scipy.special.legendre()
最近、 ( scipy のドキュメント)に関する興味深い問題に出くわしました。ルジャンドル多項式はペアごとに直交する必要があります。ただし、ある範囲でそれらを計算しx=[-1,1]
、異なる次数の 2 つの多項式のスカラー積を作成すると、常にゼロまたはゼロに近い値が得られるとは限りません。関数の動作を誤解していませんか? 以下に、ルジャンドル多項式の特定のペアのスカラー積を生成する短い例を書きました。
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))
...出力として次の値を取得します。
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()
これは機能のバグですか?それとも私は何か間違ったことをしていますか?私は建設的な回答を探しています:-)
乾杯、マーカス