You are here: Symbol Reference > Regress Namespace > Functions > Regress.NLinRegress Function
Stats Master VCL
ContentsIndex
Example

The following example uses data from NIST study involving circular interference transmittance. The response variable is transmittance, and the predictor variable is wavelength. First we setup the regression function Eckerle4 with three regression parameters (b0,b1,b2). Then we setup data and specify initial estimate for regression parameters (see below):

Uses MtxExp, Math387, Regress, Optimization, MtxVecTee;
// function definition
procedure Eckerle4(const B: TVec; const X: TVecList; const Y: TVec);
begin
    //= B[0]/B[1] * Exp(-0.5*Sqr((X-B[2])/B[1]));

    y.Normalize(X[0], B[2], B[1]);
    y.Sqr;
    y.Scale(-0.5);
    y.Exp;
    y.Scale(B[0]/B[1]);
end;
procedure Example;
var x0,y,b,yhat: Vector;
  StopReason: TOptStopReason;
  x: TVecList;
begin
  x := TVecList.Create;
  x.Add; //add

  x[0].SetIt(false,[400.0, 405.0, 410.0, 415.0,
                 420.0, 425.0, 430.0, 435.0,
                 436.5, 438.0, 439.5, 441.0,
                 442.5, 444.0, 445.5, 447.0,
                 448.5, 450.0, 451.5, 453.0,
                 454.5, 456.0, 457.5, 459.0,
                 460.5, 462.0, 463.5, 465.0,
                 470.0, 475.0, 480.0, 485.0,
                 490.0, 495.0, 500.0]);

  y.SetIt(false,[0.0001575, 0.0001699, 0.0002350, 0.0003102,
                 0.0004917, 0.0008710, 0.0017418, 0.0046400,
                 0.0065895, 0.0097302, 0.0149002, 0.0237310,
                 0.0401683, 0.0712559, 0.1264458, 0.2073413,
                 0.2902366, 0.3445623, 0.3698049, 0.3668534,
                 0.3106727, 0.2078154, 0.1164354, 0.0616764,
                 0.0337200, 0.0194023, 0.0117831, 0.0074357,
                 0.0022732, 0.0008800, 0.0004579, 0.0002345,
                 0.0001586, 0.0001143, 0.0000710]);

  b.SetIt(false,[1.0, 10.0, 500.0]); // initial estimates
  NLinRegress(x,y,Eckerle4,nil,b,optMarquardt, StopReason,
              nil,yhat,false,300,1e-8,1e-10);

  DrawValues(x[0],y,Series1,false); // draw data
  DrawValues(x[0],yhat,Series2,false); // draw fitted values

  x.Free;
end;
#include "MtxExpr.hpp"
#include "Regress.hpp"
#include "MtxVecTee.hpp"

void __fastcall Eckerle4(TVec* const b, TVecList* const x, TVec * const y)
{
    double* B = b->PValues1D(0);

    //      double a = (x-B[2])/B[1]);
    //      return B[0]/B[1] * Exp(-0.5*a*a);

    y->Normalize((*x)[0], B[2], B[1]);
    y->Sqr();
    y->Scale(-0.5);
    y->Exp();
    y->Scale(B[0]/B[1]);
}

void __fastcall Test(TLineSeries * series1, TLineSeries * series2)
{
    sVector y,b,yhat;
    TOptStopReason StopReason;

    TVecList *x = new TVecList();
    x->Add();

    const int xLen = 35;
    double xData[xLen] = {400.0, 405.0, 410.0, 415.0,
                         420.0, 425.0, 430.0, 435.0,
                         436.5, 438.0, 439.5, 441.0,
                         442.5, 444.0, 445.5, 447.0,
                         448.5, 450.0, 451.5, 453.0,
                         454.5, 456.0, 457.5, 459.0,
                         460.5, 462.0, 463.5, 465.0,
                         470.0, 475.0, 480.0, 485.0,
                         490.0, 495.0, 500.0};

    (*x)[0]->SetIt(false, xData, xLen-1);

    const int yLen = 35;
    double yData[yLen] = {0.0001575, 0.0001699, 0.0002350, 0.0003102,
                         0.0004917, 0.0008710, 0.0017418, 0.0046400,
                         0.0065895, 0.0097302, 0.0149002, 0.0237310,
                         0.0401683, 0.0712559, 0.1264458, 0.2073413,
                         0.2902366, 0.3445623, 0.3698049, 0.3668534,
                         0.3106727, 0.2078154, 0.1164354, 0.0616764,
                         0.0337200, 0.0194023, 0.0117831, 0.0074357,
                         0.0022732, 0.0008800, 0.0004579, 0.0002345,
                                 0.0001586, 0.0001143, 0.0000710};

    y.SetIt(false, yData, yLen-1);

    b.SetIt(false,OPENARRAY(double,(1.0, 10.0, 500.0))); // initial estimates

    NLinRegress(x,y,Eckerle4,NULL,b,optMarquardt, StopReason, NULL, yhat, false, 300, 1e-8, 1e-10);

    DrawValues((*x)[0], y, series1, false); // draw data
    DrawValues((*x)[0], yhat, series2, false); // draw fitted values
}
Copyright (c) 1999-2025 by Dew Research. All rights reserved.