You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

带右预条件的迭代求解器:矩阵显式处理与迭代应用的迭代次数差异

右预条件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次)。有两个核心疑问:

  1. 这种迭代次数差异是否属于数值线性代数的预期结果?是否反映矩阵存在缩放、条件数相关的问题?如何将(未)预条件系统的条件数与预期迭代次数关联?
  2. 是否是Eigen库的使用方式有误?比如多次调用SparseLU的solve()是否存在问题?查阅Eigen SparseLU文档未发现异常。

注:改用GMRES时差异大多较小,但部分情况仍有2倍差异。


内容的提问来源于stack exchange,提问作者josh_eime

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 22:13:18