共轭梯度法matlab代码_线性方程组(4)-变分原理与共轭梯度法

093d8c582cf72c5dd936dc26aa9ec91c.png

上一节讲到了静态迭代法。因为收敛太慢,更常用的还是非静态迭代法。

这里先从变分原理入手。考虑函数

equation?tex=%5CPhi%5Cleft%28%5Cvec%7Bx%7D%5Cright%29%3D%5Cfrac%7B1%7D%7B2%7D%5Cvec%7Bx%7D%5Ccdot+A%5Cvec%7Bx%7D-%5Cvec%7Bx%7D%5Ccdot+%5Cvec%7Bb%7D

equation?tex=A 对称,则函数的梯度

equation?tex=%5Cnabla+%5CPhi%5Cleft%28%5Cvec%7Bx%7D%5Cright%29%3DA%5Cvec%7Bx%7D-+%5Cvec%7Bb%7D

equation?tex=A 对称正定,则解方程
equation?tex=A%5Cvec%7Bx%7D%3D+%5Cvec%7Bb%7D 等价于求函数
equation?tex=%5CPhi%5Cleft%28%5Cvec%7Bx%7D%5Cright%29 的最小值。方程的残差
equation?tex=%5Cvec%7Br%7D%3D%5Cvec%7Bb%7D-A%5Cvec%7Bx%7D 即为函数
equation?tex=%5CPhi%5Cleft%28%5Cvec%7Bx%7D%5Cright%29 的负梯度。

一维优化问题

假设已经得到了

equation?tex=k-1 步迭代的解
equation?tex=%5Cvec%7Bx%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D ,在第
equation?tex=k 步中,沿
equation?tex=%5Cvec%7Bp_k%7D 方向搜索最优解,即

equation?tex=%5Cvec%7Bx%7D%5E%7B%5Cleft%28k%5Cright%29%7D%3D%5Cvec%7Bx%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D%2B%5Calpha_k%5Cvec%7Bp_k%7D

代入函数表达式可得

equation?tex=%5CPhi%5Cleft%28%5Cvec%7Bx%7D%5E%7B%5Cleft%28k%5Cright%29%7D%5Cright%29%3D%5Cfrac%7B1%7D%7B2%7D%5Cvec%7Bp_k%7D%5Ccdot+A%5Cvec%7Bp_k%7D%5Calpha_k%5E2-%5Cleft%28%5Cvec%7Bb%7D-A%5Cvec%7Bx%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D%5Cright%29%5Ccdot%5Cvec%7Bp_k%7D%5Calpha_k%2B%5Cfrac%7B1%7D%7B2%7D%5Cvec%7Bx%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D%5Ccdot+A%5Cvec%7Bx%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D-%5Cvec%7Bx%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D%5Ccdot+%5Cvec%7Bb%7D

最优的

equation?tex=%5Calpha_k 取值应是

equation?tex=%5Calpha_k+%3D+%5Cfrac%7B%5Cleft%28%5Cvec%7Bb%7D-A%5Cvec%7Bx%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D%5Cright%29%5Ccdot%5Cvec%7Bp_k%7D%7D%7B%5Cvec%7Bp_k%7D%5Ccdot+A%5Cvec%7Bp_k%7D%7D%3D%5Cfrac%7B+%5Cvec%7Br%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D%5Ccdot%5Cvec%7Bp_k%7D%7D%7B%5Cvec%7Bp_k%7D%5Ccdot+A%5Cvec%7Bp_k%7D%7D

得到新的解后,新的残差

equation?tex=%5Cvec%7Br%7D%5E%7B%5Cleft%28k%5Cright%29%7D%3D%5Cvec%7Br%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D-%5Calpha_k+A%5Cvec%7Bp_k%7D

最速下降法(Steepest descent method)

搜索方向的最简单的取法就是取

equation?tex=%5Cvec%7Bp_k%7D%3D%5Cvec%7Br%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D ,即负梯度方向,这就是优化问题中很常用的最速下降法。用MATLAB代码描述
function [x, iter] = sd_solve(A, b, x0, epsilon, iter_max)
    iter = 0;
    x = x0;
    r = b - A * x0;
    rr = dot(r, r);
    while sqrt(rr) >= epsilon && iter < iter_max
        iter = iter + 1;
        Ar = A * r;
        alpha = rr / dot(r, Ar);
        x = x + alpha * r;
        r = r - alpha * Ar;
        rr = dot(r, r);
    end
end

注意提取出了

equation?tex=%5Cvec%7Br%7D%5Ccdot+%5Cvec%7Br%7D
equation?tex=A%5Cvec%7Br%7D 两个公共表达式,避免了重复计算。

每一步迭代需要计算一次矩阵向量乘,两次向量内积,两次向量线性组合。

注意到

equation?tex=%5Cvec%7Br%7D%5E%7B%5Cleft%28k%5Cright%29%7D 的计算可能有误差积累,干扰迭代终止条件的判断,使得迭代在达到要求的精度之前终止。可能的解决方法有:用
  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值