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

Я использую 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))

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

1 Ответ

0 голосов
/ 29 августа 2018

Запуск вашего кода с 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.

...