Maximaで球面調和関数展開
Maximaという数式処理ソフトを知っていますか?これ、フリーながらかなりの高機能で、個人的にかなり重宝しています。そんなMaximaの威力を、CG屋さんに馴染み深い例で紹介しましょう。SH(Spherical Harmonics)の関数展開です。
それではまずMaximaを立ち上げて、ためしにY(l=3,m=3)を求めてみましょう。
SHの場合、プリセットで定義されているので、
INPUT:spherical_harmonic(3,3,theta,phi);
と入力するだけで
と出てきます。複素数がそのまま出てきてしまっているので、ここでは実数(m<0なら虚数)を抽出しておきましょう。ついでにsqrt(2)もかけておきます。
INPUT:realpart(%) * sqrt(2);
でました。これだけでも十分に実用的な計算式なのですが、極座標系から直交座標系への変換にも挑戦してみましょう。Maximaではまず以下のおまじないが必要です。
INPUT:%,trigexpand=true;
これは三角関数の展開を意味しているのですが、Maximaではこの手続きを踏まないと以下の変換が何故かうまくいきませんでした。唯一のハマりポイントと言えるでしょう。それではtheta,piの順に関数合成します。
INPUT:ratsubst(acos(z),theta,%);
INPUT:ratsubst(atan2(y,x),phi,%);
x^2+y^2が冗長なのでこれを消去してしまいます。
INPUT:ratsubst(x^2+y^2,1-z^2,%);
はい、できあがりです。欲を言えば分母のルートを消したいところですが、やり方がわかりませんでした。またl,mの値によってはこれでも冗長な結果が出ることもあります。その場合は、
INPUT:ratsimp(%);
を実行してください。また実際に畳み込みに使うときは正規化項を忘れずに入れてくださいね。
ところでStupid SH Tricksによると、かのPeter-Pike SloanはMapleを愛用されているそうです。でもこの位ならMaximaでも十分いけますよ、という例でした。