matlab里 两个fmincon同时使用,用由第一个fmincon求出的最优x值带入第二个fmincon函数内的极值,急!

function main2
xmin=zeros(9,1);
amin=xmin;
xmax=ones(9,1);
amax=xmax;
x0=(1/2000)*ones(9,1);
a0=x0;
D=0:0.1:1;
F=zeros(size(D));
for i=1:length(D);
data=D(i);
[x,fval,flag,c]=fmincon(@ning,x0,[],[],[],[],xmin,xmax,@ning1);
[a,fval,flag,c]=fmincon(@ning2,a0,[],[],[],[],amin,amax,@ning3);
F(i)=-fval;

end

plot(D,F,'*-');

function y=ning(x)
y=x(9)*((x(1)+x(5))/(x(1)+x(2)+x(5)+x(6))*log2((x(1)+x(5))/(x(1)+x(2)+x(5)+x(6)))...
+(x(2)+x(6))/(x(1)+x(2)+x(5)+x(6))*log2((x(2)+x(6))/(x(1)+x(2)+x(5)+x(6))))...
+((1-x(9)))*log2((x(2)+x(6))/(x(1)+x(2)+x(5)+x(6))*x(9)+(x(4)+x(8))/(x(3)+x(4)+x(7)+x(8))*(1-x(9)));
y=-y;
end
function [c,ceq]=ning1(x)
c(1)=x(9)*((x(1)+x(5))/(x(1)+x(2)+x(5)+x(6))*log2((x(1)+x(5))/(x(1)+x(2)+x(5)+x(6)))+
x(9)))*log2((x(2)+x(6))/(x(1)+x(2)+x(5)+x(6))*x(9)+(x(4)+x(8))/(x(3)+x(4)+x(7)+x(8))*(1-x(9)))-data;
ceq(1)=x(1)+x(2)+x(3)+x(4)+x(5)+x(6)+x(7)+x(8)-1;
end
function s=ning2(a)

s=-(((a(1)+a(2)+a(3)+a(4))*a(1)/(a(1)+a(2))+(a(5)+a(6)+a(7)+a(8))*a(5)/(a(5)+a(6)))*a(9)...
+((a(1)+a(2)+a(3)+a(4))*a(3)/(a(3)+a(4))+(a(5)+a(6)+a(7)+a(8))*a(7)/(a(7)+a(8)))*(1-
+(a(5)+a(6)+a(7)+a(8))*a(5)/(a(5)+a(6))))...
/(a(3)+a(4))+(a(5)+a(6)+a(7)+a(8))*a(8)/(a(7)+a(8))));

s=-s;
end
function [c,ceq]=ning3(a,x)
c(1)=-a(9);
c(2)=a(9)-1;
ceq(1)=a(1)-x(1);
。。。。。
ceq(8)=a(8)-x(8);
end
end
由于篇幅限制,两个目标函数没有输入完整。限制就是想用由第一个fmincon得到的x(1)-x(8)带入第二个fmincon的a(1)-a(8),然后看a(9)在(0,1)间变化时使目标函数达最大,然后画出这个最值随D变化的曲线。一直报错是第二个函数的调用不对。求高手指教!!!

你要搞清楚,你的调用函数的方式
目标函数是ning和ning2
而ning1和ning3只是非线性约束函数

你这样调用优化的解过是让ning和ning2输出最小,而不是你想要的优化a(9)的值追问

我不是优化a(9),我就是要求极值,不过是一个极值是在另一个极值的约束下产生。

追答

[x,fval,flag,c]=fmincon(@ning,x0,[],[],[],[],xmin,xmax,@ning1);
[a,fval,flag,c]=fmincon(@ning2,a0,[],[],[],[],amin,amax,@(a) ning3(a,x));

温馨提示:答案为网友推荐,仅供参考
相似回答