У меня есть две строки в коде:
print(expr.subs(t,2*l))
print(simplify(expr.subs(t,2*l)))
Какая доходность:
2*Sum(2**(-2*j + 2*l + 1)*2**(2*j + 2*l - 3)*(l + 1)**2*factorial(-j + 2*l + 1)*factorial(j + 2*l - 1)/((-j + l + 1)*(j + l - 1)*factorial(j)*factorial(2 - j)*factorial(-2*j + 2*l + 1)*factorial(2*j + 2*l - 3)), (j, 0, 0))
0
Первая команда работает правильно, и выражение такое, каким оно должно быть, но почему-то результат второй команды равен 0. Когда я вычисляю эту удвоенную сумму вручную, она не равна 0. В сумме есть только один член (поскольку j изменяется от 0 до 0). Может кто-нибудь объяснить, почему последняя команда возвращает 0?






У вас есть внутреннее выражение, которое выглядит так:
from sympy import Sum, factorial, sin , gamma, pi
from sympy.abc import j, l
inner = (2 ** (-2 * j + 2 * l + 1)
* 2 ** (2 * j + 2 * l - 3)
* (l + 1) ** 2
* factorial(-j + 2 * l + 1)
* factorial(j + 2 * l - 1)
/ ((-j + l + 1)
* (j + l - 1)
* factorial(j)
* factorial(2 - j)
* factorial(-2 * j + 2 * l + 1)
* factorial(2 * j + 2 * l - 3)))
Вызов inner.simplify() заменителей factorial() с помощью функции gamma(). Эта замена имеет некоторые условия, которые иногда могут сделать ее недействительной. Упрощенная версия выглядит так:
(16 ** l * (l + 1) ** 2
* sin(pi * j)
* gamma(j + 2 * l)
* gamma(-j + 2 * l + 2)
/ (pi * j * (j - 2) * (j - 1)
* gamma(-2 * j + 2 * l + 3)
* gamma(2 * j + 2 * l - 1)))
Затем замена j на 0 дает выражение нуля (из-за sin(pi * j)), деленного на ноль (из-за pi * j в знаменателе). Дальнейшая оценка позволяет Sympy прийти к выводу, что предельное значение должно быть равно нулю.
Всего этого можно избежать, предварительно позвонив .doit() (это попытка оценить неоцененную сумму).
expr.subs(t,2*l).doit().simplify()
# gives 2**(4*l - 1)*(l + 1)*(2*l - 1)
Нет, когда я подключаю j=0 вручную, я получаю не 0, а правильное выражение, включая 2^(4l-2) и другие полиномиальные коэффициенты (как и должно быть)