与 sympy 集成

Integration with sympy

我正在尝试使用 sympy;

执行以下集成
x = Symbol('x')
expr = (x+3)**5
integrate(expr)

我期待的答案是:

但是返回的是:

以下代码在 MATLAB 中有效:

syms x
y = (x+3)^5;
int(y)

我不确定为了使用 sympy 执行此操作我做错了什么。

这实际上是微积分中常见的问题,对于这些类型的多项式表达式,您确实会得到两个答案。 x 的每个幂的系数都存在,但它们之间缺少常数因子。

因此,您可以使用两种方法求出该表达式的不定积分。

  1. 第一种方法是对u = x+3进行代换,然后对u进行积分。那么,不定积分将如您所料 (1/6)*(x + 3)^6 + C

  2. 第二种方法是完全展开多项式并对每一项单独积分。


MATLAB 选择第一种方式求积分:

>> syms x;
>> out = int((x+3)^5)

out =

(x + 3)^6/6

后面要注意的是,如果我们展开这个多项式表达式,我们得到:

>> expand(out)

ans =

x^6/6 + 3*x^5 + (45*x^4)/2 + 90*x^3 + (405*x^2)/2 + 243*x + 243/2

sympy选择第二种方式求积分:

In [20]: from sympy import *

In [21]: x = sym.Symbol('x')

In [22]: expr = (x+3)**5

In [23]: integrate(expr)
Out[23]: x**6/6 + 3*x**5 + 45*x**4/2 + 90*x**3 + 405*x**2/2 + 243*x

您会注意到两种环境的答案相同,但缺少常数因子。由于缺少常数因子,因此没有一种巧妙的方法可以将其分解为您期望从 MATLAB 中看到的输出中得到的整洁多项式。

最后一点,如果您想重现 sympy 生成的内容,展开多项式,然后积分。我们得到 sympy 生成的内容:

>> syms x;
>> out = expand((x+3)^5)

out =

x^5 + 15*x^4 + 90*x^3 + 270*x^2 + 405*x + 243

>> int(out)

ans =

x^6/6 + 3*x^5 + (45*x^4)/2 + 90*x^3 + (405*x^2)/2 + 243*x

不过,常数因子不应该让您担心。最后你最关心的是一个的积分,所以这些常数因子的减法会发生,不会影响最后的结果。


旁注

感谢 DSM,如果您为 integrate 指定 manual=True 标志,这将尝试模拟手动执行集成,这将为您提供您期望的答案:

In [26]: from sympy import *

In [27]: x = sym.Symbol('x')

In [28]: expr = (x+3)**5

In [29]: integrate(expr, manual=True)
Out[29]: (x + 3)**6/6