%输入: x0是初始点, fun, gfun, Hess 分别是求 % 目标函数,梯度,Hesse 阵的函数
%输出: x, val分别是近似最优点和最优值, k是迭代次数. maxk=100; %给出最大迭代次数 sigma=0.4; k=0; epsilon=1e-5; while(k gk=feval(gfun,x0); %计算梯度 Gk=feval(Hess,x0); %计算Hesse阵 dk=-Gk\\gk'; %解方程组Gk*dk=-gk, 计算搜索方向 if(norm(gk) val=feval(fun,x); 5、frcg.m function [x,val,k]=frcg(fun,gfun,x0) % 功能: 用FR共轭梯度法求解无约束问题: min f(x) %输入: x0是初始点, fun, gfun分别是目标函数和梯度 %输出: x, val分别是近似最优点和最优值, k是迭代次数. maxk=5000; %最大迭代次数 rho=0.6;sigma=0.4; k=0; epsilon=1e-6; n=length(x0); while(k g=feval(gfun,x0); %计算梯度 itern=k-(n+1)*floor(k/(n+1)); itern=itern+1; %计算搜索方向 if(itern==1) d=-g; else beta=(g'*g)/(g0'*g0); d=-g+beta*d0; gd=g'*d; if(gd>=0.0) d=-g; end end if(norm(g) while(m<20) %Armijo搜索 if(feval(fun,x0+rho^m*d) x0=x0+rho^mk*d; val=feval(fun,x0); g0=g; d0=d; k=k+1; end x=x0; val=feval(fun,x); 6、waidianfa.m close all clear all clc syms x1 x2 M; %M为罚因子。 m(1)=1; c=8; %c为递增系数。赋初值。 a(1)=20; b(1)=20; f=(x1-2)^2+x2^2+M*(x1-1)^2; %外点罚函数 f0(1)=500; %求偏导、Hessian元素 fx1=diff(f,'x1'); fx2=diff(f,'x2'); fx1x1=diff(fx1,'x1'); fx1x2=diff(fx1,'x2'); fx2x1=diff(fx2,'x1'); fx2x2=diff(fx2,'x2'); %外点法M迭代循环 for k=1:100 x1=a(k); x2=b(k); M=m(k); %牛顿法求最优值 for n=1:100 f1=subs(fx1); %求解梯度值和Hessian矩阵 f2=subs(fx2); f11=subs(fx1x1); f12=subs(fx1x2); f21=subs(fx2x1); f22=subs(fx2x2); if(double(sqrt(f1^2+f2^2))<=1e-6) %最优值收敛条件 a(k+1)=double(x1);b(k+1)=double(x2);f0(k+1)=double(subs(f)); break; else X=[x1 x2]'-inv([f11 f12;f21 f22])*[f1 f2]'; x1=X(1,1);x2=X(2,1); end end if(double(sqrt((a(k+1)-a(k))^2+(b(k+1)-b(k))^2))<=1e-6)&&(double(abs((f0(k+1)-f0(k))/f0(k)))<=1e-6) %罚因子迭代收敛条件 %输出最优点坐标,罚因子迭代次数,最优值 X=[a(k+1) b(k+1)] step=k F=f0(k+1) break; else m(k+1)=c*m(k); end end