3

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()

単一の多項式のプロットは、実際にはうまく見えます。 次数 0 から 5 までのルジャンドル多項式

しかし、スカラー積を手動で計算すると、異なる次数の 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()これは機能のバグですか?それとも私は何か間違ったことをしていますか?私は建設的な回答を探しています:-)

乾杯、マーカス

4

1 に答える 1