共轭梯度法(Conjugate Gradient Method)是一种在数值分析和优化领域中广泛使用的算法,主要用于求解大型对称正定线性方程组。它由Richard H. Byrd、Daniel W. Forsythe、Maurice G. Golub及John H. Wilkinson等人发展和完善,是迭代法的一种,其主要优点在于效率高且不需要矩阵的逆运算,特别适用于大型稀疏矩阵问题。
在实际应用中,许多问题可以归结为求解形如 Ax=b 的线性方程组,其中 A 是 n×n 的对称正定矩阵,x 和 b 分别为 n 维向量。共轭梯度法的核心思想是通过构造一组相互正交的搜索方向来逼近最优解,每个方向都是前一个方向的共轭,即它们在 A 矩阵下的内积为零。这种方法使得每次迭代都能最大程度地减少残差,从而快速收敛。
实现共轭梯度法通常包括以下几个步骤:
1. **初始设置**:选择一个初始猜测解 x_0,通常为零向量,以及对应的残差 r_0 = b - Ax_0。
2. **搜索方向**:找到一个与当前残差正交的向量 p_k,通常取为 r_k。在后续迭代中,p_k 会按照一定规则更新,保持与之前向量的共轭性。
3. **步长计算**:找到一个合适的步长 α_k,使得沿 p_k 方向的更新能最大化残差的减小。这通常通过最小化函数 f(x) = (b - Ax)^T(b - Ax) 来完成,即求解 α_k 使得 f'(α_k) = 0。
4. **向量更新**:更新解向量和残差向量,即 x_{k+1} = x_k + α_k p_k,r_{k+1} = r_k - α_k Ap_k。
5. **下一个搜索方向**:计算新的搜索方向 p_{k+1},它是 r_{k+1} 与 A 的共轭,通常采用公式 p_{k+1} = r_{k+1} + β_k p_k,其中 β_k 依赖于当前和上一步的残差和步长。
6. **终止条件**:当残差足够小或达到预设的最大迭代次数时,停止迭代,得到的 x_k 就是近似解。
在提供的 `Conjugate_Gradient.m` 文件中,可能包含了上述步骤的 MATLAB 实现。这个脚本可能包括了矩阵和向量的初始化、循环迭代过程以及相关参数的计算。`license.txt` 文件则可能是该代码的授权协议,规定了代码的使用、修改和分发条件。
共轭梯度法的优点包括:
- **效率**:对于大型稀疏矩阵,共轭梯度法的计算复杂度比直接方法(如 Cholesky 分解或 LDL^T 分解)更低。
- **不需要矩阵逆**:只需要矩阵-向量乘法,避免了计算矩阵逆或求解伴随系统的大规模运算。
- **收敛性**:对于对称正定的线性方程组,共轭梯度法在最坏情况下需要 n 次迭代即可找到精确解,实际应用中通常更快。
- **稳定性**:共轭梯度法在迭代过程中具有良好的数值稳定性。
然而,共轭梯度法并不适用于非对称矩阵或非正定矩阵问题。在这种情况下,可能需要考虑其他方法,如 GMRES 或 BFGS 等。在实际应用中,为了提高计算效率和数值稳定性,通常还会结合预条件技术。