基于matlab的fmincon误差分析

基于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];

我想用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]; 
  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。