通过Matlab中的函数句柄传递其他参数

时间:2013-02-18 18:34:04

标签: function matlab optimization handle

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

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

2 个答案:

答案 0 :(得分:4)

尝试使用匿名函数:

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

答案 1 :(得分:4)

如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)