Запуск вашего кода с 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)
.
Все это очень интересно, но не очень полезно, когда вам нужна конкретная оценка выражения. Мы должны неполяризовать это выражение, и, как показывает Matlab, простая замена 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
.