文章目录
-
-
- [一、是否需要 scaling?](#一、是否需要 scaling?)
- [二、常见的 scaling 方法](#二、常见的 scaling 方法)
-
- [1. **对角 scaling(Diagonal Scaling)**](#1. 对角 scaling(Diagonal Scaling))
-
- [(a) **行 scaling(Row Scaling)**](#(a) 行 scaling(Row Scaling))
- [(b) **列 scaling(Column Scaling)**](#(b) 列 scaling(Column Scaling))
- [(c) **平衡 scaling(Equilibration / Symmetric Scaling)**](#(c) 平衡 scaling(Equilibration / Symmetric Scaling))
- [2. **基于物理的 scaling(Physical Scaling)**](#2. 基于物理的 scaling(Physical Scaling))
- [3. **基于预条件子的隐式 scaling**](#3. 基于预条件子的隐式 scaling)
- [4. **最大元素 scaling(Max Scaling)**](#4. 最大元素 scaling(Max Scaling))
- 三、实际建议
- 四、相关工具与库
- 总结
-
在使用迭代法(如共轭梯度法、GMRES、BiCGSTAB等)求解稀疏线性方程组 Ax = b 时,对矩阵进行适当的 scaling(缩放)通常是推荐的,甚至在某些情况下是必要的。这是因为:
- 条件数(condition number)过大会导致迭代法收敛缓慢甚至不收敛。
- 矩阵元素量级差异大(如某些行或列的范数相差几个数量级)会破坏数值稳定性。
- 物理单位不一致(如不同变量单位不同)也会导致矩阵不平衡。
因此,scaling 的目的是改善矩阵的数值性质,降低条件数,提高迭代法的收敛速度和稳定性。
一、是否需要 scaling?
答案:视情况而定,但强烈建议在以下情况下进行 scaling:
- 矩阵元素量级差异大(如有的元素是 10 − 6 10^{-6} 10−6,有的是 10 6 10^6 106);
- 来自多物理场问题(如流体-结构耦合),不同变量单位差异大;
- 迭代法收敛缓慢或震荡;
- 预条件子效果不佳。
注意:即使使用了预条件子(preconditioner),scaling 仍可能有帮助,因为预条件子本身也可能受矩阵不平衡影响。
二、常见的 scaling 方法
1. 对角 scaling(Diagonal Scaling)
这是最常用、计算代价最低的方法。通过左乘和/或右乘对角矩阵,使矩阵的行或列范数趋于一致。
(a) 行 scaling(Row Scaling)
目标:使每行的范数(如 2-范数或 ∞-范数)接近 1。
令 D_r 为对角矩阵,其中
( D r ) i i = 1 ∥ A i ∗ ∥ , (如 ∥ A i ∗ ∥ ∞ 或 ∥ A i ∗ ∥ 2 ) (D_r){ii} = \frac{1}{\|A{i*}\|}, \quad \text{(如 } \|A_{i*}\|\infty \text{ 或 } \|A{i*}\|_2\text{)} (Dr)ii=∥Ai∗∥1,(如 ∥Ai∗∥∞ 或 ∥Ai∗∥2)
变换后矩阵为:
A ~ = D r A \tilde{A} = D_r A A~=DrA
(b) 列 scaling(Column Scaling)
目标:使每列的范数接近 1。
令 D_c 为对角矩阵,其中
( D c ) j j = 1 ∥ A ∗ j ∥ (D_c){jj} = \frac{1}{\|A{*j}\|} (Dc)jj=∥A∗j∥1
变换后矩阵为:
A ~ = A D c \tilde{A} = A D_c A~=ADc
© 平衡 scaling(Equilibration / Symmetric Scaling)
目标:同时平衡行和列,使 \\tilde{A} = D_r A D_c ,且 \\tilde{A} 的行和列范数都接近 1。
常用算法:
- Rothberg-Gupta 算法(用于对称矩阵)
- MC64 算法(来自 HSL,用于非对称矩阵,基于最大权重匹配)
- 对数迭代平衡法:迭代调整对角缩放因子,使行和列范数趋于 1。
对称矩阵常使用对称 scaling: \\tilde{A} = DAD ,其中 D 是对角正定矩阵。
2. 基于物理的 scaling(Physical Scaling)
在建模阶段就进行变量或方程的无量纲化(nondimensionalization),例如:
- 将压力除以参考压力;
- 将速度除以声速;
- 时间除以特征时间。
这从源头上避免了量纲不一致的问题,是最"干净"的 scaling 方法。
3. 基于预条件子的隐式 scaling
某些预条件子(如 Jacobi、SSOR、ILU)本身就具有一定的 scaling 效果,但不能替代显式 scaling。
例如,Jacobi 预条件子 M = \\text{diag}(A) 在对角元量级差异大时效果差,此时先进行 scaling 再用预条件子更有效。
4. 最大元素 scaling(Max Scaling)
将整个矩阵除以其最大绝对值元素:
A ~ = A max i , j ∣ A i j ∣ \tilde{A} = \frac{A}{\max_{i,j} |A_{ij}|} A~=maxi,j∣Aij∣A
这种方法简单,但可能无法解决局部不平衡问题。
三、实际建议
- 优先使用对角平衡 scaling(如 MC64 或迭代平衡),尤其对于非对称或病态矩阵。
- 对于对称矩阵,使用对称 scaling( DAD )以保持对称性,利于共轭梯度法等。
- scaling 后,右端项和解也需要相应变换:
- 若 \\tilde{A} = D_r A D_c ,则令 \\tilde{x} = D_c\^{-1} x , , , \\tilde{b} = D_r b
- 多数现代求解器(如 PETSc、Trilinos、MATLAB)支持内置 scaling 选项。
四、相关工具与库
工具/库 | 支持的 scaling 方法 |
---|---|
PETSc | -pc_type jacobi -ksp_type cg -ksp_norm_type unpreconditioned -ksp_rtol 1e-6 -mat_diagonal_scale -mat_diagonal_scale_fix |
MATLAB | equilibrate(A) 函数(R2019b+) |
HSL | MC64(用于非对称矩阵的最优 scaling) |
SuperLU | 内置 row/col scaling 和 matching |
总结
问题 | 回答 |
---|---|
是否需要 scaling? | 推荐使用,尤其当矩阵不平衡或收敛慢时 |
常见方法 | 对角 scaling(行、列、平衡)、物理 scaling、最大元 scaling |
最佳实践 | 使用平衡 scaling(如 MC64 或 equilibrate ),保持对称性,配合预条件子 |
注意事项 | scaling 后需相应调整右端项和解,避免破坏问题物理意义 |
✅ 建议:在调用迭代求解器前,先尝试对矩阵进行平衡 scaling,往往能显著提升收敛性能。