matlab fmincon优化中输入参数错误不足

Not enough input arguments error in matlab fmincon optimization

我是 MATLAB 的新手,我需要帮助来解决这个优化问题。这是 objective 函数 m 文件:

function f = objfun(x,w1,w2)
    
    w = 6:1:125;
    
    z1 = x(4).*((x(1).*(1i.^2).*w.^2)+(x(5).*1i.*w)+x(3));
    z2 = x(1).*x(2).*(1i.^4).*w.^4;
    z3 = ((x(1)+x(2)).*x(5).*(1i.^3).*w.^3);
    z4 = (1i.^2).*w.^2.*((x(1).*x(3))+(x(2).*x(3))+(x(1).*x(4)));
    z5 = 1i.*w.*(x(5).*x(4));
    z6 = x(3).*x(4);
    z7 = x(4).*(-x(5).*1i.*w-x(3));
    z8 = (z7./(z2+z3+z4+z5+z6));
    
    trfs = 0.1.*(w.^2).*(z7./(z2+z3+z4+z5+z6));
    trfs2 = 0.1.*(z7./(z2+z3+z4+z5+z6));
    trfu = 0.1.*(z1./(z2+z3+z4+z5+z6));
    
    abstrfs = abs(trfs);
    abstrfs2 = abs(trfs2);
    abstrfu = abs(trfu);
    
    y1 = rms(abstrfs);
    y2 = rms(abstrfs2);
    y3 = abs(rms(abstrfu)-y2);
    
    
    f = w1.*(y1.^2)+w2.*(y3.^2);
end

这些是限制条件:

function [c,ceq] = confun(x,z8,y1,trfu)
    
    c(1) = y1 - 0.315;
    c(2) = abs(z8-trfu) - 0.217;
    c(3) = abs(trfu) - 0.07;
    c(4) = sqrt(x(3)./x(1)) - 9.425;
    
    ceq = [];
    
end

主文件

x0 = [510 85 81000 650000 3000];
UB = [764 124 120720 839170 3840];
LB = [509 83 80480 559440 2560];
    
j = 1;
for i = 0:0.05:1
      w1 = i;
      w2 = 1-i;
     
      [x,fval] = fmincon(@objfun,x0,[],[],[],[],LB,UB,@confun,[],w1,w2);
      w = 6:1:125;
      
      z1 = x(4).*((x(1).*(1i.^2).*w.^2)+(x(5).*1i.*w)+x(3));
      z2 = x(1).*x(2).*(1i.^4).*w.^4;
      z3 = ((x(1)+x(2)).*x(5).*(1i.^3).*w.^3);
      z4 = (1i.^2).*w.^2.*((x(1).*x(3))+(x(2).*x(3))+(x(1).*x(4)));
      z5 = 1i.*w.*(x(5).*x(4));
      z6 = x(3).*x(4);
      z7 = x(4).*(-x(5).*1i.*w-x(3));
      z8 = (z7./(z2+z3+z4+z5+z6));
    
      trfs =(w.^2).*(z7./(z2+z3+z4+z5+z6));
      trfs2 = (z7./(z2+z3+z4+z5+z6));
      trfu = (z1./(z2+z3+z4+z5+z6));
    
      abstrfs = abs(trfs);
      abstrfs2 = abs(trfs2);
      abstrfu = abs(trfu);
    
      y1(j) = rms(abstrfs);
      y2(j) = rms(abstrfs2);
      y3(j) = abs(rms(abstrfu)-y2(j));
    
      j = j+1;
end
    
plot (y1,y3,'r.','MarkerSize',10)

我收到错误消息;

Not enough input arguments.

Error in confun (line 5)
c(2) = abs(z8-trfu) - 0.217;

Error in fmincon (line 633)
        [ctmp,ceqtmp] = feval(confcn{3},X,varargin{:});

Error in main (line 13)
  [x,fval] = fmincon(@objfun,x0,[],[],[],[],LB,UB,@confun,[],w1,w2);

Caused by:
    Failure in initial nonlinear constraint function evaluation. FMINCON cannot continue.

我知道 fmincon 接受约束函数,输入形式为一个向量,元素数对应于约束变量数。但我不知道如何将所有输入参数设置为一个向量。

因为 objective 函数有点笨重,所以我在 objfun 中将它分成了不同的变量。设置约束时必须扩展功能还是有其他方法?我做了很多研究,但仍然不确定它是如何工作的。

将句柄作为 funnonlcon 参数传递的两个函数应该只采用一个参数,即设计向量(不是问题的常量值)。所以你应该构造新的匿名函数并将它们传递给 fmincon 像这样:

[x,fval] = fmincon(@(x)objfun(x, w1, w2),...
      x0,[],[],[],[],LB,UB,@(x)confun(x,z8,y1,trfu));

但要这样做,z8y1trfu 应该在调用 fmincon 之前赋值。由于这些值实际上是为每个 x 计算的,恐怕您需要在 confun 中再次计算它们。如果这不是一个非常耗时的优化,只需将它们移动到第三个函数并从 objfunconfun 调用它。否则按照 here 中描述的方法,在约束函数中使用在 objective 函数中计算的值。