Python NumPyのpolyroots()で複素数の根を持つ多項式の根を計算する方法
PythonのNumPyライブラリでは、polynomial.polyroots()メソッドを使用することで、多項式の根(解)を簡単に計算できます。このメソッドは、多項式の根を格納した配列を返します。すべての根が実数の場合は結果も実数型になり、それ以外の場合は複素数型になります。引数 c には、多項式の係数を要素とする1次元配列を指定します。
polyroots()メソッドの仕組みと注意点
根の推定値は、コンパニオン行列の固有値として求められます。そのため、以下のような点に注意が必要です。
- 複素平面上で原点から遠い位置にある根は、べき級数表現の数値的不安定性により、誤差が大きくなる可能性があります。
- 重複度が2以上の根も、その点近傍での級数の値が根の誤差に対して比較的鈍感なため、誤差が大きくなりやすい傾向があります。
- 原点付近の孤立した根については、ニュートン法を数回反復することで精度を改善できます。
手順
まず、必要なライブラリをインポートします。
from numpy.polynomial import polynomial as P
次に、polynomial.polyroots()メソッドを使って多項式の根を計算します。ここでは、虚数単位 j を用いた例を示します。
j = complex(0,1)
print("Result (roots of a polynomial)...\n",P.polyroots((-j,j)))結果のデータ型を確認します。
print("\nType...\n",P.polyroots((-j, j)).dtype)結果の形状(シェイプ)を確認します。
print("\nShape...\n",P.polyroots((-j, j)).shape)完全なコード例
from numpy.polynomial import polynomial as P
# 多項式の根を計算するには polynomial.polyroots() メソッドを使用する
# このメソッドは多項式の根の配列を返す。
# すべての根が実数なら結果も実数、そうでなければ複素数になる。
# 引数 c は多項式の係数を格納した1次元配列。
j = complex(0,1)
print("Result (roots of a polynomial)...\n",P.polyroots((-j,j)))
# データ型を取得
print("\nType...\n",P.polyroots((-j, j)).dtype)
# 形状を取得
print("\nShape...\n",P.polyroots((-j, j)).shape)出力結果
Result (roots of a polynomial)... [1.+0.j] Type... complex128 Shape... (1,)
この例では、係数 (-j, j) を持つ多項式、つまり -j + jx = 0 の根が 1.+0.j(実数の1)として正しく求められていることがわかります。また、入力に複素数が含まれているため、結果のデータ型は complex128 になっています。
-
Python NumPyのemath.sqrt()メソッドで複素数入力の平方根を計算する方法
入力値の平方根を計算するには、Python NumPyのemath.sqrt()メソッドを使用します。このメソッドは引数xの平方根を返します。xがスカラーであれば結果もスカラーとして返され、配列であれば配列として返されます。また、負の入力要素が含まれる場合には、自動的に複素数値が返されるのが特徴です。通常のnp.sqrt()では負の数を渡すとNaNが返されますが、np.emath.sqrt()(np.scimath.sqrt()のエイリアス)を使えば、負の数や複素数に対しても正しく複素数の平方根を求められます。手順まず、必要なライブラリをインポートします。import numpy as np次
-
Pythonで与えられた根を持つモニック多項式を生成する方法
PythonのNumPyで指定した根を持つモニック多項式(最高次の係数が1になる多項式)を生成するには、polynomial.polyfromroots()メソッドを使用します。このメソッドは、多項式の係数を1次元配列として返します。すべての根が実数の場合は出力も実数となり、虚数の根が含まれる場合は複素数となります。引数rootsには、根を要素として含むシーケンスを渡します。手順まず、必要なライブラリをインポートします。from numpy.polynomial import polynomial as Pモニック多項式を生成します。print(Result...\n,P.polyfromro