Почему это выражение оценивается как 0?

У меня есть две строки в коде:

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?

Нет, когда я подключаю j=0 вручную, я получаю не 0, а правильное выражение, включая 2^(4l-2) и другие полиномиальные коэффициенты (как и должно быть)

Vika 14.06.2024 23:10
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
89
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У вас есть внутреннее выражение, которое выглядит так:

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)

Другие вопросы по теме