我最近偶然发现了一个关于scipy.special.legendre()
(scipy 文档)的奇怪问题。Legendre 多项式应该是成对正交的。但是,当我在一个范围内计算它们x=[-1,1]
并构建两个不同次数的多项式的标量积时,我并不总是得到零或接近零的值。我是否误解了函数的行为?在下面我写了一个简短的例子,它产生了某些对 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()
单个多项式的图实际上看起来不错:
但是,如果我手动计算标量积——将两个不同次数的 Legendre 多项式相乘并将它们相加(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()
函数中的错误吗?还是我做错了什么?我正在寻找建设性的回应:-)
干杯,马库斯