首页 > 解决方案 > matlab fmincon优化中没有足够的输入参数错误

问题描述

我是 MATLAB 新手,我需要帮助来解决这个优化问题。这是目标函数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接受约束函数,输入形式为一个向量,其中元素的数量与约束变量的数量相对应。但我不知道如何将所有输入参数设置为一个向量。

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

标签: matlabmathematical-optimizationminimization

解决方案


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

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

但要这样做,z8,y1trfu应该在调用之前分配给fmincon. 由于这些值实际上是针对每个 计算的x,恐怕您需要在 中再次计算它们confun。如果这不是一个非常耗时的优化,只需将它们移动到第三个函数并从两者中调用它objfunand confun。否则按照此处描述的方法,使用在目标函数中计算的值,在约束函数中。


推荐阅读