3

我正在尝试以最小二乘法求解线性方程组。使用犰狳及其求解函数,我想计算抛物线拟合的三个系数。

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. 

一般来说,犰狳或c ++中是否有任何解决方法或更强大/更复杂的方法?谢谢

4

2 回答 2

2

您面临的问题是矩阵的条件数非常高,这可能会使您的结果由于舍入错误而变得毫无意义。

正如 rhalbersma 所建议的,您可以尝试更好地缩放不同的条目以减少此问题。如果您没有这样的解决方案,那么您必须使用preconditioner。其中有很多(有些非常复杂),因此您应该找到适合您问题的一个。

但是,对于您手头的这个特定系统,我将简单地反转方程(1)和(3),这将产生一个下三角系统,这很容易用 Matlab 求解(不需要迭代方法,可以对条件数非常敏感。在您的情况下,由于矩阵是对称的,Matlab 可能会尝试使用 cg 来解决它,这是一种迭代方法)。

顺便说一句,您的问题是否会产生接近奇异的矩阵?如果不是,我会在组装矩阵之前检查问题(或错误)(由于舍入错误,矩阵可能是非奇异的)。

编辑\:在我的 matlab 2009 上,我在尝试解决这个系统(使用命令)时没有收到任何警告。但是,如果我尝试使用命令pcg,我会得到它们!

于 2013-01-23T15:09:48.357 回答
2

您不能反转行列式等于零的矩阵。在您的情况下,行列式等于-8e-12,实际上并不等于零,而是作为逆矩阵给出(使用R)

1.0e-009 *
              [,1]          [,2]    [,3]
[1,] -3.815763e-16  6.806617e-14    5000
[2,]  5.111864e-14  5.000000e+03 -552500
[3,]  5.000000e+03 -5.525000e+05 8856250

请注意,这个逆矩阵既有非常大的数字,也有非常小的数字。这解释了您对“接近单数”和“严重缩放”的警告。根据底层浮点库,您可能会遇到非常糟糕的舍入错误

您可以返回到您的应用程序,查看是否有任何变量表示彼此相差多个数量级的列或行。如果是这样,你可以重新调整这些。例如,如果它们之间有 100 万的因数,并且它们代表长度,则以公里表示,而以毫米表示另一个。

于 2013-01-23T13:40:49.237 回答