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
中将它分成了不同的变量。设置约束时必须扩展功能还是有其他方法?我做了很多研究,但仍然不确定它是如何工作的。
将句柄作为 fun
和 nonlcon
参数传递的两个函数应该只采用一个参数,即设计向量(不是问题的常量值)。所以你应该构造新的匿名函数并将它们传递给 fmincon
像这样:
[x,fval] = fmincon(@(x)objfun(x, w1, w2),...
x0,[],[],[],[],LB,UB,@(x)confun(x,z8,y1,trfu));
但要这样做,z8
、y1
和 trfu
应该在调用 fmincon
之前赋值。由于这些值实际上是为每个 x
计算的,恐怕您需要在 confun
中再次计算它们。如果这不是一个非常耗时的优化,只需将它们移动到第三个函数并从 objfun
和 confun
调用它。否则按照 here 中描述的方法,在约束函数中使用在 objective 函数中计算的值。
我是 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
中将它分成了不同的变量。设置约束时必须扩展功能还是有其他方法?我做了很多研究,但仍然不确定它是如何工作的。
将句柄作为 fun
和 nonlcon
参数传递的两个函数应该只采用一个参数,即设计向量(不是问题的常量值)。所以你应该构造新的匿名函数并将它们传递给 fmincon
像这样:
[x,fval] = fmincon(@(x)objfun(x, w1, w2),...
x0,[],[],[],[],LB,UB,@(x)confun(x,z8,y1,trfu));
但要这样做,z8
、y1
和 trfu
应该在调用 fmincon
之前赋值。由于这些值实际上是为每个 x
计算的,恐怕您需要在 confun
中再次计算它们。如果这不是一个非常耗时的优化,只需将它们移动到第三个函数并从 objfun
和 confun
调用它。否则按照 here 中描述的方法,在约束函数中使用在 objective 函数中计算的值。