Minimum Origin Version Required: Origin 8.1 SR0
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);
The following code shows how to use NLFitSesssion to fit on multiple peaks in one dataset.
Before running new a worksheet and import \Samples\Curve Fitting\Multiple Peaks.dat, delete other columns just keep the first two columns. Then run "test_NLFitSession" in Command Window.
#include <Origin.h> #include <..\originlab\NLFitSession.h> #define ERR_RETURN(_ERR_MSG) { \ out_str(_ERR_MSG); \ return; \ } void test_NLFitSession(int nNumPeaks = 3) { Worksheet wks = Project.ActiveLayer(); if( !wks ) return; // assume there is one pair XY columns in active worksheet including two peaks data XYRange drInput; drInput.Add(wks, 0, "X"); drInput.Add(wks, 1, "Y"); drInput.Add(); vector vX1, vY1; drInput.GetData(vY1, vX1, NULL, 0); NLFitSession nlfSession; // Set Function if ( !nlfSession.SetFunction("Gauss", NULL, nNumPeaks) ) // set function with peak number ERR_RETURN("Fail to set function!"); // Set Data and only need to set the last dataset with global fit mode, as to allow share parameters if ( !nlfSession.SetData(vY1, vX1) ) ERR_RETURN("Fail to set data for the first dataset!") // Parameter initialization if ( !nlfSession.ParamsInitValues() ) ERR_RETURN("Fail to init parameters values!") // Show parameters before fitting nlfSession.GetChiSqr(); // call GetChiSqr order to set parameter settings on internal fit object show_params(nlfSession, nNumPeaks, "Before ftting"); //Set the maximum allowed number of iterate times, if fit not converged, try to set a bigger number nlfSession.SetMaxNumIter(400); // Do fit int nFitOutcome; bool bRet = nlfSession.Fit(&nFitOutcome); //if success string strOutcome = nlfSession.GetFitOutCome(nFitOutcome); out_str("Outcome of the fitting session : " + strOutcome); if( bRet ) { // Show parameters after fitting show_params(nlfSession, nNumPeaks, "After ftting"); // Get the fitting result vector vFitY1(vX1.GetSize()); nlfSession.GetYFromX(vX1, vFitY1, vX1.GetSize(), -1); //get cumulative fitted data // Put fitting data into new column in worksheet append_column_data(wks, vFitY1, "Fit Data"); GraphPage gp; gp.Create(); GraphLayer gl = gp.Layers(); gl.AddPlot(wks); } } void append_column_data(Worksheet& wks, vector& vData, LPCSTR lpcstrLongName) { int nCol = wks.AddCol(); if( NULL != lpcstrLongName ) wks.Columns(nCol).SetLongName(lpcstrLongName); Dataset ds(wks, nCol); ds = vData; } void show_params(NLFitSession& nlfSession, int nCount, LPCSTR lpcscTitle) { vector<double> vParamValues; vector<int> vParamOffsets; vector<string> vsParamNames; //get parameters values and names nlfSession.GetParamValuesAndOffsets(vParamValues, vParamOffsets); nlfSession.GetParamNamesInFunction(vsParamNames); //output paramter values with names for ( int index = 0; index < nCount; index++ ) { printf("%s, parameters of Peak %d:\n", lpcscTitle, index + 1); for ( int nParam = vParamOffsets[index], ii = 0; nParam < vParamOffsets[index + 1]; nParam++, ii++ ) { printf("%s = %lf\n", vsParamNames[ii], vParamValues[nParam]); } } }