我在 SymPy Live 上尝试了以下内容
b,c,t = symbols('b c t')
g = 1/(1+exp(c*(b-t)))
integrate(g,t)
结果是 Integral(1/(exp(c*(b - t)) + 1), t)
我理解为“无法处理这个”。
但是,当我尝试
g = 1/(1+exp(0.1*(b-t)))
integrate(g,t)
我得到:
1.0*t + 10.0*log(exp(-0.1*b) + exp(-0.1*t))
而且我可以轻松地将 0.1
和 10
替换为 c
和 1/c
。我做错了什么让 SymPy 在 c 上阻塞但处理 0.1?
已编辑
我刚注意到
g = 1/(1+exp(c*b-c*t)))
可以通过集成处理。
最佳答案
SymPy 0.7.2 中的积分算法是 Risch 算法的启发式版本,对输入表达式的形式非常敏感。在 SymPy 的下一个版本中(如果你现在想要的话,或者是 git master),已经开始研究完整的 Risch 算法,它没有这个问题。
In [3]: b,c,t = symbols('b c t')
In [4]: g = 1/(1+exp(c*(b-t)))
In [5]: integrate(g,t)
Out[5]:
⎛ c⋅(b - t) ⎞
log⎝ℯ + 1⎠
t + ───────────────────
c
In [9]: g = 1/(1+exp(c*b-c*t))
In [11]: integrate(g, t)
Out[11]:
⎛ b⋅c - c⋅t ⎞
log⎝ℯ + 1⎠
t + ───────────────────
c
你有时还是会看到这个问题,因为并不是所有的积分都由到目前为止已经实现的 Risch 算法的部分处理,所以它会退回到启发式版本。
(准确地说,还有另一种算法,使用 Meijer G 函数,但不适用于这个被积函数。它也有点启发式,因此可能取决于输入的形式)
关于python - 在 SymPy 中明智地使用常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16499678/