10

Sympy を使用して、シンボル "x" (および潜在的に他のシンボル) の多項式である式 f があるとします。

整数 n より大きい次数の f のすべての項を削除する効率的な方法があるかどうかを知りたいです。

特別なケースとして、私は非常に複雑な関数を持っていますが、x で 2 次までの項のみを保持したいと考えています。これを行う効率的な方法は何ですか?

それを行うための明白であまり効率的ではない方法は、n 未満の各 m に対して、m 導関数を取り、x を 0 に設定して x^m の係数を取得することです。この方法で各係数を取得し、多項式を再構築します。しかし、デリバティブを取ることは最も効率的なことではありません。

4

2 に答える 2

16

これを行う簡単な方法は、次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 ⎠
于 2014-08-03T19:37:29.953 に答える
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)

モジュールには、計算や導関数の取得などを行うのではなく、式を直接操作できる操作関数がたくさんあります。

于 2014-07-29T03:05:00.163 に答える