This example shows how to do nonlinear curve fit on one XY data with Gauss function. Without dialog open and with default settings to do fit and genereate worksheet report including parameter, statistics report tables and fitted curves report graphs.
#include <operation.h> void NLFit_op_ex() { bool bInit; Operation& op = (Operation&)op_create("FitNL", bInit); // the operation name of NLFit is FitNL if( !bInit ) { out_str("Error in op create"); return; } Tree trOp; op.GetTree(trOp); Worksheet wks = Project.ActiveLayer(); if( !wks ) return; DataRange dr; dr.Add(wks, 0, "X"); dr.Add(wks, 1, "Y"); // init trOp.GUI.InputData treenodes from dr and do SetData, SetFunction actions string strFunction = "Gauss"; string strCategory = "Peak Functions"; if (OP_NOERROR != op.OnInitDataFromOCLT(trOp, trOp.GUI.InputData, dr, strFunction, strCategory) ) { out_str("Fail to init data from data range"); return; } op.SetTree(trOp);// set the changes of trOp back to op object int nAutoUpdate = AU_AUTO; op.OnNoEdit(0, nAutoUpdate); op.Execute(); // do fit and genereate report }
Copy the following commands in Command window and press Enter to run:
newbook; string ascfile$ = System.path.program$ + "samples\Curve Fitting\Gaussian.dat"; ImpASC fname:= ascfile$; NLFit_op_ex;
The following example shows how to fit on two XY datasets with Gauss function, parameter xc is shared and Y0 of the first dataset is fixed as 5.
#include <operation.h> void NLFit_op_with_Multi_Datasets() { Worksheet wks = Project.ActiveLayer(); if( !wks ) { out_str("Please activate a worksheet with Gaussian.dat data"); return; } DataRange dr; dr.Add(wks, 0, "X"); dr.Add(wks, 1, "Y"); dr.Add(); dr.Add(wks, 0, "X"); dr.Add(wks, 2, "Y"); bool bInit; Operation& op = (Operation&)op_create("FitNL", bInit); // the operation name of NLFit is FitNL if( !bInit ) { out_str("Error in op create"); return; } Tree trOp; op.GetTree(trOp); // init trOp.GUI.InputData treenodes from dr and do SetData, SetFunction actions string strFunction = "Gauss"; string strCategory = "Peak Functions"; if (OP_NOERROR != op.OnInitDataFromOCLT(trOp, trOp.GUI.InputData, dr, strFunction, strCategory) ) { out_str("Fail to init data from data range"); return; } // set share trOp.GUI.InputData.Use = DATA_MODE_GLOBAL; // if want to share parameters, data mode should be Global Fit trOp.GUI.Parameters.Share.Value1.nVal = 0; // not share y0 trOp.GUI.Parameters.Share.Value2.nVal = 1; // share xc // set fix trOp.GUI.Parameters.Fixed.Value1.nVal = 1; // fix y0 trOp.GUI.Parameters.FixedValues.Value1.dVal = 5; // fixed value // set the changes of trOp back to op object op.SetTree(trOp); int nAutoUpdate = AU_AUTO; op.OnNoEdit(0, nAutoUpdate); // do fit and genereate report op.Execute(); // to get the newest operation tree including fit result. op.GetTree(trOp); // output parameter values int nNumData = 2; vector<string> vsParamNames = {"y0", "xc", "w", "A"}; TreeNode trParams = trOp.Calculation.Parameters; for(int nData = 0; nData < nNumData; nData++) { printf("%d:\t", nData+1); for(int nn = 0; nn < vsParamNames.GetSize(); nn++) { string strParamName = vsParamNames[nn]; TreeNodeCollection trNs(trParams, strParamName+"_"); if( trNs.Count() > nData ) { TreeNode trParam; trParam = trNs.Item(nData); if( trParam && trParam.Value ) printf("%s=%g, ", strParamName, trParam.Value.dVal ); } } printf("\n"); } }
Copy the following commands in Command window and press Enter to run:
newbook; string ascfile$ = System.path.program$ + "samples\Curve Fitting\Gaussian.dat"; ImpASC fname:= ascfile$; NLFit_op_with_Multi_Datasets;
The following example shows how to fit on the multiple peaks data.
#include <operation.h> void NLFit_op_with_Multi_Peaks() { Worksheet wks = Project.ActiveLayer(); if( !wks ) { out_str("Please activate a worksheet with Multiple Peaks.dat data"); return; } DataRange dr; dr.Add(wks, 0, "X"); dr.Add(wks, 1, "Y"); bool bInit; Operation& op = (Operation&)op_create("FitNL", bInit); // the operation name of NLFit is FitNL if( !bInit ) { out_str("Error in op create"); return; } Tree trOp; op.GetTree(trOp); // set replica number to 2. Default is 0. trOp.GUI.Replica.Number.nVal = 2; // init trOp.GUI.InputData treenodes from dr and do SetData, SetFunction actions string strFunction = "Gauss"; string strCategory = "Peak Functions"; if (OP_NOERROR != op.OnInitDataFromOCLT(trOp, trOp.GUI.InputData, dr, strFunction, strCategory) ) { out_str("Fail to init data from data range"); return; } // set the changes of trOp back to op object op.SetTree(trOp); int nAutoUpdate = AU_AUTO; op.OnNoEdit(0, nAutoUpdate); // do fit and genereate report op.Execute(); }
Copy the following commands in Command window and press Enter to run:
newbook; string ascfile$ = System.path.program$ + "samples\Curve Fitting\Multiple Peaks.dat"; ImpASC fname:= ascfile$; NLFit_op_with_Multi_Peaks;
The following example shows how to output Find Y from X table.
#include <operation.h> void NLFit_op_with_YfromX(bool bYfromX = true) { Worksheet wks = Project.ActiveLayer(); if( !wks ) { out_str("Please activate a worksheet with Gaussian.dat data"); return; } DataRange dr; dr.Add(wks, 0, "X"); dr.Add(wks, 1, "Y"); bool bInit; Operation& op = (Operation&)op_create("FitNL", bInit); // the operation name of NLFit is FitNL if( !bInit ) { out_str("Error in op create"); return; } Tree trOp; op.GetTree(trOp); // init trOp.GUI.InputData treenodes from dr and do SetData, SetFunction actions string strFunction = "Gauss"; string strCategory = "Peak Functions"; if (OP_NOERROR != op.OnInitDataFromOCLT(trOp, trOp.GUI.InputData, dr, strFunction, strCategory) ) { out_str("Fail to init data from data range"); return; } //enable Find Y from X and Calculate Confidence TreeNode trCalibration, trCustomSettings; trCalibration = op_get_calibration_table(trOp.GUI); if ( trCalibration ) { int nIndexTbl = bYfromX ? 2 : 1; string strCustomNode = "Custom" + (nIndexTbl + 1); trCustomSettings = trCalibration.GetNode(strCustomNode); } if ( trCustomSettings ) { trCustomSettings.Conf.nVal = 1; trCustomSettings.Conf.Enable = true; trCustomSettings.Use = 1; } else { out_str("Fail to enable Find Y from X"); return; } // set the changes of trOp back to op object op.SetTree(trOp); int nAutoUpdate = AU_AUTO; op.OnNoEdit(0, nAutoUpdate); // do fit and genereate report op.Execute(); }
Copy the following commands in Command window and press Enter to run:
newbook; string ascfile$ = System.path.program$ + "samples\Curve Fitting\Gaussian.dat"; ImpASC fname:= ascfile$; NLFit_op_with_YfromX;