非線形フィットCurve Fitting
NLFit はOrigin のバージョン8以降の機能です。この新しいフィット機構は、反復実行中にデータのコピーでフィットプロセスを扱います。新しいフィット機構はワークシートデータを直接繰り返しアクセスするので、古いフィット機構に比べ、早い操作を実行できます。
非線形曲線フィットでは、2つのクラスを利用可能です。
- NLFit
- 新しいフィットエンジンからの低いレベルのAPIを持つOrigin Cクラスです。このクラスには、Originのナレッジがなく、バッファ内のデータのコピーで動作します。このクラスを使用するためには、すべての必要なバッファ(ポインタ)を用意する必要があります。この区分けは、バックグラウンド処理としてフィットを実行する機能の開発のために用意されています。
- NLFitSession
- NLFitクラスをOriginオブジェクトに内包した、使いやすいインターフェースで、より高いレベルのOrigin Cクラスです。このクラスは、NLFit ダイアログ内のカーネルです。Originとインターフェースで接続するための処理は難しく、NLFitSessionクラス はこの複雑性をうまく扱うので、Origin Cコードではこのクラスを使用することをお勧めします。
非線形フィット
NLFitSession クラスを使用する前に、特定のヘッダファイルをインクルードする必要があります。
#include <..\originlab\NLFitSession.h>
また、OriginC\Originlab\nlsf_utils.c を現在のワークスペースに含め、コンパイルする必要があります。プログラムでファイルを追加するため、コマンドウィンドウまたはスクリプトファイルから下記のLabTalkコマンドを実行します。
Run.LoadOC(Originlab\nlsf_utils.c, 16)
NLFitSession オブジェクトを定義し、フィット関数を Gaussにします。
// 関数を設定
NLFitSession nlfSession;
if ( !nlfSession.SetFunction("Gauss") )
{
out_str("Fail to set function!");
return;
}
// パラメータ名と数を取得:
vector<string> vsParamNames;
int nNumParamsInFunction = nlfSession.GetParamNamesInFunction(vsParamNames);
DATA_MODE_GLOBALモデル付きの2つのXY データセットをパラメータ共有のグローバルフィットを実行するためにセットします。
int nNumData = 2;
// 第1データセットをセット
if ( !nlfSession.SetData(vY1, vX1, NULL, 0, nNumData) )
{
out_str("Fail to set data for the first dataset!");
return;
}
// 第2データセットをセット
if ( !nlfSession.SetData(vY2, vX2, NULL, 1, nNumData, DATA_MODE_GLOBAL) )
{
out_str("Fail to set data for the second dataset!");
return;
}
パラメータ値を初期化するためのパラメータ初期化コードをセットします。
// パラメータ初期化
if ( !nlfSession.ParamsInitValues() )
{
out_str("Fail to init parameters values!");
return;
}
または、1つずつパラメータ値を設定することもできます。
vector vParams(nNumParamsInFunction*nNumData);
// 第1データセットのパラメータ値をセット
vParams[0] = 5.5; // y0
vParams[1] = 26; // A
vParams[2] = 8; // xc
vParams[3] = 976; // w
// 第2データセットのパラメータ値をセット
vParams[4] = 2.3; // y0
vParams[5] = 26; // A
vParams[6] = 10.3; // xc
vParams[7] = 102; // w
int nRet = nlfSession.SetParamValues(vParams);
if(nRet != 0) // 0 はエラーなしを示す
return;
2つのデータセットでパラメータxcを共有します。
int nSharedParamIndex = 1; // 1, これはGauss関数でのxcのインデックス
nlfSession.SetParamShare(nSharedParamIndex);
フィットを実行し、ステータスメッセージを出力します。
// フィット実行
int nFitOutcome;
nlfSession.Fit(&nFitOutcome);
string strOutcome = nlfSession.GetFitOutCome(nFitOutcome);
out_str("Outcome of the fitting session : " + strOutcome);
フィット統計結果を取得します。
int nDataIndex = 0;
RegStats fitStats;
NLSFFitInfo fitInfo;
nlfSession.GetFitResultsStats(&fitStats, &fitInfo, false, nDataIndex);
printf("# Iterations=%d, Reduced Chisqr=%g\n", fitInfo.Iterations,
fitStats.ReducedChiSq);
最終的なパラメータ値を取得します。
vector vFittedParamValues, vErrors;
nlfSession.GetFitResultsParams(vFittedParamValues, vErrors);
// パラメータ xc は2つの入力データで共有
// そのため、xc の値は同じで、
// vParamValuesには、1回しか表示しない
// vsParamNames はGauss関数のパラメータ名が含まれる - y0, xc, w, A.
// 以下でxc以外の2番目のデータセットのパラメータ名を追加
vsParamNames.Add("y0");
vsParamNames.Add("w");
vsParamNames.Add("A");
for( int nParam = 0; nParam < vFittedParamValues.GetSize(); nParam++)
{
printf("%s = %f\n", vsParamNames[nParam], vFittedParamValues[nParam]);
}
最終フィットパラメータを使用して、フィット曲線のY値を計算します。
vector vFitY1(vX1.GetSize()), vFitY2(vX2.GetSize());
// 第1データセットのためのフィットYデータセットを取得
nlfSession.GetYFromX(vX1, vFitY1, vX1.GetSize(), 0);
// 2番目のデータセットのフィットYを取得
nlfSession.GetYFromX(vX2, vFitY2, vX1.GetSize(), 1);
FDFファイルにアクセスする
FDFファイルに保存されているフィット関数設定はツリー変数にロードすることができます。 OriginC\system\FDFTree.h ファイルをインクルードする必要があります。
#include <FDFTree.h>
そして、nlsf_FDF_to_tree 関数を使います。
string strFile = GetOpenBox("*.FDF");
Tree tr;
if(nlsf_FDF_to_tree(strFile, &tr))
{
out_tree(tr);
}
|