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

本文从变分原理出发,介绍了共轭梯度法(CG)的理论基础,包括最速下降法的局限性和CG法的优势。详细阐述了CG法的迭代过程,给出MATLAB代码示例,并讨论了其收敛性、适用条件及其在非对称矩阵中的变种,如双共轭梯度法和稳定双共轭梯度法。
摘要由CSDN通过智能技术生成

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 的计算可能有误差积累,干扰迭代终止条件的判断,使得迭代在达到要求的精度之前终止。可能的解决方法有:用
equation?tex=%5Cvec%7Br%7D%5E%7B%5Cleft%28k%5Cright%29%7D%3D%5Cvec%7Bb%7D-A%5Cvec%7Bx%7D%5E%7B%5Cleft%28k%5Cright%29%7D 来计算更精确的残差,引入一次额外的矩阵向量乘;或用更小的
equation?tex=%5Cvarepsilon ;或用其它迭代终止条件。

假设精确解为

equation?tex=%5Cvec%7Bx%7D%5E%2A ,则有结论

equation?tex=%5ClVert+%5Cvec%7Bx%7D%5E%7B%5Cleft%28k%5Cright%29%7D-%5Cvec%7Bx%7D%5E%7B%2A%7D%5CrVert+%5Cleqslant+%5Cfrac%7B%5Clambda_%7Bmax%7D-%5Clambda_%7Bmin%7D%7D%7B%5Clambda_%7Bmax%7D%2B%5Clambda_%7Bmin%7D%7D%5ClVert+%5Cvec%7Bx%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D-%5Cvec%7Bx%7D%5E%7B%2A%7D%5CrVert%3D%5Cfrac%7Bcond%5Cleft%28A%5Cright%29-1%7D%7Bcond%5Cleft%28A%5Cright%29%2B1%7D%5ClVert+%5Cvec%7Bx%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D-%5Cvec%7Bx%7D%5E%7B%2A%7D%5CrVert

共轭梯度法(Conjugate gradient method, CG)

假设前

equation?tex=k-1 步使用的搜索方向是线性无关的向量
equation?tex=%5Cvec%7Bp_1%7D%2C%5Cvec%7Bp_2%7D%2C%5Cdots%2C%5Cvec%7Bp_%7Bk-1%7D%7D ,而且前
equation?tex=k-1 步得到的
equation?tex=%5Cvec%7Bx%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D 满足

equation?tex=+%5CPhi%5Cleft%28%5Cvec%7Bx%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D%5Cright%29%3D%5Cmin_%7B%5Cvec%7Bx%7D%5Cin+span%5Cleft%5C%7B%5Cvec%7Bp_1%7D%2C%5Cvec%7Bp_2%7D%2C%5Cdots%2C%5Cvec%7Bp_%7Bk-1%7D%7D%5Cright%5C%7D%7D+%5CPhi%5Cleft%28%5Cvec%7Bx%7D%5Cright%29

且希望第

equation?tex=k 步得到的结果

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%5Cmin_%7B%5Cvec%7Bx%7D%5Cin+span%5Cleft%5C%7B%5Cvec%7Bp_1%7D%2C%5Cvec%7Bp_2%7D%2C%5Cdots%2C%5Cvec%7Bp_%7Bk%7D%7D%5Cright%5C%7D%7D+%5CPhi%5Cleft%28%5Cvec%7Bx%7D%5Cright%29

equation?tex=%5Cvec%7Bx%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D
equation?tex=%5Cvec%7Bx%7D%5E%7B%5Cleft%28k%5Cright%29%7D 在子空间中展开

equation?tex=%5Cvec%7Bx%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D%3D%5Csum_%7Bi%3D1%7D%5E%7Bk-1%7D%5Calpha_i%5Cvec%7Bp_%7Bi%7D%7D

equation?tex=%5Cvec%7Bx%7D%5E%7B%5Cleft%28k%5Cright%29%7D%3D%5Csum_%7Bi%3D1%7D%5E%7Bk%7D%5Calpha_i%5Cvec%7Bp_%7Bi%7D%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-%5Cvec%7Bb%7D%5Ccdot%5Cvec%7Bp_k%7D%5Calpha_k-A%5Cvec%7Bx%7D%5E%7B%5Cleft%28k%5Cright%29%7D%5Ccdot%5Cvec%7Bp_k%7D%5Calpha_k%2B+%5CPhi%5Cleft%28%5Cvec%7Bx%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D%5Cright%29

对于

equation?tex=i%3D1%2C2%2C%5Ccdots%2Ck-1

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

由前面的条件

equation?tex=%5Cfrac%7B%5Cpartial%7D%7B%5Cpartial%5Calpha_i%7D+%5CPhi%5Cleft%28%5Cvec%7Bx%7D%5E%7B%5Cleft%28k%5Cright%29%7D%5Cright%29%3D%5Cfrac%7B%5Cpartial%7D%7B%5Cpartial%5Calpha_i%7D+%5CPhi%5Cleft%28%5Cvec%7Bx%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D%5Cright%29%3D0

得到

equation?tex=%5Cvec%7Bp_k%7D%5Ccdot+A%5Cvec%7Bp_i%7D%3D0

这就是共轭梯度法,即选择两两

equation?tex=A 共轭的一系列搜索方向。仅有这个约束还不足以确定
equation?tex=%5Cvec%7Bp_k%7D ,为了得到一个确定的搜索方向,我们选择将
equation?tex=%5Cvec%7Br%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D
equation?tex=A%5Cvec%7Bp_i%7D 正交化

equation?tex=%5Cvec%7Bp_k%7D%3D%5Cvec%7Br%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D-%5Csum_%7Bi%3D1%7D%5E%7Bk-1%7D%5Cgamma_i+A%5Cvec%7Bp_i%7D

其中

equation?tex=%5Cgamma_i 是使得
equation?tex=%5ClVert%5Cvec%7Bp_k%7D%5CrVert 最小的系数(垂线最短)。

为了下面的推导,先提出一个引理,证明留作练习(提示:数学归纳法)

equation?tex=span%5Cleft%5C%7B%5Cvec%7Bp_1%7D%2C%5Cvec%7Bp_2%7D%2C%5Cdots%2C%5Cvec%7Bp_%7Bk%7D%7D%5Cright%5C%7D%3Dspan%5Cleft%5C%7B%5Cvec%7Br%7D%5E%7B%5Cleft%280%5Cright%29%7D%2C%5Cvec%7Br%7D%5E%7B%5Cleft%281%5Cright%29%7D%2C%5Cdots%2C%5Cvec%7Br%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D%5Cright%5C%7D

equation?tex=%3Dspan%5Cleft%5C%7B%5Cvec%7Bb%7D%2CA%5Cvec%7Bb%7D%2C%5Cdots%2CA%5E%7Bk-1%7D%5Cvec%7Bb%7D%5Cright%5C%7D

equation?tex=+%5CPhi%5Cleft%28%5Cvec%7Bx%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D%5Cright%29%3D%5Cmin_%7B%5Cvec%7Bx%7D%5Cin+span%5Cleft%5C%7B%5Cvec%7Bp_1%7D%2C%5Cvec%7Bp_2%7D%2C%5Cdots%2C%5Cvec%7Bp_%7Bk-1%7D%7D%5Cright%5C%7D%7D+%5CPhi%5Cleft%28%5Cvec%7Bx%7D%5Cright%29

可知

equation?tex=%5Cvec%7Br%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D%3D-%5Cnabla+%5CPhi%5Cleft%28%5Cvec%7Bx%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D%5Cright%29 正交于
equation?tex=+span%5Cleft%5C%7B%5Cvec%7Bp_1%7D%2C%5Cvec%7Bp_2%7D%2C%5Cdots%2C%5Cvec%7Bp_%7Bk-1%7D%7D%5Cright%5C%7D ,再根据引理可以推出下面的推导中所需要的所有正交关系。

因为

equation?tex=%5Cvec%7Br%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D%3D%5Cvec%7Br%7D%5E%7B%5Cleft%28k-2%5Cright%29%7D-%5Calpha_%7Bk-1%7DA%5Cvec%7Bp_%7Bk-1%7D%7D

equation?tex=%5Cvec%7Bp_k%7D%3D%5Cvec%7Br%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D-%5Csum_%7Bi%3D1%7D%5E%7Bk-1%7D%5Cgamma_i+A%5Cvec%7Bp_i%7D

所以

equation?tex=%5Cvec%7Bp_k%7D%3D%5Cvec%7Br%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D%2B%5Cfrac%7B%5Cgamma_%7Bk-1%7D%7D%7B%5Calpha_%7Bk-1%7D%7D%5Cleft%28%5Cvec%7Br%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D-%5Cvec%7Br%7D%5E%7B%5Cleft%28k-2%5Cright%29%7D%5Cright%29-%5Csum_%7Bi%3D1%7D%5E%7Bk-2%7D%5Cgamma_i+A%5Cvec%7Bp_i%7D

equation?tex=%3D%5Cleft%281%2B%5Cfrac%7B%5Cgamma_%7Bk-1%7D%7D%7B%5Calpha_%7Bk-1%7D%7D%5Cright%29%5Cvec%7Br%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D-%5Cfrac%7B%5Cgamma_%7Bk-1%7D%7D%7B%5Calpha_%7Bk-1%7D%7D%5Cleft%28%5Cvec%7Br%7D%5E%7B%5Cleft%28k-2%5Cright%29%7D%2B%5Csum_%7Bi%3D1%7D%5E%7Bk-2%7D%5Cfrac%7B%5Calpha_%7Bk-1%7D%7D%7B%5Cgamma_%7Bk-1%7D%7D%5Cgamma_i+A%5Cvec%7Bp_i%7D%5Cright%29

因为

equation?tex=%5Cvec%7Br%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D 正交于
equation?tex=span%5Cleft%5C%7B%5Cvec%7Br%7D%5E%7B%5Cleft%28k-2%5Cright%29%7D%2CA%5Cvec%7Bp_1%7D%2C%5Cdots%2CA%5Cvec%7Bp_%7Bk-2%7D%7D%5Cright%5C%7D

equation?tex=%5ClVert%5Cvec%7Bp_k%7D%5CrVert%5E2%3D%5ClVert%5Cleft%281%2B%5Cfrac%7B%5Cgamma_%7Bk-1%7D%7D%7B%5Calpha_%7Bk-1%7D%7D%5Cright%29%5Cvec%7Br%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D%5CrVert%5E2%2B%5ClVert%5Cfrac%7B%5Cgamma_%7Bk-1%7D%7D%7B%5Calpha_%7Bk-1%7D%7D%5Cleft%28%5Cvec%7Br%7D%5E%7B%5Cleft%28k-2%5Cright%29%7D%2B%5Csum_%7Bi%3D1%7D%5E%7Bk-2%7D%5Cfrac%7B%5Calpha_%7Bk-1%7D%7D%7B%5Cgamma_%7Bk-1%7D%7D%5Cgamma_i+A%5Cvec%7Bp_i%7D%5Cright%29%5CrVert%5E2

根据归纳假设,第二项在

equation?tex=%5Cvec%7Br%7D%5E%7B%5Cleft%28k-2%5Cright%29%7D-%5Csum_%7Bi%3D1%7D%5E%7Bk-2%7D%5Cfrac%7B%5Calpha_%7Bk-1%7D%7D%7B%5Cgamma_%7Bk-1%7D%7D%5Cgamma_i+A%5Cvec%7Bp_i%7D%3D%5Cvec%7Bp_%7Bk-1%7D%7D 时取最小值,所以

equation?tex=%5Cvec%7Bp_k%7D%3D%5Cleft%281%2B%5Cfrac%7B%5Cgamma_%7Bk-1%7D%7D%7B%5Calpha_%7Bk-1%7D%7D%5Cright%29%5Cvec%7Br%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D-%5Cfrac%7B%5Cgamma_%7Bk-1%7D%7D%7B%5Calpha_%7Bk-1%7D%7D%5Cvec%7Bp_%7Bk-1%7D%7D

又因为我们只关心

equation?tex=%5Cvec%7Bp_k%7D 的方向,不关心其大小,可以写成

equation?tex=%5Cvec%7Bp_k%7D%3D%5Cvec%7Br%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D%2B%5Cbeta_%7Bk%7D%5Cvec%7Bp_%7Bk-1%7D%7D

equation?tex=%5Calpha_k 的计算式可以继续简化

equation?tex=%5Calpha_k+%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%3D%5Cfrac%7B+%5Cvec%7Br%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D%5Ccdot%5Cleft%28%5Cvec%7Br%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D%2B%5Cbeta_%7Bk%7D%5Cvec%7Bp_%7Bk-1%7D%7D%5Cright%29%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%7Br%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D%7D%7B%5Cvec%7Bp_k%7D%5Ccdot+A%5Cvec%7Bp_k%7D%7D

因为

equation?tex=%5Cvec%7Bp_k%7D%5Ccdot+A%5Cvec%7Bp_%7Bk-1%7D%7D%3D0

所以

equation?tex=%5Cbeta_k%3D-%5Cfrac%7B%5Cvec%7Br%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D%5Ccdot+A%5Cvec%7Bp_%7Bk-1%7D%7D%7D%7B%5Cvec%7Bp_%7Bk-1%7D%7D%5Ccdot+A%5Cvec%7Bp_%7Bk-1%7D%7D%7D%3D-%5Cfrac%7B%5Cvec%7Br%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D%5Ccdot+%5Cleft%28%5Cvec%7Br%7D%5E%7B%5Cleft%28k-2%5Cright%29%7D-%5Cvec%7Br%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D%5Cright%29%7D%7B%5Calpha_%7Bk-1%7D%5Cvec%7Bp_%7Bk-1%7D%7D%5Ccdot+A%5Cvec%7Bp_%7Bk-1%7D%7D%7D%3D%5Cfrac%7B%5Cvec%7Br%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D%5Ccdot+%5Cvec%7Br%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D%7D%7B%5Cvec%7Br%7D%5E%7B%5Cleft%28k-2%5Cright%29%7D%5Ccdot%5Cvec%7Br%7D%5E%7B%5Cleft%28k-2%5Cright%29%7D%7D

经过上面一大段推导,共轭梯度法终于呈现在我们眼前,用MATLAB代码描述

function [x, iter] = cg_solve(A, b, x0, epsilon, iter_max)
    iter = 0;
    x = x0;
    r = b - A * x0;
    p = r;
    rr_prev = dot(r, r);            % 上一步得到的解的残差平方和
    while sqrt(rr_prev) >= epsilon && iter < iter_max
        iter = iter + 1;
        Ap = A * p;
        alpha = rr_prev / dot(p, Ap);
        x = x + alpha * p;
        r = r - alpha * Ap;
        rr_curr = dot(r, r);        % 这一步得到的解的残差平方和
        beta = rr_curr / rr_prev;
        p = r + beta * p;           % 下一步的p
        rr_prev = rr_curr;
    end
end

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

注意,因为要求

equation?tex=%5Cvec%7Bx%7D%5E%7B%5Cleft%28k%5Cright%29%7D%5Cin+span%5Cleft%5C%7B%5Cvec%7Bp_1%7D%2C%5Cvec%7Bp_2%7D%2C%5Cdots%2C%5Cvec%7Bp_%7Bk%7D%7D%5Cright%5C%7D

所以初值

equation?tex=%5Cvec%7Bx%7D%5E%7B%5Cleft%280%5Cright%29%7D%3D0

如果能找到一个更接近精确解的非零初值

equation?tex=%5Cvec%7Bx_0%7D ,则等价于解
equation?tex=A%5Cvec%7Bz%7D%3D%5Cvec%7Bb%7D-A%5Cvec%7Bx_0%7D 中的
equation?tex=%5Cvec%7Bz%7D ,最后得到原方程的解
equation?tex=%5Cvec%7Bx%7D%3D%5Cvec%7Bz%7D%2B%5Cvec%7Bx_0%7D ;由于
equation?tex=%5Cvec%7Bx%7D%5E%7B%5Cleft%28k%5Cright%29%7D 只涉及加法,根据加法交换律和结合律,这个累加放在开头还是结尾不影响结果,于是可以取
equation?tex=%5Cvec%7Bx%7D%5E%7B%5Cleft%280%5Cright%29%7D%3D0%2B%5Cvec%7Bx_0%7D%3D%5Cvec%7Bx_0%7D

按照前面的理论,共轭梯度法迭代到第

equation?tex=n 步时

equation?tex=+%5CPhi%5Cleft%28%5Cvec%7Bx%7D%5E%7B%5Cleft%28n%5Cright%29%7D%5Cright%29%3D%5Cmin_%7B%5Cvec%7Bx%7D%5Cin+span%5Cleft%5C%7B%5Cvec%7Bp_1%7D%2C%5Cvec%7Bp_2%7D%2C%5Cdots%2C%5Cvec%7Bp_%7Bn%7D%7D%5Cright%5C%7D%7D+%5CPhi%5Cleft%28%5Cvec%7Bx%7D%5Cright%29%3D%5Cmin_%7B%5Cvec%7Bx%7D%5Cin+%5Cmathbb%7BR%7D%5En%7D+%5CPhi%5Cleft%28%5Cvec%7Bx%7D%5Cright%29

即得到精确解。也就是说,共轭梯度法是一种理论上的直接解法。

但是和LU分解法一样,在实际计算中,由于浮点误差的积累,理论上的精确解没有意义。我们只需要把共轭梯度法看成迭代法即可,达到迭代终止条件之前的迭代步数小于

equation?tex=n 或者大于
equation?tex=n 都没关系。这个现象在之后还会再遇到。

共轭梯度法的收敛性

equation?tex=+%5ClVert+%5Cvec%7Bx%7D%5E%7B%5Cleft%28k%5Cright%29%7D-%5Cvec%7Bx%7D%5E%7B%2A%7D%5CrVert+%5Cleqslant+%5Cfrac%7B%5Csqrt%7Bcond%5Cleft%28A%5Cright%29%7D-1%7D%7B%5Csqrt%7Bcond%5Cleft%28A%5Cright%29%7D%2B1%7D%5ClVert+%5Cvec%7Bx%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D-%5Cvec%7Bx%7D%5E%7B%2A%7D%5CrVert+

对于条件数较大的矩阵,共轭梯度法的收敛速度比最速下降法快很多。

共轭梯度法要求系数矩阵正定,因为只有正定才存在最小值;实际上对于不定矩阵,共轭梯度法也很有可能收敛到梯度为零所对应的鞍点,不过不能从理论上保证收敛性。


共轭梯度法的变种

将共轭梯度法推广到非对称矩阵,最简单的办法是把方程

equation?tex=A%5Cvec%7Bx%7D%3D%5Cvec%7Bb%7D

转换为

equation?tex=A%5ET+A%5Cvec%7Bx%7D%3DA%5ET+%5Cvec%7Bb%7D

由于

equation?tex=A%5ET+A 对称正定,可以使用共轭梯度法解该方程。这就是正规方程的共轭梯度法。由于

equation?tex=cond%5Cleft%28A%5ET+A%5Cright%29%3Dcond%5Cleft%28A%5Cright%29%5E2

所以收敛较慢。

双共轭梯度法(Bi-conjugate gradient method)也可以应用于非对称矩阵。计算两组

equation?tex=%5Cvec%7Br%7D
equation?tex=%5Cvec%7Bp%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

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

equation?tex=%5Cvec%7Bp_k%7D%3D%5Cvec%7Br%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D%2B%5Cbeta_%7Bk%7D%5Cvec%7Bp_%7Bk-1%7D%7D

equation?tex=%5Cvec%7Bq_k%7D%3D%5Cvec%7Bs%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D%2B%5Cbeta_%7Bk%7D%5Cvec%7Bq_%7Bk-1%7D%7D

其中

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

equation?tex=%5Cbeta_k%3D%5Cfrac%7B%5Cvec%7Bs%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D%5Ccdot+%5Cvec%7Br%7D%5E%7B%5Cleft%28k-1%5Cright%29%7D%7D%7B%5Cvec%7Bs%7D%5E%7B%5Cleft%28k-2%5Cright%29%7D%5Ccdot%5Cvec%7Br%7D%5E%7B%5Cleft%28k-2%5Cright%29%7D%7D

维护

equation?tex=%5Cvec%7Br%7D 的双正交性和
equation?tex=%5Cvec%7Bp%7D 的双共轭性,对于
equation?tex=i%5Cnot%3Dj

equation?tex=%5Cvec%7Bs%7D%5E%7B%5Cleft%28i%5Cright%29%7D%5Ccdot+%5Cvec%7Br%7D%5E%7B%5Cleft%28j%5Cright%29%7D%3D%5Cvec%7Bq_i%7D%5Ccdot+A%5Cvec%7Bp_j%7D%3D0

双共轭梯度法有数值不稳定的现象,在迭代一定步数后,由于浮点误差积累,双正交性和双共轭性不再保持。稳定双共轭梯度法(Bi-conjugate gradient stablilized method)通过将一维搜索扩增到高维来修正这一误差,当搜索维数高时收敛速度提升,但单步迭代计算量和消耗的存储空间也将提升。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值