[SymPy] 微分積分

[SymPy] 微分積分

関数の微分

 引数に渡した関数 func を 変数 var で n階微分するときは次の構文を記述します。

 diff(func, var, n)

 引数 n を省略すると 1 階微分します。

# SymPy 微分 サンプルコード①

# sympyをインポート
import sympy

# 記号a, b, c, xを定義
sympy.var('a b c x')

# 関数f(x)を定義
f = a*x**2 + b*x + c

# f(x)をxで微分
dfdx1 = sympy.diff(f, x)

# f(x)をxで2階微分
dfdx2 = sympy.diff(f, x, 2)

# f(x)をxで3階微分
dfdx3 = sympy.diff(f, x, 3)

print("dfdx1 =", dfdx1)
print("dfdx2 =", dfdx2)
print("dfdx3 =", dfdx3)
dfdx1 = 2*a*x + b
dfdx2 = 2*a
dfdx3 = 0

 
 引数 var に複数の記号 x1, x2, ... を渡して導関数を得る構文もあります。

 diff(func, x1[, x2, ...])

 次のサンプルコードでは、$f(x)=\cos(xy)$ を $x$ と $y$ で 1 回ずつ偏微分しています。

# SymPy 微分 サンプルコード②

# sympyをインポート
import sympy

# 記号xを定義
sympy.var('x y')

# f(x)を定義
f = sympy.cos(x*y)

# f(x)をxとyで1回ずつ偏微分
df_dx_dy = sympy.diff(f, x, y)

print("df_dx_dy =", df_dx_dy)
df_dx_dy = -(x*y*cos(x*y) + sin(x*y))

 
 diff()関数の代わりに diff()メソッドを使って微分することもできます。

# sympyをインポート
import sympy

# 記号xを定義
sympy.var('x')

# f(x) = xexp(x)
f = x * sympy.exp(x)

# f(x)をxで微分
df_dx = f.diff(x, 1)

print(df_dx)
x*exp(x) + exp(x)

 

関数の積分

 次の構文で関数 func の変数 var による不定積分を求めることができます。

 integrate(func, var)

 定積分を計算する場合は次のように記述します。

 integrate(func, (var, 下限, 上限))

 次のサンプルコードでは、$\log x$ の不定積分と定積分を計算しています。

# Sympy 不定積分と定積分

# sympyをインポート
import sympy

# 記号a, b, xを定義
sympy.var('a b x')

# f(x) = log(x)
f = sympy.log(x)

# logxの不定積分
i = sympy.integrate(f, x)

# logxをaからbまで積分
i_a_b = sympy.integrate(f, (x, a, b))

# logxを1から2まで積分
i_1_2 = sympy.integrate(f, (x, 1, 2))

print("logxの不定積分 :", i)
print("logxをaからbまで積分 :", i_a_b)
print("logxを1から2まで積分 :", i_1_2)
logxの不定積分 : x*log(x) - x
logxをaからbまで積分 : -a*log(a) + a + b*log(b) - b
logxを1から2まで積分 : -1 + 2*log(2)

 変数 var の下限と上限に oo のような特殊な記号を指定して広義積分を求めることもできます。物理学で頻繁に用いられるガウス積分
 
\[\int_{-\infty }^{\infty }e^{-x^{2}}dx=\sqrt{\pi}\]
を確認してみましょう。

# Sympy ガウス積分

# sympyをインポート
import sympy

# 記号xを定義
sympy.var('x')

# 無限大の定義
oo = sympy.oo

# ガウス関数
f = sympy.exp(-x**2)

# ガウス積分
ig = sympy.integrate(f, (x, -oo, oo))

print(ig)
sqrt(pi)