ベクトルの微分

 

ベクトルを定義します。スカラー場をf、ベクトル場をAとします。

delete f,a,x,y,z,F,A;
F:=f(x,y,z);
A:=matrix([a[x](x,y,z),a[y](x,y,z),a[z](x,y,z)]);

f(x, y, z)
matrix([[a[x](x, y, z)], [a[y](x, y, z)], [a[z](x, y, z)]])

linalg::gradを使って勾配∇を求めます。

linalg::grad(F,[x,y,z]);

matrix([[diff(f(x, y, z), x)], [diff(f(x, y, z), y)], [diff(f(x, y, z), z)]])

ごちゃごちゃするので(x,y,z)の表記は無視します。

rule:=[f(x,y,z)=f,a[x](x,y,z)=a[x],a[y](x,y,z)=a[y],a[z](x,y,z)=a[z]];

[f(x, y, z) = f, a[x](x, y, z) = a[x], a[y](x, y, z) = a[y], a[z](x, y, z) = a[z]]

E1:=linalg::grad(F,[x,y,z]):subs(E1,rule);

matrix([[diff(f, x)], [diff(f, y)], [diff(f, z)]])

linalg::divergenceを使って発散∇・を求めます。

E1:=linalg::divergence(A,[x,y,z]):subs(E1,rule);

diff(a[x], x) + diff(a[y], y) + diff(a[z], z)

linalg::curlを使って回転∇×を求めます。

E1:=linalg::curl(A,[x,y,z]):
subs(E1,rule);

matrix([[diff(a[z], y) - diff(a[y], z)], [diff(a[x], z) - diff(a[z], x)], [diff(a[y], x) - diff(a[x], y)]])

linalg::laplacianを使ってラプラシアン∇2=Δを求めます。
スカラー場にしか対応していないようですので、分けて書きます。

E1:=linalg::laplacian(F,[x,y,z]):
subs(E1,rule);
E2:=linalg::laplacian(A,[x,y,z]):

diff(f, x, x) + diff(f, y, y) + diff(f, z, z)
Error: 1st argument must be of 'Type::Arithmetical' [linalg::laplacian]

ベクトル場のラプラシアンは分けて計算する必要があります。

E1:=linalg::laplacian(A[1],[x,y,z]):
E2:=linalg::laplacian(A[2],[x,y,z]):
E3:=linalg::laplacian(A[3],[x,y,z]):
subs(matrix([E1,E2,E3]),rule);

matrix([[diff(a[x], x, x) + diff(a[x], y, y) + diff(a[x], z, z)], [diff(a[y], x, x) + diff(a[y], y, y) + diff(a[y], z, z)], [diff(a[z], x, x) + diff(a[z], y, y) + diff(a[z], z, z)]])

mapを使うと便利です。

E1:=map([A[1],A[2],A[3]],linalg::laplacian,[x,y,z]):
subs(matrix(E1),rule);

matrix([[diff(a[x], x, x) + diff(a[x], y, y) + diff(a[x], z, z)], [diff(a[y], x, x) + diff(a[y], y, y) + diff(a[y], z, z)], [diff(a[z], x, x) + diff(a[z], y, y) + diff(a[z], z, z)]])

公式集によるとΔf=∇・∇fです。

E1:=linalg::laplacian(F,[x,y,z]):
E2:=linalg::divergence(linalg::grad(F,[x,y,z]),[x,y,z]):
subs(E1,rule);subs(E2,rule);
E1-E2;

diff(f, x, x) + diff(f, y, y) + diff(f, z, z)
diff(f, x, x) + diff(f, y, y) + diff(f, z, z)
0

公式集によるとΔA=∇(∇・A)-∇×∇×Aです。

E1:=map([A[1],A[2],A[3]],linalg::laplacian,[x,y,z]):
E2:=linalg::grad(linalg::divergence(A,[x,y,z]),[x,y,z]):
E3:=linalg::curl(linalg::curl(A,[x,y,z]),[x,y,z]):
subs(matrix(E1),rule);
subs(E2,rule);
subs(E3,rule);

matrix([[diff(a[x], x, x) + diff(a[x], y, y) + diff(a[x], z, z)], [diff(a[y], x, x) + diff(a[y], y, y) + diff(a[y], z, z)], [diff(a[z], x, x) + diff(a[z], y, y) + diff(a[z], z, z)]])
matrix([[diff(a[x], x, x) + diff(diff(a[y], x), y) + diff(diff(a[z], x), z)], [diff(diff(a[x], x), y) + diff(a[y], y, y) + diff(diff(a[z], y), z)], [diff(diff(a[x], x), z) + diff(diff(a[y], y), z) + diff(a[z], z, z)]])
matrix([[- diff(a[x], y, y) + diff(diff(a[y], x), y) - diff(a[x], z, z) + diff(diff(a[z], x), z)], [- diff(a[y], x, x) + diff(diff(a[x], x), y) + diff(diff(a[z], y), z) - diff(a[y], z, z)], [- diff(a[z], x, x) + diff(diff(a[x], x), z) - diff(a[z], y, y) + diff(diff(a[y], y), z)]])

左辺-右辺=0を示します。

E1-(E2-E3);

matrix([[0], [0], [0]])

 

∇・(f A)=∇(f)・A+f(∇・A)を証明します。
E1が∇・(f A)、E2が∇(f)・A、E3がf(∇・A)です。

E1:=linalg::divergence(F*A,[x,y,z]):
E2:=transpose(linalg::grad(F,[x,y,z]))*A://転置が必要です。
E3:=F*linalg::divergence(A,[x,y,z]):
subs(E1,rule);
subs(E2,rule);
subs(E3,rule);

f*diff(a[x], x) + a[x]*diff(f, x) + f*diff(a[y], y) + a[y]*diff(f, y) + f*diff(a[z], z) + a[z]*diff(f, z)
matrix([[a[x]*diff(f, x) + a[y]*diff(f, y) + a[z]*diff(f, z)]])
f*(diff(a[x], x) + diff(a[y], y) + diff(a[z], z))

左辺-右辺=0を示します。

simplify(E1-(E2+E3));

matrix([[0]])

∇・(A×B)=(∇×A)・B-A・(∇×B)を証明します。

ポテンシャル場AとBを定義します。

delete x,y,z,a,b,A,B;
A:=matrix([a[x](x,y,z),a[y](x,y,z),a[z](x,y,z)]):
B:=matrix([b[x](x,y,z),b[y](x,y,z),b[z](x,y,z)]):

まとめるルールをまとめます。

ruleA:=[a[x](x,y,z)=a[x],a[y](x,y,z)=a[y],a[z](x,y,z)=a[z]]:
ruleB:=[b[x](x,y,z)=b[x],b[y](x,y,z)=b[y],b[z](x,y,z)=b[z]]:
rule:=[op(ruleA),op(ruleB)]://1次元のリストに変換

左辺と右辺の項を計算しruleでまとめます。
E1が∇・(A×B)、E2が(∇×A)・B、E3がA・(∇×B)です。

E1:=linalg::divergence(linalg::crossProduct(A,B),[x,y,z]):
E2:=linalg::scalarProduct(linalg::curl(A,[x,y,z]),B,Real)://Realを忘れないこと
E3:=linalg::scalarProduct(A,linalg::curl(B,[x,y,z]),Real)://Realを忘れないこと
subs(E1,rule);
subs(E2,rule);
subs(E3,rule);

b[z]*diff(a[y], x) - b[z]*diff(a[x], y) + b[y]*diff(a[x], z) + a[z]*diff(b[x], y) - b[y]*diff(a[z], x) - a[z]*diff(b[y], x) - b[x]*diff(a[y], z) - a[y]*diff(b[x], z) + b[x]*diff(a[z], y) + a[y]*diff(b[z], x) + a[x]*diff(b[y], z) - a[x]*diff(b[z], y)
b[z]*diff(a[y], x) - b[z]*diff(a[x], y) + b[y]*diff(a[x], z) - b[y]*diff(a[z], x) - b[x]*diff(a[y], z) + b[x]*diff(a[z], y)
a[z]*diff(b[y], x) - a[z]*diff(b[x], y) + a[y]*diff(b[x], z) - a[y]*diff(b[z], x) - a[x]*diff(b[y], z) + a[x]*diff(b[z], y)

左辺-右辺を求めます。

E1-(E2-E3);

0

2回微分の公式です。

∇×(∇f)=0
∇・(∇×A)=0

linalg::curl(linalg::grad(F,[x,y,z]),[x,y,z]);
linalg::divergence(linalg::curl(A,[x,y,z]),[x,y,z]);

matrix([[0], [0], [0]])
0