独立変数から従属変数の値を取得するため、あるいは、従属変数から独立変数の値を取得するために、指定したパラメータ値を使用する方法を示しています。
XからYを取得する式は、
y = a + x * b;
YからXを取得する式は、
x = (y - a) / b;
非線形関数の場合、NumericFunction クラスを使用してxからyを取得し、ocmath_find_xs 関数を使用してyからxを取得します。
サンプルを実行する前に nlsf_utils.cファイルをロードしてコンパイルしておく必要があります。これは、コマンドrun.LoadOC(Originlab\nlsf_utils.c) のスクリプトから実行するか、ワークスペース内にこのファイルを追加して行います。
#include <ONLSF.h> #include <..\Originlab\nlsf_utils.h> void _findy_from_x() { // フィット関数オーガナイザダイアログのカテゴリに関連した // 適切な関数を使用する。F9キーを押すとこのダイアログが開く。 // Poly 関数はPolynomial カテゴリにある string strFuncFileName = "Poly"; Tree trFF; if( !nlsf_load_fdf_tree(trFF, strFuncFileName) ) { out_str("Fail to load function file to tree"); return; } NumericFunction func; if (!func.SetTree(trFF)) { out_str("NumericFunction object init failed"); return; } int nNumParamsInFunc = trFF.GeneralInformation.NumberOfParameters.nVal; vector vParams(nNumParamsInFunc); vParams = NANUM; vParams[0] = 1; vParams[1] = 2; vParams[2] = 3; vector vX = {1, 1.5, 2}; vector vY; vY = func.Evaluate(vX, vParams); }
次の関数は、指定したY値から2つのX値を取得する方法を示しています。実行前に、Samples\Curve Fitting\Gaussian.dat をワークシートにインポートし、このワークシートをアクティブにします。
#include <...\originlab\nlsf_utils.h> #include <FDFTree.h> void _findx_from_y() { double y = 20; // X値取得するY値は 20 Worksheet wks = Project.ActiveLayer(); if (!wks) { return; } // フィットするデータを取得 DataRange dr; dr.Add(wks, 0, "X"); dr.Add(wks, 1, "Y"); DWORD dwPlotID; vector vDataX, vDataY; if(dr.GetData(DRR_GET_DEPENDENT | DRR_NO_FACTORS, 0, &dwPlotID, NULL, &vDataY, &vDataX) < 0) { printf("failed to get data"); return; } uint nFindXNum = 2; // Xの個数をセット vector vFindX; vFindX.SetSize(nFindXNum); string strFile = GetOriginPath() + "OriginC\\OriginLab\\nlsf_utils.c"; PFN_STR_INT_DOUBLE_DOUBLE_DOUBLEP pFunc = Project.FindFunction("compute_y_by_x", strFile, true); string strFuncFileName = "Gauss"; vector vParams(4); vParams[0] = 5.58333; // y0 vParams[1] = 26; // xc vParams[2] = 8.66585; // w vParams[3] = 976.41667; // A int nRet = ocmath_find_xs(y, (uint)(vDataY.GetSize()), vDataX, vDataY, nFindXNum, vFindX, strFuncFileName, vParams.GetSize(), vParams, pFunc); if( OE_NOERROR == nRet ) printf("Y = %g\tX1 = %g\tX2 = %g\n", y, vFindX[0], vFindX[1]); }