今回は、Maximaを勉強に活用する実践例として、
Maximaで極座標のラプラシアンを求める方法を紹介したいと思います。
2次元と3次元のラプラシアンは電磁気学や量子力学などではおなじみです。
物理学の教科書などで扱う問題の多くは回転対称・球対称な場合なので、
極座標に移って問題を議論するのはごく自然なことです。
しかし、デカルト座標ではあんなに簡単に書けるラプラシアンが、
ひとたび極座標へ座標変換するやいなやその見た目を大きく変えます。
極座標での表式を導出するのにもちょっと手間がかかって、
あっちのサインとこっちのコサインがキャンセルしたり組み合わさったり、
すったもんだの末に授業が1コマ終わってたりします。
このような、単純だけれども面倒な計算にこそコンピュータを使い、ラクをしたいものです。
Maximaはそのようなことを可能にするフリーの(無料の)数式処理ソフトウェアです。
次の記事の中ではMaximaの使い方のごく初歩的な部分を紹介しています:
本記事では、2次元、3次元のラプラシアンの極座標表示をMaximaを使って求めます。
おまけとして、4次元の極座標で表したラプラシアンも求めてみます。
5次元、6次元の場合についても結果だけ載せておきます。
(考察する対象を容易に拡張できるのもコンピュータを使うメリットです)
2次元ラプラシアン
まずはウォーミングアップとして2次元のラプラシアン
を2次元極座標 で表してみましょう。 と の関係は
または
で与えられます。さて、微分の連鎖律から
です。ここで行列
を導入しました。この行列は
kill(all)$ assume(r>0)$ r(x,y):=sqrt(x^2+y^2)$ theta(x,y):=atan(y/x)$ r2:matrix([diff(r(x,y),x),diff(theta(x,y),x)],[diff(r(x,y),y),diff(theta(x,y),y)])$ R2:trigsimp(subst(r*sin(theta), y, subst(r*cos(theta), x, r2)));
とMaximaに入力することにより
と計算されます。ここで を勝手な関数として
とすると
によってラプラシアンを求めることができます:
depends(f,[r,theta])$ T2:R2.matrix([diff(f,r)],[diff(f,theta)]); Lap2:expand(trigsimp(sum( R2[i][1]*diff(T2[i][1],r)+R2[i][2]*diff(T2[i][1],theta), i, 1, 2)));
とMaximaに入力して上の数式を計算させることにより
がわかります。
3次元ラプラシアン
次に3次元のラプラシアン
を3次元極座標 で表してみましょう。 と の関係は
または
で与えられます。ここで2次元のときと同様に を勝手な関数として
を導入します。すると
kill(all)$ assume(r>0)$ assume(sin(theta)>0)$ r(x,y,z):=sqrt(x^2+y^2+z^2)$ theta(x,y,z):=atan(sqrt(x^2+y^2)/z)$ phi(x,y,z):=atan(y/x)$ r3:matrix( [diff(r(x,y,z),x),diff(theta(x,y,z),x),diff(phi(x,y,z),x)], [diff(r(x,y,z),y),diff(theta(x,y,z),y),diff(phi(x,y,z),y)], [diff(r(x,y,z),z),diff(theta(x,y,z),z),diff(phi(x,y,z),z)])$ R3:trigsimp( subst(r*cos(theta), z, subst(r*sin(theta)*sin(phi), y, subst(r*sin(theta)*cos(phi), x, r3)))); depends(f,[r,theta,phi])$ T3:R3.matrix([diff(f,r)],[diff(f,theta)],[diff(f,phi)])$ Lap3:expand(trigsimp(sum( R3[i,1]*diff(T3[i][1],r)+R3[i,2]*diff(T3[i][1],theta)+R3[i,3]*diff(T3[i][1],phi), i, 1, 3)));
を入力することにより
がわかります。
4次元ラプラシアン
さいごに4次元のラプラシアン
を4次元極座標 で表してみましょう。 と の関係は
または
です。なんとなくパターンが見えてきますね。あとは省略しますが
kill(all)$ assume(r>0)$ assume(sin(theta)>0)$ assume(sin(phi)>0)$ assume(sin(psi)>0)$ r(x,y,z,w):=sqrt(x^2+y^2+z^2+w^2)$ theta(x,y,z,w):=atan(sqrt(x^2+y^2+z^2)/w)$ phi(x,y,z,w):=atan(sqrt(x^2+y^2)/z)$ psi(x,y,z,w):=atan(sqrt(x^2)/y)$ r4:matrix( [diff(r(x,y,z,w),x),diff(theta(x,y,z,w),x),diff(phi(x,y,z,w),x),diff(psi(x,y,z,w),x)], [diff(r(x,y,z,w),y),diff(theta(x,y,z,w),y),diff(phi(x,y,z,w),y),diff(psi(x,y,z,w),y)], [diff(r(x,y,z,w),z),diff(theta(x,y,z,w),z),diff(phi(x,y,z,w),z),diff(psi(x,y,z,w),z)], [diff(r(x,y,z,w),w),diff(theta(x,y,z,w),w),diff(phi(x,y,z,w),w),diff(psi(x,y,z,w),w)])$ R4:trigsimp( subst(r*cos(theta), w, subst(r*sin(theta)*cos(phi), z, subst(r*sin(theta)*sin(phi)*cos(psi), y, subst(r*sin(theta)*sin(phi)*sin(psi), x, r4))))); depends(f,[r,theta,phi,psi])$ T4:R4.matrix([diff(f,r)],[diff(f,theta)],[diff(f,phi)],[diff(f,psi)])$ Lap4:expand(trigsimp(sum( R4[i,1]*diff(T4[i][1],r)+R4[i,2]*diff(T4[i][1],theta)+ R4[i,3]*diff(T4[i][1],phi)+R4[i,4]*diff(T4[i][1],psi), i, 1, 4)));
から
と求まります。
以上の結果から5次元、6次元、…の場合の結果を予想してみて、
その予想が正しかったかどうか、Maximaを使って検証してみるというのも面白いかもしれません。
ちなみに、
答えだけ書いておくと