带右预条件的迭代求解器:矩阵显式处理与迭代应用的迭代次数差异
右预条件BiCGStab迭代次数差异问题
我在使用Eigen库求解Ax = b时,采用右预条件(形式为[A M^(-1)] Mx = b)的两种实现方式,迭代次数差异显著:
- 显式预计算
A M^(-1)后求解; - 预分解
M并在每次迭代中对Mx的猜测值应用预条件。
问题背景与实现细节
需求是求解离散PDE数值方法得到的稠密矩阵A对应的线性方程组Ax = b,矩阵A规模为10000×10000至22000×22000。采用Eigen的BiCGStab迭代求解器,通过稀疏预条件器M将问题转化为求解A M^(-1) y = b(其中y = Mx)。
案例1:显式预计算A M^(-1)
对小规模问题显式计算A M^(-1)后,使用以下求解器:
Eigen::BiCGSTAB<MatrixType, Eigen::IdentityPreconditioner> solver;
达到1e-3相对容差仅需20-60次迭代(使用IdentityPreconditioner避免额外预条件)。
案例2:矩阵自由形式实现右预条件
参考Eigen文档设置自定义矩阵-向量乘积:预分解M(调用SparseLU的compute()方法),每次迭代先求解Mz = y得到z,再计算Az。此时迭代次数大幅增加,部分情况为案例1的2-4倍,甚至1000次迭代仍无法达到1e-3容差。
核心疑问
已知A的条件数为900-1e7,显式计算的A M^(-1)条件数为100-1e6,但即使A M^(-1)条件数在100-900范围内,案例2的迭代次数仍远超案例1(如20次vs>1000次)。有两个核心疑问:
- 这种迭代次数差异是否属于数值线性代数的预期结果?是否反映矩阵存在缩放、条件数相关的问题?如何将(未)预条件系统的条件数与预期迭代次数关联?
- 是否是Eigen库的使用方式有误?比如多次调用SparseLU的
solve()是否存在问题?查阅Eigen SparseLU文档未发现异常。
注:改用GMRES时差异大多较小,但部分情况仍有2倍差异。
内容的提问来源于stack exchange,提问作者josh_eime
相关产品推荐
相关产品推荐

