私は最近、scipy.special.legendre()
(scipy documentation)に関する興味深い問題に遭遇しました。 legendre多項式はpairwise直交する必要があります。しかし、私がそれらを範囲x=[-1,1]
で計算し、異なる次数の2つの多項式のスカラー積を構築すると、常にゼロに近い値やゼロに近い値が得られるわけではありません。関数の振る舞いを誤解していますか?単一の多項式のプロットが実際に正常に見えるscipyのlegendre多項式の直交性の問題
from __future__ import print_function, division
import numpy as np
from scipy import special
import matplotlib.pyplot as plt
# create range for evaluation
x = np.linspace(-1,1, 500)
degrees = 6
lp_array = np.empty((degrees, len(x)))
for n in np.arange(degrees):
LP = special.legendre(n)(x)
# alternatively:
# LP = special.eval_legendre(n, x)
lp_array[n, ] = LP
plt.plot(x, LP, label=r"$P_{}(x)$".format(n))
plt.grid()
plt.gca().set_ylim([-1.1, 1.1])
plt.legend(fontsize=9, loc="lower right")
plt.show()
:
をしかし、私は計算した場合、次の私はルジャンドル多項式の特定のペアの内積を生産する簡単な例を、書かれているで スカラー積手動 - 異なる程度の要素ごとの2つのルジャンドルの多項式を乗算し、(500は正規化のためである)、それらをまとめる...
for i in range(degrees):
print("0vs{}: {:+.6e}".format(i, sum(lp_array[0]*lp_array[i])/500))
... I出力として次の値を得る:
0vs0: +1.000000e+00
0vs1: -5.906386e-17
0vs2: +2.004008e-03
0vs3: -9.903189e-17
0vs4: +2.013360e-03
0vs5: -1.367795e-16
自体と第1の多項式のスカラー積である(予想される)、及び半他の結果の同じ一つはほぼゼロであるが、いくつかの値は、です10e-3
の順番と私は理由が分かりません。私もscipy.special.eval_legendre(n, x)
機能を試しました - 同じ結果: -
これはscipy.special.legendre()
機能のバグですか?それとも私は何か悪いことをしますか?あなたは、正確な整数行っているので、他の人が、あなたには、いくつかのエラーを取得するつもりだ、コメントしているとして、私は:-)
歓声、 マルクス
画像を統合してくれてありがとう:-) – Markus
うん、ok。なぜ私のアプローチが正しく動作しないのか分かりませんが、多項式積を積分するのは間違いありません。この点をありがとう。 – Markus
統合アプローチは正確ではありません。 '10^{ - 3}〜1/500'は500ポイントで予想される誤差の大きさのオーダーです。 –