当前位置: 首页 > news >正文

Eigen迭代求解器类

1. 迭代求解器核心类概览

Eigen 提供多种迭代法求解稀疏线性方程组 Ax=bAx=b,适用于大规模稀疏矩阵:

求解器类适用矩阵类型算法关键特性
ConjugateGradient对称正定(SPD)共轭梯度法(CG)高精度,内存效率高
LeastSquaresConjugateGradient矩形矩阵最小二乘 CG(LSQR)解最小二乘问题 min⁡∥Ax−b∥2min∥Ax−b∥2
BiCGSTAB非对称稳定双共轭梯度法适用一般矩阵,收敛速度快
GMRES非对称广义最小残差法适合病态系统,需重启参数
DGMRES非对称动态 GMRES自适应子空间大小
MINRES对称不定最小残差法无需正定性

2. 通用属性与方法

所有迭代求解器继承自 Eigen::IterativeSolverBase,提供统一接口:

核心方法
方法参数说明返回值/功能示例
compute(const MatrixType& A)A: 稀疏矩阵预计算分解(如预处理)solver.compute(A);
solve(const VectorType& b)b: 右侧向量返回解向量 xxVectorXd x = solver.solve(b);
info()返回收敛状态(Success/NoConvergenceif (solver.info() != Success) {...}
iterations()返回实际迭代次数int iters = solver.iterations();
error()返回最后一次迭代的误差估计double err = solver.error();
通用参数设置
方法参数说明默认值示例
setTolerance(Scalar tol)设置收敛容差1e-10solver.setTolerance(1e-6);
setMaxIterations(int max_it)设置最大迭代次数取决于求解器solver.setMaxIterations(1000);
setPreconditioner(Precond)设置预条件子(见下文)Identitysolver.setPreconditioner(ILU);

3. 各求解器特有方法

(1) ConjugateGradient (CG)
  • 特有设置

    cpp

    // 设置对角预条件子(默认启用)
    solver.setPreconditioner(DiagonalPreconditioner<double>());
(2) BiCGSTAB
  • 重启参数(无默认重启):

    cpp

    // 设置重启周期(GMRES/DGMRES 适用)
    solver.set_restart(30);  // 每30次迭代重启
(3) GMRES / DGMRES
  • 子空间大小

    cpp

    // 设置子空间维度(默认30)
    GMRES<SparseMatrix<double>> solver;
    solver.set_restart(50);  // 重启周期=子空间大小

4. 预条件子(Preconditioner)

预条件子可加速收敛,Eigen 提供以下选项:

预条件子类适用场景配置方法
DiagonalPreconditioner对角占优矩阵默认启用(CG)
IncompleteLUT (ILU)通用稀疏矩阵solver.preconditioner().setFillfactor(2);
IdentityPreconditioner无预处理(默认)无需配置
ILU 预条件子示例

cpp

ConjugateGradient<SparseMatrix<double>, Lower, IncompleteLUT<double>> solver;
solver.preconditioner().setFillfactor(2);  // 填充因子
solver.compute(A);
VectorXd x = solver.solve(b);

5. 代码示例

基本使用(CG 求解对称正定系统)

cpp

#include <Eigen/Sparse>
#include <Eigen/IterativeLinearSolvers>
using namespace Eigen;SparseMatrix<double> A(1000, 1000);
VectorXd b = VectorXd::Random(1000);
// 填充 A 为对称正定矩阵...ConjugateGradient<SparseMatrix<double>> solver;
solver.setTolerance(1e-8);
solver.setMaxIterations(1000);
solver.compute(A);VectorXd x = solver.solve(b);
std::cout << "#iterations: " << solver.iterations() << ", error: " << solver.error() << std::endl;
BiCGSTAB 解非对称系统

cpp

BiCGSTAB<SparseMatrix<double>> solver;
solver.setTolerance(1e-6);
solver.compute(A);
VectorXd x = solver.solve(b);

6. 参数选择建议

参数推荐值/策略说明
容差 (tolerance)1e-6 ~ 1e-10根据精度需求调整
最大迭代次数1000~5000避免无限循环
预条件子ILU 或 Diagonal依矩阵特性选择
重启周期(GMRES)30~50内存与收敛速度的权衡

7. 性能优化技巧

  1. 矩阵格式:确保输入矩阵为 SparseMatrix 且已调用 makeCompressed()

  2. 预条件子:对病态系统,ILU 预条件子可显著提升收敛速度。

  3. ** warm-start**:若多次求解相同矩阵不同 bb,复用 compute(A) 结果。

8. 常见错误处理

  • 不收敛:检查矩阵是否满足求解器要求(如 CG 需对称正定)。

  • 数值不稳定:尝试调整容差或改用更稳定的算法(如 MINRES)。

  • 内存不足:减小 GMRES 重启参数或使用内存友好的 CG。

掌握这些迭代求解器后,可高效处理大规模稀疏线性系统!更多细节见 Eigen 文档。

相关文章:

  • 对卡尔曼滤波的理解和简单示例实现
  • 服务器虚拟化:技术解析与实践指南
  • 2025蓝桥省赛c++B组第二场题解
  • python 与Redis操作整理
  • Android HAL HIDL
  • matplotlib画图工具使用(1) 画折线统计图python代码
  • 推论阶梯——AI与思维模型【81】
  • 【SpringBoot】WebConfig 跨域配置详细说明
  • 「蛮荒桌面下载」蛮荒桌面美化版 官方免费下载安卓电视版安装
  • java每日精进 4.26【多租户之过滤器及请求处理流程】
  • Eigen库入门
  • Day13(前缀和)——LeetCode2845.统计趣味子数组的数目
  • Python Cookbook-6.10 保留对被绑定方法的引用且支持垃圾回收
  • Eigen稀疏矩阵类 (SparseMatrix)
  • Centos7系统防火墙使用教程
  • 某东h5st_5.1(补环境)
  • qt/c++云对象浏览器
  • 文章记单词 | 第46篇(六级)
  • java函数式接口与方法引用
  • 八猴渲染器三维场景实时预览软件 Marmoset Toolbag 5.01 安装包免费下载
  • 宣称防老年痴呆的“原装进口”保健品McPee被指涉假,未获澳方销售批准
  • 一回合摘下“狮心”,张名扬霸气回应观众:再嘘一个我听听
  • 2025年上海空间信息大会举行,重大项目集中签约
  • 重新认识中国女性|婚姻,自古以来就是一桩生意
  • 王毅会见乌兹别克斯坦外长赛义多夫
  • 常熟银行一季度净赚超10亿增逾13%,净息差较上年末下降0.1个百分点