Симпи не может оценить бесконечную сумму, включающую гамма-функции

1

Я использую Sympy для оценки некоторых символических сумм, которые включают в себя манипуляции с gamma функциями, но я заметил, что в этом случае он не оценивает сумму и не оценивает ее.

import sympy as sp
a = sp.Symbol('a',real=True)
b = sp.Symbol('b',real=True)
d = sp.Symbol('d',real=True)
c = sp.Symbol('c',integer=True)
z = sp.Symbol('z',complex=True)
t = sp.Symbol('t',complex=True)
sp.simplify(t-sp.summation((sp.exp(-d)*(d**c)/sp.gamma(c+1))/(z-c-a*t),(c,0,sp.oo)))

Затем мне нужно окутать это выражение, и, к сожалению, это становится невозможным.

Однако с символической панелью Matlab я получаю следующий ответ:

Matlab

>> a=sym('a') 
>> b=sym('b');
>> c=sym('c')
>> d=sym('d');
>> z=sym('z');
>> t=sym('t');
>> symsum((exp(-d)*(d^c)/factorial(c))/(z-c-a*t),c,0,inf)
ans = 
(-d)^(z - a*t)*exp(-d)*(gamma(a*t - z) - igamma(a*t - z, -d))

Формула включает более низкие незавершенные гамма-функции, как и ожидалось. Любая идея, почему это поведение? Я думал, что симпы смогли сделать это суммирование символически.

  • 0
    Но в MATLAB вы не «отстранены» функцией.
  • 0
    Да, Matlab был только примером, чтобы показать, что суммирование может быть сделано.
Показать ещё 2 комментария
Теги:
sympy
symbolic-math

1 ответ

2
Лучший ответ

Запуск кода с помощью SymPy 1.2 приводит к

d**(-a*t + z)*exp(-I*pi*a*t - d + I*pi*z)*lowergamma(a*t - z, d*exp_polar(I*pi)) + t

Кстати, summation уже пытается оценить сумму (и преуспевает в случае SymPy 1.2), последующее упрощение является косметическим. (И иногда могут быть вредными).

Наличие exp_polar означает, что SymPy считает необходимым рассматривать точки на римановой поверхности логарифмической функции вместо регулярных комплексных чисел. (Связанный бит документов). Функция lower_gamma разветвлена и поэтому мы должны различать "значение в -1, если мы придем к -1 с 1 по часовой стрелке" от "значения в -1, если мы придем к -1 с 1 перехода против часовой стрелки". Первый - exp_polar(-I*pi), последний - exp_polar(I*pi).

Все это очень интересно, но не очень полезно, когда вам нужна конкретная оценка выражения. Мы должны разобрать это выражение, и из того, что показывает Матлаб, просто заменить exp_polar на exp является правильным способом сделать это здесь.

rv = sp.simplify(t-sp.summation((sp.exp(-d)*(d**c)/sp.gamma(c+1))/(z-c-a*t),(c,0,sp.oo)))
rv = rv.subs(sp.exp_polar, sp.exp)

Результат: d**(-a*t + z)*exp(-I*pi*a*t - d + I*pi*z)*lowergamma(a*t - z, -d) + t

Здесь есть что подумать, с комплексными числами и так далее. Является ли d положительным или отрицательным? Что повышает его до власти -a*t+z означает, какую ветвь многозначной силовой функции мы возьмем? Те же проблемы присутствуют в выводе Matlab, где -d повышается до мощности.

Я рекомендую проверить это с помощью ввода с плавающей запятой (прямое суммирование рядов по сравнению с выражением выражения SymPy для него) и добавление предположений о знаке d если это возможно.

  • 0
    Спасибо, по-видимому, это была старая симпатичная версия, которая не могла оценить сумму. Во всяком случае, д является положительным реальным

Ещё вопросы

Сообщество Overcoder
Наверх
Меню