前書き
繰り返し計算練習ができるサイトを作っているのですが、ある関数の動作で少し詰まったので備忘録代わりに書いておきます。
coeff
coeffはsympyに備え付けられた関数です。
(Polynomials Manipulation Module Reference)
かなり広い使い方ができるようですが、自分はもっぱら多項式を用意して、指定した次数の係数を返してもらうのに使っています。
import sympy as sy
x = sy.Symbol("x", real=True)
expr = x ** 2 - 5 * x + 6
print(expr.coeff(x, 2))
print(expr.coeff(x, 1))
print(expr.coeff(x, 0))
1
-5
6
何かと便利なのでよくお世話になるのですが、実はこのcoeffメソッド、式の与え方によって挙動が変わることがあります。私が引っ掛かったのはここですね。具体的には因数分解された形で計算すると、ごろっと挙動が変わります。
import sympy as sy
x = sy.Symbol("x", real=True)
# expr = x ** 2 - 5 * x + 6
expr = (x - 2) * (x - 3)
print(expr.coeff(x, 2))
print(expr.coeff(x, 1))
print(expr.coeff(x, 0))
0
0
0
これを防ぐためには、expandをかませればokです。
import sympy as sy
x = sy.Symbol("x", real=True)
# expr = x ** 2 - 5 * x + 6
# expr = (x - 2) * (x - 3)
expr = sy.expand((x - 2) * (x - 3))
print(expr.coeff(x, 2))
print(expr.coeff(x, 1))
print(expr.coeff(x, 0))
1
-5
6
これに気付かず半日くらい苦労しました。
後書き
ネット上であまり情報が見つからなかったので、結構苦労しました。思うに、もっともっと高度で複雑な計算のために利用している人が大半で、私のようにあらゆる数や式をLaTeX形式で出力してくれることの恩恵を一番重視しているユーザーがそこまで居ないのではないでしょうか。高校数学まででやるような初歩的な計算はあまり資料がないことも少なくありませんからね。
以上、短い上にニッチですが、どなたかの助けになれれば幸いです。