1

考虑以下 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;

我的目标是针对x1x2 使用函数 fminunc 优化上述函数,该函数还包含渐变。如果以上述方式定义,我不知道是否可以优化该功能。

我的方法是(但我知道它行不通):

options = optimoptions('fmincon', 'SpecifyObjectiveGradient',true);
% Initializing 
x10 = [1, 1];
x20 = 1;

[t1, t2] = fminunc(@(x1, x2)optifun(x1,x2), x10, x20, options);

编辑:我已经按照用户的指出进行了更正:@m7913d

4

1 回答 1

0

主要问题

您的函数签名与预期不符fminunc:您只能指定一个(初始)x向量和一个梯度向量,其中应包含所有变量/梯度。如果您不想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

总之,请务必仔细阅读错误消息和文档,并尝试使您的代码符合预期的语法。

于 2017-05-20T11:07:43.170 回答