Minimum Origin Version Required: Origin 8 SR0
//////////////////////////////////////////////////////////////////////////////////////// // Explicit function fitting // before running this function, import \Samples\Curve Fitting\Gaussian.dat to worksheet. //////////////////////////////////////////////////////////////////////////////////////// #include <Origin.h> #include <FDFTree.h> #include <ONLSF.h> void NLFit_example1() { string strFDF = okutil_get_origin_path(ORIGIN_PATH_SYSTEM, "FitFunc") + "Gauss.FDF"; Tree trFF; if( !nlsf_FDF_to_tree( strFDF, &trFF )) { out_str("Fail to load FDF function file"); return; } ////////////////////////////////////////////////////////////////////////////// // 1. Setting the fitting function // // The fit object: NLFit fit; int nn = fit.SetFunction(trFF); if (nn <= 0) { out_str("Failed setting fitting function!"); return; } /////////////////////////////////////////////////////////////////////////// // 2. Setting data for fitting //////////////////////////////////////////// Worksheet wks = Project.ActiveLayer(); if( !wks ) { out_str("No active worksheet to get input data"); return; } DataRange dr; dr.Add(wks, 0, "X"); dr.Add(wks, 1, "Y"); DWORD dwRules = DRR_GET_DEPENDENT | DRR_NO_FACTORS; int nNumRanges = dr.GetNumData(dwRules); ASSERT( 1 == nNumRanges ); if( nNumRanges <= 0 || nNumRanges > 1) { out_str("Not proper input data to do fit"); return; } vector vX, vY; DWORD dwPlotID; dr.GetData( dwRules, 0, &dwPlotID, NULL, &vY, &vX); NLSFONEDATA stDep, stIndep; stIndep.pdData = vX; stIndep.nSize = vX.GetSize(); stDep.pdData = vY; stDep.nSize = vY.GetSize(); nn = fit.SetData(1, &stDep, &stIndep); if (nn != 0) { out_str("SetData() failed!"); return; } // 3. Setting paramaters ////////////////////////////////////////////////// int nNumParams = 4; vector vParams(nNumParams); // this vector should be initialized to the total number of paramaters // This vector will be used both to set initial paramater values, and to receive the parameter values after fitting: NumericFunction fn; fn.SetTree(trFF); int nErr; if( !fn.ParamInit( vParams, vX, vY, nErr ) )// Run parameter init code to get parameter init values { vParams[0] = 5.58; // y0 vParams[1] = 26; // xc vParams[2] = 8; // w vParams[3] = 976; // A } nn = fit.SetParams(nNumParams, vParams); if ( 0 != nn ) { out_str("Invalid paramater setting!"); return; } /////////////////////////////////////////////////////////////////////////// // 4. Fitting ///////////////////////////////////////////////////////////// int nMaxNumIterations = 100; nn = fit.Fit(nMaxNumIterations); printf("Fit(%ld) returned: %ld\n", nMaxNumIterations, nn); if( 0 == nn ) printf("Fit Done!\n"); /////////////////////////////////////////////////////////////////////////// // 5. Dump all the results and compare with what was expected ///////////// for (int iparam = 0; iparam < nNumParams; iparam++) { printf("param index = %d value obtained = %lf\n", iparam + 1, vParams[iparam]); } return; }