6

我在 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.1and10替换cand 1/c。我做错了什么让 SymPy 在 c 上窒息但处理 0.1?

已编辑

我刚刚注意到

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

可以通过集成来处理。

4

2 回答 2

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 函数,但不适用于这个被积函数。它也有点启发式,因此可能取决于输入的形式)

于 2013-05-12T19:45:24.490 回答
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以获取有关自动简化的更多信息。

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

于 2013-05-11T18:54:27.703 回答