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.
|