質問

Sympyを使用して、シンボル "x"の多項式である式fを持っています(そして他の潜在的なシンボルの)。

私は、順序のf個の整数nより大きい順序ですべての用語を落とす効率的な方法がある場合を知りたいと思います。

特別な場合として、私は非常に複雑な関数を持っていますが、Xでは2次まで用語を保持したいだけです。これを行う効率的な方法は何ですか?

明らかであり、それをすることは、それを行うことを行うためにそれを実行するための非常に効率的な方法であろう、x ^ mの係数を得るためにm個の微分を取り、xを0に設定する。このようにして各係数を取得してから多項式を再構築します。しかし、派生物を服用することは最も効率的なことではありません。

役に立ちましたか?

解決

これを行う簡単な方法は、

のように、式に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)
.

モジュールには、計算/デリバティブ/ etcなどを行うのではなく、直接調査で動作できるようにする必要があることが多数あります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top