约束优化方法与MATLAB实现.docx
- 文档编号:27797025
- 上传时间:2023-07-05
- 格式:DOCX
- 页数:19
- 大小:33.17KB
约束优化方法与MATLAB实现.docx
《约束优化方法与MATLAB实现.docx》由会员分享,可在线阅读,更多相关《约束优化方法与MATLAB实现.docx(19页珍藏版)》请在冰豆网上搜索。
约束优化方法与MATLAB实现
例5-1MATLAB实现,用M函数文件形式求解:
symsst
f=(s-5)^2+4*(t-6)^2;
g=[s^2+t^2-64;s-t+10;10-s];
X=[6.27.88.2;11129.8];
[x,minf]=minconSimpSearch2(f,g,X,1.3,0.7,1,0.7,[st])
复合形法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:
目标函数的最小值
ifnargin==8%函数参量个数
eps=1.0e-6;
end
N=size(X);
n=N
(2);
FX=zeros(1,n);
while1
fori=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;
fori=1:
n
SumF=SumF+(FX(IX(i))-Fpx)^2;%判断收敛end
SumF=sqrt(SumF/(n-1));
ifSumF<=eps
x=Xsorted(:
1);
break;
else
bcon_1=1;
cof_alpha=alpha;
whilebcon_1
x2=px+cof_alpha*(px-Xsorted(:
n));%算反射点的坐标
gx2=subs(g,var,x2);%看有没有出界
ifmin(gx2)>=0
bcon_1=0;
else
cof_alpha=0.7*(cof_alpha);
end
end
fx2=subs(f,var,x2);%反射点函数值
iffx2 (1) cof_gama=gama; bcon_2=1; whilebcon_2 x3=x2+cof_gama*(x2-px);%扩张步骤,感觉应该用x2代贴第一部分px gx3=subs(g,var,x3); fx3=subs(f,var,x3); ifmin(gx3)>=0 bcon_2=0; iffx3 (1) count=1; else count=2; end else bcon_2=0; count=3; end end ifcount==1 Xsorted(: n)=x3; X=Xsorted; continue else Xsorted(: n)=x2; X=Xsorted; continue end else iffx2 Xsorted(: n)=x2; X=Xsorted; continue else iffx2 Xsorted(: n)=x2; cof_beta=beta; bcon_3=1; whilebcon_3<4 x4=Xsorted(: n)+cof_beta*(px-Xsorted(: n)); gx4=subs(g,var,x4); ifmin(gx4)>=0 bcon_3=5; else cof_beta=cof_beta/2; bcon_3=bcon_3+1; end end ifmin(gx4)>=0 fx4=subs(f,var,x4); FNnew=subs(f,var,Xsorted(: n)); iffx4 Xsorted(: n)=x4; X=Xsorted; continue else x0=Xsorted(: 1); fori=1: n Xsorted(: i)=x0+sita*(Xsorted(: i)-x0); end end else x0=Xsorted(: 1); fori=1: n Xsorted(: i)=x0+sita*(Xsorted(: i)-x0); X=Xsorted; continue end end else x0=Xsorted(: 1); fori=1: n Xsorted(: i)=x0+sita*(Xsorted(: i)-x0); X=Xsorted; continue end end end end end X=Xsorted; end minf=subs(f,var,x); M函数文件的运行结果如下: x=5.2186 6.0635 minf=0.0639 ==================================================================== 例5-2MATLAB实现,用M函数文件形式求解: symsts; f=(t-1)^2+(s-2)^2+1; [x,mf]=minRosen(f,[-21;-1-1],[-1;-2],[0,0],[ts]) Rosen梯度法投影法函数文件minRosen如下: function[x,minf]=minRosen(f,A,b,x0,var,eps) %目标函数: f; %约束矩阵: A; %约束右端常数向量: b; %初始可行点: x0; %自变量向量: var; %精度: eps; %目标函数最小值时的自变量值: x; %目标函数的最小值: minf; formatlong; ifnargin==5 eps=1.0e-6; end symsl; x0=transpose(x0); n=length(var); sz=size(A); m=sz (1); gf=jacobian(f,var); bConti=1; whilebConti k=0; s=0; A1=A; A2=A; b1=b; b2=b; fori=1: m dfun=A(i,: )*x0-b(i); ifabs(dfun)<0.000000001%对约束条件的系数矩阵和向量做分解 k=k+1; A1(k,: )=A(i,: );%A1代表等式约束系数矩阵 b1(k,1)=b(i);%b1代表等式约束向量 else s=s+1; A2(s,: )=A(i,: );%A2代表不等式约束系数矩阵 b2(s,1)=b(i);%b2代表不等式约束系数矩阵 end end ifk>0 A1=A1(1: k,: ); b1=b1(1: k,: ); end ifs>0 A2=A2(1: s,: ); b2=b2(1: s,: ); end while1 P=eye(n,n); ifk>0 tM=transpose(A1); P=P-tM*inv(A1*tM)*A1; end gv=subs(gf,var,x0); gv=transpose(gv); d=-P*gv;%d搜索方向 ifd==0 ifk==0 x=x0; bConti=0; break; else w=inv(A1*tM)*A1*gv; ifw>=0%W分量全为正 x=x0; bConti=0; break; else [u,index]=min(w); sA1=size(A1); ifsA1 (1)==1 k=0; else k=sA1 (2);%选择W的一个负分量 A1=[A1(1: (index-1),: );A1((index+1): sA1 (2),: )];%去掉A1对应的行 end end end else break; end end yl=x0+l*d; tmpf=subs(f,var,yl); bb=b2-A2*x0; dd=A2*d; ifdd>=0 [tmpI,lm]=minJT(tmpf,0,0.1);%用进退法确定一维极值问题的极值区间 else lm=inf; fori=1: length(dd) ifdd(i)<0 ifbb(i)/dd(i) lm=bb(i)/dd(i); end end end end [xm,minf]=minHJ(tmpf,0,lm,1.0e-14);%用黄金分割法求解一维极值问题 tol=norm(xm*d); iftol x=x0; break; end x0=x0+xm*d; end minf=subs(f,var,x); M函数文件的运行结果如下: x=0.5000 1.5000 mf=1.5000 =========================================================== 例5-3MATLAB实现,用M函数文件形式求解: symst; a=4;b=3; f=a*t; g=[t-b]; [x,minf]=minNF(f,[5],g,10,0.5,[t]) 内点惩罚函数法文件minNF如下: function[x,minf]=minNF(f,x0,g,u,v,var,eps) %目标函数: f; %初始点: x0; %约束函数: g; %罚因子: u; %缩小系数: v; %自变量向量: var; %精度: eps; %目标函数取最小值时的自变量: x; %目标函数的最小值: minf; formatlong; ifnargin==6 eps=1.0e-6; end k=0; FE=0; fori=1: length(g) FE=FE+1/g(i);%构造罚函数 end x1=transpose(x0); x2=inf; while1 FF=u*FE; SumF=f+FF; [x2,minf]=minNT(SumF,transpose(x1),var);%用牛顿法求解无约束优化 Bx=subs(FE,var,x2); ifu*Bx ifnorm(x2-x1)<=eps x=x2; break; else u=v*u;%修正参数 x1=x2; end else ifnorm(x2-x1)<=eps x=x2; break; else u=v*u;%修正参数 x1=x2; end end end minf=subs(f,var,x); formatshort; M函数文件的运行结果如下: x=3.0000 minf=12.0000 ================================================================= 例5-5用混合惩罚函数法求解下列优化问题 取初始点 。 解: MATLAB实现,用M函数文件形式求解: symsst; f=s^2-s*t+1; g=[s^2+t^2-15;s;t];h=[2*s+3*t-20]; [x,minf]=minMixFun(f,g,h,[33],2,0.5,[st]) 混合惩罚函数法文件minMixFun如下: function[x,minf]=minMixFun(f,g,h,x0,r0,c,var,eps) %目标函数: f; %不等式约束: g; %初始点: x0; %罚因子: r0; %缩小系数: c; %自变量向量: var; %精度: eps; %目标函数取最小值时的自变量: x; %目标函数的最小值: minf; gx0=subs(g,var,x0); ifgx0>=0; else disp('初始点必须满足不等式约束! '); x=NaN; minf=NaN; return; end ifr0<=0 disp('初始障碍因子必须大于0! '); x=NaN; minf=NaN; return; end ifc>=1||c<0 disp('缩小系数必须大于0且小于1! '); x=NaN; minf=NaN; return; end ifnargin==7 eps=1.0e-6; end FE=0; fori=1: length(g) FE=FE+1/g(i); end FH=transpose(h)*h; x1=transpose(x0); x2=inf; while1 FF=r0*FE+FH/sqrt(r0); SumF=f+FF; [x2,minf]=minNT(SumF,transpose(x1),var); ifnorm(x2-x1)<=eps x=x2; break; else r0=c*r0; x1=x2; end end minf=subs(f,var,x); M函数文件的运行结果如下: x=2.0000 5.3333 minf=-5.6667 ===================================================================== 例5-6用函数fmincon求解约束优化问题 s.t 解: 首先编制两个M文件,分别保存目标函数和约束函数 目标函数M文件 functionf=objfun(x) f=5*x (1)^2+2*x (2)^2; 约束函数M文件 function[c,ceq]=confun(x) c=1.5/x (1)-x (2); ceq=[]; 调用优化工具箱fmincon解上述问题 [X,FVAL,EXITFLAG,OUTPUT,LAMBDA,GRAD,HESSIAN]=fmincon(@objfun,[12],[],[],[],[],[],[],@confun) 运行结果如下: Warning: Large-scale(trustregion)methoddoesnotcurrentlysolvethistypeofproblem,switchingtomedium-scale(linesearch). >Infminconat260 Optimizationterminated: first-orderoptimalitymeasurelessthanoptions.TolFunandmaximumconstraintviolationislessthanoptions.TolCon. Activeinequalities(towithinoptions.TolCon=1e-006): lowerupperineqlinineqnonlin 1 X=0.97401.5400 FVAL=9.4868 EXITFLAG=1 OUTPUT= iterations: 7 funcCount: 33 stepsize: 1 algorithm: 'medium-scale: SQP,Quasi-Newton,line-search' firstorderopt: 1.8905e-007 cgiterations: [] message: [1x144char] LAMBDA= lower: [2x1double] upper: [2x1double] eqlin: [1x0double] eqnonlin: [1x0double] ineqlin: [1x0double] ineqnonlin: 6.1601 GRAD=9.7400 6.1601 HESSIAN=24.6592-3.5437 -3.54371.6534 具体参数分析,fmincon函数介绍。 ==================================================================== 例5-7用函数fmincon求解约束优化问题 s.t 解: 首先建立目标函数M文件 functiony=optimFun(x) y=x (1)^4-4*x (1)-8*x (2)+15; 根据题目约束条件知,约束条件中既有线性约束,又有非线性约束,因此必须分别处理。 根据线性约束条件有 建立非线性约束M文件 function[c,ceq]=Fxxconfun(x) c=9-x (1)^2-x (2)^2; ceq=[]; 调用优化工具箱fmincon函数求解 [x,fval,exitflag,output]=fmincon(@optimFun,[12],A,b,[],[],[],[],@fxxconfun) 运行结果如下: Warning: Large-scale(trustregion)methoddoesnotcurrentlysolvethistypeofproblem,switchingtomedium-scale(linesearch). >Infminconat260 Optimizationterminated: Magnitudeofdirectionalderivativeinsearchdirectionlessthan2*options.TolFunandmaximumconstraintviolationislessthanoptions.TolCon. Noactiveinequalities x=1.2420-2.7308 fval=34.2582 exitflag=5 output=iterations: 17 funcCount: 74 stepsize: 1 algorithm: 'medium-scale: SQP,Quasi-Newton,line-search' firstorderopt: 0.0203 cgiterations: [] message: [1x172char]
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 约束 优化 方法 MATLAB 实现