誘電緩和のデータ解析で広く使われているHavriliak-Nagami式の重ね合わせによるフィッティングツールを、IgorProのプロシージャとして実現した。プロシージャファイルは以下の3つに分割した。
IgorProでフィッティングを行うには、これら3つのファイルをあらかじめ読み込んでおく必要がある。常にこれを使うなら、IgorProフォルダのIgor Proceduresフォルダの中にファイルを3つとも入れておくと便利である。IgorProで他の解析も行うのなら、毎回この3つのファイルをダブルクリックしてIgorProに読み込ませる必要がある。
このページは、IgorProユーザでIgorProのマニュアルをそれなりにながめたことがあって、プロシージャの書き方を知っているか、またはマニュアルを片手にこれからプロシージャを作ろうという人を対象にしている。書いてある内容がわからない時は、マニュアルを見ること。
複素数の計算をする関数の定義。IgorProのversion2.*の時に作ったので、Igor側がサポートしたため不要になったものもあるが、これまでに作ったプロシージャの互換性のために残してある。IgorProの古いバージョンでは、複素数を使うことはできたが複素数を引数にとれる関数が少なかったので、主な関数を自作した。以下の関数が含まれている。
Function/D/C cadd(z1, z2)
Function/D/C csub(z1, z2)
Function/D/C cmul(z1, z2)
Function/D/C cdiv(z1, z2)
Function/D/C cln(z)
Function/D/C clog(z)
Function/D/C cexp(z)
Function/D/C cpow(z1, z2)
Function/D/C csin(z)
Function/D/C ccos(z)
Function/D/C ctan(z)
Function/D/C csqrt(z)
Function/D/C csinh(z)
Function/D/C ccosh(z)
これをコンパイルすると、IgorProのメニューバーにTDR Macroという項目が追加されて、
の4つの項目のメニューが表示されるようになる。フィッティングの手順を次に示す。
それなりにいいパラメータを得たのでとりあえず記録しておいて次のフィッティング結果と比べたいときは、Save Current Fitting Coefficientsを実行すると、パラメータをメモしておける。次のフィッティングをしてみて、それがよろしくないときはRestore Current Fitting Coefficientsを選ぶと記録しておいたフィッティングパラメータに戻せるので、それを初期値にして処理を再開できる。
このプロシージャファイルに含まれている関数やマクロは次の通り。
Function HN5FitManual(w, p)
Macro SetupFitting(xaxis, ywave_real, ywave_imag)
Macro SaveCurrentCoefs()
Save Current Fitting Coefficients
で呼ばれるMacro RestoreCurrentCoefs()
Restore Current Fitting Coefficients
で呼ばれるFunction MakeControls()
Function MakeControls_2()
Function SetVarProc_coefs(ctrlName,varNum,varStr,varName) : SetVariableControl
Function CheckProc_hold(ctrlName,checked) : CheckBoxControl
Function SetVarProc_show(ctrlName,varNum,varStr,varName) : SetVariableControl
Function ButtonProc(ctrlName) : ButtonControl
Do Fitting Automaticallyで行われるマルケート法によるフィッティングの計算ルーチン。
Function/D/C HavN(omega, dele, ltau, alpha, beta)
Function/D/C Fit5Relax(w, log_f)
Function HN5Fit(w, p)
sigma= sqrt((dr + di)/(n-m))
Return sigma
だと、実部と虚部について残差を計算し、和が最小にするという条件を指定したことになる。
if(dr>di)
return sr*sqrt(dr+di)
else
return si*sqrt(dr+di)
endif
だと、実部と虚部について残差を計算し、大きい方を返すので、実部と虚部の残差を同じにするという条件を指定したのと同等である。
Macro DoFit_5Components()