必要なモジュールの 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]:
In [4]:
diff(f, y)
Out[4]:
偏微分は交換可能
です。
を示してみます。
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]:
スカラー場の勾配(grad)
スカラー場
In [6]:
def grad(phi):
return Matrix([diff(phi,x), diff(phi,y), diff(phi,z)])
勾配(grad)の計算例
In [7]:
rvec = Matrix([x, y, z])
r = sqrt(rvec.dot(rvec))
In [8]:
grad(r)
Out[8]:
上の結果が
となっていることを確認します。
左辺から右辺を引いてゼロベクトルになっていればいいですから…
In [9]:
grad(r) - rvec/r
Out[9]:
また,電磁気学では以下のような計算をする必要も出てくるので,やっておきます。
In [10]:
grad(1/r)
Out[10]:
In [11]:
_ + rvec/r**3
Out[11]:
ベクトル場の発散 (div)
ベクトル場の発散を定義する。
In [12]:
def div(v):
return diff(v[0], x) + diff(v[1], y) + diff(v[2], z)
発散 (div) の計算例
(答えは空間の次元の数)
In [13]:
div(rvec)
Out[13]:
ベクトル場の回転 (rot)
ベクトルの回転を以下のようにして定義します。
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) の計算例
In [15]:
rot(rvec/r)
Out[15]:
スカラー場やベクトル場の2階微分と恒等式
勾配 (grad) の発散 (div)
スカラー場
In [16]:
phi = Function('phi')(x, y, z)
In [17]:
div(grad(phi))
Out[17]:
ラプラス演算子の計算例
を確認します。
In [18]:
def Laplacian(phi):
# スカラー関数 phi のみに適用
return div(grad(phi))
In [19]:
Laplacian(1/r)
Out[19]:
In [20]:
simplify(_)
Out[20]:
勾配 (grad) の回転 (rot)
スカラー場
恒等的に
In [21]:
grad(phi)
Out[21]:
In [22]:
rot(grad(phi))
Out[22]:
回転 (rot) の発散 (div)
ベクトル場
恒等的に
である。
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]:
In [26]:
div(rot(a))
Out[26]:
回転 (rot) の回転 (rot)
ベクトル場
が成り立つことを確認する。
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]:
追記:外積の発散
一般に,2つのベクトル
この式は,電磁場のエネルギー密度・エネルギー流束のところで出てくる。
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]:
追記:スカラーとベクトルの積の発散
この式も,電磁場のエネルギー密度・エネルギー流束のところで出てくる。
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]: