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 : 右側向量 | 返回解向量?xx | VectorXd x = solver.solve(b); |
info() | 無 | 返回收斂狀態(Success /NoConvergence ) | if (solver.info() != Success) {...} |
iterations() | 無 | 返回實際迭代次數 | int iters = solver.iterations(); |
error() | 無 | 返回最后一次迭代的誤差估計 | double err = solver.error(); |
通用參數設置
方法 | 參數說明 | 默認值 | 示例 |
---|---|---|---|
setTolerance(Scalar tol) | 設置收斂容差 | 1e-10 | solver.setTolerance(1e-6); |
setMaxIterations(int max_it) | 設置最大迭代次數 | 取決于求解器 | solver.setMaxIterations(1000); |
setPreconditioner(Precond) | 設置預條件子(見下文) | Identity | solver.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. 性能優化技巧
-
矩陣格式:確保輸入矩陣為?
SparseMatrix
?且已調用?makeCompressed()
。 -
預條件子:對病態系統,ILU 預條件子可顯著提升收斂速度。
-
** warm-start**:若多次求解相同矩陣不同?bb,復用?
compute(A)
?結果。
8. 常見錯誤處理
-
不收斂:檢查矩陣是否滿足求解器要求(如 CG 需對稱正定)。
-
數值不穩定:嘗試調整容差或改用更穩定的算法(如 MINRES)。
-
內存不足:減小 GMRES 重啟參數或使用內存友好的 CG。
掌握這些迭代求解器后,可高效處理大規模稀疏線性系統!更多細節見?Eigen 文檔。