【问题标题】:Passing additional arguments through function handle in Matlab在 Matlab 中通过函数句柄传递附加参数
【发布时间】:2013-02-18 18:34:03
【问题描述】:

我有一个函数可以在 Matlab 中优化,比如 Function。这个函数取决于我想要优化的变量(比如 x)和一个不需要优化的参数(比如 Q)。因此,函数 Function(x,Q)。换句话说,我有一个 Q 值数组,并且想为每个 Q 找到最佳 x 值。但是,在优化函数中使用函数句柄 @Function 时,我找不到如何传递这些 Q 值的方法。

所以,我的问题是如何在优化函数中使用函数句柄时传递这些 Q 值,例如 fmincon(@Function,x0,A,b)?

【问题讨论】:

  • fmincon(@Function,x0,Q,A,b) 工作吗?
  • @DennisJaheruddin 不,它不起作用。不幸的是。

标签: function matlab optimization handle


【解决方案1】:

尝试使用匿名函数:

x = cell( 1, numel(Q) );
for qi = 1:numel( Q )
   x{qi} = fmincon( @(x) Function(x, Q(qi)), A, b );
end 

【讨论】:

    【解决方案2】:

    如 MATLAB 文档中所述,这个问题实际上有 3 种解决方案:

    1. 匿名函数
      这在这篇文章的Shai's answer 中有描述。
    2. 嵌套函数
      在这种方法中,外部函数接受所有参数,而内部函数只接受对其进行优化的参数。
      这是取自 MATLAB 文档的示例: function [x,fval] = runnested(a,b,c,x0) [x,fval] = fminunc(@nestedfun,x0); % Nested function that computes the objective function function y = nestedfun(x) y = (a - b*x(1)^2 + x(1)^4/3)*x(1)^2 + x(1)x(2) +... (-c + cx(2)^2)*x(2)^2; end end
    3. 全局变量
      在这种方法中,您应该在工作区中将目标函数中所需的参数定义为global,并在目标函数中使用它们并将它们声明为全局。
      这是 MATLAB 文档中的一个示例:
      • 定义目标函数: function y = globalfun(x) global a b c y = (a - b*x(1)^2 + x(1)^4/3)*x(1)^2 + x(1)x(2) + ... (-c + cx(2)^2)*x(2)^2; end
      • 优化: global a b c; a = 4; b = 2.1; c = 4; % Assign parameter values x0 = [0.5,0.5]; [x,fval] = fminunc(@globalfun,x0)

    【讨论】:

      【解决方案3】:

      您可以执行以下操作:

      x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options,Q)
      

      这会将 Q 传递给 fun(x,Q)!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-04
        • 2016-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多