共轭梯度法 (CG) 解线性方程组

求解线性方程组:Ax=bAx = bAx=b其中 A∈S++m⊂Rm×mA\in S^m_{++} \subset \R^{m\times m}AS++mRm×mb∈Rmb \in \R^mbRm

共轭梯度法的matlab实现:

function [x] = CG(A,b)

x = 0;   // 迭代初值
r = b;   // 初始残差
i_max = 50;  // 最大迭代次数
yita = 1e-6; // 残差限度

i = 0;
while sqrt(r'*r)> yita && i<i_max
    i = i+1;
    if i == 1
        p = r;
    else
        beta = r'*r/(r_before'*r_before);
        p = r + beta*p;
    end
    alpha = r'*r/(p'*A*p);
    x = x + alpha*p;
    r_before = r;
    r = r - alpha*A*p;
end

短短几行,效果奇佳。

测试:

A = rand(20,20);
A = A*A';

xs = randn(20,1);

b = A*xs;

norm(xs - CG(A,b))

输出:

ans =

   1.8305e-08

需要注意的是,方阵 A 必须是对称正定的,否则无法得到正确结果例如:

A = rand(20,19);
A = A*A';  % 此时 A 的秩为 19, 非满秩,半正定!

xs = randn(20,1);

b = A*xs;

norm(xs - CG(A,b))

误差就很大了!

ans =

    0.3442
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

颹蕭蕭

白嫖?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值