目次
代数計算ライブラリSymPyのインポート
SymPyのすごさを一言で言い表すならば「数学の玉手箱」です。SymPyにぎっしり詰まった数学をPythonを通して便利に引き出すことができます。
中学・高校の数学で登場した方程式もSymPyにかかれば簡単に解いてくれます。方程式といっても様々な種類があります。今回はn次方程式と微分方程式をとりあげます。
ライブラリ・モジュールのインポートの方法についてあらためてまとめておきます。
インポートの方法その1|import ライブラリ名
SymPyライブラリをインポートするには
>>> import sympy
とするのが基本です。SymPyライブラリに含まれる関数を使う場合には
>>> sympy.func()
のようにします。
インポートの方法その2|import ライブラリ名 as 別名
長い名前のライブラリ名の代わりに別名を使うことができます。sympyの場合symやspがよく使われます。
>>> import sympy as sym
>>> sym.func()
>>> import sympy as sp
>>> sp.func()
のように使います。ただし短縮名を宣言すると、もとのライブラリ名は使えなくなります。
インポートの方法その3|from ライブラリ名 import func1, func2
ライブラリで定義された指定した関数だけを使う場合にこの方法を使います。sympy.func1()、sympy.func2()はsympy.を付けずにfunc1()、func2()として使うことができます。
インポートの方法その4|from ライブラリ名 import *
ライブラリのすべての関数をライブラリ名を省略して使うことができます。
>>> from sympy import *
>>> func1()
>>> func2()
>>> func3()
*を使ったインポートは多くの関数を使う場合には便利です。しかし、複数のライブラリをインポートした場合には、関数がどのライブラリのものなのかが分からなくなるので注意が必要です。
sympy.solve()で2次方程式3x²-4x+5=0を解く
2次方程式
3x²-4x+5=0
を解いてみましょう。
>>> import sympy
>>> x = sympy.Symbol('x')
>>> sympy.solve(3*x**2-4*x+5)
[2/3 - sqrt(11)*I/3, 2/3 + sqrt(11)*I/3]
3行目は見た通りです。2次方程式の右辺を0にしたときの左辺をsympy.solve()の引数に渡しています。
2行目がポイントです。xを代数xとして使うための設定です。Pythonでは変数xには文か数を代入できますが代数として使うことはできないのでそのための準備が必要になります。
sympy.Symbol()で定義された変数xをシンボリック変数(Symbolic variable)といいます。ライブラリ名SymPyのSymとはSymbolが由来です。
sympy.init_printing()で解の表示を自然数式表示にする
出力された解はわかりづらいです。sympy.init_printing()関数を実行することで出力をきれいな自然数式表示にすることができます。
>>> import sympy
>>> sympy.init_printing()
>>> x = sympy.Symbol('x')
>>> sympy.solve(3*x**2-4*x+5)
結果は虚数解なので虚数iがついています。
2次方程式ax²+bx+c=0を解く
SymPyは係数がシンボリック変数であっても解くことができます。
2次方程式
ax²+bx+c=0
を解いてみましょう。
a、b、cもシンボリック変数として定義するだけでOKです。
>>> import sympy
>>> sympy.init_printing()
>>> sympy.var('x a b c')
>>> sympy.solve(a*x**2+b*x+c, x)
多数の変数をシンボリック変数として定義する場合にはsympy.var()が便利です。最初の2次方程式はシンボリック変数がxだけなのでsympy.solve()には解くべき変数を省略できました。この2次方程式ではシンボリック変数が4つあるのでどの変数について解くかを第2引数に渡します。
結果は2次方程式の解の公式そのものです。
3次方程式ax³+bx²+cs+d=0を解く
では3次方程式はどうでしょうか。
3次方程式
ax³+bx²+cs+d=0
を解いてみます。
シンボリック変数を1つ追加するだけで、これまでと同じです。
>>> import sympy
>>> sympy.init_printing()
>>> sympy.var('x a b c d')
>>> sympy.solve(a*x**3+b*x**2+c*x+d, x)
ただしコンソール上で出力すると結果が長すぎて自然数式表示でも分かりづらくなります。そこでJupyer Notebookで解いてみます。
3つの解のうち1番目の解全体を見ることができます。これが「カルダノの公式」です。
このようにSymPyを使えばたった4行のコードで代数方程式を解くことができます。次回は得られた方程式の解を利用する方法を紹介します。