5

数値積分法を使用して、プログラム内の任意の(コーディング時に知られている)関数を数値積分しようとしています。私はPython2.5.2をSciPyの数値積分パッケージと一緒に使用しています。それを感じるために、sin(x)を統合してみて、この動作を観察することにしました-

>>> from math import pi
>>> from scipy.integrate import quad
>>> from math import sin
>>> def integrand(x):
...     return sin(x)
... 
>>> quad(integrand, -pi, pi)
(0.0, 4.3998892617846002e-14)
>>> quad(integrand, 0, 2*pi)
(2.2579473462709165e-16, 4.3998892617846002e-14)

なぜなら、この振る舞いは奇妙だと思います。-
1。通常の積分では、全サイクルで積分するとゼロになります。
2.数値積分では、この(1)は必ずしも当てはまりません。これは、曲線の下の総面積を概算しているだけだからです。

いずれにせよ、1がTrueであると仮定するか、2がTrueであると仮定すると、動作に一貫性がないことがわかります。両方の統合(-piからpiおよび0から2 * pi)は0.0(タプルの最初の値が結果で2番目がエラー)を返すか、2.257を返す必要があります。

誰かがこれが起こっている理由を説明できますか?これは本当に矛盾ですか?数値解法について本当に基本的なことが欠けているかどうか誰かに教えてもらえますか?

いずれにせよ、私の最終的なアプリケーションでは、上記の方法を使用して関数の弧長を見つけることを計画しています。誰かがこの分野での経験がある場合は、Pythonでこれを行うための最良のポリシーについて教えてください。

編集

配列に格納されている範囲内のすべてのポイントで、すでに最初の微分値があります。
現在のエラーは許容範囲です。
エンドノート

私はこれについてWikipaediaを読みました。Dimitryが指摘しているように、弧長を取得するためにsqrt(1 + diff(f(x)、x)^ 2)を統合します。私が聞きたかったのは、これを行うためのより良い近似/ベストプラクティス(?)/より速い方法はありますか?さらにコンテキストが必要な場合は、個別に投稿します/必要に応じてここにコンテキストを投稿します。

4

6 に答える 6

10

quad関数は、古い Fortran ライブラリの関数です。効率を最大化するために、数値積分に使用するステップ サイズをどのように処理するかを統合する関数の平坦性と勾配によって判断することによって機能します。これが意味することは、分析的には同じであっても、地域ごとにわずかに異なる回答が得られる可能性があるということです.

間違いなく、両方の統合がゼロを返すはずです。1/(10 兆) の値を返すと、ゼロにかなり近くなります。わずかな違いは、ウェイquadがロールオーバーsinし、ステップ サイズが変更されているためです。あなたの計画されたタスクのために、quadあなたが必要とするすべてになります。

編集:あなたがしていることについては、問題ないと思いますquad。それは速く、かなり正確です。私の最後の声明は、本当にうまくいかないものを見つけない限り、自信を持って使用することです. 無意味な回答が返されない場合は、おそらく問題なく動作しています。心配ない。

于 2009-02-24T10:32:18.523 に答える
6

数値 O(10^-14) は事実上ゼロであると言えます。あなたの許容度は?

クワッドの基礎となるアルゴリズムが最適ではない可能性があります。別の統合方法を試して、改善されるかどうかを確認してください。5 次のルンゲクッタは、非常に優れた汎用テクニックです。

それは、浮動小数点数の性質にすぎない可能性があります。「すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと」.

于 2009-02-24T10:52:04.667 に答える
6

どちらの答えも事実上ゼロなので、おそらく機械の精度だと思います。

馬の口からの回答が必要な場合は、この質問をscipy ディスカッション ボードに投稿します。

于 2009-02-24T10:32:55.667 に答える
4

ここに絶対誤差の見積もりがあるので、この出力は私には正しいようです。sin(x) の積分値は、通常の積分と数値積分の両方で、全期間 (2*pi の長さの間隔) でゼロの値を持つ必要があり、結果はその値に近くなります。
円弧の長さを評価するには、sqrt(1+diff(f(x), x)^2) 関数の積分を計算する必要があります。ここで、diff(f(x), x) は f(x) の導関数です。円弧長も参照

于 2009-02-24T10:22:12.103 に答える
3
0.0 == 2.3e-16 (absolute error tolerance 4.4e-14)

両方の答えは同じで正しいです。つまり、指定された許容範囲内でゼロです。

于 2009-02-24T23:53:11.357 に答える