2008年8月29日金曜日

Mathematica:補間とか

NRGとかの数値計算の結果は基本的に離散的データである。スペクトルをプロットした場合、たとえば有効な近藤温度の指標がほしいとかで、ピークの半値幅が欲しくなるときとかも多々ある。そんなわけで、離散データを補間、近似多項式ゲッツ⇒半値幅の計算をMathematicaでやってしまう方法を探してみた。
補間を自力でやろうとするとスプライン補間法の勉強とかで数日つぶれたり、実装でまた数日つぶれそうなのでとても1から自力とかやる気になれない。MathematicaはInterpolationっていう補間を全部やってくれてしまう関数を持っている。
基本的な使い方は
Interpolation[{{1,2},{2,2.4},{3,4.4}}]
のように、データをリストの形式で代入する。多次元でもおk。
データを手でいちいち代入するとかそんなメンドクサイことをするはずもなく、普通はファイルに用意しておいて、それをテーブルとしてインポートして代入するという方法をとるわな。そうしたいときは、

Import["spec.dat(みたいなファイル名)","Table"]
f=Interpolation[%]

のようにするといい。Mathematicaでは%は直前の結果という意味になる。
さてInterpolationの返す値はInterpolatingFunctionという関数である。通常の関数と同じように扱える近似多項式である。デフォルトでは3次の多項式で近似される模様。次数はオプションで変えることができるけど、あまり次数を上げるとすげー振動しだすと聞く。そんなわけで、半値幅もInterpolatingFunctionの最大値を求めて、その半分になるx座標をもとめてやればいいんでは?というのが私の考え。半値幅を出すのにもっといい方法があるのかもしれないけど、いまんとここれぐらいしか考え付かない。
関数の最大値を求めるFindMaximumと、方程式の根を求めるFindRootを使えばこれが実現できる。
m=FindMaximum[f[x],{x,0}]
FindRoot[f[x]==m[[1]]/2.0,{x,0.0001}]

みたいに。
FindMaximumの第二要素でその近傍での極大を求めるという設定。この関数の返す値は、{{値、その座標}}というリストになっているので、FindRoot内では第一要素を取り出して使っている。
FindRootの第二要素はその点から根を求めていくための基準点で、ここをうまくとってやらないと、欲しい部分での解が出なかったりするので要注意。

そうそう、B4が1人、近藤効果とRKKY相互作用の競合in2重量子ドットの論文をゼミ課題に選んだ。おぉ~私のやってることとがっつりかぶるぜ。後輩が近藤効果を自発的に選ぶのは初めてだな。(ボスが押し付けた例はあれど)結構勉強するのしんどいだろうから、つぶれないようにいろいろ配慮したほうが良いかもなぁ。しょっぱなから2不純物近藤問題を理解しろとかきついやろうし。このまま近藤方面を邁進してくれて私が作ったプログラムとかお蔵入りせず使ってくれると嬉しいんだが。

0 コメント: