基于matlab的fmincon误差分析
我想用fmincon解决一个简单的问题,但它返回一条错误消息。 我有两个函数f_2和f_1,我想分别最小化它们。我想在一个matlab函数中编写f_1和f_2,即我的fun.m。然后我想使用主代码中的索引调用它们中的每一个。以下是您可以看到的代码:基于matlab的fmincon误差分析,matlab,optimization,Matlab,Optimization,我想用fmincon解决一个简单的问题,但它返回一条错误消息。 我有两个函数f_2和f_1,我想分别最小化它们。我想在一个matlab函数中编写f_1和f_2,即我的fun.m。然后我想使用主代码中的索引调用它们中的每一个。以下是您可以看到的代码: main code: AA=[1 2 -1 -0.5 1];bb=-2; xo=[1 1 1 1 1]; VLB=[-1 -1 -1 -1 -1]; VUB=[100 100 100 100 100];
main code:
AA=[1 2 -1 -0.5 1];bb=-2;
xo=[1 1 1 1 1];
VLB=[-1 -1 -1 -1 -1];
VUB=[100 100 100 100 100];
for F_index = 1:2
[x,fval]=fmincon(@myfun,xo,AA,bb,[],[],VLB,VUB)
end
%%下面是函数
function f = myfun(x, F_index)
if F_index == 1
f = norm(x)^2 - 4*x(4)*(x(2) + 3.4*x(5))^2 ;
end
if F_index == 2
f = 100*(x(3) - x(5)) + (3*x(1)+2*x(2) - x(3)/3)^2 + 0.01*(x(4) - x(5))
end
未定义的函数或变量“F_index”
如果F_index==1,则myfun(第2行)中出现错误
fmincon错误(第564行)
初始值=
feval(funfcn{3},X,varargin{:})
主线错误(第6行)
[x,fval]=fmincon(@myfun,xo,AA,bb,[],[],VLB,VUB)
原因:
初始用户提供的目标失败
功能评估。FMINCON无法继续
您需要了解变量输入/输出函数 实际上,在任何编程语言中,当您输入函数时,该函数只能访问内部创建的变量,或作为参数传递的变量,如
x
、y
、z
和potato
,在下一个示例中:myfun(x,y,z,potato)
这意味着:
function f = myfun(x)
if F_index == 1
f = norm(x)^2 - 4*x(4)*(x(2) + 3.4*x(5))^2 ;
end
end
myfun不知道什么是F_索引
解决此问题的方法之一是将
F_index
声明为global
,但我建议您以某种方式更改函数,这样它就不会访问函数外变量。您需要了解函数内/函数外的变量
实际上,在任何编程语言中,当您输入函数时,该函数只能访问内部创建的变量,或作为参数传递的变量,如x
、y
、z
和potato
,在下一个示例中:myfun(x,y,z,potato)
这意味着:
function f = myfun(x)
if F_index == 1
f = norm(x)^2 - 4*x(4)*(x(2) + 3.4*x(5))^2 ;
end
end
myfun不知道什么是F_索引
解决此问题的方法之一是将
F_index
声明为global
,但我建议您以某种方式更改函数,这样它就不会访问函数变量以外的内容。错误消息清楚地说明了问题:变量F_index
在函数myfun
中未定义。Matlab中的变量的范围仅限于定义它们的函数(或者更确切地说是“工作空间”)。它们可以“全球化”,但这不是你通常想要做的事情
解决方法是使用嵌套函数,其中封闭函数的变量在嵌套函数中可用:
function main_function
AA=[1 2 -1 -0.5 1];bb=-2;
xo=[1 1 1 1 1];
VLB=[-1 -1 -1 -1 -1];
VUB=[100 100 100 100 100];
F_index = 1;
for F_index = 1:2
[x,fval]=fmincon(@myfun,xo,AA,bb,[],[],VLB,VUB)
end
function f = myfun(x)
if F_index == 1
f = norm(x)^2 - 4*x(4)*(x(2) + 3.4*x(5))^2 ;
end
if F_index == 2
f = 100*(x(3) - x(5)) + (3*x(1)+2*x(2) - x(3)/3)^2 + 0.01*(x(4) - x(5))
end
end
end
现在
myfun
嵌套在main\u函数中,并且可以访问其变量。错误消息清楚地说明了问题:变量F\u索引
在函数myfun
中未定义。Matlab中的变量的范围仅限于定义它们的函数(或者更确切地说是“工作空间”)。它们可以“全球化”,但这不是你通常想要做的事情
解决方法是使用嵌套函数,其中封闭函数的变量在嵌套函数中可用:
function main_function
AA=[1 2 -1 -0.5 1];bb=-2;
xo=[1 1 1 1 1];
VLB=[-1 -1 -1 -1 -1];
VUB=[100 100 100 100 100];
F_index = 1;
for F_index = 1:2
[x,fval]=fmincon(@myfun,xo,AA,bb,[],[],VLB,VUB)
end
function f = myfun(x)
if F_index == 1
f = norm(x)^2 - 4*x(4)*(x(2) + 3.4*x(5))^2 ;
end
if F_index == 2
f = 100*(x(3) - x(5)) + (3*x(1)+2*x(2) - x(3)/3)^2 + 0.01*(x(4) - x(5))
end
end
end
现在,myfun
嵌套在main\u函数中,并且可以访问其变量。您可以使用以下方法绑定额外的参数:
这里,对F_索引的值进行求值,并成为匿名函数的一部分
然而,这些看起来像是完全独立的函数。为什么不一直将它们分开,并在迭代中使用句柄的单元数组呢
fcns = {@fun1, @fun2};
for F_index = 1:2
[x,fval]=fmincon(fcns{F_index},xo,AA,bb,[],[],VLB,VUB)
end
可以使用以下命令绑定额外参数:
这里,对F_索引的值进行求值,并成为匿名函数的一部分
然而,这些看起来像是完全独立的函数。为什么不一直将它们分开,并在迭代中使用句柄的单元数组呢
fcns = {@fun1, @fun2};
for F_index = 1:2
[x,fval]=fmincon(fcns{F_index},xo,AA,bb,[],[],VLB,VUB)
end
但是我想有如果我实际上有3个函数,并且想用这种方式优化它们中的每一个@A.Donda@Jamaisavenir,我不太明白你的意思。请编辑您的问题并包含一些更接近您实际应用程序的代码,以便我们更好地了解如何帮助您。@Jamaisavenir,我编辑了我的答案,请查看这是否是您所需要的。但我希望有,如果我实际上有3个函数,并希望以这种方式优化每个函数@A.Donda@Jamaisavenir,我不太明白你的意思。请编辑您的问题并包含一些更接近您实际应用程序的代码,以便我们更好地了解如何帮助您。@Jamaisavenir,我编辑了我的答案,请查看这是否是您需要的。但是您希望使用if
语句,以便我可以优化所有f1、f2、f3,。。个别地@Ander Biguriu想使用if
语句,这样我就可以优化所有的f1,f2,f3,。。个别地@Ander Biguri感谢您的编辑!好的,在这种情况下,最简单的解决方案是定义不同的函数,myfun1
,myfun2
等等。但我更新的答案中列出的解决方案也应该有效。请注意,最好使用switch
语句,而不是一系列if
s语句。感谢您的编辑!好的,在这种情况下,最简单的解决方案是定义不同的函数,myfun1
,myfun2
等等。但我更新的答案中列出的解决方案也应该有效。请注意,最好使用switch
语句,而不是一系列if
s。