[英]Passing additional arguments through function handle to do optimization in Matlab
我有一个要优化的函数,例如f,在matlab中,该函数取决于我要优化的变量x = {x(1),x(2))和两个不需要优化的参数n和c ,换句话说,我有一个n和c值矩阵,我想为每个n和c找到最佳x值。 这是我的代码:
clear all;
clc;
close all;
f=@(x,n,c)n*x(1)+(x(2)+3*c)/(x(1)+c);
for n=1:10
for c=1:20
x=zeros(length(n),length(c));
fun{n,c}=@(x)f(x,n,c);
options=optimset('Algorithm','interior-point')
x(n,c)=fmincon(fun{n,c},[0;0],[1 0;-1 0;0 1;0 -1],[40;0;40;0],[],[],[],[],[],options);
end
end
??? Subscripted assignment dimension mismatch.
Error in ==> forloop2 at 10
x(n,c)=fmincon(fun{n,c},[0;0],[1 0;-1 0;0 1;0
-1],[40;0;40;0],[],[],[],[],[],options);
Any helps? Thank you so much!
恐怕您实际上没有提出问题,但这是一个答案:
function myOptimization
clear all;
clc;
close all;
results=cell(10,20);
for n=1:10
for c=1:20
options=optimset('Algorithm','interior-point');
fmincon(@(x)fun(x,n,c),[0;0],[1 0;-1 0;0 1;0 -1],[40;0;40;0],[],[],[],[],[],options);
resultingCoordinates=fmincon(@(x)fun(x,n,c),[0;0],[1 0;-1 0;0 1;0 -1],[40;0;40;0],[],[],[],[],[],options);
results{n,c}=resultingCoordinates;
end
end
results
end
function f=fun(x,n,c)
f=n*x(1)+(x(2)+3*c)/(x(1)+c);
end
您在原始代码中至少犯了3个错误。
首先,x(n,c)= fmincon ...不起作用,因为fmincon返回具有最佳坐标的向量作为第一个输出参数。 因此,您试图将向量分配给矩阵“ x”中的单个位置,这是错误的来源。 我将最佳坐标放在单元格数组中,以便可以存储所有输出坐标。 如果希望将最佳“ f值”作为矩阵分配给结果,则可以使用[〜,f(n,c)] = fmincon ...。
其次,即使您想要保存坐标,“ x”对于您的输出矩阵来说也是一个非常糟糕的名字。 这甚至可能会导致您出错,因为它只是用来表示目标函数的输入,而不是最佳坐标。 对于最佳坐标或最佳函数值,请使用其他名称,以反映这些是结果。
第三,您不需要在每次更改参数时连续重新分配输出矩阵/单元格数组。 您实质上是在尝试清除每次迭代的结果,如果您要保存结果,则该方法将无效。
我还将目标函数拆分为一个函数,并将该函数的优化拆分为另一个。
我希望这有帮助。 将来,请尝试对堆栈溢出定义一个明确的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.