コンボリューションしながらフィットする方法

手法の基本的な事項は下記サイトの209-212ページを参照。

http://cloud.originlab.com/pdfs/Origin2016_Documentation/Japanese/Origin_Tutorial_2016_J.pdf

以下の取り組みでは、vSignal = A * exp( -t*vSample )をvSignal = A * exp( -vSample/t )に変更している。

関数を定義する。(既に用意してある場合は先に進む。)

F9を押し、フィット関数オーガナイザを開き、以下のように関数を定義する。

 

 

 

関数:

関数ボックスの隣にあるボタン(アイコン)をクリックし、コードビルダに関数を記述します。

#pragma warning(error :15618)

#include <origin.h>

// ヘッダーファイルは必須です。

#include <ONLSF.H>

#include <fft_utils.h>

//

//

void _nlsfTestConv(

// フィットパラメータ:

double y0, double A, double t,

// 独立変数:

double x,

// 従属変数:

double& y)

{

// 編集部分の始まり

NLFitContext *pCtxt = Project.GetNLFitContext();

Worksheet wks;

DataRange dr;

int c1,c2;

dr = pCtxt->GetSourceDataRange(); //Get the source data range

dr.GetRange(wks, c1, c2); //元データワークシートを取得

if ( pCtxt )

{

// 個々の反復での出力信号のベクトル

static vector vSignal;

// パラメータが更新されると、コンボリューションの結果も再計算される

BOOL bIsNewParamValues = pCtxt->IsNewParamValues();

if ( bIsNewParamValues )

{

// ワークシートからサンプリングと応答データを読み取る

Dataset dsSampling(wks, 0);

Dataset dsResponse(wks, 2);

int iSize = dsSampling.GetSize();

vector vResponse, vSample;

vResponse = dsResponse;

vSample = dsSampling;

vSignal.SetSize(iSize);

vResponse.SetSize(iSize);

vSample.SetSize(iSize);

// 指数減少曲線を算出

vSignal = A * exp( -vSample/t);

// コンボリューションの実行

int iRet = fft_fft_convolution(iSize, vSignal, vResponse);

//サンプリング間隔を掛けることでコンボリューションを修正

vSignal = (vSample[1]-vSample[0])*vSignal;

}

NLSFCURRINFO stCurrInfo;

pCtxt->GetFitCurrInfo(&stCurrInfo);

// 反復のためにデータインデックスを入手

int nCurrentIndex = stCurrInfo.nCurrDataIndex;

// 評価したy値を入手

y = vSignal[nCurrentIndex] + y0;

// ここではxを利用していないため、関数をコンパイルするために使用

x;

}

//編集可能エリア終了

}

 

特定のxに対して、関数は対応するy値を返します。しかし、コンボリューションが実行されると、特定のデータポイントだけでなく、曲線全体に対して操作を実行する必要があります。Origin 8 SR2から、フィット内での主要情報を取得するために、NLFitContextクラスを導入しました。各反復計算で、NLFitContextを使って、フィットパラメータを監視しています。それらが更新されると、fft_fft_convolution メソッドにより、FFTを使ってコンボリューションを計算します。結果はベクターデータvSignalに保存されます。各xに対して、NLSFCURRINFO内の現在のデータインデックスを使って、vSignalから評価したyを取得できます。

曲線をフィットする。

Prompt(光源の時間プロファイル)とDelay(発光の時間プロファイル)を用意する。(以下は例)

この時、二つのファイルの測定条件は同じものとする(スリット、TAC、coaxial delay等々)

  1. 列B(Dealyの列)を選択し、Ctrl + Yを押し、非線形フィットダイアログを開きます。
  2. 関数選択ページに戻り、定義したFitConv関数を選びます。
  3. フィット曲線ページのXデータ型では「入力Xに同じ」を選択します。

 

  1. パラメータをy0=0, A=10, t=1のように初期化します。
  2. 「フィット」ボタンをクリックし、結果を生成します。

 

このチュートリアルで説明した関数と同じようなフィット関数を使用する場合、NLFitを実行する際は、NLFitダイアログの設定タブで、フィット曲線のXデータ型に入力データと同じを設定するようにしてください。

成功したケース

成功しなかったケース(prompt成分が多い場合)

この場合は、promptとdecalyのそれぞれの関数を使ってフィットする必要があるだろう。

Originの所感

Originを使った一連のデータ編集の書式をようやく用意できた。これまでSma4に始まり、Excel, Kaleida Graph, Origin,Igor, Gnuplotとグラフ作成ソフトを使ってきたけど、万能なものはないと感じる。データ編集の高級性でどのソフトを使うのが良いのかことなる。例えばxyデータを単に見たいだけだったら、Sma4やKaleida Graphは圧倒的に早い。フィッティングなどのデータ編集はOriginやIgorが便利。Excelはマクロが必要なデータ編集が(場合によって)早くできる。自分はXYだけじゃなくて3Dグラフも良く使うので、最近はOrigin使ってる。データをフォルダーに分けられるのが便利。