hirax.net::inside out::2008年07月11日

最新記事(inside out)へ  |   年と月を指定して記事を読む(クリック!)

2008年6月 を読む << 2008年7月 を読む >> 2008年8月 を読む

2008-07-11[n年前へ]

「スペクトル操作Mathematicaライブラリ」で動画を作る 

 光スペクトル操作用のMathematicaライブラリで、スペクトル変化の動画を作ると、こんな感じになります。Map も spectorPlot も Table も addtiveMixtureSpector も whiteLight も cyanFilter も・・・どれも「関数」です。addtiveMixtureSpector や whiteLight や cyanFilter は「関数を返す関数」で、Map などは関数を引数にとる関数です。Mathematica でコードを書いていると、なぜか自然に関数を重ね合わせていくような書き方が気持良くなってきます。

Map[spectorPlot,
 Table[
  addtiveMixtureSpector[
   {whiteLight,
   transmissionSpector[whiteLight,
   cyanFilter, 1.0]}, {1-r,r}]
 ,{r,0,3,0.05}]]

 それで、今この瞬間の悩みはMathematicaで"spectorFitting[targetSpector_,usingSpectrum]"というような関数をどうやって書くか、ということです。targetSpector は、任意のスペクトルを表現する関数で、usingSpectrum は「スペクトルを表す関数群」で要素数は任意のリストです。usingSpectrumを使いtargetSpectorをどのように表現するかを、最小二乗近似で最適解をNMinimize で解くというのが、そんな関数を作るときの定番の手順なのだろうと思います。つまり、方程式と制約条件を動的に作成し、それをNMinimize で解いた結果を返す、という具合です。

 さて、この spectorFitting という関数はどう簡単に書くことができるものでしょうか。Mathematicaは変数名と文字列を明確に区別する割に、見た目ではまったくその違いがわからないのが面白いところ(同時に苦労するところ)かも、と思ったりしたのです。