つれづれなる備忘録

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

SymPyの使い方13 ~ ベクトルモジュール1

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

1. ベクトルモジュール

SymPyでベクトルを扱う方法としては、以前に行列で定義する方法について紹介した。

atatat.hatenablog.com

今回はベクトルモジュールにより直交座標系の単位ベクトルをシンボリックに定義する。ベクトルモジュールのCoordSys3Dを以下のようにimportしてNを直交座標系の単位ベクトル系とする。 type(N)とすることで直交座標系で定義されていることが確認できる。

from sympy.vector import CoordSys3D
N = CoordSys3D('N')
type(N)
>sympy.vector.coordsysrect.CoordSys3D

各成分にアクセスするにはN.i,N.j,N.kとする。例えばN.iは単位ベクトルの要素であることが確認できる。

type(N.i)
>sympy.vector.vector.BaseVector

2. 単位ベクトルを用いたベクトル定義と演算

ベクトルを定義するには、上記で定義した単位ベクトルをスカラー倍および加減算で定義する。

v1=2*N.i+N.j+3*N.k
v2=-1*N.i+5*N.j-2*N.k

定義したベクトルは以下のように演算することができる。

v1+v2
>N.i + 6*N.j + N.k

内積.dot(v)外積.cross(v)を用いる。

v1.dot(v2)
>-3
v1.cross(v2)
>(-17)*N.i + N.j + 11*N.k

3. ベクトル演算の簡略化

 ベクトルの演算時において係数の数式の簡略化はSymPyの機能を用いて実行できる。 係数の因数分解.factor()を用いる。

from sympy import symbols
a,b,c=symbols('a b c')
v=(a*b+a*c+b**2+b*c)*N.i+N.j
v.factor()
>((a + b)*(b + c))*N.i + N.j

三角関数の簡略化はtrigsimp(v)を用いる。

from sympy import sin, cos, trigsimp, diff
v3 = (sin(a)**2 + cos(a)**2)*N.i - (2*cos(b)**2 - 1)*N.k
trigsimp(v3)
>N.i + (-cos(2*b))*N.k

または簡略化を行う.simplify()でもよい。

v3.simplify()
>>N.i + (-cos(2*b))*N.k

微分diff(v,x)

diff(v3,b)
>(4*sin(b)*cos(b))*N.k

またはDerivative(v,x)を用いる。Derivativeは演算を実行するために.doit()を用いる。

from sympy import Derivative
Derivative(v3,b)
>Derivative((sin(a)**2 + cos(a)**2)*N.i + (-2*cos(b)**2 + 1)*N.k, b)
Derivative(v3,b).doit()
>(4*sin(b)*cos(b))*N.k

積分Integral(v,x)を用いるがDerivativeと同様に演算を実行するために.doit()を用いる。

from sympy import Integral
v4 = a*N.i + sin(a)*N.j -a**2* N.k
Integral(v4,a)
>(Integral(a, a))*N.i + (Integral(sin(a), a))*N.j + (Integral(-a**2, a))*N.k
Integral(v4,a).doit()
>a**2/2*N.i + (-cos(a))*N.j + (-a**3/3)*N.k

3. まとめ

 今回はSymPyのベクトルモジュールを用いたベクトルの定義および基本的な演算に関して紹介した。