Zernike多項式 - その6 Mathematica関数の中身 [Zernike多項式のMathematica関数]
前回やったZernike多項式用のMathematica関数。その中身について。
Packageの中身
Mathematica Packageの中身は見てもらうのが一番手っ取り早いけどいくつか特徴的なところを上げておく。
動径関数は
zernikeRFunction = If[TrueQ[$VersionNumber >= 6.0], ZernikeR, zernikeRGeneralFunction];となっていて、バージョンをチェックして6.0以上だったら組み込みのZernikeRを使い、以下なら式-12を展開したものを使うようにしている。従って6.0以前でもこのPackageは利用可能(のはず)である。 デカルト座標での式は極座標から変換している。
Expand[TrigExpand[ zernikePolarDoubleIndexedPolynomial[n, m][r, t]] /. { Cos[t] -> x/r, Sin[t] -> y/r}] /. r^(q_?EvenQ) -> (x^2 + y^2)^(q/2)]])zernikePolarDoubleIndexedPolynomialはPackage内部での関数でふたつの添字を与えると極座標形式での多項式を返す。これを組み込み関数であるTrigExpandで展開して、極座標からデカルト座標への置き換え規則を適用している。これだけで極座標表示からデカルト座標表示に書き換えることができる。こういう書き方はMathematicaらしくて非常に楽。ちなみにMathematicaのヘルプでZernikeRのところを見るとこのやりかたが載っている。僕は2.2のときからやってるので僕の方が先だ。誰でも思いつくか、これは。
ちなみに
a->b a:>bは置き換え規則を表すRuleとRuleDelayedというシンボルの簡略表現。ReplaceAllやReplaceRepeatedと組み合わせることでシンボル間の置き換えができる。たとえばxをaで置き換えるなら
In[1]:= {x, x^2, y} /. x -> a Out[1]= {a, a^2, y}とすればいい。「/.」はReplaceAllの簡略表現。
また今回は、一度計算した多項式は記憶するように書いてある。簡単な例で説明すると
f[p_]:=(f[p]=g[p])とすることでfの定義に付け加えていくことができる。具体的にやってみると、最初は
?f Global`f f[p_]:=f[p]=g[p]となっている。「?f」というのはMathematicaで「f」の定義を表示させる入力。
そのあと、一度
In[98]:= f[0] Out[98]= g[0]と評価してからもう一度定義を確認すると
?f Global`f f[0]=g[0] f[p_]:=f[p]=g[p]となって引数が0の場合がfの定義に含まれる。
さらに
In[100]:= f[1] Out[100]= g[1]とすると
?f Global`f f[0]=g[0] f[1]=g[1] f[p_]:=f[p]=g[p]というふうにどんどん付け加えられる。この場合、あまり意味はないけどg[p]が評価に時間がかかるような関数の場合、一度評価すればつぎからはその結果が使い回されることになってメモリは食うが時間の節約になる。
Mathematicaの内部でもこういった結果のキャッシュはいろいろなところで行われていて、評価に費やする時間の中で組み込み関数の比率が大きいときはあまり意味がない。今回も昔はいざしらず、6.0ではメモリを食うだけでメリットはあまりないかもしれない。でも、こういう手法は覚えておくと便利な場合がある。
2009-04-15 23:14
nice!(0)
コメント(0)
トラックバック(0)
コメント 0