ベクトルの微分
ベクトルを定義します。スカラー場を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)]);
linalg::gradを使って勾配∇を求めます。
linalg::grad(F,[x,y,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]];
E1:=linalg::grad(F,[x,y,z]):subs(E1,rule);
linalg::divergenceを使って発散∇・を求めます。
E1:=linalg::divergence(A,[x,y,z]):subs(E1,rule);
linalg::curlを使って回転∇×を求めます。
E1:=linalg::curl(A,[x,y,z]):
subs(E1,rule);
linalg::laplacianを使ってラプラシアン∇2=Δを求めます。
スカラー場にしか対応していないようですので、分けて書きます。
E1:=linalg::laplacian(F,[x,y,z]):
subs(E1,rule);
E2:=linalg::laplacian(A,[x,y,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);
mapを使うと便利です。
E1:=map([A[1],A[2],A[3]],linalg::laplacian,[x,y,z]):
subs(matrix(E1),rule);
公式集によるとΔ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;
公式集によるとΔ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);
左辺-右辺=0を示します。
E1-(E2-E3);
∇・(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);
左辺-右辺=0を示します。
simplify(E1-(E2+E3));
∇・(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);
左辺-右辺を求めます。
E1-(E2-E3);
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]);