g1=A*x1+b; y0=A*a0*d0; s0=a0*d0;
% H1=H0+s0*s0'/(s0'*y0)-H0*y0*y0'*H0/(y0'*H0*y0);
H1=H0+((1+y0'*H0*y0/(s0'*y0))*s0*s0'-H0*y0*s0'-s0*y0'*H0)/(s0'*y0); k=k+1; d1=-H1*g1;
a1=-d1'*g1/(d1'*G0*d1); a0=a1; d0=d1; H0=H1; s0=a0*d0; x1=x1+a0*d0; break end end x=x1;
fx=0.5*x1'*A*x1+b'*x1+c;
运行结果如下:
》 [x,fx,k]=bianchidufa([3 -1;-1 1],[-2;0],0,[2;1]) H1 =
0.4031 0.2578 0.2578 0.8945 fx = -1 x =
1.0000 1.0000 fx = -1 k = 1
故函数极小点是点(1,1)
25.用鲍威尔法求函数f?x1,x2??x12?2x2?4x1?2x1x2的极小点。
用鲍威尔法在MATLAB的M文件编辑器中编写的M文件,如下:
function [x,fx,k]=bowell(A,b,c,x0)%鲍威尔法 d01=[1;0]; d02=[0;1]; x02=[0;0]; esp=1e-12;%停机原则 k=0;%迭代次数
while norm(x0-x02)>=esp k=k+1; g01=A*x0+b;
a01=-d01'*g01/(d01'*A*d01);
x01=x0+a01*d01; g02=A*x01+b;
a02=-d02'*g02/(d02'*A*d02); x02=x01+a02*d02; d10=x02-x0; g10=A*x02+b;
a10=-d10'*g10/(d10'*A*d10); x10=x0+a01*d01; d01=d02; d02=d10; x0=x10; end x=x0;
fx=0.5*x'*A*x+b'*x+c;
运行结果如下:
[x,fx,k]=bowell([2 -2;-2 4],[-4;0],0,[2;1]) fx = -8 x = 4 2 fx = -8 k = 3
6.用单纯形法求线性规划问题
minf(x)??1.1x1?2.2x2?3.3x3?4.4x4?x1?x2?x3?4?s.t.?x1?2x2?2.5x3?3x4?5?x?0(j?1,2,3,4)?j%单纯形法matlab程序-danchunxingfa
% 求解标准型线性规划:max c*x; s.t. A*x=b; x>=0
% 本函数中的A是单纯初始表,包括:最后一行是初始的检验数,最后一列是资源向量b % N是初始的基变量的下标
% 输出变量sol是最优解, 其中松弛变量(或剩余变量)可能不为0 % 输出变量val是最优目标值,kk是迭代次数
function [sol,val,kk]=danchunxingfa(A,N) [mA,nA]=size(A); kk=0; % 迭代次数 flag=1; while flag
用单纯形法在MATLAB的M文件编辑器中编写的M文件,如下:
kk=kk+1;
if A(mA,:)<=0 % 已找到最优解 flag=0;
sol=zeros(1,nA-1); for i=1:mA-1
sol(N(i))=A(i,nA); end
val=-A(mA,nA); else
for i=1:nA-1
if A(mA,i)>0&A(1:mA-1,i)<=0 % 问题有无界解 disp('have infinite solution!'); flag=0; break; end end
if flag % 还不是最优表,进行转轴运算 temp=0; for i=1:nA-1 if A(mA,i)>temp temp=A(mA,i); inb=i; % 进基变量的下标 end end
sita=zeros(1,mA-1); for i=1:mA-1 if A(i,inb)>0
sita(i)=A(i,nA)/A(i,inb); end end
temp=inf; for i=1:mA-1
if sita(i)>0&sita(i) % 以下更新N for i=1:mA-1 if i==outb N(i)=inb; end end % 以下进行转轴运算 A(outb,:)=A(outb,:)/A(outb,inb); for i=1:mA if i~=outb A(i,:)=A(i,:)-A(outb,:)*A(i,inb); end end end end end ; 令g(x)?1.1x1?2.2x2?3.3x3?4.4x4,则求minf(x)??1.1x1?2.2x2?3.3x3?4.4x4就变成求?maxg(x),即minf(x)??maxg(x).运行结果如下: >> A=[1 1 1 0 4; 1 2 2.5 3 5; 1.1 2.2 -3.3 4.4 0];N=[3;4];[sol,val,kk]=danchunxingfa(A,N) sol = 0 0 4.0000 1.6667 val = 7.3333 kk = 2 所以, 经两次转轴运算,得到的最优解为x1?x2?0,x3?4.0000,x4?1.667,minf(x)??7.3333 7. 求解线性规划问题 minz??7x1?12x2?9x1?4x2?x3?360?4x?5x?x?200 ?124s.t.??3x1?10x2?x5?300?xj?0(j?1,2,3,4,5)?用单纯形法在MATLAB的M文件编辑器中编写的M文件,如下: %单纯形法matlab程序-danchunxingfa % 求解标准型线性规划:max c*x; s.t. A*x=b; x>=0 % 本函数中的A是单纯初始表,包括:最后一行是初始的检验数,最后一列是资源向量b % N是初始的基变量的下标 % 输出变量sol是最优解, 其中松弛变量(或剩余变量)可能不为0 % 输出变量val是最优目标值,kk是迭代次数 function [sol,val,kk]=danchunxingfa(A,N) [mA,nA]=size(A); kk=0; % 迭代次数 flag=1; while flag kk=kk+1; if A(mA,:)<=0 % 已找到最优解 flag=0; sol=zeros(1,nA-1); for i=1:mA-1 sol(N(i))=A(i,nA); end val=-A(mA,nA); else for i=1:nA-1 if A(mA,i)>0&A(1:mA-1,i)<=0 % 问题有无界解 disp('have infinite solution!'); flag=0; break; end end if flag % 还不是最优表,进行转轴运算 temp=0; for i=1:nA-1 if A(mA,i)>temp temp=A(mA,i); inb=i; % 进基变量的下标 end end sita=zeros(1,mA-1); for i=1:mA-1 if A(i,inb)>0 sita(i)=A(i,nA)/A(i,inb); end end temp=inf; for i=1:mA-1 if sita(i)>0&sita(i) % 以下更新N for i=1:mA-1 if i==outb N(i)=inb; end end % 以下进行转轴运算 A(outb,:)=A(outb,:)/A(outb,inb); for i=1:mA if i~=outb A(i,:)=A(i,:)-A(outb,:)*A(i,inb); end end end end end ; 运行结果如下: 令Y?7x1?12x2,则求minz?7x1?12x2可转变为求?maxY,即minz?-maxY. >> A=[9 4 1 0 0 360; 4 5 0 1 0 200; 3 10 0 0 1 300; 7 12 0 0 0 0]; N=[3;4;5]; [sol,val,kk]=danchunxingfa(A,N) sol = 20 24 84 0 0 val = 420 kk = 3 所以,经3次转轴运算,得到的最优解为 x1?20,x2?24,x3?84,x4?x5?0,minz??420.