3

最小二乗スタイルで連立一次方程式を解こうとしています。アルマジロとその解決関数を使用して、放物線近似の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. 

一般的に、armadilloまたは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 に答える