SymPy: нет влияния doit на произведение экспонент

#product #sympy #exponential #doit

#продукт #sympy #экспоненциальный #doit

Вопрос:

Я пытаюсь получить экспоненциальную сумму из произведения экспонент, используя SymPy. Кажется, это работает для любой базы, кроме e (число Эйлера).

Пример кода с общей базой для экспоненциального:

 from sympy import symbols, Function
from sympy import Product, E, pi, exp
i,n,base=symbols('i n base')
f=Function('f')
P=Product(base**f(i),(i,1,n))
P.doit()
  

P — это следующее выражение:

и после применения doit() становится:

Этот код работает для любой базы. Я тестировал его с числом (например, 3,0), переменной (например, x,base) или константой, определенной в SymPy (например, pi). Просто когда base = число Эйлера, doit() не работает.

 P=Product(E**f(i),(i,1,n))
P.doit()
  

или

 P=Product(exp(f(i)),(i,1,n))
P.doit()
  

результат по-прежнему:

и не

Обходной путь может заключаться в том, чтобы заменить e переменной типа base и сделать противоположную замену в конце.

Но есть ли какое-либо лучшее решение?

Версии: python 3.7.4, SymPy 1.4

Ответ №1:

Я думаю, это работает для других случаев, но не exp, потому что E**x это экземпляр класса exp , а не Pow . Вероятно, код sympy можно сделать согласованным, проверив оба класса.

Вы можете использовать rewrite для преобразования между произведениями и суммами, используя exp и log:

 In [47]: P = Product(E**f(i), (i, 1, n))                                                                                                                      

In [48]: P                                                                                                                                                    
Out[48]: 
  n         
─┬──┬─      
 │  │   f(i)
 │  │  ℯ    
 │  │       
i = 1       

In [49]: P.rewrite(Sum)                                                                                                                                       
Out[49]: 
   n       
  ___      
  ╲        
   ╲       
   ╱   f(i)
  ╱        
  ‾‾‾      
 i = 1     
ℯ