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]);
}