【问题标题】:Symbolic integration slow with SymPySymPy 的符号集成很慢
【发布时间】:2017-12-10 14:00:46
【问题描述】:

我不是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 中的半分钟多与 Mathematica 上的即时回复。这还不够信息吗?

标签: python sympy symbolic-math


【解决方案1】:

在进行集成之前,您可以通过将 SymPy 告知 expand products of sin-cos to sums(另请参阅 [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

【讨论】:

  • 谢谢,这正是我想要的。
猜你喜欢
  • 1970-01-01
  • 2017-08-24
  • 2012-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多