mei_13のPython講座 ロゴ

【解説】Pythonで数学を自在に操る「SymPy」の世界:数式をそのまま解く魔法のライブラリ




🐍 初心者歓迎!月額4,000円で質問し放題のPython講座
(1時間4,000円の伴走型ビデオチャット指導も受付中!)
🚀 講座の詳細を見る 📩 質問・お問い合わせ

Pythonで数学を自在に操る「SymPy」の世界:数式をそのまま解く魔法のライブラリ


Yukiのアイコン
【Yuki】 「Hirokiくん、こんにちは。今日はPythonのライブラリの中でも少し特殊で、でもとっても面白い『SymPy』についてお話ししようと思います。普段、プログラミングで計算をするときは 1 + 12 になったり、3.14 を使って円の面積を出したりしますよね。でも、SymPyはそれとは少し違う、『記号計算(代数計算)』を得意とするライブラリなんです。数学の教科書に出てくるような $x$ や $y$ といった文字を、そのまま文字として扱うことができるんですよ……。」


Hirokiのアイコン
【Hiroki】 「こんにちは、Yukiさん!文字をそのまま扱う……ですか?いつも使っているプログラミングだと、変数には必ず数字とかのデータが入っていないといけないイメージですけど、そうじゃない使い方ができるんですね。なんだか数学の授業をそのままパソコンでやるみたいで面白そうです!」


Yukiのアイコン
【Yuki】 「ふふ、そうですね。まさに『数学のノート』をPythonで作るような感覚かもしれません。複雑な方程式を解いたり、微分積分をしたり……人間が紙とペンでやるような計算を、正確に、そしてあっという間にこなしてくれるんです。少しずつ、使いかたを見ていきましょうね……。」

SymPyのインストールと準備


Yukiのアイコン
【Yuki】 「まずは、SymPyを使えるように準備しましょう。SymPyは標準ライブラリではないので、インストールが必要です。ターミナルやコマンドプロンプトで、以下のコマンドを入力してみてくださいね。」

pip install sympy


Hirokiのアイコン
【Hiroki】 「インストールできました!準備完了です。」


Yukiのアイコン
【Yuki】 「ありがとうございます。それでは、プログラムの冒頭でSymPyをインポートしましょう。一般的には、このようにインポートすることが多いですよ。」

import sympy
# 必要な関数を個別にインポートする場合もあります
from sympy import symbols, expand, factor, solve, diff, integrate, limit, oo

記号の定義:文字を文字として扱う


Yukiのアイコン
【Yuki】 「SymPyを使う上で一番大切なのは、『どのアルファベットを記号(Symbol)として扱うか』を宣言することです。これを行わないと、Pythonは『xって何?定義されていない変数だよ』と怒ってしまいますから……。」


Hirokiのアイコン
【Hiroki】 「なるほど、最初に『これは数学の文字ですよ』と教えてあげる必要があるんですね。」


Yukiのアイコン
【Yuki】 「その通りです。symbols 関数を使って、このように定義します。」

from sympy import symbols

# x と y を記号として定義します
x, y = symbols('x y')

# 数式を作ってみます
expr = x + 2*y
print(expr)


Yukiのアイコン
【Yuki】 「これを出力すると、計算結果の数値ではなく x + 2*y という式がそのまま表示されます。これが記号計算の第一歩ですね……。」

数式の展開と因数分解


Hirokiのアイコン
【Hiroki】 「これだけで数式が扱えるのはすごいですね。でも、これを使って何ができるんですか?」


Yukiのアイコン
【Yuki】 「例えば、複雑な数式の展開因数分解が簡単にできます。中学校や高校で習った内容も、SymPyなら一瞬ですよ。」

from sympy import symbols, expand, factor

x = symbols('x')

# (x + 1)^2 を展開してみましょう
expr = (x + 1)**2
expanded_expr = expand(expr)
print(f"展開前: {expr}")
print(f"展開後: {expanded_expr}")

# 今度は x^2 - 1 を因数分解してみます
expr_to_factor = x**2 - 1
factored_expr = factor(expr_to_factor)
print(f"因数分解前: {expr_to_factor}")
print(f"因数分解後: {factored_expr}")


Hirokiのアイコン
【Hiroki】 「わあ、すごい!(x + 1)**2x**2 + 2*x + 1 になりました。因数分解もバッチリですね。テストの丸付けとかに使えそうです(笑)」


Yukiのアイコン
【Yuki】 「ふふ、そうかもしれませんね。計算ミスがないので、とても頼りになります。私はあまり計算が得意ではないので、こうして機械が正確に処理してくれるのを見ると、なんだか少し、ホッとします……。」

方程式を解く:solve関数の使い方


Hirokiのアイコン
【Hiroki】 「展開や因数分解ができるなら、方程式も解けたりしますか?」


Yukiのアイコン
【Yuki】 「もちろんです。solve という関数を使えば、方程式の解を求めることができます。例えば、$x^2 - 2x - 8 = 0$ という方程式を解いてみましょう。」

from sympy import symbols, solve

x = symbols('x')

# 方程式 x^2 - 2*x - 8 = 0 を解く
# solveの第1引数に式(=0となるように変形したもの)、第2引数に解きたい文字を入れます
solution = solve(x**2 - 2*x - 8, x)
print(f"解は: {solution}")


Hirokiのアイコン
【Hiroki】 「結果が [-2, 4] と出ました!二次方程式の解がちゃんと二つ出てくるんですね。連立方程式はどうですか?」


Yukiのアイコン
【Yuki】 「連立方程式も得意ですよ。リストの形で式を渡してあげれば大丈夫です。」

from sympy import symbols, solve

x, y = symbols('x y')

# x + y = 10
# x - y = 2
# これを解きます
eq1 = x + y - 10
eq2 = x - y - 2
ans = solve([eq1, eq2], [x, y])
print(f"連立方程式の解: {ans}")


Yukiのアイコン
【Yuki】 「このように、辞書形式やリスト形式で答えを返してくれます。数値計算ライブラリだと近似値(0.999...のような値)になることがありますが、SymPyは厳密解を出してくれるのが特徴です。」

微分と積分:解析的な解を求める


Hirokiのアイコン
【Hiroki】 「厳密な答えが出るのは嬉しいです。それなら、もっと難しい微分や積分もできるんでしょうか?」


Yukiのアイコン
【Yuki】 「はい、得意分野です。微分には diff、積分には integrate という関数を使います。高校や大学で習うような計算も、SymPyにお任せください……。」

from sympy import symbols, diff, integrate, sin, cos

x = symbols('x')

# 微分: sin(x) を x で微分する
diff_result = diff(sin(x), x)
print(f"sin(x)の微分: {diff_result}")

# 積分: x^2 を x で積分する(不定積分)
int_result = integrate(x**2, x)
print(f"x^2の不定積分: {int_result}")

# 定積分: x^2 を 0 から 3 まで積分する
def_int_result = integrate(x**2, (x, 0, 3))
print(f"x^2を0から3まで定積分: {def_int_result}")


Hirokiのアイコン
【Hiroki】sin(x) の微分が cos(x) になってる!積分もちゃんと x**3/3 になっていますね。定積分の答えが 9 になるのも、自分で計算するよりずっと早いです。」


Yukiのアイコン
【Yuki】 「そうですね。複雑な関数の微積分は人間だと時間がかかりますし、ケアレスミスも怖いです。SymPyなら、数式がどれだけ複雑になっても、定義通りに計算を進めてくれるんです。……私、複雑な数式が整然と整理されていく過程を見るのが、少しだけ好きなんです。フォントが綺麗に整列しているWebサイトを見たときのような、そんな気持ち良さがあると思いませんか……?」


Hirokiのアイコン
【Hiroki】 「あ、なんとなくわかります。バラバラだった文字が綺麗にまとまるのって、パズルが解けた時みたいな爽快感がありますよね。」

美しい出力:数式の表示にこだわる


Yukiのアイコン
【Yuki】 「そう言ってもらえて嬉しいです。ところで、これまでの出力結果は x**2 + 1 のようなプログラミング形式でしたけれど、SymPyには数式をより美しく表示する機能もあるんですよ。」


Hirokiのアイコン
【Hiroki】 「えっ、もっと見やすくなるんですか?」


Yukiのアイコン
【Yuki】 「はい。init_printing() という関数を使うと、Jupyter Notebookなどでは LaTeX(ラテフ)という形式を使って、教科書のような綺麗な数式を表示してくれるようになります。もしターミナルで実行している場合でも、Unicodeを使ってなるべく数式っぽく見せてくれるんです。」

from sympy import symbols, init_printing, integral, sqrt

x = symbols('x')
init_printing() # 美しい出力を有効にする

# 積分記号を含む数式を作成してみる
expr = sqrt(x**2 + 1)
# 表示を確認(環境によって見た目が変わります)
print(sympy.pretty(expr))


Yukiのアイコン
【Yuki】 「私は、情報の正しさも大切ですが、それがどう見えるかという『美しさ』も同じくらい大切だと思っているんです。数式が綺麗に整っていると、それだけで内容がスッと頭に入ってくるような気がしませんか……?」


Hirokiのアイコン
【Hiroki】 「確かに、sqrt(x**2 + 1) と書かれるより、ちゃんとルートの記号の中に式が入っている方が直感的に分かりますね。Yukiさんらしいこだわりですね!」


Yukiのアイコン
【Yuki】 「……あ、いえ、そんな……。ただの趣味、かもしれません……。」

極限と無限大の扱い


Hirokiのアイコン
【Hiroki】 「他にSymPyでできる面白いことはありますか?」


Yukiのアイコン
【Yuki】 「そうですね、極限(limit)を求めることもできますよ。無限大を表す oo(小文字のオーを二つ並べたもの)を使って計算できるんです。」

from sympy import symbols, limit, sin, oo

x = symbols('x')

# xが無限大に向かうときの 1/x の値を求める
limit_result = limit(1/x, x, oo)
print(f"x -> oo のとき 1/x は: {limit_result}")

# xが0に向かうときの sin(x)/x の値を求める
limit_result_sin = limit(sin(x)/x, x, 0)
print(f"x -> 0 のとき sin(x)/x は: {limit_result_sin}")


Hirokiのアイコン
【Hiroki】 「無限大まで扱えるなんて本格的ですね!sin(x)/x の極限が 1 になるのも、有名だけど計算するのは大変なやつですよね。」


Yukiのアイコン
【Yuki】 「はい。こうした極限の計算は、機械学習のアルゴリズムを理解する際や、物理学のシミュレーションの理論式を立てる時などにも役立ちます。実は、最近注目されているAI(人工知能)の技術も、その根底にはこうした高度な数学があるんですよ。」

AI技術と数学の関係


Hirokiのアイコン
【Hiroki】 「AIといえば、最近はChatGPTとかGeminiとかがすごいですよね。それらにもSymPyのような数学が関わっているんですか?」


Yukiのアイコン
【Yuki】 「直接SymPyが動いているわけではありませんが、AIの学習プロセス(最適化)には『微分』が欠かせません。例えば、Googleが提供している最新のAIモデル、Gemini 1.5 Flashのようなモデルも、膨大な量の微分の計算を経て作られているんです。……あ、ちなみにGeminiの最新ライブラリは google-genai を使って呼び出すのが今のトレンドですね。」


Hirokiのアイコン
【Hiroki】 「へえ、最新のAIも元を辿れば数学なんですね。それをPythonで手軽に扱えるSymPyって、実はすごい基礎を支えているライブラリなのかもしれない……。」


Yukiのアイコン
【Yuki】 「そうですね。数値として処理するNumPyやPyTorchと、記号として処理するSymPy。これらを使い分けられるようになると、エンジニアとしての幅がグッと広がると思います……。Hirokiくんなら、きっとすぐに使いこなせるようになりますよ。」

行列の計算


Hirokiのアイコン
【Hiroki】 「最後に、もう一つだけ教えてください!数学で『行列』って習ったんですけど、SymPyで行列は扱えますか?」


Yukiのアイコン
【Yuki】 「もちろんですよ。行列の計算もとてもスムーズです。逆行列を求めたり、固有値を計算したりすることもできます。」

from sympy import Matrix

# 2x2の行列を定義
A = Matrix([[1, 2], [3, 4]])
B = Matrix([[5, 6], [7, 8]])

# 行列の足し算
print(f"A + B = {A + B}")

# 行列の掛け算
print(f"A * B = {A * B}")

# 逆行列
print(f"Aの逆行列 = {A.inv()}")

# 行列式
print(f"Aの行列式 = {A.det()}")


Hirokiのアイコン
【Hiroki】 「行列の計算って手計算だとミスしやすいから、こうやってコードで確認できるのは助かります。逆行列の計算とか、分数が出てきて大変だった記憶があります……。」


Yukiのアイコン
【Yuki】 「そうですよね。SymPyは分数を分数のまま(例えば 0.333... ではなく 1/3 として)保持してくれるので、計算を繰り返しても誤差が溜まらないんです。そこが数値計算ライブラリとの大きな違いですね……。」

まとめ:SymPyを使うメリット


Yukiのアイコン
【Yuki】 「さて、今日はSymPyについて駆け足でお話ししてきましたが、どうでしたか……?」


Hirokiのアイコン
【Hiroki】 「すごく面白かったです!『Pythonで計算=数字を出す』だけじゃなくて、数式そのものを組み立てたり、解いたりできるのが新鮮でした。数学の宿題の確認だけじゃなくて、プログラミングで理論的な式を作るときに絶対役立ちそうです。」


Yukiのアイコン
【Yuki】 「そう言ってもらえると、私も嬉しいです。SymPyのポイントをまとめておきますね。

  1. 記号計算: 文字を文字として扱い、厳密な解を出す。
  2. 多機能: 展開、因数分解、方程式、微分積分、行列など、高校〜大学数学をほぼカバー。
  3. 正確性: 近似値ではなく分数やルートを使って計算するため、誤差が出ない。
  4. 美しさ: LaTeX等を使った綺麗な表示が可能。

さらに詳しく知りたくなったら、公式サイトのドキュメントを読んでみてください。英語ですが、コード例が豊富で眺めているだけでも勉強になりますよ……。」


Hirokiのアイコン
【Hiroki】 「ありがとうございます!Yukiさん、また分からないことがあったら教えてくださいね。」


Yukiのアイコン
【Yuki】 「はい、もちろんです……。あ、でも、あまり難しい問題を一気に出されると、私も熱暴走しちゃうかもしれないので……少しずつ、一緒に頑張りましょうね。それでは、今日はこの辺で……。」



< Scipy
コラム一覧に戻る
Numba >

この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。

「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。

「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。

➡ ココナラで制作・相談を依頼する(見積もり無料)


初心者から始められるPythonレッスン

プログラミング未経験者・初心者歓迎!
月額4,000円で質問し放題!!
● 完全オンライン
● 翌日までには必ず返信
● 挫折しない独自の学習メソッド
● 圧倒的高評価!!
テキストベースで時間を選ばない
4,000円/60分伴走型ビデオチャット指導も可能
● 高品質なサンプルコード
詳細はこちら

📩 質問・お問い合わせはこちら



AIアシスタント Yuki