Calculate the current reduced Chi-square value.
void GetChiSqr(vector& vChiSqr = NULL, bool bGenerateOutputs = false)
There is no return value for this function.
EX1
This example shows how to get reduced chi-sqr and output results on multiple datasets.
#include <..\originlab\NLFitSession.h> void NLFitSession_GetChiSqr_ex1() { Worksheet wks = Project.ActiveLayer(); if ( !wks || wks.GetNumCols() < 3 ) return; NLFitSession nlfSession; //set fit function if ( !nlfSession.SetFunction("Gauss") ) { out_str("Fail to set function!"); return; } const int nDatasets = 2; //two datasets //prepare input dataset 1 XYRange drInput; drInput.Add(wks, 0, "X"); drInput.Add(wks, 1, "Y"); vector vX, vY; drInput.GetData(vY, vX); //set data 1 if ( !nlfSession.SetData(vY, vX, NULL, 0, nDatasets ) ) { out_str("Fail to set data 1!"); return; } //prepare input dataset 2 drInput.Reset(); drInput.Add(wks, 0, "X"); drInput.Add(wks, 2, "Y"); drInput.GetData(vY, vX); //set data 2 if ( !nlfSession.SetData(vY, vX, NULL, 1, nDatasets ) ) { out_str("Fail to set data 2!"); return; } //set parameters vector vParams(8); //gauss function need y0, xc, w, A each dataset, and there are two datasets. vParams[0] = 4; vParams[1] = 25; vParams[2] = 20; vParams[3] = 255; vParams[4] = 3; vParams[5] = 20; vParams[6] = 15; vParams[7] = 25; nlfSession.SetParamFix(4, true); //y0 of dataset 2 as fixed. nlfSession.SetEnableLinearConstraints(true, NULL); if ( 0 != nlfSession.SetParamValues(vParams) ) { out_str("Fail to set parameter values!"); return; } //generate and show results. vector vChiSqr; bool bGenerateOutputs = true; nlfSession.GetChiSqr(vChiSqr, bGenerateOutputs); if ( vChiSqr.GetSize() != nDatasets ) { out_str("Fail to get Chi-Sqr of all datasets!"); return; } for ( int iData = 0; iData < nDatasets; iData++ ) { if ( vChiSqr.GetSize() > iData ) printf("Reduced Chi-Sqr of dataset %d is : %lf\n", iData + 1, vChiSqr[iData]); if( bGenerateOutputs ) //the output results is updated and reliable { FitParameter arrFitParams[4]; //y0, xc, w, A RegStats regStats; NLSFFitInfo fitInfo; if ( nlfSession.GetFitResultsStats(®Stats, &fitInfo, false, iData) && nlfSession.GetFitResultsParams(arrFitParams, ®Stats, iData) > 0 ) { printf("\nFit parameters : \n"); vector<string> vParaNames = {"y0", "xc", "w", "A"}; for ( int iPara = 0; iPara < vParaNames.GetSize(); iPara++ ) { _show_fitparams(arrFitParams[iPara], vParaNames[iPara]); } printf("\nRegular statistics : \n"); _show_regstats(regStats); } } } return; } static void _show_fitparams(FitParameter& fitParams, LPCSTR lpcszParamName) { printf("Parameter %s value : %lf\n", lpcszParamName, fitParams.Value); printf("Parameter %s fix : %s\n", lpcszParamName, fitParams.Fix ? "True" : "False"); printf("Parameter %s error : %lf\n", lpcszParamName, fitParams.Error); return; } static void _show_regstats(RegStats& regStats) { printf("Number of points : %d\n", (int)regStats.N); printf("Degrees of freedom : %lf\n", regStats.DOF); printf("ReducedChisq(Chi^2/DOF) : %lf\n", regStats.ReducedChiSq); printf("Regression sum of squares : %lf\n", regStats.SSR); printf("Correlation : %lf\n", regStats.Correlation); printf("R Value : %lf\n", regStats.Rvalue); printf("Coefficient of determination : %lf\n", regStats.RSqCOD); printf("Adjusted residual sum of squares : %lf\n", regStats.AdjRSq); printf("Root_MSE(SD) : %lf\n", regStats.RMSESD); printf("Norm of Residuals : %lf\n", regStats.NormResiduals); return; }
Originlab\NLFitSession.h