Замените `exp (I * pi)` на `-1` в выражении SymPy - PullRequest
0 голосов
/ 07 апреля 2020

При использовании sympy для интеграции выражения часто в результате есть где-то exp (I * pi):

from sympy.functions import *
from sympy import *
init_printing(use_latex=False, use_unicode=False)
shift = Symbol('shift', real=True, positive=True)
x = Symbol('x', real=True, positive=True)
p = Symbol('p', real=True)

expr = integrate(exp(-p)/(p+shift), (p, x, oo))
expr
/            /   /             I*pi\     /             I*pi\             \    
|            |log\(shift + x)*e    / - Ei\(shift + x)*e    /   EulerGamma|    
|(shift + x)*|---------------------------------------------- + ----------| - l
\            \                  shift + x                      shift + x /    

                          \       
                          |  shift
og(shift + x) - EulerGamma|*e     
                          /      

Но известно, что exp(I*pi) == -1. И неудобно иметь в выражении комплексные числа, которые должны быть реальными. Можно ли как-то заменить exp(I*pi) на -1 в выражении? Я пробовал simplify() и subs(exp(I*pi), -1). Не помогает ни первое, ни второе.

1 Ответ

0 голосов
/ 07 апреля 2020

Специальная директива о печати скрывает то, что у вас есть на самом деле. Это не exp(I*pi), это polar_exp(I*pi). Если вы print(expr), вы увидите это:

((shift + x)*((log((shift + x)*exp_polar(I*pi)) - Ei((shift +
x)*exp_polar(I*pi)))/(shift + x) + EulerGamma/(shift + x)) - log(shift
+ x) - EulerGamma)*exp(shift)

Замена на .subs(exp_polar(I*pi), -1) будет работать ... но вы должны прочитать о polar_lift и exp_polar, чтобы понять, что она говорит вам и что вы должны знать при выполнении этой замены.

...