NLFitSession
Name
NLFitSession
Remark
The NLFitSession is a higher level Origin class, which is available to perform nonlinear fitting by handling the fitting process with a copy of the data while perform iterations. It wraps the NLFit class with a friendly interface to aid in implementing the fitting evaluation procedure. It is the kernel of the NLFit dialog. This class is recommended for coding in Origin C, because it takes care of all the complexities that arise from the process of interfacing to Origin.
Hierarchy
Examples
EX1
Prior to running the following example, the nlsf_utils.c file need to be loaded and compiled. This can be done from script with the command run.LoadOC(Originlab\nlsf_utils.c) or just add this file to your workspace.
#include <..\originlab\NLFitSession.h>
bool NLFitSession_Fit_ex()
{
Worksheet wks;
wks.Create("origin");
// Prepare worksheet with XYY columns and simulate data for the first two XY columns as Gauss curve
vector vX, vY;
if( !prepare_simulate_data_wks(wks, vX, vY) )
{
out_str("Fail to generate simulate data");
return false;
}
NLFitSession FitSession;
// Set function
if( !FitSession.SetFunction("Gauss")) // set function as Gauss, category name can be ignore
{
out_str("invalid fit function");
return false;
}
// Set data
if( !FitSession.SetData(vY, vX))
{
out_str("fail to set data");
return false;
}
// Parameter initializtion
if( !FitSession.ParamsInitValues())
{
out_str("fail to initialize parameter");
return false;
}
out_str("The parameter values before fitting");
FitSession.GetChiSqr(); // call GetChiSqr in order to set parameter settings on internal fit object
show_params(FitSession);
// Fit
int nOutcome;
if( !FitSession.Fit(&nOutcome) )
{
out_str("Fail to do fitting");
return false;
}
out_str("The parameter values after fitting");
show_params(FitSession);
// Calculate fitting Y
vector vFitY(vX.GetSize());
if( 0 == FitSession.GetYFromX(vX, vFitY, vFitY.GetSize()) )
{
out_str("Fail to get Y values");
return false;
}
// Put fitting Y data to worksheet column C.
XYRange xyFit;
xyFit.Add(wks, 0, "X");
xyFit.Add(wks, 2, "Y");
xyFit.SetData(&vFitY, &vX);
// Plot input data and fitting data
GraphPage gp;
gp.Create("origin");
GraphLayer gl = gp.Layers(0);
int nPlot = gl.AddPlot(wks, IDM_PLOT_LINE); // plot input as line
if( nPlot >= 0)
{
DataPlot dp = gl.DataPlots(1);
if(dp)
dp.SetColor(SYSCOLOR_RED); // set fit plot color to read
gl.Rescale();
legend_update(gl); //refresh graph legend
}
return true;
}
bool prepare_simulate_data_wks(Worksheet& wks, vector& vX, vector& vY)
{
if( !wks )
{
out_str("error in prepare_simulate_data_wks");
return false;
}
// Format worksheet
wks.SetSize(-1, 3);
wks.SetColDesignations("XYY");
vector<string> vsNames = {"Data X", "Data Y", "Fit Y"};
int ii = 0;
foreach(Column col in wks.Columns)
{
col.SetLongName(vsNames[ii++]);
}
// Generate simulate data
string strFDF = okutil_get_origin_path(ORIGIN_PATH_SYSTEM, "FitFunc")+"Gauss.FDF";
Tree trFF;
if( !nlsf_FDF_to_tree( strFDF, &trFF ))
return false;
NumericFunction NF;
NF.SetTree(trFF);
// Initalize the independent data values:
int nPts = 500;
vX.Data(1, nPts, 1);
vector vParams(4); // 4 is the number of params in the function y0,xc,w,A are parameters for Gauss.
vParams[0] = 5; // y0
vParams[1] = 250; // xc
vParams[2] = 40; // w
vParams[3] = 7; // A
// Vector for the dependent data
vY.SetSize(nPts);
BOOL bb = NF.Evaluate(vParams, vY, vX, NULL, nPts);
if (!bb)
{
out_str("Failed!");
return false;
}
add_white_noise(vY, 5, NOISE_OVER_DIFFERENCE); // add 5% noise
// Put data from vectors to worksheet
DataRange dr;
dr.Add(wks, 0, "X");
dr.Add(wks, 1, "Y");
dr.SetData(&vY, &vX);
return true;
}
void show_params(NLFitSession& FitSession)
{
// get parameter values after initialization
vector vParamValues, vErrors;
FitSession.GetFitResultsParams(vParamValues, vErrors);
// output parameter values with names
vector<string> vsParamNames;
FitSession.GetParamNamesInFunction(vsParamNames);
int nDataset = 0;
for( int nParam = 0; nParam < vParamValues.GetSize(); nParam++)
{
printf("%s = %f\n", vsParamNames[nParam], vParamValues[nParam]);
}
}
header to Include
Originlab\NLFitSession.h
Reference
Members
|