NLFit はOrigin のバージョン8以降の機能です。この新しいフィット機構は、反復実行中にデータのコピーでフィットプロセスを扱います。新しいフィット機構はワークシートデータを直接繰り返しアクセスするので、古いフィット機構に比べ、早い操作を実行できます。
非線形曲線フィットでは、2つのクラスを利用可能です。
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ファイルに保存されているフィット関数設定はツリー変数にロードすることができます。 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); }