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:
No comments:
Post a Comment