
数学の計算をプログラミングで扱うとき、浮動小数点数の丸め誤差に悩まされた経験はありませんか?例えば、1/3 は小数では割り切れず、計算を重ねるうちにわずかな誤差が生まれてしまいます。
そんな課題を解決してくれるのが、今回ご紹介する数式処理ライブラリ「SymPy」です。変数を数値ではなく「文字(シンボル)」として扱い、方程式を解いたり、微分・積分を行ったりと、まるで私たちがノートの上で手計算しているかのような処理を正確に実行できます。
SymPyの概要
SymPy(シムパイ)は、Pythonで数式処理(Computer Algebra System: CAS)を行うためのオープンソースライブラリです。完全にPythonのみで記述されているため、C言語などのコンパイラを必要とせず、手軽に導入できるのが特徴です。代数方程式の求解、微積分、極限、行列演算、さらには式の展開や因数分解まで、多岐にわたる数学的処理をカバーしています。
「純粋なPythonだけで動くので、環境構築に特別なコンパイラが必要ないのも導入しやすい魅力ですね。」
SymPyの主なメリット
- 厳密な計算(シンボリック計算): 値を小数に変換せず、分数や平方根、円周率(π)などをそのまま保持して計算するため、計算誤差が発生しません。
- 直感的な数式変形: 複雑な多項式の展開(
expand)や因数分解(factor)、式の簡単化(simplify)を数行のコードで行えます。 - 微積分や方程式の解析解の導出: 数値的な近似解ではなく、数式としての解(解析解)を導き出すことができます。高校や大学で学ぶ数学の課題検証にも最適です。
- 外部依存のないシンプルな構成: NumPyなどの重厚な外部ライブラリに依存せず、軽量かつ可搬性に優れています。
サンプルコード
基本的なシンボルの定義から、式の変形、方程式の求解、そして微分積分の例を見てみましょう。
pip install sympyimport sympy as sp
# 1. シンボルの定義
x, y = sp.symbols('x y')
# 2. 式の展開と因数分解
expr = (x + 2) * (x - 3)
expanded = sp.expand(expr)
print(f"展開: {expanded}") # x**2 - x - 6
factored = sp.factor(expanded)
print(f"因数分解: {factored}") # (x - 3)*(x + 2)
# 3. 2次方程式の求解: x^2 - x - 6 = 0
solutions = sp.solve(expr, x)
print(f"方程式の解: {solutions}") # [-2, 3]
# 4. 微分と積分
# f(x) = x^3 - 4*x の微分
f = x**3 - 4*x
diff_f = sp.diff(f, x)
print(f"微分: {diff_f}") # 3*x**2 - 4
# f(x) の不定積分
int_f = sp.integrate(f, x)
print(f"不定積分: {int_f}") # x**4/4 - 2*x**2
# 定積分(0から2まで)
definite_int = sp.integrate(f, (x, 0, 2))
print(f"定積分 (0 to 2): {definite_int}") # -4「微積分や定積分までたったの1行で計算できてしまうのは、初めて触れたとき本当に感動しました!」
展開: x**2 - x - 6
因数分解: (x - 3)*(x + 2)
方程式の解: [-2, 3]
微分: 3*x**2 - 4
不定積分: x**4/4 - 2*x**2
定積分 (0 to 2): -4みーちゃんのワンポイント
SymPyを扱うときは、Python本来の数値計算の評価順序に注意しましょう。例えば 1/2 * x と書くと、Pythonが先に 1/2 を 0.5(float)に変換してしまいます。厳密な有理数として扱いたい場合は、sp.Rational(1, 2) * x や sp.S(1)/2 * x のように記述するのが確実です!

