C++armadillo不能正确求解条件较差的矩阵

C++ armadillo not correctly solving poorly conditioned matrix

本文关键字:条件 不能 C++armadillo      更新时间:2023-10-16

关于Armadillo中内置的线性求解器,我有一个相对简单的问题。我是C++的新手,但有其他语言的编程经验。我正在通过逐次线性化来解决流体流动问题,使用armadillo函数Solve(a,b)在每次迭代中获得解。

我遇到的问题是我的矩阵条件很差。行列式的数量级为10^-20,条件数为75000。我知道这些情况很糟糕,但这就是我所拥有的。有人知道是否可以在我的A矩阵和求解函数中指定超出双精度(可能是长双精度)的精度吗?我知道Armadillo中有双矩阵类,但我还没有找到任何更高精度的文档。

为了从另一个角度解决这个问题,我在Mathematica中写了一些代码,LinearSolve运行得很好,程序收敛到了正确的答案。我的推理是,Mathematica变量具有更高的精度,可以处理更高级别的舍入误差。

如果有人对此有任何见解,请告诉我。我知道还有其他方法可以处理条件较差的矩阵(比如预处理和旋转),但我的工作更多地是在物理方面,而不是在实际的数值求解中,所以我试图避开这一点。

编辑:我只是把Mathematica版本的精度限制在小数点后15位,程序仍然收敛。这让我相信这不是一个可变精度的问题,而是方法的问题。

正如你所说的"你的工作更多地是在物理学中":与其试图提高精度,我会使用Moore Penrose伪逆,它在Armadillo中可以通过函数pinv获得。然后,您应该体验一下参数tolerance,将其设置为合理的级别。

几何解释如下:坏的条件数是由于行/列向量是线性相关的。在物理学中,这种线性依赖关系通常有一个至少需要解释的起源。伪逆首先通过丢弃奇异值小于参数tolerance的所有奇异向量,将矩阵投影到向量"不太线性相关"的低维空间上。重用矩阵具有更好的条件数,从而可以构造较少问题的标准逆。