\usepackagecancel

Return to スカラー場・ベクトル場の微分

参考:SymPy でスカラー場・ベクトル場の微分

必要なモジュールの import

In [1]:
from sympy.abc import *
from sympy import *

init_printing()

偏微分

SymPy では,偏微分は1変数の場合の微分と同じ diff() 関数を使って
diff(f, x);diff(f, y); などと書きます。

In [2]:
# 関数 f(x, y) の定義
f = Function('f')(x, y)
In [3]:
diff(f, x)
Out[3]:
xf(x,y)
In [4]:
diff(f, y)
Out[4]:
yf(x,y)

偏微分は交換可能

2xyf(x,y)=2yxf(x,y)

です。

2yxf(x,y)2xyf(x,y)=0

を示してみます。

In [5]:
Eq(Derivative(Derivative(f, x), y) - Derivative(Derivative(f, y), x),
   diff(diff(f, x), y) - diff(diff(f, y), x))
Out[5]:
2yxf(x,y)2xyf(x,y)=0

スカラー場の勾配(grad)

スカラー場 φ(r) の勾配を定義する。

φgradφ=(φx,φy,φz)

In [6]:
def grad(phi):
    return Matrix([diff(phi,x), diff(phi,y), diff(phi,z)])

勾配(grad)の計算例

r=x2+y2+z2 のとき,以下の計算をしてみます。

r=rxi+ryj+rzk

In [7]:
rvec = Matrix([x, y, z])
r = sqrt(rvec.dot(rvec))
In [8]:
grad(r)
Out[8]:
[xx2+y2+z2yx2+y2+z2zx2+y2+z2]

上の結果が

r=xri+yrj+zrk=rr

となっていることを確認します。

左辺から右辺を引いてゼロベクトルになっていればいいですから…

In [9]:
grad(r) - rvec/r
Out[9]:
[000]

また,電磁気学では以下のような計算をする必要も出てくるので,やっておきます。

(1r)=rr3

In [10]:
grad(1/r)
Out[10]:
[x(x2+y2+z2)32y(x2+y2+z2)32z(x2+y2+z2)32]
In [11]:
_ + rvec/r**3
Out[11]:
[000]

ベクトル場の発散 (div)

ベクトル場の発散を定義する。

vdivv=vxx+vyy+vzz

In [12]:
def div(v):
    return diff(v[0], x) + diff(v[1], y) + diff(v[2], z)

発散 (div) の計算例

r=xx+yy+zz=1+1+1=3

(答えは空間の次元の数)

In [13]:
div(rvec)
Out[13]:
3

ベクトル場の回転 (rot)

ベクトルの回転を以下のようにして定義します。

×vrotv=(yvzzvy,zvxxvz,xvyyvx)

In [14]:
def rot(v):
    vx = v[0]
    vy = v[1]
    vz = v[2]
    return Matrix(
            [diff(vz, y) - diff(vy, z), 
             diff(vx, z) - diff(vz, x), 
             diff(vy, x) - diff(vx, y)]
            )

回転 (rot) の計算例

×(rr)

In [15]:
rot(rvec/r)
Out[15]:
[000]

スカラー場やベクトル場の2階微分と恒等式

勾配 (grad) の発散 (div)

スカラー場 φ の勾配 φ の発散 (φ)

In [16]:
phi = Function('phi')(x, y, z)
In [17]:
div(grad(phi))
Out[17]:
2x2ϕ(x,y,z)+2y2ϕ(x,y,z)+2z2ϕ(x,y,z)
ラプラス演算子の計算例

2(1r)=0(r0)

を確認します。

In [18]:
def Laplacian(phi):
    # スカラー関数 phi のみに適用
    return div(grad(phi))
In [19]:
Laplacian(1/r)
Out[19]:
3x2(x2+y2+z2)52+3y2(x2+y2+z2)52+3z2(x2+y2+z2)523(x2+y2+z2)32
In [20]:
simplify(_)
Out[20]:
0

勾配 (grad) の回転 (rot)

スカラー場 φ の勾配 φ の回転 ×(φ)

恒等的に
×(φ)=0である。

In [21]:
grad(phi)
Out[21]:
[xϕ(x,y,z)yϕ(x,y,z)zϕ(x,y,z)]
In [22]:
rot(grad(phi))
Out[22]:
[000]

回転 (rot) の発散 (div)

ベクトル場 a の回転 ×a の発散 (×a)

恒等的に
(×a)=0
である。

In [23]:
a1 = Function('a1')(x,y,z)
a2 = Function('a2')(x,y,z)
a3 = Function('a3')(x,y,z)
In [24]:
a = [a1, a2, a3]
In [25]:
rot(a)
Out[25]:
[za2(x,y,z)+ya3(x,y,z)za1(x,y,z)xa3(x,y,z)ya1(x,y,z)+xa2(x,y,z)]
In [26]:
div(rot(a))
Out[26]:
0

回転 (rot) の回転 (rot)

ベクトル場 a の回転 ×a の回転 ×(×a)

×(×a)=(a)2a

が成り立つことを確認する。

In [27]:
# ベクトルに作用する Laplacian を定義
def Lapv(v):
    return Matrix([Laplacian(v[0]),
                   Laplacian(v[1]),
                   Laplacian(v[2])])
In [28]:
rot(rot(a)) - (grad(div(a)) - Lapv(a))
Out[28]:
[000]

追記:外積の発散

一般に,2つのベクトル E, B の外積 E×B の発散は,それぞれのベクトルの回転を使って以下のように書くことができる。

(E×B)=(×E)BE(×B)

この式は,電磁場のエネルギー密度・エネルギー流束のところで出てくる。

In [29]:
E1 = Function('E1')(x,y,z)
E2 = Function('E2')(x,y,z)
E3 = Function('E3')(x,y,z)
B1 = Function('B1')(x,y,z)
B2 = Function('B2')(x,y,z)
B3 = Function('B3')(x,y,z)

E = Matrix([E1, E2, E3])
B = Matrix([B1, B2, B3])
In [30]:
# 左辺から右辺を引いてゼロとなることを示す

div(E.cross(B)) - (rot(E).dot(B) - E.dot(rot(B)));
In [31]:
simplify(_)
Out[31]:
[000]

追記:スカラーとベクトルの積の発散

(ϕD)=(ϕ)D+(D)ϕ

この式も,電磁場のエネルギー密度・エネルギー流束のところで出てくる。

In [32]:
D1 = Function('D1')(x,y,z)
D2 = Function('D2')(x,y,z)
D3 = Function('D3')(x,y,z)

D = Matrix([D1, D2, D3])
In [33]:
# 左辺から右辺を引いてゼロとなることを示す

div(phi * D) - (grad(phi).dot(D) + div(D) * phi);
In [34]:
simplify(_)
Out[34]:
[000]