Sympy计算∫(x+b)^t积分分段解存疑:t=0/1时结果异常
我们需要求解不定积分$\int (x + b)^t dx$(其中$b,t \in \mathbb{R}$),使用SymPy执行以下代码:
import sympy from sympy.abc import x, b, t sympy.integrate((x + b)**t, x)
得到的分段解为:
$$\begin{cases} \frac{\left(b + x\right)^{t + 1}}{t + 1} & \text{当}: t \neq -1 \log{\left(b + x \right)} & \text{否则} \end{cases}$$
但直观上会觉得这个解在t=0和t=1时存在问题,认为正确的分段解应该是:
$$\begin{cases} \log{\left(b + x \right)} & \text{当} : t = -1 \x & \text{当} : t = 0 \ \frac{x^2}{2} + bx & \text{当} : t = 1 \ \frac{\left(b + x\right)^{t + 1}}{t + 1} & \text{其他情况} \ \end{cases}$$
测试验证
t=0的情况
先通过通解代入t=0:import sympy from sympy.abc import x, b, t general_solution = sympy.integrate((x + b)**t, x) specific_solution = general_solution.subs(t, 0)得到的结果是
x + b,但直接积分$(x+b)^0$:import sympy from sympy.abc import x, b, t direct_solution = sympy.integrate((x + b)**0, x)得到的结果是
x。t=1的情况
通解代入t=1会得到$\frac{(x+b)2}{2}$,而直接积分$(x+b)1$会得到$\frac{x^2}{2} + bx$,两者同样存在差异。
原因解释
SymPy给出的结果其实是正确的,核心原因在于不定积分的结果本身就相差一个任意常数:
- 当t=0时,通解代入得到的
x + b和直接积分的x仅相差常数项b,这属于不定积分的等价解(因为不定积分的结果是一族函数,任意两个解之间相差常数)。 - 当t=1时,$\frac{(x+b)2}{2}$展开后是$\frac{x2}{2} + bx + \frac{b2}{2}$,和$\frac{x2}{2} + bx$相差常数$\frac{b^2}{2}$,同样属于等价的不定积分结果。
SymPy的通解采用了统一的表达式形式,没有单独列出t=0、t=1的情况,因为这些情况都可以被通解表达式覆盖,只是常数项的差异不影响不定积分的正确性。
内容的提问来源于stack exchange,提问作者ddiva1973

