Sympy:去除多项式中的高次项

11 投票
2 回答
7126 浏览
提问于 2025-04-18 15:05

使用Sympy库,假设我们有一个表达式f,它是一个关于符号"x"的多项式(可能还包含其他符号)。

我想知道有没有什么有效的方法可以去掉f中所有高于某个整数n的项。

作为一个特殊情况,我有一个非常复杂的函数,但我只想保留x的二次项及以下的项。有什么有效的方法可以做到这一点呢?

一种明显但效率不高的方法是,对于每个小于n的m,计算m次导数,然后将x设为0,以获得x^m的系数。通过这种方式我们可以得到每个系数,然后再重建这个多项式。但是,计算导数并不是最有效的做法。

2 个回答

2

如果你查看多项式模块的文档:

http://docs.sympy.org/latest/modules/polys/reference.html

你会发现有很多方法可以处理你的问题,这些方法会根据你的具体情况而有所不同。这里有几种可行的方法:

一种是使用 .coeffs()

>>> f = 3 * x**3 + 2 * x**2 + x * y + y**3 + 1
>>> order = 2

>>> coeffs = Poly(f, x).coeffs()
>>> f_new = sum(x**n * coeffs[-(n+1)] for n in range(order+1)) # the +1 is to get 0th order
>>> f_new
2*x**2 + x*y + y**3 + 1

另外,你也可以遍历 .all_terms() 中的项:

>>> all_terms = Poly(f, x).all_terms()
>>> sum(x**n * term for (n,), term in all_terms() if n <= order)

这个模块里有很多操作函数,你可以直接用这些函数来处理表达式,而不需要自己去计算、求导等等。

18

一个简单的方法是给这个表达式加上 O(x**n),像这样:

In [23]: x + x**2 + x**4 + x**10 + O(x**3)
Out[23]:
     2    ⎛ 3⎞
x + x  + O⎝x ⎠

如果你想以后把它去掉,可以使用 removeO 方法。

In [24]: (x + x**2 + x**4 + x**10 + O(x**3)).removeO()
Out[24]:
 2
x  + x

你也可以使用 series 来获取这个表达式的级数展开。这里的不同之处在于,如果表达式中出现了非多项式的项,它的表现会有所不同:

In [25]: x + sin(x) + O(x**3)
Out[25]:
              ⎛ 3⎞
sin(x) + x + O⎝x ⎠

In [26]: (x + sin(x)).series(x, 0, 3)
Out[26]:
       ⎛ 3⎞
2⋅x + O⎝x ⎠

撰写回答