【问题标题】:Sympy: Drop higher order terms in polynomialSympy:删除多项式中的高阶项
【发布时间】:2014-09-20 00:47:57
【问题描述】:

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

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

作为一个特殊情况,我有一个非常复杂的函数,但我只想将术语保持在 x 中的二阶。这样做的有效方法是什么?

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

【问题讨论】:

  • 请原谅我的无知。您如何定义术语的“顺序”?和学位的意思一样吗?
  • 对不起,多项式中特定项的次数

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


【解决方案1】:

一个简单的方法是在表达式中添加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 ⎠

【讨论】:

  • 这也适用于多元多项式,例如:+ O(x*y) 或 + O(x**2*y)。谢谢:)
【解决方案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 将复杂表达式转换为多项式的效率如何
  • 这很慢,我认为转换为多项式的过程大致符合我在问题中的建议,即取导数等。
  • 嗯,也许你可以 expand() 函数并遍历 .args: sum(term for term in expand(f).args if degree(term, x) &lt;= order)
猜你喜欢
  • 1970-01-01
  • 2020-08-08
  • 1970-01-01
  • 2015-08-31
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
  • 2015-07-10
  • 1970-01-01
相关资源
最近更新 更多