更新:2024/11/22

SymPyの代入(subs)と評価(evalf、lambdify)について

はるか
はるか
今回のテーマはSymPyでの代入と評価。
ふゅか
ふゅか
そうそう!SymPyを使うと数式の代入や評価が簡単にできるんだよ。はじめに、代入の方法から説明していくね♪

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. 式への代入

はるか
はるか
代入だけじゃなくて、式そのものを他の式に置き換えることもできる。
ふゅか
ふゅか
うん、例えば$y$に$x + 1$を代入する例もあるね。代入後の式は$x^2 + x + 1$になるわ!
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メソッドを使ってyx + 1に置き換えた結果、新しい式$x^2 + x + 1$が得られます。代入後の数式は次のようになります。

2. 評価

SymPyで式を近似的に評価するには、evalfNメソッドを使用します。evalfNメソッドは10進数の浮動小数点の近似値に変換します。

ふゅか
ふゅか
式を近似的に評価するには、evalfを使うといいよ♪例えば、$\pi$の近似値を求めると…

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のevalfN関数を使うと、評価の精度を指定することもできます。小数点以下の桁数を指定することで、より精密な計算を行うことが可能です。

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で効率的に数式処理や数値計算を行うことができます。

はるか
はるか
まとめると、subsメソッドで変数や式を置き換えたり、<code>evalf</code>で数値的に評価したりできる。
ふゅか
ふゅか
そして、lambdifyを使うと高速に評価できるってわけね!みんなもSymPyで数式処理を効率化してみてね♪
PR