Я использую 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))
Формула включает более низкие незавершенные гамма-функции, как и ожидалось. Любая идея, почему это поведение? Я думал, что симпы смогли сделать это суммирование символически.
Запуск кода с помощью 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
если это возможно.