3

多項式の根を求めた場合Mathematica、これをシンボリックに行っても、これらの正確な答えの数値近似を見つけても、数値的に行っても、同じ (近似) 答えが得られるはずです。これがひどく失敗する例 ( Mathematica 7OS X で実行中) を次に示します。

poly = -112 + 1/q^28 + 1/q^26 - 1/q^24 - 6/q^22 - 14/q^20 - 25/q^18 -
  38/q^16 - 52/q^14 - 67/q^12 - 81/q^10 - 93/q^8 - 102/q^6 - 108/
  q^4 - 111/q^2 - 111 q^2 - 108 q^4 - 102 q^6 - 93 q^8 - 81 q^10 -
  67 q^12 - 52 q^14 - 38 q^16 - 25 q^18 - 14 q^20 - 6 q^22 - q^24 +
  q^26 + q^28;

Total[q^4 /. NSolve[poly == 0, q]] - Total[q^4 /. N[Solve[poly == 0, q]]]

(注: これは実際にはローラン多項式であり、大きな累乗を掛けるとq問題は解決します。)

ここの最後の行は、見つかったソリューションが非常に異なることを示すだけです。実際、それは私たちが取り組んでいた問題で計算しようとしていた量です。

NSolve[poly == 0, q]との出力をよく見るとN[Solve[poly == 0, q]、NSolve54が予想される ではなく根しか与えないことがわかります56。繰り返されるルートなどを見逃しただけではありません。等級の 2 つの最大根がありません (約+/- 1.59)

これは Mathematica のバグですか?なぜこれが起こっているのか、誰にも説明がありますか?

4

1 に答える 1

7

残念ながら、あなたの期待は根拠のないものです。

あなたが言うようにSolve[]、正確な解を与え、N[]小さなエラーを導入しますが、それを評価するときに一度だけです。NSolve[]一方、最初から数値近似を使用するため、大きな丸め誤差が蓄積される可能性があります。

また、計算のデフォルトの精度によっても制限されます。これにより、根が失われるなど、数値計算法が完全に失敗する可能性があります (ウィルキンソンの多項式を参照)。NSolve[]次のように、より高い精度を使用するように指示することで、これを打ち消すことができます。

In[1]  := Total[q^4 /. NSolve[poly == 0, q, WorkingPrecision -> 50]] - 
          Total[q^4 /. N[Solve[poly == 0, q]]]
Out[1] := 0. - 3.66374*10^-15 I

数値法を使用するときは、常にエラーを念頭に置くことが重要です。これは、長い多項式を解くことから、大きな行列の対角化、奇妙な関数の積分など、さまざまな数値解析の問題に当てはまるため、正しいアプローチは 1 つではなく、Mathematica に、たとえば WorkingPrecision を上げるように指示する必要があります。 、または別の数値手法を適用します。

于 2010-10-19T06:52:26.003 に答える