我在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)))
可以通过集成来处理。
答案 0 :(得分:5)
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函数,但不适用于此被积函数。它也有点启发式,因此可能取决于输入的形式)
答案 1 :(得分:1)
虽然我无法回答为什么1/(1+exp(c*b-c*t)))
有效但1/(1+exp(c*(b-t)))
却没有,但如果我们对某个给定的那个可以解释为什么c=<a_number>
有效。
SymPy有许多自动简化功能。它通过扩展和来简化'float * sum',但它并不简化'symbol * sum'。您可以查看https://github.com/sympy/sympy/wiki/automatic-simplification以获取有关自动简化的更多信息。
虽然这解释了问题的一部分,但它并没有解释为什么只考虑符号中的一个而不是另一个符号。