X=[1026.2 1521.2 1433.1 1543.3 2123.6 2046.5 2077.5 2095.3 2135.5 2605.31 2670.44;
305884 304029 293912 243019 275895 289603 291791 286719 242689 245802 274703;
152135 154344 156965 163045 174492 179200 184553 188431 191693 193252 196983];
Y=[1357.8 1514.9 1773.3 2207.8 2291.5 2333.5 2399.3 2410.3 2541.9 2606.5 2916;
123065 156596 189799 219130.3 198009 209946 198024 210586 228854 249323 243445;
15306.9 18003.6 21384.7 23077.5 24259.6 25208.9 26398.4 28474.1 30604.8 32394.6 34978.6];
n=size(X',1);m=size(X,1);s=size(Y,1);
A=[-X' Y'];b=zeros(11,1);
LB=zeros(6,1);UB=[];
for i=1:11
Aeq =[X(:,i)',zeros(1,3)];beq=1;
f=[zeros(1,3),-Y(:,i)'];
w(:,i)=linprog(f,A,b,Aeq,beq,LB,UB);
Eii=Y(:,i)'*w(4:6,i);
for k=1:11
f=[zeros(1,3) Y(:,k)'];
Aeq=[X(:,k)',zeros(1,3)
Eii*X(:,i)',-Y(:,i)'];
beq=[1
0];
v=linprog(f,A,b,Aeq,beq,LB,UB);
E(i,k)=(Y(:,k)'*v(4:6))/(X(:,k)'*v(1:3));
end
end
E
mean(E)
[Y I]=sort(mean(E));
fliplr(I)
索引超出数组元素的数目(0),
E(i,k)=(Y(:,k)'*v(4:6))/(X(:,k)'*v(1:3));
同学你好,你的程序运行到出错的一步的时候,显示第22行linprog求解没有可行域,即解出来的是空解v=[],这个时候在23行强制索引v(4:6)和v(1:3)自然会报错说“索引超出数组元素的数目(0)”,因为这个时候的v的长度是0。所以建议当v=[]的时候,把v设置成全部都是NaN的形式,就可以继续进行求解了。修改后的代码如下:
X=[1026.2 1521.2 1433.1 1543.3 2123.6 2046.5 2077.5 2095.3 2135.5 2605.31 2670.44;
305884 304029 293912 243019 275895 289603 291791 286719 242689 245802 274703;
152135 154344 156965 163045 174492 179200 184553 188431 191693 193252 196983];
Y=[1357.8 1514.9 1773.3 2207.8 2291.5 2333.5 2399.3 2410.3 2541.9 2606.5 2916;
123065 156596 189799 219130.3 198009 209946 198024 210586 228854 249323 243445;
15306.9 18003.6 21384.7 23077.5 24259.6 25208.9 26398.4 28474.1 30604.8 32394.6 34978.6];
n=size(X',1);m=size(X,1);s=size(Y,1);
A=[-X' Y'];b=zeros(11,1);
LB=zeros(6,1);UB=[];
for i=1:11
Aeq =[X(:,i)',zeros(1,3)];beq=1;
f=[zeros(1,3),-Y(:,i)'];
w(:,i)=linprog(f,A,b,Aeq,beq,LB,UB);
Eii=Y(:,i)'*w(4:6,i);
for k=1:11
f=[zeros(1,3) Y(:,k)'];
Aeq=[X(:,k)',zeros(1,3)
Eii*X(:,i)',-Y(:,i)'];
beq=[1
0];
v=linprog(f,A,b,Aeq,beq,LB,UB); % 当函数返回的值为空的时候,没有可行域,说明线性规划没有解,即v为空
if(isempty(v)) % v的值为空的时候,自动用NaN填充
v = NaN(6,1);
end
E(i,k)=(Y(:,k)'*v(4:6))/(X(:,k)'*v(1:3)); % 当v为空的时候自然v(4:6)和v(1:3)不存在,即超出索引
end
end
E
mean(E)
[Y I]=sort(mean(E));
fliplr(I)
可见求解会顺利进行下去,没有解的地方都会标记成NaN。
如有帮助,还望题主给个采纳支持一下答主答题哟,谢谢啦(づ ̄3 ̄)づ╭❤~