SymPyの代入(subs)と評価(evalf、lambdify)について
1. 代入
SymPyで式の変数に値や別の式を代入するには、subsメソッドを使用します。
1.1. 単一の変数への代入
まず、単一の変数に値を代入する例を見てみましょう。
from sympy import symbols
x = symbols('x')
expr = x**2 + 2*x + 1
# xに3を代入
result = expr.subs(x, 3)
print(result) # 出力: 16
この例では、xというシンボルを作成し、数式$x^2 + 2x + 1$を定義しました。その後、subsメソッドを使ってxに3を代入しています。
1.2. 複数の変数への代入
from sympy import symbols
x, y = symbols('x y')
expr = x**2 + y**2
# xに1、yに2を代入
result = expr.subs({x: 1, y: 2})
print(result) # 出力: 5
1.3. 式への代入
from sympy import symbols
x, y = symbols('x y')
expr = x**2 + y
# yにx + 1を代入
result = expr.subs(y, x + 1)
print(result) # 出力: x**2 + x + 1
この例では、yに別の式x + 1を代入しています。subsメソッドを使ってyをx + 1に置き換えた結果、新しい式$x^2 + x + 1$が得られます。代入後の数式は次のようになります。
2. 評価
SymPyで式を近似的に評価するには、evalfやNメソッドを使用します。evalfやNメソッドは10進数の浮動小数点の近似値に変換します。
2.1. 数値評価の基本
まず、evalfメソッドを使って数式の近似値を求める基本的な方法を見てみましょう。
from sympy import symbols, pi
expr = pi
print(expr.evalf()) # 出力: 3.14159265358979
この例では、円周率$\pi$をevalfメソッドで近似的に評価しています。出力された値は、$\pi$の近似値である3.14159265358979です。
2.2. 特定の値での評価
from sympy import symbols, sin, pi
x = symbols('x')
expr = sin(x)
# xにπ/2を代入して評価
result = expr.subs(x, pi/2).evalf()
print(result) # 出力: 1.0
2.3. 精度の指定
SymPyのevalfやN関数を使うと、評価の精度を指定することもできます。小数点以下の桁数を指定することで、より精密な計算を行うことが可能です。
from sympy import N
expr = N(pi, 50) # 小数点以下50桁まで計算
print(expr)
この例では、$\pi$を小数点以下50桁まで評価しています。N関数の第2引数に精度を指定することで、必要な桁数まで計算することができます。
3. ラムダ式による高速評価
大量の数値計算が必要な場合、lambdifyを使用してラムダ関数に変換できます。
3.1. lambdifyの使用例
大量の数値計算が必要な場合には、SymPyの式をPythonのラムダ関数に変換して、高速に評価することができます。lambdifyメソッドを使用することで、SymPyの式を変換し、NumPy配列などを用いて効率的に計算できます。
from sympy import symbols, sin, lambdify
import numpy as np
x = symbols('x')
expr = sin(x)
# numpyでつかるように変換
f = lambdify(x, expr, 'numpy')
# numpy配列を入力として評価
x_vals = np.linspace(0, 2*np.pi, 100)
y_vals = f(x_vals)
この例では、sin(x)の式をlambdifyメソッドで数値関数に変換しています。lambdifyを使うことで、SymPyの式をNumPyなどの数値計算ライブラリと組み合わせて高速に計算できます。これにより、大量のデータに対する評価を効率的に行うことができます。
4. まとめ
- 代入: subsメソッドで変数や式を他の値や式に置き換える。
- 評価: evalfメソッドで式を数値的に評価する。
- 高速評価: lambdifyで式をラムダ関数に変換し、大量のデータに対して高速に評価する。
これらの機能を活用することで、SymPyで効率的に数式処理や数値計算を行うことができます。





