Pythonで多項式を扱う時はSympyを使うものだと思い込んでいたのですが、
NumPyにも多項式クラスが用意されいるのを見つけ、しかもかなり使い勝手が良かったので紹介します。
ドキュメント: numpy.poly1d
これを使えば簡単に多項式を生成し、多項式間の演算を行ったり値を代入したりすることができます。
まず、多項式の生成は次の2種類のやりかでできます。
– 高次の項から順番に係数を指定する。
– その多項式の根を指定する。(この場合、再高次の項の係数は1)。
$2x^3-4x^2-22x+24$ と $(z-1)(z+2)=z^2+z-2$ をそれぞれの方法で定義したのが次のコードです。
import numpy as np
# 係数を指定する場合は、高次の項から順番に指定する
p1 = np.poly1d([2, -4, -22, 24])
print(p1)
"""
3 2
2 x - 4 x - 22 x + 24
"""
# r=True を指定することで、根を指定して生成できる
# variable で変数の文字も指定できる(デフォルトはx)
p2 = np.poly1d([-2, 1], r=True, variable="z")
print(p2)
"""
2
1 z + 1 z - 2
"""
係数のリストはc、次数はo、根の一覧はr、という属性でそれぞれアクセスすることができます。
係数と根はその多項式オブジェクトを作る時に指定した方法に関係なく取得できて便利です。
方程式を解くのもこれでできますね。
# 係数のリスト
print(p1.c)
# [ 2 -4 -22 24]
# 次数
print(p1.o)
# 3
# 根
print(p1.r)
# [-3. 4. 1.]
また、指定した次数の係数は辞書と同じように[次数]でアクセスできます。
# x^2 の係数
print(p1[2])
# -4
値の代入は通常の関数と同じように、 多項式オブジェクト(代入したい値) で計算できます。
# p1 に 2 を代入
print(p1(2))
# -20
このほか、 通常の +, -, * の 演算子で演算もできます。
/ は割り算ですが、商と余りを返してくれます。とても便利ですね。
p = np.poly1d([2, 7, 1, 4, 3])
q = np.poly1d([1, 3, 5])
print(p+q)
"""
4 3 2
2 x + 7 x + 2 x + 7 x + 8
"""
print(p-q)
"""
4 3 2
2 x + 7 x + 2 x + 7 x + 8
"""
print(p*q)
"""
6 5 4 3 2
2 x + 13 x + 32 x + 42 x + 20 x + 29 x + 15
"""
print(p/q)
# (poly1d([ 2., 1., -12.]), poly1d([35., 63.]))
このほかさらに、polyderとpolyintで微分と不定積分も用意されています。
# 微分
print(np.polyder(p))
"""
3 2
8 x + 21 x + 2 x + 4
"""
# 不定積分
print(np.polyint(p))
"""
5 4 3 2
0.4 x + 1.75 x + 0.3333 x + 2 x + 3 x
"""
例は省略しますが、2個目の引数に自然数を渡せばn回微分や、n回積分もやってくれます。
積分の方は、3つ目の引数に積分定数を渡すこともできます。