使用定义的 Matlab 函数进行 fmincon 优化
Posted
技术标签:
【中文标题】使用定义的 Matlab 函数进行 fmincon 优化【英文标题】:fmincon optimization with defined Matlab function 【发布时间】:2019-02-05 10:43:41 【问题描述】:是否可以将优化函数fmincon
与 Matlab 定义的函数一起使用?
我写了一个函数,我给出了几个常量参数(实数或复数),现在,每次我改变这些参数,结果都会改变(你不说)。
[output1, output2] = my_function(input1,input2,input3,input4)
我看到fmincon
函数允许在给定约束条件下找到最佳结果。假设我想找到仅作用于input1
的最佳输出,并保持所有其他输入不变。是否可以定义类似的东西
fmincon(@(input1)my_function,[1,2],[],mean)
对于input1
,从 1 到 2 表示最佳值 mean
,其中平均值是其他一些结果的平均值。
我知道这是一个非常模糊的问题,但我无法给出一个最简单的例子,因为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.
【问题讨论】:
你试过了吗?如果是这样,请告诉我们。否则,向我们展示您失败的尝试。 MATLAB 定义的函数与用户定义的函数的不同之处仅在于它们是专有的且通常是封闭源代码,在编程方面与您编写的内容没有什么不同。 我添加了一些尝试 您的问题似乎与fmincon
无关,只是对 MATLAB 语法的使用不当。您不能使用 function
这个词,因为它是保留的。使用my_fun
之类的其他内容。同样,匿名函数(例如@(input1) sum(input1)
)仅输出 1 个值,因此您可能需要在单独的文件中创建一个函数来执行您想要的操作。没有一个真实的例子,我无法帮助更多,一个真实的minimal reproducible example
【参考方案1】:
输入应该用在你的函数定义中——阅读anonymous functions应该如何写。您不必使用匿名函数来定义实际的目标函数(下面的myFunction
),您可以在自己的文件中使用函数。关键是目标函数应该返回一个要最小化的标量。
这里有一个非常简单的例子,使用fmincon
根据初始猜测[1.5,1.5]
找到myFunction
中的最小值。
% 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)
您可以使用fmincon
的A
、B
、Aeq
和Beq
输入来添加不等式约束,但这太宽泛,无法在此处介绍,请参阅文档。
请注意,您使用关键字function
的方式是无效的语法。我在演示中为函数使用了有效的变量名。
【讨论】:
以上是关于使用定义的 Matlab 函数进行 fmincon 优化的主要内容,如果未能解决你的问题,请参考以下文章