Python, SymPyの使い方(因数分解、方程式、微分積分など)
SymPyは代数計算(数式処理)を行うPythonのライブラリ。
因数分解したり、方程式(連立方程式)を解いたり、微分積分を計算したりすることができる。
- 公式サイト: SymPy
ここでは、SymPyの基本的な使い方として、
- インストール
- 変数、式を定義:
sympy.symbol()
- 変数に値を代入:
subs()
メソッド - 式の展開:
sympy.expand()
- 因数分解:
sympy.factor()
- 方程式を解く:
sympy.solve()
- 連立方程式を解く:
sympy.solve()
- 微分:
sympy.diff()
- 積分:
sympy.integrate()
- 三角関数、指数関数、対数関数などを使う
について、サンプルコードとともに説明する。
SymPyのインストール
pip
でインストールできる。(環境によってはpip3
)
$ pip install sympy
Anacondaにも入っている。これからPythonの環境を構築するのであれば、WindowsだとAnacondaをインストールするのが楽かもしれない。以下の公式サイトからAnacondaのインストーラーがダウンロードできる。
変数、式を定義: sympy.symbol()
変数は以下のようにsympy.symbol()
で定義する。
import sympy
x = sympy.Symbol('x')
y = sympy.Symbol('y')
print(type(x))
# <class 'sympy.core.symbol.Symbol'>
その変数を使って自由に数式を定義できる。四則演算(+
, -
, *
, /
)、べき乗(**
)などの演算子はPython標準のものを使う。
expr = x**2 + y + 1
print(expr)
# x**2 + y + 1
変数の名称とsympy.symbol()
の引数に渡す文字列は違っていてもいいが、分かりにくくなるだけなので、同じものにしておいたほうが無難。
z = sympy.Symbol('ZZZZ')
expr_z = z**2 + 3 * z
print(expr_z)
# ZZZZ**2 + 3*ZZZZ
変数に値を代入: subs()メソッド
定義した式の変数に値を代入したい場合はsubs()
メソッドを使う。
第一引数に対象の変数、第二引数に代入する値を指定する。
数値を代入したり、ほかの変数を代入したりできる。
print(expr)
# x**2 + y + 1
print(expr.subs(x, 1))
# y + 2
print(expr.subs(x, y))
# y**2 + y + 1
複数の変数に値を代入する場合は、(変数, 代入する値)
のタプルのリストを引数に指定する。
print(expr.subs([(x, 1), (y, 2)]))
# 4
式の展開: sympy.expand()
式を定義しただけだと自動的に展開されたりはしない。
expr = (x + 1)**2
print(expr)
# (x + 1)**2
式を展開したい場合はsympy.expand()
を使う。
expr_ex = sympy.expand(expr)
print(expr_ex)
# x**2 + 2*x + 1
因数分解: sympy.factor()
因数分解したい場合はsympy.factor()
を使う。
いくつか例を示す。変数が複数あってもよい。
print(expr_ex)
# x**2 + 2*x + 1
expr_factor = sympy.factor(expr_ex)
print(expr_factor)
# (x + 1)**2
print(sympy.factor(x**3 - x**2 - 3 * x + 3))
# (x - 1)*(x**2 - 3)
print(sympy.factor(x * y + x + y + 1))
# (x + 1)*(y + 1)
方程式を解く: sympy.solve()
方程式を解く(方程式の解を取得する)場合はsympy.solve()
を使う。
sympy.solve(式)
で式 = 0
とした場合の解が取得できる。
平方根(ルート)はsqrt
、虚数単位はI
で表される。(sqrt
はsquare rootの略)
print(sympy.solve(x**2 - 3 * x + 2))
# [1, 2]
print(sympy.solve(x**2 + x + 1))
# [-1/2 - sqrt(3)*I/2, -1/2 + sqrt(3)*I/2]
複数の変数を含む式において、任意の変数に対して解を取得することもできる。第二引数に対象の変数を指定する。
expr = x + y**2 - 4
print(sympy.solve(expr, x))
# [-y**2 + 4]
print(sympy.solve(expr, y))
# [-sqrt(-x + 4), sqrt(-x + 4)]
連立方程式を解く: sympy.solve()
連立方程式を解く場合もsympy.solve()
を使う。
複数の式を含むリスト(またはタプル)をsympy.solve()
の引数に指定すればOK。
expr1 = 3 * x + 5 * y - 29
expr2 = x + y - 7
print(sympy.solve([expr1, expr2]))
# {x: 3, y: 4}
微分: sympy.diff()
式の微分をするにはsympy.diff()
を使う。
print(sympy.diff(x**3 + 2 * x**2 + x))
# 3*x**2 + 4*x + 1
複数の変数を含む式において、任意の変数に対して微分することもできる。第二引数に対象の変数を指定する。
expr = x**3 + y**2 - y
print(sympy.diff(expr, x))
# 3*x**2
print(sympy.diff(expr, y))
# 2*y - 1
積分: sympy.integrate()
式の積分をするにはsympy.integrate()
を使う。
print(sympy.integrate(3 * x**2 + 4 * x + 1))
# x**3 + 2*x**2 + x
三角関数、指数関数、対数関数などを使う
三角関数、指数関数、対数関数などはsympy.sin()
, sympy.exp()
, sympy.log()
のように定義されている。
微分や積分も可能。
print(sympy.diff(sympy.cos(x)))
# -sin(x)
print(sympy.diff(sympy.exp(x)))
# exp(x)
print(sympy.diff(sympy.log(x)))
# 1/x
print(sympy.integrate(sympy.cos(x)))
# sin(x)
print(sympy.integrate(sympy.exp(x)))
# exp(x)
print(sympy.integrate(sympy.log(x)))
# x*log(x) - x
いちいちsympy.
をつけるのが面倒な場合は、以下のように各関数をimport
しておけばよい。
import sympy
from sympy import sin, exp
x = sympy.Symbol('x')
print(sympy.diff(sin(x)))
# cos(x)
print(sympy.diff(exp(x)))
# exp(x)
from sympy import *
とすればすべての関数がsympy.
なしで使えるが、import *
は何がimport
されるか分からないので、Pythonのコーディング規約PEP8
では推奨されていない。