【问题标题】:Optimizing for more than one argument in Matlab在 Matlab 中针对多个参数进行优化
【发布时间】:2017-05-20 20:04:50
【问题描述】:

考虑下面的 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

【问题讨论】:

    标签: matlab optimization fminsearch


    【解决方案1】:

    主要问题

    您的函数签名与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
    

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

    【讨论】:

    • @pkj 请查看您之前的问题并检查您是否不需要接受给定的答案。
    • 对于发布一个错误且不完整的问题,我深表歉意。我正在处理的问题发布时间很长,所以我发布了一个综合问题,并没有费心重新检查它。作为最后的澄清,你已经解决了我真正的疑问。我有一个可以被许多脚本访问的函数,我想要一些方法来解决它而不改变函数的结构;好像没有办法。您的辅助函数将完成这项工作。感谢您回答问题,很抱歉我的格式错误的问题浪费了您的时间。我会看看我以前的问题。
    猜你喜欢
    • 2018-11-07
    • 2013-06-25
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 2011-08-01
    相关资源
    最近更新 更多