在数值分析中,共轭梯度法(Conjugate Gradient Method, CG 法)是当今求解对称正定的线性方程组的首选数值方法,从格式上来看它是一种迭代方法,在迭代到步之后,不计机器误差的情况下可以得到精确解。
方法[]
设我们要解决的线性方程组为
设为一给定的迭代初始向量,是初始残量,取共轭方向,按照如下迭代格式进行迭代
其中,是普通内积,是内积,即
推导过程从略,这里仅指出一些特点:
- 和完全正交方法一样,CG 法选择的约束空间和搜索空间是一样的,因此是一种正交投影法,但它是考察了对称矩阵的特殊结构,简化了 FOM 方法。
- CG 方法中我们设定的残量相互正交。
- 被称为搜索方向,这些方向彼此正交,即且当时
- 是由下式待定的它描述了第次迭代解向精确解靠近的共轭方向上的步长。
- 未得到精确解时,第步 CG 法得到的向量总是在以下意义下最优:其中是精确解,Krylov 子空间
算法[]
以下程序设计是 CG 法实现的简易 Matlab 代码。
function [z, k] = cg(A, b, x0, eps)
% 共轭梯度法 (CG法) 求解对称正定矩阵的线性方程组 Ax = b 的解的程序.
% A 是系数矩阵, 必须对称正定, b 是常数项矩阵, x0 是迭代解的初始值, eps 是相对误差, 可缺省.
if ~exist('eps', 'var')
eps = 10e-6;
end
r(:,1) = b - A * x0;
x(:,1) = x0;
q(:,1) = r(:,1);
[~, n] = size(A);
for k=1:n
r(:,2) = r(:,1); x(:,2) = x(:,1); q(:,2) = q(:,1);
alpha = dot(r(:,2), r(:,2))/dot(A*q(:,2), q(:,2));
x(:,1) = x(:,2) + alpha * q(:,2);
r(:,1) = r(:,2) - alpha * A * q(:,2);
beta = dot(r(:,1), r(:,1))/dot(r(:,2), r(:,2));
q(:,1) = r(:,1) + beta * q(:,2);
if norm(r(:,2))/norm(r(:,1)) < eps
break;
end
end
z = x(:,1);
end
参考资料
- 黄云清, 《数值计算方法》, 科学出版社, 北京, 2012-06, ISBN
978-7-0302-3428-5
.
数值代数(学科代码:1106150,GB/T 13745—2009) | |
---|---|
范数 | 向量范数 ▪ 准范数 ▪ 向量序列 ▪ 矩阵范数 ▪ 广义矩阵范数 ▪ 对偶范数 ▪ 从属范数 ▪ 谱范数 ▪ Frobenius 范数 ▪ 谱半径 ▪ 矩阵级数 ▪ 矩阵指数 ▪ 条件数 |
线性方程组的 数值解 |
列主元消去法 ▪ Jacobi 方法 ▪ Gauss-Seidel 方法 ▪ 超松弛法 ▪ 投影方法 ▪ Krylov 子空间方法 ▪ Arnoldi 算法 ▪ 完全正交方法 ▪ 广义极小残量法 ▪ 共轭梯度法 ▪ 极小残量法 ▪ 预条件共轭梯度法 ▪ 最小二乘法 |
矩阵分解和 特征值问题 |
Rayleigh 商 ▪ 幂法 ▪ 反幂法 ▪ Gerschgorin 圆盘 ▪ LU 分解 ▪ Cholesky 分解 ▪ QR 分解 ▪ Givens 变换 ▪ Householder 矩阵 ▪ Householder 方法 ▪ Hessenberg 矩阵 ▪ QR 算法 ▪ Jordan-Chevalley 分解 ▪ 极分解 ▪ 奇异值分解 |
所在位置:数学(110)→ 计算数学(11061)→ 数值代数(1106150) |