2.2.1.2.1 NLFitSession::Fit

Contents

Description

Perform the fit. Iterations will be carried out until the tolerance is reached, or the number of iterations has reached the maximum specified by SetMaxNumIter.

Syntax

bool Fit(int* pnOutcome = NULL, bool bCheckLastOutcome = false, bool bAllowCancel = false)

Parameters

pnOutcome
[output] the int pointer, if not NULL, receive the error code.
bCheckLastOutcome
[input] if ture, will not iteration again if already converged.
bAllowCancel
[input] if true to allow type Esc to interrupt iteration.

Return

return ture if fit converged, else return false.

Examples

EX1

  1. 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 command run.LoadOC(Originlab\nlsf_utils.c) or just add this file to your workspace.
  2. New a worksheet and import \Samples\Curve Fitting\Gaussian.dat.
  3. Copy and compile the following codes, and run "NLFitSession_Fit_ex1" in Command window.


#include <..\originlab\NLFitSession.h>
void NLFitSession_Fit_ex1()
{
    Worksheet 	wks = Project.ActiveLayer();
    if( !wks )
        return;
    
    wks.SetSize(-1, 2); // remove other columns
    wks.SetSize(-1, 4); // add two new columns
    wks.SetColDesignations("XYXY");
    
    XYRange 	dr;
    // add input data range
    dr.Add(wks, 0, "X");
    dr.Add(wks, 1, "Y");
    dr.Add();
    // add output fit data range
    dr.Add(wks, 2, "X");
    dr.Add(wks, 3, "Y");
    
    int 	nRangeIndex = 0;
    vector 	vX, vY;
    dr.GetData(vY, vX, NULL, nRangeIndex); 
  

    NLFitSession    FitSession;
    
    // 1. set function
    if( !FitSession.SetFunction("Gauss")) // set function as Gauss, category name can be ignore
    {
        out_str("invalid fit function");
        return;
    }   
    
    // 2. set data
    if( !FitSession.SetData(vY, vX))
    {
        out_str("fail to set data");
        return;
    }
    
    // 3. init parameter
    if( !FitSession.ParamsInitValues())
    {
        out_str("fail to init parameter");
        return;
    }
    
    out_str("The parameter values before fitting");
    FitSession.GetChiSqr(); // call GetChiSqr order to set parameter settings on internal fit object
    show_params(FitSession);
    
    // 4. fit
    int nOutcome;
    if( !FitSession.Fit(&nOutcome) )
    {
        out_str("Fail to do fitting");
        return;
    }
 
    out_str("The parameter values after fitting");
    show_params(FitSession);
    
    
    // 5. get fitting xy data and put to source worksheet
    double 	xmin, xmax, xinc;
    vX.GetMinMax(xmin, xmax);
    
    int 	count = 100;
    RoundLimits(&xmin, &xmax, &xinc, count);
    
    vector 	vFitX, vFitY;
    vFitX.Data(xmin, xmax, xinc);
    vFitY.SetSize(vFitX.GetSize());
    
    if( 0 == FitSession.GetYFromX(vFitX, vFitY, vFitX.GetSize()) )
    {
    	out_str("Fail to get Y values");
    }
    
    nRangeIndex = 1;
    dr.SetData(&vFitY, &vFitX, nRangeIndex); 
    
    // plot source data and fitting data
    GraphPage gp;
    gp.Create();
    GraphLayer gl = gp.Layers();
    if( gl.AddPlot(wks) >= 0 )
    	legend_update(gl);
}
 
void show_params(NLFitSession& FitSession)
{
    // get parameter values after initialization
    vector      vParamValues;
    vector<int> vnParamsOffsets; // the begin index of one group of parameters, normally one group for one dataset
    FitSession.GetParamValuesAndOffsets(vParamValues, vnParamsOffsets);
    
    // output parameter values with names
    vector<string> vsParamNames;
    FitSession.GetParamNamesInFunction(vsParamNames);   
        
    int nDataset = 0;
    for( int nParam = vnParamsOffsets[nDataset], ii = 0; nParam < vnParamsOffsets[nDataset+1]; nParam++, ii++ )
    {
        printf("%s = %f\n", vsParamNames[ii], vParamValues[nParam]);
    }   
}

Remark

See Also

GetFitOutCome

Header to Include

Originlab\NLFitSession.h