我正在尝试以最小二乘法求解线性方程组。 我想使用 Armadillo 及其求解函数计算抛物线拟合的三个系数。
vec coeffs = solve(CtC, Ctb)
与 CtC=
1.0e+009 *
+--------------------------------+
| 2.0878 0.0221 0.0002 |
| 0.0221 0.0002 0.0000 |
| 0.0002 0.0000 0.0000 |
+--------------------------------+
和 Ctb=
+------------+
| -0.6163 |
| -0.0065 |
| -0.0001 |
+------------+
显然 solve() 无法解决它,甚至 Matlab 也会警告:
Warning: Matrix is close to singular or badly scaled. Results may be inaccurate.
RCOND = 1.303968e-022.
一般来说, Armadillo 或 C++ 中是否有任何解决方法或更强大/更复杂的方法? 谢谢
最佳答案
您面临的问题是 condition number您的矩阵非常高,这可能会使您的结果由于舍入误差而变得毫无意义。
正如 rhalbersma 所建议的,您可以尝试更好地缩放不同的条目以减少此问题。如果你没有这样的解决方案,那么你必须使用 preconditioner .它们有很多(有些非常复杂),因此您应该找到适合您的问题的一个。
但是,对于您手头的这个特定系统,我会简单地反转等式 (1) 和 (3),这将产生一个下三角系统,这很容易用 Matlab 求解(不需要迭代方法这可能对条件数非常敏感。在您的情况下,由于矩阵是对称的,Matlab 可能会尝试使用 cg 来解决它,这是一种迭代方法)。
顺便问一下,您的问题是否已知会产生近似奇异矩阵?如果不是,我会在组装矩阵之前检查问题(或错误)(由于舍入误差,矩阵可能是非奇异的)。
编辑:在我的 matlab 2009 上,我在尝试求解该系统时没有收到任何警告(使用 \
命令)。但是,如果我尝试使用命令 pcg
,我会得到它们!
关于c++ - 针对奇异矩阵时 solve() 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14480740/