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

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

 

一、实验目的

 

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

 

二、实验内容

 

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

2)终止准则取

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

4)选取几个与实验二实验三中相同的初始点,并给出相关实验结果的对比及分析(从最优解、最优值、收敛速度(迭代次数)等方面进行比较);

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

 

 

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

1. 算法步骤

步骤1:初始点x 0 k = 0,精度要求e10^-5

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

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

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

步骤5x 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 @     阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示