Sympy:在多项式中删除高阶项

时间:2014-07-28 18:32:03

标签: python sympy symbolic-math computer-algebra-systems polynomials

使用Sympy,假设我们有一个表达式f,它是符号“x”(以及可能的其他符号)的多项式。

我想知道如果有一种有效的方法可以删除大于某个整数n的f中的所有项。

作为一个特例,我有一个非常复杂的功能,但我想只保留x中的第二顺序。有效的方法是什么?

明显的,非常有效的方法是每m小于n,取m个导数并将x设为0得到x ^ m的系数。我们以这种方式获得每个系数,然后重建多项式。但是,采取衍生品并不是最有效的方法。

2 个答案:

答案 0 :(得分:9)

一种简单的方法是将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 ⎠

答案 1 :(得分:2)

如果你看一下多项式模块docs:

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)

模块中有很多操作函数,您应该能够直接使用表达式,而不是进行计算/获取衍生物等。