在 Matlab 中针对多个参数进行优化
Optimizing for more than one argument in Matlab
考虑以下 Matlab 函数
function [f, dfx1, dfx2] = optifun(x1,x2)
f = x1(1)^2 + x1(2)^2 + x2^2;
% Gradients
dfx1(1) = 2*x1(1);
dfx1(2) = 2*x1(2);
dfx2 = 2*x2;
我的 objective 是针对 x1
和 x2
使用函数`fminunc 优化上述函数,它也包含梯度。如果按照上面的方式定义函数,我不知道是否可以优化它。
我的方法是(但我知道这行不通):
options = optimoptions('fmincon', 'SpecifyObjectiveGradient',true);
% Initializing
x10 = [1, 1];
x20 = 1;
[t1, t2] = fminunc(@(x1, x2)optifun(x1,x2), x10, x20, options);
编辑:我已经按照用户指出的进行了更正:@m7913d
主要问题
你的函数签名不符合fminunc
的期望:你只能指定一个(初始)x
向量和一个梯度向量,它应该包含所有variables/gradients .如果你不想optifun
(这是首选方案),你可以定义一个辅助函数如下:
function [f, df] = optifun_helper(x)
[f, dfx1, dfx2] = optifun(x(1:2),x(3));
df = [dfx1 dfx2];
end
并使用这个函数来解决你的优化问题:
[x] = fminunc(@(x) optifun_helper(x), [x10 x20], options);
小问题
您的代码还有其他问题。我得到的第一个错误是:
Error using optimoptions (line 118)
Invalid solver specified. Provide a solver name or handle (such as 'fmincon' or @fminunc).
Type DOC OPTIMOPTIONS for a list of solvers.
如错误消息所建议,您应该将求解器指定为第一个参数:
options = optimoptions('fminunc','SpecifyObjectiveGradient',true);
第二个问题是 optifun
的某些输出变量由于拼写问题而从未定义(您定义 df1
而不是 dfx1
):
function [f, dfx1, dfx2] = optifun(x1,x2)
f = x1(1)^2 + x1(2)^2 + x2^2;
% Gradients
dfx1(1) = 2*x1(1);
dfx1(2) = 2*x1(2);
dfx2 = 2*x2;
end
作为结论,请始终仔细阅读错误消息和文档,并尝试使您的代码符合预期的语法。
考虑以下 Matlab 函数
function [f, dfx1, dfx2] = optifun(x1,x2)
f = x1(1)^2 + x1(2)^2 + x2^2;
% Gradients
dfx1(1) = 2*x1(1);
dfx1(2) = 2*x1(2);
dfx2 = 2*x2;
我的 objective 是针对 x1
和 x2
使用函数`fminunc 优化上述函数,它也包含梯度。如果按照上面的方式定义函数,我不知道是否可以优化它。
我的方法是(但我知道这行不通):
options = optimoptions('fmincon', 'SpecifyObjectiveGradient',true);
% Initializing
x10 = [1, 1];
x20 = 1;
[t1, t2] = fminunc(@(x1, x2)optifun(x1,x2), x10, x20, options);
编辑:我已经按照用户指出的进行了更正:@m7913d
主要问题
你的函数签名不符合fminunc
的期望:你只能指定一个(初始)x
向量和一个梯度向量,它应该包含所有variables/gradients .如果你不想optifun
(这是首选方案),你可以定义一个辅助函数如下:
function [f, df] = optifun_helper(x)
[f, dfx1, dfx2] = optifun(x(1:2),x(3));
df = [dfx1 dfx2];
end
并使用这个函数来解决你的优化问题:
[x] = fminunc(@(x) optifun_helper(x), [x10 x20], options);
小问题
您的代码还有其他问题。我得到的第一个错误是:
Error using optimoptions (line 118)
Invalid solver specified. Provide a solver name or handle (such as 'fmincon' or @fminunc).
Type DOC OPTIMOPTIONS for a list of solvers.
如错误消息所建议,您应该将求解器指定为第一个参数:
options = optimoptions('fminunc','SpecifyObjectiveGradient',true);
第二个问题是 optifun
的某些输出变量由于拼写问题而从未定义(您定义 df1
而不是 dfx1
):
function [f, dfx1, dfx2] = optifun(x1,x2)
f = x1(1)^2 + x1(2)^2 + x2^2;
% Gradients
dfx1(1) = 2*x1(1);
dfx1(2) = 2*x1(2);
dfx2 = 2*x2;
end
作为结论,请始终仔细阅读错误消息和文档,并尝试使您的代码符合预期的语法。