SymPy 的符号集成速度慢
Symbolic integration slow with SymPy
我不是 SymPy
专家,但我在过去几年的一些讲座中成功地使用了它。但是,有时符号集成似乎很慢。这是一个示例,Mathematica
几乎可以立即计算,而 SymPy
在我的机器上需要很长时间(超过半分钟)。
from sympy import *
x = symbols("x")
def coeff (f, k, var = x):
return integrate(f(var) * cos(k * var), (var, -pi, pi)) / pi
f = lambda x: (11*sin(x) + 6*sin(2*x) + 2*sin(3*x))/10
[coeff(f, k) for k in range(0, 5)]
我是不是做错了什么或者这是预期的行为?有什么技巧可以加快速度吗?
SymPy
版本是 1.0,Python
在 Windows.
上是 3.5.1 64 位 (Anaconda)
您可以通过告诉 SymPy 扩展产品来帮助指导集成
sin-cos 求和 (另见 [1],[2]),然后再进行积分:
例如,
In [58]: fprod(f, 4)
Out[58]: (11*sin(x)/10 + 3*sin(2*x)/5 + sin(3*x)/5)*cos(4*x)
In [59]: FU['TR8'](fprod(f, 4))
Out[59]: -sin(x)/10 - 3*sin(2*x)/10 - 11*sin(3*x)/20 + 11*sin(5*x)/20 + 3*sin(6*x)/10 + sin(7*x)/10
这种形式的集成更简单。
因此您可以使用:
import sympy as sym
x = sym.symbols("x")
def f(x):
return (11*sym.sin(x) + 6*sym.sin(2*x) + 2*sym.sin(3*x))/10
def fprod(f, k, var=x):
return f(var) * sym.cos(k * var)
FU = sym.FU
def coeff (f, k, var=x):
return sym.integrate(FU['TR8'](fprod(f, k)), (var, -sym.pi, sym.pi)) / sym.pi
[coeff(f, k) for k in range(0, 5)]
这是使用 FU['TR8']
的基准:
In [52]: %timeit [coeff(f, k) for k in range(0, 5)]
10 loops, best of 3: 78.8 ms per loop
使用原始代码(没有FU['TR8']
):
In [54]: %timeit [coeff(f, k) for k in range(0, 5)]
1 loop, best of 3: 19.8 s per loop
我不是 SymPy
专家,但我在过去几年的一些讲座中成功地使用了它。但是,有时符号集成似乎很慢。这是一个示例,Mathematica
几乎可以立即计算,而 SymPy
在我的机器上需要很长时间(超过半分钟)。
from sympy import *
x = symbols("x")
def coeff (f, k, var = x):
return integrate(f(var) * cos(k * var), (var, -pi, pi)) / pi
f = lambda x: (11*sin(x) + 6*sin(2*x) + 2*sin(3*x))/10
[coeff(f, k) for k in range(0, 5)]
我是不是做错了什么或者这是预期的行为?有什么技巧可以加快速度吗?
SymPy
版本是 1.0,Python
在 Windows.
您可以通过告诉 SymPy 扩展产品来帮助指导集成 sin-cos 求和 (另见 [1],[2]),然后再进行积分:
例如,
In [58]: fprod(f, 4)
Out[58]: (11*sin(x)/10 + 3*sin(2*x)/5 + sin(3*x)/5)*cos(4*x)
In [59]: FU['TR8'](fprod(f, 4))
Out[59]: -sin(x)/10 - 3*sin(2*x)/10 - 11*sin(3*x)/20 + 11*sin(5*x)/20 + 3*sin(6*x)/10 + sin(7*x)/10
这种形式的集成更简单。
因此您可以使用:
import sympy as sym
x = sym.symbols("x")
def f(x):
return (11*sym.sin(x) + 6*sym.sin(2*x) + 2*sym.sin(3*x))/10
def fprod(f, k, var=x):
return f(var) * sym.cos(k * var)
FU = sym.FU
def coeff (f, k, var=x):
return sym.integrate(FU['TR8'](fprod(f, k)), (var, -sym.pi, sym.pi)) / sym.pi
[coeff(f, k) for k in range(0, 5)]
这是使用 FU['TR8']
的基准:
In [52]: %timeit [coeff(f, k) for k in range(0, 5)]
10 loops, best of 3: 78.8 ms per loop
使用原始代码(没有FU['TR8']
):
In [54]: %timeit [coeff(f, k) for k in range(0, 5)]
1 loop, best of 3: 19.8 s per loop