SymPyによる数式処理
概要
この記事では、Pythonの数式処理ライブラリであるSymPyについて解説する。SymPyを用いることで、代数計算、微積分、行列演算などを記号的に(解析的に)行うことが可能である。
本記事では以下の項目について扱う。
- 基本的な演算
- 代数(展開、因数分解、方程式)
- 微積分(微分、積分)
- 線形代数(行列)
筆者の環境
筆者の環境は以下の通りである。
!sw_vers
ProductName: macOS
ProductVersion: 15.5
BuildVersion: 24F74
!python -V
Python 3.12.12
必要なライブラリを読み込む。今回は sympy を主に使用する。
import sympy
from sympy import symbols, expand, factor, solve, diff, integrate, sin, cos, Matrix, init_printing, pprint
import numpy as np
from pprint import pprint as py_pprint
# 数式を綺麗に表示するための設定
init_printing()
print("sympy version :", sympy.__version__)
sympy version : 1.14.0
1. 基本的な演算
SymPyでは、変数を記号(Symbol)として定義することで、数式をそのまま扱うことができる。 ここでは、変数 $x, y$ を定義し、簡単な数式を作成する。
x, y = symbols('x y')
expr = x + 2*y
expr
$\displaystyle x + 2 y$
2. 代数
展開
数式の展開には expand 関数を利用する。
例として、$(x + 1)^2$ を展開する。
expr = (x + 1)**2
expanded_expr = expand(expr)
expanded_expr
$\displaystyle x^{2} + 2 x + 1$
因数分解
因数分解には factor 関数を利用する。
例として、$x^2 + 2x + 1$ を因数分解する。
factored_expr = factor(expanded_expr)
factored_expr
$\displaystyle \left(x + 1\right)^{2}$
方程式を解く
方程式を解くには solve 関数を利用する。
例として、二次方程式 $x^2 - 3x + 2 = 0$ を $x$ について解く。
eq = x**2 - 3*x + 2
solutions = solve(eq, x)
# リストの結果はpprintで出力
py_pprint(solutions)
[1, 2]
3. 微積分
微分
微分を行うには diff 関数を利用する。
例として、$\sin(x)$ を $x$ で微分する。
diff_expr = diff(sin(x), x)
diff_expr
$\displaystyle \cos{\left(x \right)}$
積分
積分を行うには integrate 関数を利用する。
例として、$\cos(x)$ を $x$ で不定積分する。
int_expr = integrate(cos(x), x)
int_expr
$\displaystyle \sin{\left(x \right)}$
定積分も可能である。$\int_{0}^{\pi} \sin(x) dx$ を計算する。
def_int_expr = integrate(sin(x), (x, 0, sympy.pi))
def_int_expr
$\displaystyle 2$
4. 線形代数(行列)
行列は Matrix クラスを用いて定義する。
ここでは、行列 $\mathbf{A}$ を以下のように定義する。
$$ \mathbf{A} = \begin{pmatrix} 1 & 2 \\ 3 & 4 \end{pmatrix} $$
A = Matrix([[1, 2], [3, 4]])
A
$\displaystyle \left[\begin{matrix}1 & 2\\3 & 4\end{matrix}\right]$
行列式
行列式は det メソッドで計算できる。
det_A = A.det()
det_A
$\displaystyle -2$
逆行列
逆行列は inv メソッドで計算できる。
inv_A = A.inv()
inv_A
$\displaystyle \left[\begin{matrix}-2 & 1\\\frac{3}{2} & - \frac{1}{2}\end{matrix}\right]$
固有値と固有ベクトル
固有値と固有ベクトルは eigenvects メソッドで計算できる。
eigen_info = A.eigenvects()
display(eigen_info)
$\displaystyle \left[ \left( \frac{5}{2} - \frac{\sqrt{33}}{2}, \ 1, \ \left[ \left[\begin{matrix}- \frac{\sqrt{33}}{6} - \frac{1}{2}\\1\end{matrix}\right]\right]\right), \ \left( \frac{5}{2} + \frac{\sqrt{33}}{2}, \ 1, \ \left[ \left[\begin{matrix}- \frac{1}{2} + \frac{\sqrt{33}}{6}\\1\end{matrix}\right]\right]\right)\right]$
結論
この記事では、PythonのSymPyライブラリを用いた基本的な数式処理の方法について解説した。
SymPyを利用することで、複雑な計算をプログラム上で正確に行うことが可能となる。本記事で紹介した機能はSymPyの一部に過ぎないが、これらを組み合わせることで多様な数学的問題に対処できるだろう。