数値積分法を使用して、プログラム内の任意の(コーディング時に知られている)関数を数値積分しようとしています。私は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)を統合します。私が聞きたかったのは、これを行うためのより良い近似/ベストプラクティス(?)/より速い方法はありますか?さらにコンテキストが必要な場合は、個別に投稿します/必要に応じてここにコンテキストを投稿します。