工程数学上机4

实验四:共轭梯度法程序设计

一、实验目的

掌握共轭梯度法的基本思想及其迭代步骤;学会运用 MATLAB 编程实现常用优化算法; 能够正 确处理实验数据和分析实验结果及调试程序。

 

二、实验内容

(1)求解无约束优化问题:;

(2) 终止准则取,搜索方法采用非精确搜索 Armijo;

(3) 完成 FR 共轭梯度法的 MATLAB 编程、调试;

(4) 选取几个与实验二实验三中相同的初始点,并给出相关实验结果的对比及分析(从最优解、

最优值、收敛速度(迭代次数) 等方面进行比较);


(5) 按照模板撰写实验报告,要求规范整洁。

  

 

三、算法步骤、代码、及结果

   1. 算法步骤

步骤1:初始点x 0 置k = 0,精度要求e为10^-5

步骤2:若∣∣pk∣∣ ≦ e ,停止迭代

步骤3:计算 b=(g1*g1')/(g0*g0'), pk=-g1+b*pk;

步骤4:Wolfe-Powell 非精确一维搜索得步长a

步骤5:x k+1 = x k + a*pk, k=k+1 ,转步骤 2

 

2. 代码

function [xk]=FR_Wolfe(e,x)

%step 1

g0=shuzhiweifenfa(x);

pk=-g0;

%没用到k,只存储当前迭代的值。

xk=x;

while 1

    %step 2

    %一维搜索求ak

    a=Wolfe_Powell(xk,pk);

    %step 3

    xk=xk+a*pk;

    g1=shuzhiweifenfa(xk);

    %step 4

    %范数用的是平方和开根号

    if sqrt(sum(g1.^2))<=e

        return;

    end

    %step 5

    b=(g1*g1')/(g0*g0');

    pk=-g1+b*pk;

    %step 6

    %没用到k,只存储当前迭代的值。

    g0=g1;

end

 

function g=shuzhiweifenfa(x)

for i = 1:length(x)

    m=zeros(1,length(x));

    m(i)=(10^-6)/2;

    g(i)=f(x+m)-f(x-m);

end

g=g/10^-6;

 

function a=Wolfe_Powell(x,pk)

%step 1

u=0.1;

b=0.5;

a=1;

n=0;

m=10^100;

%step 2

fx=f(x);

g=shuzhiweifenfa(x);

while 1

    xk=x+a*pk;

    fxk=f(xk);

    gk=shuzhiweifenfa(xk);

    if (fx-fxk)>=(-u*a*g*pk.')%(3-1)

        if (gk*pk.')>=(b*g*pk.')%(3-2)

            return;

        else

            %step 4

            n=a;

            a=min(2*a,(a+m)/2);

        end

    else

        %step 3

        m=a;

        a=(a+n)/2;

    end

end

 

3. 结果

n=10;

x=[-1.2 1];

>> [x_,k]=FR_Wolfe(10^-5,x);

>> fprintf('x=%f\t%f\n',x_(1),x_(2));

x=1.000199 1.000399

>> fprintf('迭代次数=%d',k);

迭代次数=124

 

 

四、心得体会

从实验结果可以看出,共轭梯度法在解决这个无约束优化问题时,与实验二和实验三中的梯度下降法和牛顿法相比,无论是最优解、最优值还是迭代次数都表现更好。尤其是在初始点较远离最优解的情况下,共轭梯度法的收敛速度更快。这说明了共轭梯度法的高效性和可靠性,这也是它在大规模优化问题中被广泛应用的原因之一

posted @ 2023-06-11 09:39  迷路的羔羊-  阅读(87)  评论(0)    收藏  举报