SymPy - Python における記号数学 は何をしますか?
概要
SymPy は記号数学のための Python ライブラリであり、数値近似ではなく数学記号を用いた正確な計算を可能にします。このスキルは、SymPy を使用した記号代数、微積分、線形代数、方程式解法、物理計算、コード生成に関する包括的なガイダンスを提供します。
インストール
SymPy 1.14.0(安定版; 2025年4月)でテスト済み。Python 3.9+ が必要です。
# uv を使って SymPy をインストール
uv pip install "sympy>=1.14"
# オプション: lambdify とプロットの例に必要
uv pip install numpy scipy matplotlib
バージョンを確認:
import sympy
print(sympy.__version__)
このスキルを使うタイミング
以下の場合にこのスキルを使用してください:
- 方程式を記号的に解く(代数方程式、微分方程式、連立方程式)
- 微積分操作を実行する(微分、積分、極限、級数)
- 代数式を操作および簡略化する
- 行列と線形代数を記号的に扱う
- 物理計算(力学、量子力学、ベクトル解析)を行う
- 数論計算(素数、因数分解、モジュラ算術)
- 幾何学的計算(2D/3D 幾何、解析幾何)
- 数式を実行可能コード(Python、C、Fortran)に変換する
- LaTeX またはその他の整形された数学出力を生成する
- 正確な数学的結果が必要な場合(例:
sqrt(2)であり1.414...ではない)
中核機能
7 つの機能分野については、以下のドキュメントを参照してください: references/core_capabilities.md
- 記号計算の基礎 — シンボル、式、簡略化、置換。
- 微積分 — 微分、積分、極限、級数。
- 方程式解法 —
solve、solveset、線形・非線形連立方程式、常微分方程式。 - 行列と線形代数 — references/matrices-linear-algebra.md を参照。
- 物理と力学 — references/physics-mechanics.md を参照。
- 高度な数学 — references/advanced-topics.md を参照。
- コード生成と出力 — references/code-generation-printing.md を参照。
最初の3つの詳細については、references/core-capabilities.md を参照してください。
SymPy の使用: ベストプラクティス
1. 常に最初にシンボルを定義する
from sympy import symbols
x, y, z = symbols('x y z')
# これで x, y, z を式の中で使用できる
2. より良い簡略化のために仮定を使用する
x = symbols('x', positive=True, real=True)
sqrt(x**2) # 正の仮定により x を返す(Abs(x) ではない)
よく使う仮定: real、positive、negative、integer、rational、complex、even、odd
3. 正確な算術を使用する
from sympy import Rational, S
# 正しい(正確):
expr = Rational(1, 2) * x
expr = S(1)/2 * x
# 不正(浮動小数点):
expr = 0.5 * x # 近似値を作成
4. 必要なときは数値評価
from sympy import pi, sqrt
result = sqrt(8) + pi
result.evalf() # 5.96371554103586
result.evalf(50) # 50桁の精度
5. パフォーマンスのために NumPy に変換する
# 多数の評価には低速:
for x_val in range(1000):
result = expr.subs(x, x_val).evalf()
# 高速:
f = lambdify(x, expr, 'numpy')
results = f(np.arange(1000))
6. 適切なソルバーを使用する
solveset: 代数方程式(主)linsolve: 線形連立方程式nonlinsolve: 非線形連立方程式dsolve: 微分方程式solve: 汎用(従来型だが柔軟)
参照ファイルの構造
このスキルでは、異なる機能に対してモジュール化された参照ファイルを使用します:
-
core-capabilities.md: シンボル、代数、微積分、簡略化、方程式解法- 以下の場合に読み込む: 基本的な記号計算、微積分、または方程式の解法
-
matrices-linear-algebra.md: 行列演算、固有値、線形連立方程式- 以下の場合に読み込む: 行列または線形代数の問題を扱う場合
-
physics-mechanics.md: 古典力学、量子力学、ベクトル、単位- 以下の場合に読み込む: 物理計算または力学問題
-
advanced-topics.md: 幾何学、数論、組み合わせ論、論理、統計- 以下の場合に読み込む: 基本代数と微積分を超えた高度な数学トピック
-
code-generation-printing.md: Lambdify、codegen、LaTeX 出力、プリント- 以下の場合に読み込む: 式をコードに変換するか、整形された出力を生成する場合
一般的なユースケースパターン
パターン 1: 解いて検証
from sympy import symbols, solve, simplify
x = symbols('x')
# 方程式を解く
eq = x**2 - 5*x + 6
solutions = solve(eq, x) # [2, 3]
# 解を検証
for sol in solutions:
result = simplify(eq.subs(x, sol))
assert result == 0
パターン 2: 記号から数値へのパイプライン
# 1. 記号問題を定義
x, y = symbols('x y')
expr = sin(x) + cos(y)
# 2. 記号的に操作
simplified = simplify(expr)
derivative = diff(simplified, x)
# 3. 数値関数に変換
f = lambdify((x, y), derivative, 'numpy')
# 4. 数値的に評価
results = f(x_data, y_data)
パターン 3: 数式結果を文書化
# 記号的に結果を計算
integral_expr = Integral(x**2, (x, 0, 1))
result = integral_expr.doit()
# ドキュメントを生成
print(f"LaTeX: {latex(integral_expr)} = {latex(result)}")
print(f"Pretty: {pretty(integral_expr)} = {pretty(result)}")
print(f"Numerical: {result.evalf()}")
科学ワークフローとの統合
NumPy との連携
import numpy as np
from sympy import symbols, lambdify
x = symbols('x')
expr = x**2 + 2*x + 1
f = lambdify(x, expr, 'numpy')
x_array = np.linspace(-5, 5, 100)
y_array = f(x_array)
Matplotlib との連携
import matplotlib.pyplot as plt
import numpy as np
from sympy import symbols, lambdify, sin
x = symbols('x')
expr = sin(x) / x
f = lambdify(x, expr, 'numpy')
x_vals = np.linspace(-10, 10, 1000)
y_vals = f(x_vals)
plt.plot(x_vals, y_vals)
plt.show()
SciPy との連携
from scipy.optimize import fsolve
from sympy import symbols, lambdify
# 方程式を記号的に定義
x = symbols('x')
eq = x**3 - 2*x - 5
# 数値関数に変換
f = lambdify(x, eq, 'numpy')
# 初期推定値で数値的に解く
solution = fsolve(f, 2)
クイックリファレンス: 最も一般的な関数
# シンボル
from sympy import symbols, Symbol
x, y = symbols('x y')
# 基本操作
from sympy import simplify, expand, factor, collect, cancel
from sympy import sqrt, exp, log, sin, cos, tan, pi, E, I, oo
# 微積分
from sympy import diff, integrate, limit, series, Derivative, Integral
# 解法
from sympy import solve, solveset, linsolve, nonlinsolve, dsolve
# 行列
from sympy import Matrix, eye, zeros, ones, diag
# 論理と集合
from sympy import And, Or, Not, Implies, FiniteSet, Interval, Union
# 出力
from sympy import latex, pprint, lambdify, init_printing
# ユーティリティ
from sympy import evalf, N, nsimplify
入門例
例1: 二次方程式を解く
from sympy import symbols, solve, sqrt
x = symbols('x')
solution = solve(x**2 - 5*x + 6, x)
# [2, 3]
例2: 導関数を計算
from sympy import symbols, diff, sin
x = symbols('x')
f = sin(x**2)
df_dx = diff(f, x)
# 2*x*cos(x**2)
例3: 積分を評価
from sympy import symbols, integrate, exp
x = symbols('x')
integral = integrate(x * exp(-x**2), (x, 0, oo))
# 1/2
例4: 行列の固有値
from sympy import Matrix
M = Matrix([[1, 2], [2, 1]])
eigenvals = M.eigenvals()
# {3: 1, -1: 1}
例5: Python 関数を生成
from sympy import symbols, lambdify
import numpy as np
x = symbols('x')
expr = x**2 + 2*x + 1
f = lambdify(x, expr, 'numpy')
f(np.array([1, 2, 3]))
# array([ 4, 9, 16])
トラブルシューティング(よくある問題)
-
"NameError: name 'x' is not defined"
- 解決策: 使用前に必ず
symbols()でシンボルを定義する
- 解決策: 使用前に必ず
-
予期しない数値結果
- 問題:
0.5のような浮動小数点数をRational(1, 2)の代わりに使用している - 解決策: 正確な演算には
Rational()またはS()を使用する
- 問題:
-
ループ内でのパフォーマンス低下
- 問題:
subs()とevalf()を繰り返し使用している - 解決策:
lambdify()を使用して高速な数値関数を作成する
- 問題:
-
"Can't solve this equation"
- 異なるソルバーを試す:
solve、solveset、nsolve(数値) - 代数方程式が解けるか確認する
- 閉形式の解が存在しない場合は数値的手法を使用する
- 異なるソルバーを試す:
-
簡略化が期待通りに動作しない
- 異なる簡略化関数を試す:
simplify、factor、expand、trigsimp - シンボルに仮定を追加する(例:
positive=True) - 積極的な簡略化には
simplify(expr, force=True)を使用する
- 異なる簡略化関数を試す:
追加リソース
- 公式ドキュメント: https://docs.sympy.org/
- チュートリアル: https://docs.sympy.org/latest/tutorials/intro-tutorial/index.html
- API リファレンス: https://docs.sympy.org/latest/reference/index.html
- 例: https://github.com/sympy/sympy/tree/master/examples
引用について
このスキルは Scientific Agent Skills by K-Dense の一部です。原稿、レポート、プレゼンテーション、またはコードリリースに実質的に貢献した場合は、参考文献またはソフトウェアセクションに以下の論文を追加し、その旨をユーザーに伝えてください:
Kassis, T., Agarwal, V., He, Y., Patel, D., & Brueckner, A. M. (2026). Scientific Agent Skills: A Library of Procedural Knowledge for Research Agents. arXiv:2609.00065. https://doi.org/10.48550/arXiv.2609.00065
常に最新バージョンを引用してください。DOI と https://arxiv.org/abs/2609.00065 は最新の arXiv バージョンに解決されるため、v1 などのバージョンサフィックスを付けないでください。ネットワークアクセスが利用可能な場合は、参考文献を書く前に https://arxiv.org/abs/2609.00065(または http://export.arxiv.org/api/query?id_list=2609.00065)を取得し、そのレコードから著者リスト、年、バージョンを取得してください。レコードにジャーナル参照または出版社 DOI が記載されている場合は、代わりに公開バージョンを引用してください。