SymPy による代数計算
SymPy とは Symbol (記号) による演算、すなわちコンピュータで代数演算を実行する機能を備えた計算機代数システム (CAS ; Computer Algebra System) です。
SymPyの基本的な使い方
記号の定義
x を記号として定義すると、x ** 2 + 1 のような式を x の多項式として扱うことができます。記号の定義には次の 2 通りの方法があります。
複数の記号を定義することもできます。
生成されたオブジェクトは sympy.core.symbol.Symbolクラスに属しますが、当サイトではこのクラスに属するオブジェクトを簡単に Symbol と記述します。
# sympyをインポート
import sympy
# Symbolクラスのインスタンスを生成(記号の定義)
sympy.var('x')
# 多項式yを定義
y = x ** 2 + 1
print(y)
print(type(x))
x**2 + 1
<class 'sympy.core.symbol.Symbol'>
記号に数値を代入
記号に数値を代入するときは subs()メソッドを用います。
# sympyをインポート
import sympy
# Symbolクラスのインスタンスを生成
sympy.var('x')
# 多項式yを定義
y = x ** 2 + 1
# xに3を代入
y = y.subs(x, 3)
print(y)
10
複数の記号に数値を代入するときは、(記号, 数値) のタプルを要素に持つリストを渡します。
# sympyをインポート
import sympy
# 記号 x, y を定義
sympy.var('x y')
# 多項式zを定義
z = x ** 2 + 2 * x * y + y ** 2
# xに3, yに5を代入
z = z.subs([(x, 3), (y, 5)])
print(z)
64
多項式の四則演算
式同士で加減乗除を実行すると、多項式が返ります。
# sympyをインポート
import sympy
# 記号 a, b を定義
sympy.var('a b')
# 多項式f1を定義
f1 = a + 2 * b + 1
f2 = a + b + 5
# 多項式の加減乗除
g1 = f1 + f2
g2 = f1 - f2
g3 = f1 * f2
g4 = f1 / f2
print("f1 + f2 =", g1)
print("f1 - f2 =", g2)
print("f1 × f2 =", g3)
print("f1 / f2 =", g4)
f1 + f2 = 2*a + 3*b + 6
f1 - f2 = b - 4
f1 × f2 = (a + b + 5)*(a + 2*b + 1)
f1 / f2 = (a + 2*b + 1)/(a + b + 5)
分数型(有理数型)オブジェクト
sympy.Rational() に分子と分母を渡すと、分数型(有理数型)インスタンスを生成することができます。正確なクラス名は sympy.core.numbers.Rational です。
# sympyをインポート
import sympy
# a = 3/5
a = sympy.Rational(3, 5)
# b = 1/7
b = sympy.Rational(1, 7)
# 記号を定義
sympy.var('c')
print("a =", a)
print("b =", b)
print("a + b + c =", a + b + c)
a = 3/5
b = 1/7
a + b + c = c + 26/35
SymPyにおける不具合について
現在、SymPy のいくつかのバージョンにおいて
「 Symbolsオブジェクトが call できない」
「 sympy.solvers.ode.dsolve() の ics 引数が認識されない」
などの動作不良を確認しています。現時点 (2019年2月15日) の最新バージョン 1.3 においても問題が発生しています。私自身が確認したところ、バージョン 1.2 が最も安定しているようです。上記のエラーに心当たりのあるかたは、Anaconda Prompt を起動して、次のコードで SymPy をアップグレードまたはダウングレードしてください。