使用 Sympy,假设我们有一个表达式 f,它是符号“x”(以及可能的其他符号)的多项式。
我想知道是否有一种有效的方法可以删除大于某个整数 n 的 f 中的所有项。
作为一个特例,我有一个非常复杂的函数,但我只想在 x 中保持最高 2 阶的术语。这样做的有效方法是什么?
明显的,不是很有效的方法是对于每个小于 n 的 m,取 m 个导数并将 x 设置为 0 以获得 x^m 的系数。我们以这种方式获得每个系数,然后重建多项式。但采取衍生品并不是最有效的事情。
使用 Sympy,假设我们有一个表达式 f,它是符号“x”(以及可能的其他符号)的多项式。
我想知道是否有一种有效的方法可以删除大于某个整数 n 的 f 中的所有项。
作为一个特例,我有一个非常复杂的函数,但我只想在 x 中保持最高 2 阶的术语。这样做的有效方法是什么?
明显的,不是很有效的方法是对于每个小于 n 的 m,取 m 个导数并将 x 设置为 0 以获得 x^m 的系数。我们以这种方式获得每个系数,然后重建多项式。但采取衍生品并不是最有效的事情。
一种简单的方法是添加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 ⎠
如果您查看多项式模块文档:
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)
模块中有很多操作函数,您应该能够直接使用表达式,而不是进行计算/取导数/等。