Недавно я наткнулся на любопытный вопрос относительно scipy.special.legendre()
(scipy documentation). Полиномы legendre должны быть попарно ортогональными. Однако, когда я вычисляю их в диапазоне x=[-1,1]
и строят скалярное произведение двух многочленов разной степени, я не всегда получаю нуль или значения, близкие к нулю. Я неправильно интерпретирую поведение функций? В дальнейшем я написал небольшой пример, который производит скалярное произведение некоторых пар полиномов Лежандра:Проблема ортогональности в полиномах легенд легенд Scipy
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()
Сюжет отдельных многочленов на самом деле выглядит отлично:
Но если рассчитать скалярные произведения вручную - перемножить два полиномам Лежандра разной степени поэлементно и просуммировать их (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
Скалярное произведение первого многочлена с самим собой (как и следовало ожидать), равной один, и половина других результатов практически равны нулю, но есть некоторые значения в порядка 10e-3
, и я понятия не имею, почему. Я также пробовал функцию scipy.special.eval_legendre(n, x)
- тот же результат: - \
Является ли это ошибкой в функции scipy.special.legendre()
? Или я делаю что-то неправильно? Ищу конструктивные откликается :-)
приветствий, Маркус
спасибо за интеграцию изображения :-) – Markus
Хм, хорошо. Я действительно не понимаю, почему мой подход работает некорректно, но да, определенно имеет смысл интегрировать полиномиальный продукт. Спасибо за этот вопрос. – Markus
Ваш подход интеграции не является точным. '10^{- 3} ~ 1/500' - это величина ошибки, которую вы ожидаете с 500 очками. –