C++armadillo不能正确求解条件较差的矩阵
C++ armadillo not correctly solving poorly conditioned matrix
关于Armadillo中内置的线性求解器,我有一个相对简单的问题。我是C++的新手,但有其他语言的编程经验。我正在通过逐次线性化来解决流体流动问题,使用armadillo函数Solve(a,b)在每次迭代中获得解。
我遇到的问题是我的矩阵条件很差。行列式的数量级为10^-20,条件数为75000。我知道这些情况很糟糕,但这就是我所拥有的。有人知道是否可以在我的A矩阵和求解函数中指定超出双精度(可能是长双精度)的精度吗?我知道Armadillo中有双矩阵类,但我还没有找到任何更高精度的文档。
为了从另一个角度解决这个问题,我在Mathematica中写了一些代码,LinearSolve运行得很好,程序收敛到了正确的答案。我的推理是,Mathematica变量具有更高的精度,可以处理更高级别的舍入误差。
如果有人对此有任何见解,请告诉我。我知道还有其他方法可以处理条件较差的矩阵(比如预处理和旋转),但我的工作更多地是在物理方面,而不是在实际的数值求解中,所以我试图避开这一点。
编辑:我只是把Mathematica版本的精度限制在小数点后15位,程序仍然收敛。这让我相信这不是一个可变精度的问题,而是方法的问题。
正如你所说的"你的工作更多地是在物理学中":与其试图提高精度,我会使用Moore Penrose伪逆,它在Armadillo中可以通过函数pinv
获得。然后,您应该体验一下参数tolerance
,将其设置为合理的级别。
几何解释如下:坏的条件数是由于行/列向量是线性相关的。在物理学中,这种线性依赖关系通常有一个至少需要解释的起源。伪逆首先通过丢弃奇异值小于参数tolerance
的所有奇异向量,将矩阵投影到向量"不太线性相关"的低维空间上。重用矩阵具有更好的条件数,从而可以构造较少问题的标准逆。
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么我的for循环不能正确获取argv
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 为什么我不能在 FOR LOOP 中使用 i/10,C++?
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 为什么模板类中的对象不能返回值
- 条件不起作用,谁能解释为什么会这样?
- 为什么我不能在 for 循环中出现这样的条件?(C++)
- 为什么我不能将 size() 函数编写为 while 循环中的条件?
- 为什么 printf 可以屏蔽竞争条件,而系统日志不能?
- 为什么 CUDA 同步点不能阻止竞争条件?
- 为什么我不能在C++的三元条件语句中使用 "break" 语句?
- 声明不能发生在条件运算符表达式内部
- C++armadillo不能正确求解条件较差的矩阵
- 为什么不能在 if 条件下比较两个字符串?
- 为什么我不能在这个条件下定义变量
- 为什么c++中的if语句不能处理多个条件
- 为什么检查分配操作的结果有效,但不能与其他条件相结合
- 如果不能在条件分支中调用 CUDA,如何在 CUDA 中减少__syncthreads?