XY検索独立変数から従属変数の値を取得するため、あるいは、従属変数から独立変数の値を取得するために、指定したパラメータ値を使用する方法を示しています。
線形
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) のスクリプトから実行するか、ワークスペース内にこのファイルを追加して行います。
XからYを取得
#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からXを取得
次の関数は、指定した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]);
}
|