关于Armadillo内置的线性求解器我有一个相对简单的问题。我是C ++的新手,但有其他语言的编码经验。我通过连续线性化解决流体流问题,使用犰狳函数Solve(A,b)在每次迭代时得到解。
我遇到的问题是我的矩阵非常恶劣。决定因素大约为10 ^ -20,条件数为75000.我知道这些条件很糟糕,但它是我所拥有的。有谁知道是否有可能在我的A矩阵和解决函数中指定精度超过double(也许是long double)?我知道犰狳中有双矩阵类,但我还没有找到任何更高精度的文档。
为了从另一个角度来看,我在Mathematica中编写了一些代码,并且LinearSolve工作得很好,程序收敛到了正确的答案。我的理由是Mathematica变量具有更高的精度,可以处理更高水平的舍入误差。
如果有人对此有任何见解,请告诉我。我知道还有其他方法来处理条件差的矩阵(如预处理和旋转),但我的工作更多的是物理学而不是实际的数值解决方案,所以我试图避开它。
编辑:我只是将Mathematica版本的精度限制在15位小数,程序仍然会收敛。这使我相信它不是一个可变精度问题,而是该方法的一个问题。
答案 0 :(得分:1)
正如你所说"你的工作更多的是在物理学中:而不是试图提高准确度,我会使用Moore-Penrose Pseudo-Inverse,它在犰狳中可以通过函数获得{ {3}}。然后,您应该使用参数tolerance
进行一些操作,以将其设置为合理的水平。
几何解释如下:不良条件数是由于行/列向量与线性相关的事实。在物理学中,这种线性依赖性通常具有至少需要解释的起源。伪逆首先将矩阵投影到较低维空间,在该较低维空间中,矢量与线性相关性较小。通过丢弃具有小于参数tolerance
的奇异值的所有奇异向量。得到的矩阵具有更好的条件数,因此可以用较少的问题构造标准逆。