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)を∇による定義に従って計算できる。
まず発散は
∇とベクトル場の内積をとるので
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
回転は
∇とベクトル場の外積をとるので
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
方向微分は
と書けるので
(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. まとめ
ベクトルモジュールでベクトル解析を行うことでベクトルのような面倒な計算を簡単に実行させることができる。