拟牛顿算法一、算法流程图/算法步骤1、DFP 算法:(1)算法步骤:2、BFGS 算法(1)算法步骤:3、模式搜索算法(1)算法步骤:二、程序代码1、DFP 算法%拟牛顿法中 DFP 算法求解 f=x1*x1+2*x2*x2-2*x1*x2-4*x1 的最小值ticformat longsymsx1 x2 r;f= x1*x1+2*x2*x2-2*x1*x2-4*x1;%要最小化的函数x=[x1,x2]; df=jacobian(f,x);%函数 f 的偏导df=df.';x0=[0,0]'; g1=subs(df,x,x0); %起始点的梯度epsilon=1e-6;%0.000001 为搜索精度k=0;H0=[1 0;0 1];%初始矩阵为二阶单位阵while(norm(g1)>epsilon)%迭代终止条件||g1||<=epsilonif k==0d=-H0*g1;%负梯度方向elseH1=H0+pk*pk'/(qk'*pk)-H0*qk*qk'*H0/(qk'*H0*qk);d=-H1*g1;H0=H1;endz=subs(f,x,x0+r*d);%关于 r 的函数result1=jintuifa(z,r);%进退法求下单峰区间result2= gold(z,r,result1);%黄金分割法求最优步长step=result2;x0=x0+step*d;g0=g1;g1=subs(df,x,x0);%gk=double(gk);qk=g1-g0;pk=step*d;k=k+1;endk%最优点x0min=subs(f,[x1 x2],x0)%最优值toc%进退法求下单峰区间function result= jintuifa(y,r)t0=0;step=0.0125;t1=t0+step;ft0=subs(y,{r},{t0});%step1 求 f(t0) 将函数 y 中变量 x 替换为 t0ft1=subs(y,{r},{t1});if (ft1<=ft0)%step3 step4step=2*step;t2=t1+step;ft2=subs(y,{r},{t2});while(ft1>ft2)t1=t2; step=2*step;t2=t1+step;ft1=subs(y,{r},{t1});ft2=subs(y,{r},{t2});endelse%step5 step6step=step/2;t2=t1;t1=t2-step;ft1=subs(y,{r},{t1});while(ft1>ft0)step=step/2;t2=t1;t1=t2-step;ft1=subs(y,{r},{t1});endendresult=[t2];%黄金分割法求最优步长function result=gold(y,r,m)a=0;b=m;e=1e-5;a1=a+0.382*(b-a);%step1f1=subs(y,{r},{a1});a2=a+0.618*(b-a);%step2f2=subs(y,{r},{a2});while(abs(b-a)>e)if f1