预条件子
迭代方法的收敛速度取决于系数矩阵的频谱(特征值)。因此,您可以通过将线性方程组变换为具有更好的频谱(聚类特征值或接近 1 的条件数)来改善大多数迭代方法的收敛性和稳定性。这种变换的执行方法是将第二个被称为预条件子的矩阵应用于方程组。此过程将线性方程组
Ax=b
变换为等效方程组
A˜x˜=b˜.
理想的预条件子将系数矩阵 A 变换为单位矩阵,因为任何迭代方法都将在使用这种预条件子的一次迭代中实现收敛。实际上,寻找一个好的预条件子需要权衡。采用以下三种方式之一执行变换:左侧预条件、右侧预条件或拆分预条件。
第一种情况称为左侧预条件,因为预条件子矩阵 M 出现在 A 的左侧:
(M−1A)x=(M−1b).
以下迭代求解器使用左侧预条件:
在右侧预条件中,M 出现在 A 的右侧:
(AM−1)(Mx)=b.
以下迭代求解器使用右侧预条件:
最后,对于对称系数矩阵 A,拆分预条件可确保变换后的方程组仍是对称的。预条件子 M=HHT 被拆分,因子出现在 A 的不同侧:
(H−1AH−T)HTx=(H−1b)
经过拆分预条件后的方程组的求解器算法以上述方程为基础,但实际上无需计算 H。求解器算法直接与 M 相乘并求解。
以下迭代求解器使用拆分预条件:
在所有情况下,选用预条件子 M 以加快迭代方法的收敛。当迭代解的残差停滞不前或两次迭代之间进展甚微时,通常意味着您需要生成一个预条件子矩阵以加入问题中。
MATLAB 中的迭代求解器允许您指定单个预条件子矩阵 M,或两个预条件子矩阵因子,使得 M =
M1M2。这使得以分解形式指定预条件子变得容易,例如 M = LU。请注意,在同时保留了 M =
HHT 的拆分预条件情况下,M1 和 M2 输入与 H 因子之间没有关联。
在某些情况下,预条件子在给定问题的数学模型中自然发生。在没有自然预条件子的情况下,可以使用下表中的不完全分解之一来生成预条件子矩阵。不完全分解本质上是不完全直接求解,计算起来很快。
函数分解说明A≈LU正方形或矩形矩阵的不完全 LU 分解。
A≈LL*对称正定矩阵的不完全 Cholesky 分解。
有关 ilu 和 ichol 的详细信息,请参阅不完全分解。预条件子示例
以二维方形域中的拉普拉斯方程的五点有限差分逼近方程为例。以下命令使用预条件共轭梯度法 (PCG) 和预条件子 M = L*L’,其中 L 是 A 的零填充不完全 Cholesky 因子。对于此方程组,pcg 无法在不指定预条件子矩阵的情况下求得解。
A = delsq(numgrid(‘S’,250));
b = ones(size(A,1),1);
tol = 1e-3;
maxit = 100;
L = ichol(A);
x = pcg(A,b,tol,maxit,L,L’);
pcg converged at iteration 92 to a solution with relative residual 0.00076.
pcg 需要 92 次迭代才能达到指定的容差。但是,使用其他预条件子可以产生更好的结果。例如,使用 ichol 构造修正的不完全 Cholesky,pcg 只需经过 39 次迭代便可达到指定的容差。
L = ichol(A,struct(‘type’,’nofill’,’michol’,’on’));
x = pcg(A,b,tol,maxit,L,L’);
pcg converged at iteration 39 to a solution with relative residual 0.00098.