3.9.2.1.5 Weighted Fitting

Version Info

Minimum Origin Version Required: Origin 8.1 SR0

Need to do before Running Examples

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 following command or just add this file to your workspace.

run.LoadOC(Originlab\nlsf_utils.c);

Example

The following code shows how to use NLFitSesssion to fit with weighted data.

  1. Create a new worksheet and import the data <Origin Installation Directory>\Samples\Curve Fitting\Gaussian.dat.
  2. Copy and compile the following codes in Code Builder, and then run "Weighted_Fitting" in Command Window.
#include <..\originlab\NLFitSession.h>

void Weighted_Fitting()
{
	// get the active worksheet
	Worksheet wks = Project.ActiveLayer();
	if(!wks)
	{
		out_str("Not a valid worksheet!");
		return; // need to activate a worksheet with data
	}
	
	NLFitSession FitSession;
	
	// 1. set function
	if(!FitSession.SetFunction("Gauss"))
	{
		out_str("Set fitting function error!");
		return;
	}
	
	// get parameter names and number
	vector<string> vsParamNames;
	int nNumParamsInFunction = FitSession.GetParamNamesInFunction(vsParamNames);
	
	// get data range
	DataRange drInputData;
	drInputData.Add(wks, 0, "X");  // x column
	drInputData.Add(wks, 1, "Y");  // y column
	drInputData.Add(wks, 2, "ED");  // weight column
	
	// 2. set the dataset
	vector vX, vY, vW;
	drInputData.GetData(&vX, 0);
	drInputData.GetData(&vY, 1);
	drInputData.GetData(&vW, 2);
	
	if(!FitSession.SetData(vY, vX, NULL, 0, 1, DATA_MODE_INDEP_CONSOLID, vW))
	{
		out_str("Set data error!");
		return;
	}
	
	// 3. set parameter init values
	if(!FitSession.ParamsInitValues())
	{
		out_str("Init values error!");
		return;
	}
	
	// 4. set weight method, WEIGHT_NONE = no weight, WEIGHT_INSTRUMENTAL = instrumental
	// WEIGHT_STATISTICAL = statistics
	if(!FitSession.SetWeightData(WEIGHT_INSTRUMENTAL, 0.0, 0.0, 0.0))
	{
		out_str("Set weight method error!");
		return;
	}
			
	// 5. start fitting	
	int nFitOutcome;
	if(!FitSession.Fit(&nFitOutcome))
	{
		string strOutcome = FitSession.GetFitOutCome(nFitOutcome);
		out_str("Fit error! "+strOutcome);
		return;
	}
	
	// 6. success, get results	
	RegStats fitStats;
	NLSFFitInfo fitInfo;
	vector vParamValues, vErrors;
	FitSession.GetFitResultsStats(&fitStats, &fitInfo, false, 0);
	FitSession.GetFitResultsParams(vParamValues, vErrors);
	
	printf("# Iterations = %d, Reduced Chisqr = %g\n", fitInfo.Iterations, fitStats.ReducedChiSq);
	for(int nParam=0; nParam<vParamValues.GetSize(); nParam++)
	{
		printf("# %s = %f, %s_error = %f\n", vsParamNames[nParam], vParamValues[nParam], vsParamNames[nParam], vErrors[nParam]);
	}
}