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 function Eckerle4(const B: TVec; X: double): double; begin Eckerle4 := B[0]/B[1] * Exp(-0.5*Sqr((X-B[2])/B[1])); end; procedure Example; var x,y,b,yhat: Vector; StopReason: TOptStopReason; begin x.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,y,Series1,false); // draw data DrawValues(x,yhat,Series2,false); // draw fitted values end;
#include "MtxExpr.hpp" #include "Regress.hpp" #include "MtxVecTee.hpp" //add TChart to the form double __fastcall Eckerle4(TVec * const B, double x) { double a = (x - B->Values[2])/B->Values[1]; return B->Values[0]/B->Values[1] * Exp(-0.5*a*a); } void __fastcall Test(TLineSeries* series1, TLineSeries* series2) { sVector x,y,b,yhat; TOptStopReason StopReason; 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.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,y,series1,false); // draw data DrawValues(x,yhat,series2,false); // draw fitted values }
Copyright (c) 1999-2025 by Dew Research. All rights reserved.
|