SymPy:多项式中高阶项的删除

11

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

我想知道是否有一种有效的方法可以删除f中高于某个整数n阶的所有项。

作为一个特例,我有一个非常复杂的函数,但我只想保留x的二次项。有什么更有效的方法吗?

显然,不太有效的方法是对于每个小于n的m,取m阶导数并将x设置为0以获得x ^ m的系数。我们通过这种方式获取每个系数,然后重构多项式。但是取导数不是最有效的方法。


请原谅我的无知。如何定义术语的“次数”?它是否意味着与“次数”相同? - Carl Love
抱歉,是的,多项式中特定项的次数。 - zzz
2个回答

18

一个简单的方法是将O(x**n)添加到表达式中,例如

In [23]: x + x**2 + x**4 + x**10 + O(x**3)
Out[23]:
     23x + 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 ⎠

2
太好了,这也适用于多元多项式,例如:+ O(xy) 或 + O(x**2y)。谢谢 :) - Bernardo Costa

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)

该模块中有许多操作函数,您应该能够直接使用表达式而不是进行计算/求导等操作。


好的,我得测试一下将一个复杂表达式通过Poly转换成多项式的效率如何。 - zzz
它运行得相当慢,我认为将其转换为多项式的过程大致上就是我在问题中所建议的,即进行求导等操作。 - zzz
嗯,也许你可以expand()函数并迭代.argssum(term for term in expand(f).args if degree(term, x) <= order) - SeanV

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接