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 = euler数字时,doit()不起作用。

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

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

结果仍然是:

而不是

一种解决方法是用 base 这样的变量对 e 进行替换,并在末尾进行相反的替换。

但是有更好的解决方案吗?

版本:python 3.7.4,SymPy 1.4

解决方法

我猜想这对其他情况也有效,但不适用于exp,因为E**x是类exp而不是Pow的实例。通过检查两个类,可能可以使sympy代码保持一致。

您可以使用exp和log使用重写在Product和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     
ℯ      

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...