问题描述
我正在尝试使用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
ℯ