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变化的曲线。一直报错是第二个函数的调用不对。求高手指教!!!
我不是优化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));