例5-1 MATLAB实现,用M函数文件形式求解: syms s t
f=(s-5)^2+4*(t-6)^2;
g=[s^2+t^2-64;s-t+10;10-s]; X=[6.2 7.8 8.2;11 12 9.8];
[ x,minf]=minconSimpSearch2(f,g,X,1.3,0.7,1,0.7,[s t])
复合形法minconSimpSearch2函数文件如下:
function[ x,minf]=minconSimpSearch2(f,g,X,alpha,sita,gama,beta,var,eps) % f:目标函数 % g:约束函数 % X:初始复合形 % alpha:反射系数 % sita:紧缩系数 % gama:扩展系数 % beta:收缩系数 % var:自变量向量 % eps:精度
% x:目标函数取最小值时的自变量 % minf:目标函数的最小值
if nargin==8 %函数参量个数 eps=1.0e-6; end N=size(X); n=N(2); FX=zeros(1,n); while 1 for i=1:n
FX(i)=subs(f,var,X(:,i)); end
[XS,IX]=sort(FX);
Xsorted=X(:,IX) ; %按照IX的顺序重新排列X
px=sum(Xsorted(:,1:(n-1)),2)/(n-1); %sum(a,2),a矩阵行相加 Xsorted(:,1:2)保留Xsort的1,2列。
中心点坐标。
Fpx=subs(f,var,px); %中心点函数值 SumF=0; for i=1:n
SumF=SumF+(FX(IX(i))-Fpx)^2; %判断收敛 end SumF=sqrt(SumF/(n-1)); if SumF<=eps x=Xsorted(:,1); break; else
bcon_1=1; cof_alpha=alpha;
while bcon_1
x2=px+cof_alpha*(px-Xsorted(:,n)); %算反射点的坐标 gx2=subs(g,var,x2); %看有没有出界 if min(gx2)>=0 bcon_1=0; else
cof_alpha=0.7*(cof_alpha); end end
fx2=subs(f,var,x2); if fx2 x3=x2+cof_gama*(x2-px); gx3=subs(g,var,x3); fx3=subs(f,var,x3); if min(gx3)>=0 bcon_2=0; if fx3 count=2; end else bcon_2=0; count=3 ; end end if count==1 Xsorted(:,n)=x3; X=Xsorted; continue else Xsorted(:,n)=x2; X=Xsorted; continue end else if fx2 %反射点函数值 %扩张步骤,感觉应该用x2代贴第一部分px if fx2 Xsorted(:,n)=x2; cof_beta=beta; bcon_3=1; while bcon_3<4 x4=Xsorted(:,n)+cof_beta*(px-Xsorted(:,n)); gx4=subs(g,var,x4); if min(gx4)>=0 bcon_3=5; else cof_beta=cof_beta/2; bcon_3=bcon_3+1; end end if min(gx4)>=0 fx4=subs(f,var,x4); FNnew=subs(f,var,Xsorted(:,n)); if fx4 x0=Xsorted(:,1); for i=1:n Xsorted(:,i)=x0+sita*(Xsorted(:,i)-x0); end end else x0=Xsorted(:,1); for i=1:n Xsorted(:,i)=x0+sita*(Xsorted(:,i)-x0); X=Xsorted; continue end end else x0=Xsorted(:,1); for i=1:n Xsorted(:,i)=x0+sita*(Xsorted(:,i)-x0); X=Xsorted; continue end end end