Typical propability density function (
Gaussian distribution).
var
i : integer;
iY : double;
pDN : TDistribution_Normal;
pSerie : TLineSeries;
begin
Memo1.Clear;
/* prepare chart */
pSerie := TLineSeries( Chart1.Series[0] );
pSerie.Clear;
/* prepare distribution data */
pDN := TDistribution_Normal.Create;
pDN.Init( 0, 1 );
for i := 0 to pDN.pIntegral.pY.Count - 1 do
begin
{ -- get value }
iY := pDN.pIntegral.pY.GetValue( i );
pSerie.AddXY( i, iY );
end;
And here is very important
TDistribution_Normal.Init() function with parameters as
MEAN and
SIGMA, here is generated range
MEAN +-3.5 SIGMA.
The sum values under curve is equeal to 1.
function TDistribution_Normal.Init( _iMean, _iSigma : double ) : boolean;
var
i : integer;
iFrom, iTo, iValue : double;
begin
result := false;
{ -- check }
if _iSigma <= 0 then
begin
ShowMessage( 'Distribution_Normal() - standard deviation can`t be 0.' );
exit;
end;
{ -- add range -3.5 sigma - Mean - + 3.5 sigma }
pIntegral.Clear;
iFrom := _iMean - ( 3.5 * _iSigma );
iTo := _iMean + ( 3.5 * _iSigma );
{ aproximation - 300 items }
pIntegral.iStep := ( iTo - iFrom ) / 300;
pIntegral.SetInterval( iFrom, iTo );
{ -- calc values normal distribution for every X }
for i := 0 to pIntegral.pX.Count - 1 do
begin
iValue := ( 1 / ( _iSigma * sqrt( 2*pi ) ) ) *
exp( - ( sqr( pIntegral.pX.GetValue( i ) - _iMean ) ) /
( 2 * sqr( _iSigma ) ) );
pIntegral.pY.AddValue( iValue );
end;
pIntegral.Calc;
result := true;
end;
Output: