我正在将MATLAB程序移植到C ++。 Matlab能够解决我的C ++库armadillo无法解决的线性系统(复数值,稀疏矩阵)。
犰狳是否有能力使用诸如GMRES的迭代求解器?不幸的是,armadillo的文档非常简单,其中包含求解器的详细信息。
否则,我可以从犰狳叫LAPACK吗?或哪种替代C ++库提供了强大的线性求解器?
(矩阵条件非常恶劣,我也在寻找解决此问题的其他方法,包括预处理矩阵)
答案 0 :(得分:1)
sparse matrix of Armadillo具有专用于求解线性系统spsolve()
的功能。如文档所指出,只要在Armadillo的配置文件config.hpp中安装并启用它,便会使用SuperLU 。否则,它将矩阵转换为密集格式并使用LAPACK。 LAPACK处理various matrix formats,主要是密集和带格式,但不能处理像压缩的稀疏行这样的通用稀疏格式。
SuperLU实现了稀疏矩阵的LU分解。它利用附加的置换矩阵来获得稀疏的L和U因子。但是,存在许多替代方案,可以实施各种策略,例如MUMPS或UMFPACK(多边LU分解)或PaStiX或... Suitesparse的页面告诉Matlab“反斜杠”使用UMFPACK或CHOLMOD。,可能是diagram中的LU和Cholevsky分解。
此外,Eigen library包装了许多求解器。因此,可以根据矩阵属性和用户选择来选择求解器。
看看Petsc库::它包装了许多preconditionners and solvers,包括GMRES。请参见this example了解如何填充和求解矩阵。用户可以在运行时选择其求解器和预处理器!在链接的示例中,前置条件设置为ICC(不完整的Cholesky),但求解器(KSP)从选项中设置。 This web page帮助指定一组初始选项。对于gmres:
-ksp_type gmres -ksp_monitor -ksp_monitor_true_residual -ksp_rtol <rtol> -ksp_norm_type unpreconditioned
显示器将告诉您残留物减少的速度。 rtol指定(可能是经过预处理的)剩余范数的相对减少。 范数类型unpreconditioned
指定必须计算无条件残差的范数以测试收敛性。由于矩阵条件不佳,监视真实的无条件残差可能是个好主意。否则,如果前提条件矩阵碰巧是条件不好的,则可以很好地解决前提条件问题,但初始问题的残差仍然很大。
有关GMRES求解器的某些选项(Krylov方向的数量...),请参见this page。编译程序后,尝试使用-help
运行,以列出可用的选项。