使用定义的Matlab函数进行fmincon优化

时间:2019-02-05 10:43:41

标签: matlab optimization

是否可以将优化函数fmincon与Matlab定义的函数一起使用?

我编写了一个函数,其中给出的常数参数(实数或复数)很少,而现在,每次更改这些参数时,结果都会改变(您不必说)。

[output1, output2] = my_function(input1,input2,input3,input4)

我看到fmincon函数允许在给定约束下找到最佳结果。假设我想找到仅作用于input1的最佳输出,并使所有其他输入保持不变。是否可以定义类似

的东西
fmincon(@(input1)my_function,[1,2],[],mean)

对于input1,其最佳值mean从1变为2,其中平均值是其他一些结果的平均值。

我知道这是一个非常模糊的问题,但是由于function可以做出很多事情,因此我无法给出一个最小的例子

具有多个输出的第一个尝试给了我错误Only functions can return multiple values.

然后我尝试只输出一个,如果我使用

output1 = @(input1)function(input2,input3);
fmincon(@output1,[1,2],[],mean)

我得到了错误

  

错误:“ output1”以前用作变量,与此处用作函数或命令的名称存在冲突。   有关详细信息,请参见MATLAB文档中的“ MATLAB如何识别命令语法”。

有了fmincon(@my_function,[1,2],[],mean),我得到Not enough input arguments.

1 个答案:

答案 0 :(得分:2)

该输入应在函数定义中使用-阅读anonymous functions的编写方式。您不必使用匿名函数来定义实际的目标函数(下面的myFunction),您可以在其自己的文件中使用函数。关键是目标函数应返回要最小化的标量。

这是一个非常简单的示例,基于初始猜测fmincon,使用myFunction[1.5,1.5]中找到最小值。

% myFunction is min when x=1,y=2
myFunction = @(x,y) (x-1).^2 + (y-2).^2;
% Define the optimisation function.
% This should take one input (can be an array) 
% and output a scalar to be minimised
optimFunc = @(P) myFunction( P(1), P(2) );

% Use fmincon to find the optimum solution, based on some initial guess
optimSoln = fmincon( optimFunc, [1.5, 1.5] );

% >> optimSoln
% optimSoln =
%     0.999999990065893   1.999999988824129

% Optimal x = optimSoln(1), optimal y = optimSoln(2);

您可以看到计算出的最优值并非完全[1,2],但在默认的最优容差范围内。您可以更改fmincon求解器的选项-阅读documentation


如果您想将y=1保持不变,则只需更新函数定义:

% We only want solutions with y=1
optimFunc_y1 = @(P) myFunction( P(1), 1 ); % y=1 always
% Find new optimal solution
optimSoln_y1 = fmincon( optimFunc_y1, 1.5 );

% >> optimSoln_y1
% optimSoln_y1 = 
%    0.999999990065893
% Optimal x when y=1 = optimSoln(1)

您可以使用A的{​​{1}},BAeqBeq输入来添加不等式约束,但这在这里太宽泛了,请参阅文档。


请注意,您使用的关键字fmincon的语法无效。我在演示中为函数使用了有效的变量名。