牛顿法、阻尼牛顿法及单纯形法

function [x,minf]=ModifSimpleMthd(A,c,b,baseVector)%约束矩阵:A%目标函数系数向量:c%约束右端向量:b%初始基向量:baseVector%目标函数取最小值时的自变量值:x%目标函数的最小值:minfsz=size(A);nVia=sz(2);n=sz(1);xx=1:nVia;nobase=zeros(1,1);m=1; if c>=0vr=find(c~=0,1,'last');rgv=inv(A(:,(nVia-n+1):nVia))*b;if rgv>=0x=zeros(1,vr);minf=0;elsedisp('不存在最优解');x=NaN;minf=NaN;return;endend for i=1:nVia%获取非基变量下标if(isempty(find(baseVector==xx(i),1)))nobase(m)=i;m=m+1;else;endend bCon=1;M=0;B=A(:,baseVector);invB=inv(B); while bConnB=A(:,nobase);%非基变量矩阵ncb=c(nobase);%非基变量系数B=A(:,baseVector);%基变量矩阵cb=c(baseVector);%基变量系数xb=invB*b;f=cb*xb;w=cb*invB;for i=1:length(nobase) %判别sigma(i)=w*nB(:,i)-ncb(i);end[maxs,ind]=max(sigma); %ind为进基变量下标if maxs<=0%最大值小于零,,输出解最优minf=cb*xb;vr=find(c~=0,1,'last');for l=1:vrele=find(baseVector==l,1);if(isempty(ele))x(l)=0;elsex(l)=xb(ele);endendbCon=0;elsey=inv(B)*A(:,nobase(ind));if y<=0%不存在最优解disp('不存在最优解!');x=NaN;minf=NaN;return;elseminb=inf;chagB=0;for j=1:length(y)if y(j)>0bz=xb(j)/y(j);if bz<minbminb=bz;chagB=j;endendend%chagB为基变量下标tmp=baseVector(chagB); %更新基矩阵和非基矩阵baseVector(chagB)=nobase(ind);nobase(ind)=tmp;for j=1:chagB-1%基变量矩阵的逆矩阵变换if y(j)~=0invB(j,:)=invB(j,:)-invB(chagB,:)*y(j)/y(chagB);endendfor j=chagB+1:length(y)if y(j)~=0invB(j,:)=invB(j,:)-invB(chagB,:)*y(j)/y(chagB);endendinvB(chagB,:)=invB(chagB,:)/y(chagB);endendM=M+1;if(M==1000000)%迭代步数限制disp('找不到最优解!');x=NaN;minf=NaN;return;endend运行结果如下图:

因为在路上你就已经收获了自由自在的好心情。

牛顿法、阻尼牛顿法及单纯形法

相关文章:

你感兴趣的文章:

标签云: