共轭梯度法是一种用于求解对称正定线性方程组
A x = b
的迭代算法,其中:
- A ∈ ℝⁿˣⁿ 是对称正定矩阵(即 A = Aᵀ 且 ∀ 非零向量 z,有 zᵀ A z > 0),
- x 是未知向量,
- b 是已知右端向量。
该方法等价于最小化二次函数:
f(x) = ½ xᵀ A x − bᵀ x
算法步骤(使用 Unicode 公式)
输入:对称正定矩阵 A,向量 b,初始猜测 x₀(通常取 0),容差 ε,最大迭代次数 kₘₐₓ
输出:近似解 xₖ
-
初始化:
r₀ ← b − A x₀
p₀ ← r₀
k ← 0 -
迭代直到收敛(‖rₖ‖ < ε 或 k ≥ kₘₐₓ):
a. 计算步长 αₖ:
αₖ = (rₖᵀ rₖ) / (pₖᵀ A pₖ)
b. 更新解:
xₖ₊₁ = xₖ + αₖ pₖ
c. 更新残差:
rₖ₊₁ = rₖ − αₖ A pₖ
d. 检查收敛:若 ‖rₖ₊₁‖ < ε,则停止。
e. 计算共轭方向系数 βₖ:
βₖ = (rₖ₊₁ᵀ rₖ₊₁) / (rₖᵀ rₖ)
f. 更新搜索方向:
pₖ₊₁ = rₖ₊₁ + βₖ pₖ
g. k ← k + 1
- 返回 xₖ
关键性质
- 每一步的搜索方向 {p₀, p₁, ..., pₖ} 满足 A-共轭性:
pᵢᵀ A pⱼ = 0, 当 i ≠ j - 对于 n 维问题,在精确算术下最多 n 步收敛到精确解。
- 仅需矩阵-向量乘法,无需存储或分解 A,适合大规模稀疏系统。
示例
x = x0
r = b - A @ x
p = r
for k in range(max_iter):
rTr = r.T @ r
if sqrt(rTr) < tol: break
Ap = A @ p
alpha = rTr / (p.T @ Ap)
x = x + alpha * p
r = r - alpha * Ap
beta = (r.T @ r) / rTr
p = r + beta * p
end
3317

被折叠的 条评论
为什么被折叠?



