繁体   English   中英

C ++犰狳没能正确解决条件差的矩阵

[英]C++ armadillo not correctly solving poorly conditioned matrix

关于Armadillo中内置的线性求解器,我有一个相对简单的问题。 我是C ++的新手,但有其他语言的编码经验。 我通过连续线性化解决流体流问题,使用犰狳函数Solve(A,b)在每次迭代时得到解。

我遇到的问题是我的矩阵非常恶劣。 决定因素大约为10 ^ -20,条件数为75000.我知道这些条件很糟糕,但这就是我所拥有的。 有谁知道是否有可能在我的A矩阵和解决函数中指定精度超过double(也许是long double)? 我知道Armadillo中有双矩阵类,但我没有找到任何更高精度的文档。

为了从另一个角度来看这个问题,我在Mathematica中编写了一些代码,并且LinearSolve工作得非常好,程序收敛到了正确的答案。 我的理由是Mathematica变量具有更高的精度,可以处理更高水平的舍入误差。

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

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

正如你所说“你的工作更多是物理学”:我不会试图提高准确度,而是使用Moore-Penrose Pseudo-Inverse,在Armadillo中可以通过函数pinv获得。 然后,您应该体验一下参数tolerance ,将其设置为合理的水平。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM