SymPy 的集成函数尝试了多种不同的集成方法,其中一种是 Risch 算法,在某些情况下可能会非常慢。还有一种“手动”集成方法,它不如 Risch 完整,但偶尔会出现极度缓慢的情况。这里有一些描述:
https://docs.sympy.org/latest/modules/integrals/integrals.html#internals
您给出的示例中的问题是它陷入了启发式。所以让我们试试“手动”吧:
In [1]: expr = (-4*x**3*sin(2*x) + 2*cos(x)*cos(2*x))*(cos(x) + 1)
In [2]: expr
Out[2]:
⎛ 3 ⎞
⎝- 4⋅x ⋅sin(2⋅x) + 2⋅cos(x)⋅cos(2⋅x)⎠⋅(cos(x) + 1)
In [3]: %time anti1 = expr.integrate(x, manual=True)
CPU times: user 39.7 s, sys: 232 ms, total: 39.9 s
Wall time: 43.1 s
In [4]: anti1
Out[4]:
3 3 3 ⌠
8⋅x ⋅cos (x) 3 2 x 4⋅sin (x) sin(4⋅x) ⎮ 2 3
──────────── + 2⋅x ⋅cos(2⋅x) - 3⋅x ⋅sin(2⋅x) - 3⋅x⋅cos(2⋅x) + ─ - ───────── + 2⋅sin(x) + 2⋅sin(2⋅x) + ──────── - 8⋅⎮ x ⋅cos (x) dx
3 2 3 8 ⌡
这需要 40 秒,但结果并未完全积分:manualintegrate 在其中留下了一个未计算的积分。我们可以通过调用doit 使用普通的integrate 来完成它:
In [5]: %time anti1.doit()
CPU times: user 4.46 s, sys: 142 ms, total: 4.61 s
Wall time: 4.81 s
Out[5]:
3 3 2 3 2 3
8⋅x ⋅cos (x) 3 16⋅x ⋅sin (x) 2 2 2 32⋅x⋅sin (x)⋅cos(x) 112⋅x⋅cos (x)
──────────── + 2⋅x ⋅cos(2⋅x) - ───────────── - 8⋅x ⋅sin(x)⋅cos (x) - 3⋅x ⋅sin(2⋅x) - ─────────────────── - ───────────── - 3⋅x⋅c
3 3 3 9
3 2
x 284⋅sin (x) 112⋅sin(x)⋅cos (x) sin(4⋅x)
os(2⋅x) + ─ + ─────────── + ────────────────── + 2⋅sin(x) + 2⋅sin(2⋅x) + ────────
2 27 9 8
所以又花了几秒钟才得到这个结果。正如我们可以验证的那样,这现在是一个完整的反导数:
In [6]: simplify(expr - _.diff(x))
Out[6]: 0
这意味着我们可以使用expr.integrate(x, manual=True).doit() 在大约 50 秒内完成这个特殊的积分。
实际上,如果将这个特定示例从 sin/cos 重写为 exp,则可以在 5 秒内完成:
In [1]: expr = (-4*x**3*sin(2*x) + 2*cos(x)*cos(2*x))*(cos(x) + 1)
In [2]: %time expr.rewrite(exp).expand().integrate(x).expand().rewrite(sin).simplify()
CPU times: user 5.3 s, sys: 21.2 ms, total: 5.32 s
Wall time: 5.33 s
Out[2]:
3 2
3 3 2⋅x ⋅cos(3⋅x) 2 2 2⋅x ⋅sin(3⋅x) 4⋅x⋅cos
2⋅x ⋅cos(x) + 2⋅x ⋅cos(2⋅x) + ───────────── - 6⋅x ⋅sin(x) - 3⋅x ⋅sin(2⋅x) - ───────────── - 12⋅x⋅cos(x) - 3⋅x⋅cos(2⋅x) - ───────
3 3 9
(3⋅x) x 13⋅sin(3⋅x) sin(4⋅x)
───── + ─ + 13⋅sin(x) + 2⋅sin(2⋅x) + ─────────── + ────────
2 27 8
In [3]: simplify(expr - _.diff(x))
Out[3]: 0
虽然这个答案看起来与前一个答案不同,但使用三角恒等式重写三角表达式的方法有无数种,但它们应该等价于一个加法常数(根据反导数的要求)。