2)流程图如下:
给定x0,e>0,n H=[1,0;0,1],x1=x0; 计算此时点梯度模g,函数值z。 g>=e? 停 Xn=x0; fn=z; H=[1,0;0,1]; 计算x1点的模g,梯度矩阵df,赫森矩阵值dff,函数值f。 p=-H*df; 求出最优步长r qr=-(df'*p)/(p'*dff*p); x2=x1+r*p'; 计算在x2的梯度模g Y g>=e? N xn=x2'; fn=f;输出迭代次数k,结束循环。 k= =n? Y N detx=(x2-x1)'; detg=df1-df; Z=H*detg; beta=1/(detx'*detg); miu=1/(Z'*detg); B=beta*detx*detx'; C=miu*Z*Z'; H=H+B-C; x1=x2; x1=x2; k=1; k=k+1;
3)M文件如下:
function [xn,fn]=DFP1(x0,e,n) %这是变尺度法
%输入参数是初始点x0,精度e,和n值 %输出值是极值点xn,和极值 if nargin<1
error('请按要求输入参数!') error('变尺度法') elseif nargin==1 e=0.0000001; n=10; elseif nargin==2 n=10; elseif nargin>3
error('参数输多了!') end
[z,df,dff,g]=fun(x0); k=1; H=[1,0;0,1]; x1=x0; if (g>=e)
for i=1:100000
[f,df,dff,g]=fun(x1); p=-H*df;
r=-(df'*p)/(p'*dff*p); x2=x1+r*p'; [f,df1,dff,g]=fun(x2); if (g>=e) if(k==n) x1=x2; % H=[1,0;0,1]; k=1;
else
detx=(x2-x1)'; detg=df1-df; Z=H*detg; beta=1/(detx'*detg); miu=1/(Z'*detg); B=beta*detx*detx'; C=miu*Z*Z'; H=H+B-C; x1=x2; k=k+1; end else xn=x2'; fn=f; k break end end else xn=x0'; fn=z; end
4)运行效果图
其中x0为迭代初始点,e为迭代精度,k为迭代次数,xn为满足迭代精度的最优解,yn为
函数带入最优解后得到的最优值。
5)评估
从运行效果图可以得到,变尺寸法能非常快地得到满足精度的最优点,获得最优值!
三、fun()函数
为了编程方便将函数表达式,梯度,赫森矩阵和梯度模写在同一个M文件当中。输入的参数是x的值,输出对应的函数表达式,梯度,赫森矩阵和梯度模的值。
该M文件如下:
function [z,df,dff,g]=fun(x) z=100*(x(2)-x(1)^2)^2+(1-x(1))^2;
df=[-400*(x(2)-x(1)^2)*x(1)-2*(1-x(1)),200*(x(2)-x(1)^2)]'; dff=[-400*x(2)+1200*x(1)^2+2,-400*x(1);-400*x(1),200];
g=sqrt((-400*(x(2)-x(1)^2)*x(1)-2*(1-x(1)))^2+(200*(x(2)-x(1)^2))^2);
四、合并两个方法
为了利用最优梯度法的开局和变尺度的收局优势,减少迭代次数,将这两种方法结合起来使用。
下面是该函数的M文件:
function [xn,fn]=GHM(x0,e1,e2,n) x1=OGM(e1,x0)
[x2,f2]=DFP1(x1,e2,n); xn=x2; fn=f2;
运行效果图:
为了使最优梯度法发挥作用,因此任意取得一个初始值,令x0=[-1000,899] 得到运行效果图如下:
经多次试验,本程序从任意初始点收敛于最优点[1,1]得到趋于0的最优值。而且通过最优梯度法和变尺寸法减少了迭代次数。