SymPy:doit 对指数乘积没有影响

SymPy: no effect of doit on a product of exponentials

我正在尝试使用 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)、变量(例如 xbase)或 SymPy 中定义的常量(例如pi)。 就在base=euler number时,doit()不起作用。

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

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

结果仍然是:

而不是

一个变通办法可能是用 base 之类的变量替换 e 并在最后进行相反的替换。

但是有没有更好的解决办法呢?

版本:python 3.7.4,SymPy 1.4

我想这适用于其他情况但不适用于 exp,因为 E**x 是 class exp 而不是 Pow 的实例。可能通过检查两个 classes.

可以使 sympy 代码一致

您可以使用 rewrite 使用 exp 和 log 在 Products 和 Sums 之间进行转换:

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     
ℯ