MATLAB - 共轭梯度法

一、问题描述
       求解系数矩阵A是对称正定矩阵的线性方程组 Ax=b或求解二次函数f(x)=\frac{1}{2}x^{T}Ax-b^{T}x的极小值点。

二、算法

      共轭梯度法,步骤如下:

     1 任意给定初始点x^{^{0}}及精度\varepsilon >0

     2  d^{(0)}=r^{(0)}=b-Ax

     3  对于k=0,1,...,n-1,作

          1)a_{(k)}=\frac{\left \| r^{(k)} \right \|\begin{matrix} 2 \\ 2 \end{matrix}}{<d^{(k)},Ad^{(k)}>}

          2) x^{(k+1)}=x^{(k)}+a_{(k)}d^{(k)}

          3) r^{^{(k+1)}}=b-Ax^{(k+1)} ,或 r^{(k+1)}=b-Ax^{(k+1)}=b-A(x^{(k)}+a_{(k)}d^{(k)})=r^{(k)}-a_{(k)}Ad^{(k)}

          4) 若\frac{\left \| r^{(k+1)} \right \|}{\left \| b \right \|}\leq \varepsilonk+1=n,则输出x^{(k+1)}r^{(k+1)},取r^{(k+1)}作为Ax=b的解,否则

          5)   

                  \beta _{(k+1),k}=\frac{\left \| r^{(k+1)} \right \|\begin{matrix} 2\\ 2 \end{matrix}}{\left \| r^{(k)}\right \|\begin{matrix} 2\\ 2 \end{matrix}}

          6)     d^{(k+1)}=r^{(k+1)}+\beta _{(k+1),k}d^{(k)}.

   MATLAB代码:

function CGM_main()
A = [10 1 2 3 4
    1 9 -1 2 -3
    2 -1 7 3 -5
    3 2 3 12 -1
    4 -3 -5 -1 15];
b=[12 -27 14 -17 12]';
x0=[0 0 0 0 0]';
max_iter=10000;

fprintf('\n');
fprintf('共轭梯度法:\n');
fprintf('==========================\n');
[y,iter]=cgm (A,b,x0,max_iter);
fprintf('\n');
fprintf('迭代次数:\n   %d \n',iter);
fprintf('方程的解: \n');
fprintf('%10.6f',y);
fprintf('\n\n=========================\n\n');
end

function [x,iter] = cgm (A,b,x0,max_iter)
x=x0;
epsilon=1.0e-6;
fprintf('\n x0= ');
fprintf('   %10.6f',x0);
r=b-A*x;
d=r;
for k=0:max_iter
    alpha=(r'*r)/(d'*A*d);
    xx=x+alpha*d;
    rr=b-A*xx;
    if (norm(rr,2)/norm(b,2))<= epsilon
        fprintf('\n 找到啦~');
        iter = k+1;
        x=xx;
        r=rr;
        fprintf('\n x%d = ',k+1);
        fprintf('   %10.6f',x);
        fprintf('\n r%d = ',k+1);
        fprintf('   %10.6f',r);
        
        return
    end
    beta=(rr'*rr)/(r'*r);
    d=rr+beta*d;
    x=xx;
    r=rr;
    fprintf('\n x%d = ',k+1);
    fprintf('   %10.6f',x);
end
iter = max_iter;
return 
end

    运行结果:

共轭梯度法:
==========================

 x0=      0.000000     0.000000     0.000000     0.000000     0.000000
 x1 =      1.073560    -2.415510     1.252487    -1.520877     1.073560
 x2 =      1.305605    -2.627981     2.146636    -1.694270     0.442393
 x3 =      1.446618    -2.225384     2.448048    -1.970691     0.620722
 x4 =      1.086550    -2.063574     2.792911    -2.101645     0.836386
 找到啦~
 x5 =      1.000000    -2.000000     3.000000    -2.000000     1.000000
 r5 =      0.000000     0.000000    -0.000000    -0.000000     0.000000
迭代次数:
   5 
方程的解: 
  1.000000 -2.000000  3.000000 -2.000000  1.000000

===================== 

注:编写MATLAB程序时主函数一定请放在最前面...


参考文献:
[1] MATLAB R2014官方手册
[2] 近代优化方法,徐成贤,陈志平,李乃成编著.科学出版社,2002.
[3] 最优化方法(第二版).孙文瑜,徐成贤,朱德通编著.高等教育出版社,2010.
 

  • 21
    点赞
  • 223
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值