つれづれなる備忘録

日々の発見をあるがままに綴る

SymPyの使い方14 ~ ベクトルモジュール2

 今回はSymPyのベクトル演算を専門に扱うベクトルモジュールのうちベクトル解析について紹介する。

1. ベクトル成分の定義

 前回のベクトル定義の際、単位ベクトルは.i, .j, .kを用いることを紹介したが、直交系であれば .x, .y, .zによりx/y/z成分を表現することができる。

from sympy.vector import CoordSys3D
R=CoordSys3D('R')
e_pot=2*R.x**2*R.y
e_pot
>2*R.x**2*R.y

2. 微分演算

 ベクトル場を単純に微分するにはsympyモジュールのdiffを使用する。

from sympy import diff
diff(e_pot,R.x)
>4*R.x*R.y

 Delは∇に相当するコマンドで、以下のように使用する。Del()の括弧内に直接ベクトル場を入力するとエラーになるので、一度delop=Del()としてdelopを使用する。

from sympy.vector import Del
delop=Del()
grd_f=delop(R.x*R.y*R.z)
grd_f
>(Derivative(R.x*R.y*R.z, R.x))*R.i + (Derivative(R.x*R.y*R.z, R.y))*R.j + (Derivative(R.x*R.y*R.z, R.z))*R.k

delopを実行するには.doit()を用いる。

grd_f.doit()
>R.y*R.z*R.i + R.x*R.z*R.j + R.x*R.y*R.k

3. ベクトル解析

∇を用いることでベクトル解析ででてくる発散(div)、回転(rot)を∇による定義に従って計算できる。

まず発散は

 \displaystyle {\rm{div}}\,{\bf{R}}=\nabla \cdot {\bf{R}}

∇とベクトル場の内積をとるので

delop.dot(R.x*R.y*R.z*(R.i+R.j+R.k)).doit()
>R.x*R.y + R.x*R.z + R.y*R.z

またはdivergenceコマンドを用いて

from sympy.vector import divergence
divergence(R.x*R.y*R.z*(R.i+R.j+R.k))
>R.x*R.y + R.x*R.z + R.y*R.z

回転は

 \displaystyle {\rm{rot}}\,{\bf{R}}=\nabla \times {\bf{R}}

∇とベクトル場の外積をとるので

delop.cross(R.x*R.y*R.z*R.i).doit()
>R.x*R.y*R.j + (-R.x*R.z)*R.k

またはcurlコマンドを用いて

from sympy.vector import curl
curl(R.x*R.y*R.z*R.i)
>R.x*R.y*R.j + (-R.x*R.z)*R.k

勾配に関しては、gradientを使用することもできる。

from sympy.vector import gradient
gradient(R.x*R.y*R.z)
>R.y*R.z*R.i + R.x*R.z*R.j + R.x*R.y*R.k

方向微分

\displaystyle \nabla_{{\bf{v}}}f({\bf{x}}) =\nabla f({\bf{x}}) \cdot {\bf{v}}

と書けるので

(R.i+R.j+R.k).dot(delop)(R.x*R.y*R.z)
>R.x*R.y + R.x*R.z + R.y*R.z

またはdirectional_derivativeを用いて

from sympy.vector import directional_derivative
directional_derivative(R.x*R.y*R.z,R.i+R.j+R.k)
>R.x*R.y + R.x*R.z + R.y*R.z

4. まとめ

 ベクトルモジュールでベクトル解析を行うことでベクトルのような面倒な計算を簡単に実行させることができる。