在SymPy中明智地使用常量

时间:2013-05-11 17:10:00

标签: python sympy integrate

我在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.110替换为c1/c。我做错了让SymPy在c上阻塞但是处理0.1?

被修改

我刚才注意到了

g = 1/(1+exp(c*b-c*t)))

可以通过集成来处理。

2 个答案:

答案 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以获取有关自动简化的更多信息。

虽然这解释了问题的一部分,但它并没有解释为什么只考虑符号中的一个而不是另一个符号。