diff --git a/applications/lazstats/docs/HelpNDoc/LazStats.hnd b/applications/lazstats/docs/HelpNDoc/LazStats.hnd index c7adb2a95..8f5eb89e3 100644 Binary files a/applications/lazstats/docs/HelpNDoc/LazStats.hnd and b/applications/lazstats/docs/HelpNDoc/LazStats.hnd differ diff --git a/applications/lazstats/docs/chm/LazStats.chm b/applications/lazstats/docs/chm/LazStats.chm index 16397dfa9..be6575d71 100644 Binary files a/applications/lazstats/docs/chm/LazStats.chm and b/applications/lazstats/docs/chm/LazStats.chm differ diff --git a/applications/lazstats/source/forms/simulations/distribunit.lfm b/applications/lazstats/source/forms/simulations/distribunit.lfm index d4c24fe8b..4a6a5832d 100644 --- a/applications/lazstats/source/forms/simulations/distribunit.lfm +++ b/applications/lazstats/source/forms/simulations/distribunit.lfm @@ -1,13 +1,14 @@ object DistribFrm: TDistribFrm Left = 420 - Height = 301 + Height = 223 Top = 215 - Width = 307 + Width = 384 AutoSize = True BorderStyle = bsDialog Caption = 'Distributions' - ClientHeight = 301 - ClientWidth = 307 + ClientHeight = 223 + ClientWidth = 384 + OnActivate = FormActivate OnCreate = FormCreate OnShow = FormShow Position = poMainFormCenter @@ -32,7 +33,7 @@ object DistribFrm: TDistribFrm ClientHeight = 89 ClientWidth = 176 TabOrder = 0 - object NDChk: TCheckBox + object NDChk: TRadioButton Left = 16 Height = 19 Top = 8 @@ -41,7 +42,7 @@ object DistribFrm: TDistribFrm OnClick = NDChkClick TabOrder = 0 end - object ChiChk: TCheckBox + object ChiChk: TRadioButton Left = 16 Height = 19 Top = 35 @@ -50,7 +51,7 @@ object DistribFrm: TDistribFrm OnClick = ChiChkClick TabOrder = 1 end - object FChk: TCheckBox + object FChk: TRadioButton Left = 16 Height = 19 Top = 62 @@ -61,29 +62,28 @@ object DistribFrm: TDistribFrm end end object GroupBox2: TGroupBox - AnchorSideLeft.Control = Owner + AnchorSideLeft.Control = GroupBox1 + AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = GroupBox1 - AnchorSideTop.Side = asrBottom AnchorSideRight.Control = GroupBox1 AnchorSideRight.Side = asrBottom - Left = 12 - Height = 146 - Top = 137 - Width = 180 - Anchors = [akTop, akLeft, akRight] + Left = 204 + Height = 140 + Top = 12 + Width = 170 AutoSize = True BorderSpacing.Left = 12 - BorderSpacing.Top = 16 + BorderSpacing.Right = 12 BorderSpacing.Bottom = 12 Caption = 'Parameters' - ClientHeight = 126 - ClientWidth = 176 + ClientHeight = 120 + ClientWidth = 166 TabOrder = 1 object AlphaLabel: TLabel AnchorSideTop.Control = AlphaEdit AnchorSideTop.Side = asrCenter AnchorSideRight.Control = AlphaEdit - Left = 33 + Left = 19 Height = 15 Top = 6 Width = 84 @@ -92,57 +92,60 @@ object DistribFrm: TDistribFrm Caption = 'Type I Error Rate' ParentColor = False end - object Label2: TLabel + object DF1Label: TLabel AnchorSideTop.Control = DF1Edit AnchorSideTop.Side = asrCenter AnchorSideRight.Control = DF1Edit - Left = 26 + Left = 12 Height = 15 - Top = 37 + Top = 33 Width = 91 Anchors = [akTop, akRight] BorderSpacing.Right = 8 Caption = 'Deg. Freedom (1)' ParentColor = False end - object Label3: TLabel + object DF2Label: TLabel + AnchorSideLeft.Control = GroupBox2 AnchorSideTop.Control = DF2Edit AnchorSideTop.Side = asrCenter AnchorSideRight.Control = DF2Edit - Left = 26 + Left = 12 Height = 15 - Top = 68 + Top = 60 Width = 91 - Anchors = [akTop, akRight] + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Left = 12 BorderSpacing.Right = 8 Caption = 'Deg. Freedom (2)' ParentColor = False end - object Label4: TLabel + object MeanLabel: TLabel AnchorSideTop.Control = MeanEdit AnchorSideTop.Side = asrCenter AnchorSideRight.Control = MeanEdit - Left = 87 + Left = 73 Height = 15 - Top = 99 + Top = 93 Width = 30 Anchors = [akTop, akRight] BorderSpacing.Right = 8 Caption = 'Mean' ParentColor = False + Visible = False end object AlphaEdit: TEdit AnchorSideTop.Control = GroupBox2 AnchorSideRight.Control = GroupBox2 AnchorSideRight.Side = asrBottom - Left = 125 + Left = 111 Height = 23 Top = 2 Width = 43 Alignment = taRightJustify Anchors = [akTop, akRight] BorderSpacing.Top = 2 - BorderSpacing.Right = 8 + BorderSpacing.Right = 12 TabOrder = 0 Text = 'AlphaEdit' end @@ -151,130 +154,110 @@ object DistribFrm: TDistribFrm AnchorSideTop.Side = asrBottom AnchorSideRight.Control = AlphaEdit AnchorSideRight.Side = asrBottom - Left = 125 + Left = 111 Height = 23 - Top = 33 + Top = 29 Width = 43 Alignment = taRightJustify Anchors = [akTop, akRight] - BorderSpacing.Top = 8 + BorderSpacing.Top = 4 TabOrder = 1 - Text = 'Edit1' + Text = 'DF1Edit' end object MeanEdit: TEdit AnchorSideTop.Control = DF2Edit AnchorSideTop.Side = asrBottom AnchorSideRight.Control = AlphaEdit AnchorSideRight.Side = asrBottom - Left = 125 + Left = 111 Height = 23 - Top = 95 + Top = 89 Width = 43 Alignment = taRightJustify Anchors = [akTop, akRight] - BorderSpacing.Top = 8 + BorderSpacing.Top = 4 BorderSpacing.Bottom = 8 TabOrder = 3 - Text = 'Edit1' + Text = 'MeanEdit' + Visible = False end object DF2Edit: TEdit AnchorSideTop.Control = DF1Edit AnchorSideTop.Side = asrBottom AnchorSideRight.Control = AlphaEdit AnchorSideRight.Side = asrBottom - Left = 125 + Left = 111 Height = 23 - Top = 64 + Top = 56 Width = 43 Alignment = taRightJustify Anchors = [akTop, akRight] - BorderSpacing.Top = 8 + BorderSpacing.Top = 4 + BorderSpacing.Bottom = 10 TabOrder = 2 - Text = 'Edit1' + Text = 'DF2Edit' end end - object Panel1: TPanel - AnchorSideLeft.Control = GroupBox1 - AnchorSideLeft.Side = asrBottom - AnchorSideBottom.Control = GroupBox2 + object CloseBtn: TButton + AnchorSideTop.Control = Bevel1 + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = Owner + AnchorSideRight.Side = asrBottom AnchorSideBottom.Side = asrBottom - Left = 208 - Height = 136 - Top = 147 - Width = 76 - Anchors = [akLeft, akBottom] + Left = 321 + Height = 25 + Top = 180 + Width = 55 + Anchors = [akTop, akRight] AutoSize = True - BorderSpacing.Left = 16 - BorderSpacing.Right = 12 - BevelOuter = bvNone - ChildSizing.VerticalSpacing = 12 - ClientHeight = 136 - ClientWidth = 76 + BorderSpacing.Top = 8 + BorderSpacing.Right = 8 + Caption = 'Close' + ModalResult = 11 + TabOrder = 4 + end + object ComputeBtn: TButton + AnchorSideTop.Control = CloseBtn + AnchorSideRight.Control = CloseBtn + Left = 237 + Height = 25 + Top = 180 + Width = 76 + Anchors = [akTop, akRight] + AutoSize = True + BorderSpacing.Left = 8 + BorderSpacing.Right = 8 + Caption = 'Compute' + OnClick = ComputeBtnClick + TabOrder = 3 + end + object ResetBtn: TButton + AnchorSideTop.Control = CloseBtn + AnchorSideRight.Control = ComputeBtn + Left = 175 + Height = 25 + Top = 180 + Width = 54 + Anchors = [akTop, akRight] + AutoSize = True + BorderSpacing.Left = 8 + BorderSpacing.Right = 8 + BorderSpacing.Bottom = 8 + Caption = 'Reset' + OnClick = ResetBtnClick TabOrder = 2 - object ResetBtn: TButton - AnchorSideLeft.Control = Panel1 - AnchorSideTop.Control = Panel1 - AnchorSideRight.Control = Panel1 - AnchorSideRight.Side = asrBottom - Left = 0 - Height = 25 - Top = 0 - Width = 76 - Anchors = [akTop, akLeft, akRight] - AutoSize = True - BorderSpacing.Bottom = 8 - Caption = 'Reset' - OnClick = ResetBtnClick - TabOrder = 0 - end - object CancelBtn: TButton - AnchorSideLeft.Control = Panel1 - AnchorSideTop.Control = ResetBtn - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = Panel1 - AnchorSideRight.Side = asrBottom - Left = 0 - Height = 25 - Top = 37 - Width = 76 - Anchors = [akTop, akLeft, akRight] - AutoSize = True - Caption = 'Cancel' - ModalResult = 2 - TabOrder = 1 - end - object ComputeBtn: TButton - AnchorSideLeft.Control = Panel1 - AnchorSideTop.Control = CancelBtn - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = Panel1 - AnchorSideRight.Side = asrBottom - Left = 0 - Height = 25 - Top = 74 - Width = 76 - Anchors = [akTop, akLeft, akRight] - AutoSize = True - Caption = 'Compute' - OnClick = ComputeBtnClick - TabOrder = 2 - end - object ReturnBtn: TButton - AnchorSideLeft.Control = Panel1 - AnchorSideTop.Control = ComputeBtn - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = Panel1 - AnchorSideRight.Side = asrBottom - AnchorSideBottom.Side = asrBottom - Left = 0 - Height = 25 - Top = 111 - Width = 76 - Anchors = [akTop, akLeft, akRight] - AutoSize = True - Caption = 'Return' - ModalResult = 1 - TabOrder = 3 - end + end + object Bevel1: TBevel + AnchorSideLeft.Control = Owner + AnchorSideTop.Control = GroupBox2 + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = Owner + AnchorSideRight.Side = asrBottom + Left = 0 + Height = 8 + Top = 164 + Width = 384 + Anchors = [akTop, akLeft, akRight] + Shape = bsBottomLine end end diff --git a/applications/lazstats/source/forms/simulations/distribunit.pas b/applications/lazstats/source/forms/simulations/distribunit.pas index 9fa5c8481..33ea1c5f6 100644 --- a/applications/lazstats/source/forms/simulations/distribunit.pas +++ b/applications/lazstats/source/forms/simulations/distribunit.pas @@ -1,3 +1,8 @@ +// Testing: no file needed +// +// Test input parameters: +// - F distribution: DF1 = 3, DF2 = 20 + unit DistribUnit; {$mode objfpc}{$H+} @@ -10,7 +15,7 @@ uses BlankFrmUnit, FunctionsLib, Globals; type - TwoCol = array[1..2,1..100] of double; + TwoCol = array[1..2, 1..100] of double; type @@ -18,62 +23,48 @@ type TDistribFrm = class(TForm) AlphaEdit: TEdit; + Bevel1: TBevel; + ChiChk: TRadioButton; DF1Edit: TEdit; DF2Edit: TEdit; + FChk: TRadioButton; MeanEdit: TEdit; - Panel1: TPanel; + NDChk: TRadioButton; ResetBtn: TButton; - CancelBtn: TButton; ComputeBtn: TButton; - ReturnBtn: TButton; + CloseBtn: TButton; GroupBox2: TGroupBox; AlphaLabel: TLabel; - Label2: TLabel; - Label3: TLabel; - Label4: TLabel; - NDChk: TCheckBox; - ChiChk: TCheckBox; - FChk: TCheckBox; + DF1Label: TLabel; + DF2Label: TLabel; + MeanLabel: TLabel; GroupBox1: TGroupBox; procedure ChiChkClick(Sender: TObject); procedure ComputeBtnClick(Sender: TObject); procedure FChkClick(Sender: TObject); + procedure FormActivate(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormShow(Sender: TObject); procedure NDChkClick(Sender: TObject); procedure ResetBtnClick(Sender: TObject); private { private declarations } - procedure NDPlot(Sender : TObject); - procedure ChiPlot(Sender : TObject); - procedure FPlot(Sender : TObject); - procedure Hscale(Xmin, Xmax : double; Nsteps : integer; - acolor : TColor; FontSize : integer; - X, Y, Xlength : integer; - charLabel : string; Sender : TObject); - procedure Vscale(Ymin, Ymax : double; Nsteps : integer; - acolor : TColor; FontSize : integer; - X, Y, Ylength : integer; - charLabel : string; Sender : TObject); - procedure NormPts(zMin, zMax : double; Npts : integer; - VAR realpts : TwoCol; - Sender : TObject); - procedure PltPts(realpts : TwoCol; - Xmax, Xmin, Ymax, Ymin : double; - Npts, XaxisStart, YaxisStart, XaxisRange : integer; - YaxisRange : integer; - acolor : TColor; Sender : TObject); - procedure ChiPts(cMin, cMax : double; - Npts, df : integer; - VAR realpts : TwoCol; - Sender : TObject); - procedure FPts(FMin, FMax : double; - Npts, df1, df2 : integer; - VAR realpts : TwoCol; - Sender : TObject); - function chi2func(chisqr, df : double) : double; - function Ffunc(F : double; df1, df2 : integer) : double; + procedure NDPlot; + procedure ChiPlot; + procedure FPlot; + procedure HScale(Xmin, Xmax: double; NSteps: integer; AColor: TColor; + FontSize: integer; X, Y, XLength: integer; CharLabel: string); + procedure VScale(Ymin, Ymax: double; NSteps: integer; AColor: TColor; + FontSize: integer; X, Y, YLength: integer; CharLabel: string); + procedure NormPts(zMin, zMax: double; NPts: integer; var RealPts: TwoCol); + procedure PltPts(RealPts: TwoCol; XMax, XMin, YMax, YMin: double; + Npts, XAxisStart, YAxisStart, XAxisRange, YAxisRange: integer; AColor: TColor); + procedure ChiPts(cMin, cMax: double; NPts, DF: integer; var RealPts: TwoCol); + procedure FPts(FMin, FMax: double; NPts, DF1, DF2: integer; var RealPts: TwoCol); + function Chi2Func(chisqr, df: double): double; + function FFunc(F: double; DF1, DF2: integer): double; + function Validate(out AMsg: String; out AControl: TWinControl): Boolean; public { public declarations } end; @@ -87,14 +78,14 @@ implementation procedure TDistribFrm.ResetBtnClick(Sender: TObject); begin - NDChk.Checked := false; - ChiChk.Checked := false; - FChk.Checked := false; - AlphaEdit.Text := '0.05'; - DF1Edit.Text := ''; - DF2Edit.Text := ''; - MeanEdit.Text := ''; - GroupBox2.Enabled := false; + NDChk.Checked := false; + ChiChk.Checked := false; + FChk.Checked := false; + AlphaEdit.Text := FormatFloat('0.00', DEFAULT_ALPHA_LEVEL); + DF1Edit.Text := ''; + DF2Edit.Text := ''; + MeanEdit.Text := ''; + GroupBox2.Enabled := false; end; procedure TDistribFrm.FormShow(Sender: TObject); @@ -110,9 +101,9 @@ begin AlphaLabel.Enabled := true; AlphaEdit.Enabled := true; DF1Edit.Enabled := false; - Label2.Enabled := false; - Label3.Enabled := false; - Label4.Enabled := false; + DF1Label.Enabled := false; + DF2Label.Enabled := false; + MeanLabel.Enabled := false; DF2Edit.Enabled := false; MeanEdit.Enabled := false; end @@ -121,462 +112,471 @@ begin end; procedure TDistribFrm.ComputeBtnClick(Sender: TObject); +var + msg: String; + C: TWinControl; + ok: Boolean; begin - if NDChk.Checked then - begin - NDPlot(self); - end; - if ChiChk.Checked then - begin - ChiPlot(self); - end; - if FChk.Checked then - begin - FPlot(self); - end; + if not Validate(msg, C) then + begin + C.SetFocus; + MessageDlg(msg, mtError, [mbOK], 0); + exit; + end; + + ok := false; + if NDChk.Checked then + begin + NDPlot(); + ok := true; + end; + + if ChiChk.Checked then + begin + ChiPlot(); + ok := true; + end; + + if FChk.Checked then + begin + FPlot(); + ok := true; + end; + + if not ok then + MessageDlg('Please select a distribution.', mtError, [mbOK], 0); end; procedure TDistribFrm.FChkClick(Sender: TObject); begin - if FChk.Checked then - begin - GroupBox2.Enabled := true; - Label3.Enabled := true; - AlphaLabel.Enabled := true; - AlphaEdit.Enabled := true; - DF1Edit.Enabled := true; - DF2Edit.Enabled := true; - Label2.Enabled := true; - Label4.Enabled := false; - MeanEdit.Enabled := false; - end - else - GroupBox2.Enabled := false; + if FChk.Checked then + begin + GroupBox2.Enabled := true; + DF2Label.Enabled := true; + AlphaLabel.Enabled := true; + AlphaEdit.Enabled := true; + DF1Edit.Enabled := true; + DF2Edit.Enabled := true; + DF1Label.Enabled := true; + MeanLabel.Enabled := false; + MeanEdit.Enabled := false; + end + else + GroupBox2.Enabled := false; end; procedure TDistribFrm.ChiChkClick(Sender: TObject); begin - if ChiChk.Checked then - begin - GroupBox2.Enabled := true; - Label2.Enabled := true; - DF1Edit.Enabled := true; - Label3.Enabled := false; - Label4.Enabled := false; - AlphaLabel.Enabled := true; - AlphaEdit.Enabled := true; - DF2Edit.Enabled := false; - MeanEdit.Enabled := false; - end else - GroupBox2.Enabled := false; + if ChiChk.Checked then + begin + GroupBox2.Enabled := true; + DF1Label.Enabled := true; + DF1Edit.Enabled := true; + DF2Label.Enabled := false; + MeanLabel.Enabled := false; + AlphaLabel.Enabled := true; + AlphaEdit.Enabled := true; + DF2Edit.Enabled := false; + MeanEdit.Enabled := false; + end else + GroupBox2.Enabled := false; end; -procedure TDistribFrm.NDPlot(Sender: TObject); +procedure TDistribFrm.NDPlot; var - charLabel : string; - Clwidth, Clheight,X, Y, XaxisStart, XaxisEnd, YaxisStart, YaxisEnd : integer; - i, Xrange, Yrange, t : integer; - alpha, h, z, hprop, zprop : double; - realpts : TwoCol; - + CharLabel: string; + Clwidth, Clheight,X, Y, XAxisStart, XAxisEnd, YAxisStart, YAxisEnd: integer; + i, Xrange, Yrange, t: integer; + alpha, h, z, hprop, zprop: double; + RealPts: TwoCol; begin - for i := 1 to 100 do realpts[1,i] := 0.0; - for i := 1 to 100 do realpts[2,i] := 0.0; - charLabel := 'Normal Distribution. Alpha = '; - BlankFrm.Image1.Canvas.Clear; - BlankFrm.Image1.Canvas.Pen.Color := clBlack; - BlankFrm.Image1.Canvas.Brush.Color := clWhite; - BlankFrm.Image1.Canvas.Clear; - BlankFrm.Image1.Canvas.FloodFill(1,1,clWhite,fsborder); - BlankFrm.Image1.Canvas.Pen.Width := 2; - Clwidth := BlankFrm.Image1.Width; - Clheight := BlankFrm.Image1.Height; - XaxisStart := Clwidth div 8; - XaxisEnd := Clwidth - (Clwidth div 8); - YaxisStart := (Clheight * 7) div 10; - YaxisEnd := Clheight div 10; - Xrange := XaxisEnd - XaxisStart; - Yrange := YaxisStart - YaxisEnd; - alpha := StrToFloat(AlphaEdit.Text); - BlankFrm.Show; + for i := 1 to 100 do realpts[1,i] := 0.0; + for i := 1 to 100 do realpts[2,i] := 0.0; - // Create values of normal curve - NormPts(-4.0, 4.0, 100, realpts, self); - PltPts(realpts, 4.0, -4.0, 0.5, 0.0, 100, XaxisStart, YaxisStart, Xrange, - Yrange, clBlack, self); + BlankFrm.Image1.Canvas.Pen.Color := clBlack; + BlankFrm.Image1.Canvas.Brush.Color := clWhite; + BlankFrm.Image1.Canvas.Clear; + BlankFrm.Image1.Canvas.FloodFill(1,1,clWhite,fsborder); + BlankFrm.Image1.Canvas.Pen.Width := 2; + Clwidth := BlankFrm.Image1.Width; + Clheight := BlankFrm.Image1.Height; - // Draw line for alpha z := 1.645 - charLabel := charLabel + AlphaEdit.Text; - BlankFrm.Caption := charLabel; - z := inversez(1.0 - alpha); - zprop := (4.0 + z) / 8.0; - h := (1.0 / sqrt(2.0 * 3.1415)) * (1.0 / exp(z * z / 2.0)); - hprop := (0.5 - h) / 0.5; - X := round( zprop * Xrange)+ XaxisStart; - Y := YaxisEnd + round( hprop * Yrange); - BlankFrm.Image1.Canvas.MoveTo(X,YaxisStart); - BlankFrm.Image1.Canvas.LineTo(X,Y-10); // alpha cutoff + XAxisStart := Clwidth div 8; + XAxisEnd := Clwidth - Clwidth div 8; + YAxisStart := (Clheight * 7) div 10; + YAxisEnd := Clheight div 10; + XRange := XAxisEnd - XAxisStart; + YRange := YAxisStart - YAxisEnd; + alpha := StrToFloat(AlphaEdit.Text); - // floodfill rejection section with red - BlankFrm.Image1.Canvas.Brush.Color := clRed; - BlankFrm.Image1.Canvas.Brush.Color := clWhite; + BlankFrm.Show; - // create labeled axis - Hscale(-4.0, 4.0, 11, clWhite, 10, XaxisStart, YaxisStart, Xrange,'z SCALE',self); - Vscale(0.0, 0.5, 11, clWhite, 10, XaxisStart, YaxisStart, Yrange, 'DENSITY',self); + // Create values of normal curve + NormPts(-4.0, 4.0, 100, RealPts); + PltPts(RealPts, 4.0, -4.0, 0.5, 0.0, 100, XAxisStart, YAxisStart, XRange, YRange, clBlack); - // Print Heading - t := BlankFrm.Image1.Canvas.TextWidth(charLabel); - X := (BlankFrm.Width div 2) - (t div 2); - BlankFrm.Image1.Canvas.TextOut(X,0,charLabel); - charLabel := 'Critical Value = '; - charLabel := charLabel + format('%6.3f',[z]); - t := BlankFrm.Image1.Canvas.TextWidth(charLabel); - X := (BlankFrm.Image1.Width div 2) - (t div 2); - BlankFrm.Image1.Canvas.TextOut(X,BlankFrm.Image1.Canvas.TextHeight(charLabel),charLabel); + // Draw line for alpha z := 1.645 + CharLabel := 'Normal Distribution. Alpha: ' + AlphaEdit.Text; + BlankFrm.Caption := CharLabel; + z := inversez(1.0 - alpha); + zprop := (4.0 + z) / 8.0; + h := (1.0 / sqrt(2.0 * 3.1415)) * (1.0 / exp(z * z / 2.0)); + hprop := (0.5 - h) / 0.5; + X := round(zprop * XRange) + XAxisStart; + Y := YAxisEnd + round(hprop * YRange); + BlankFrm.Image1.Canvas.MoveTo(X, YAxisStart); + BlankFrm.Image1.Canvas.LineTo(X, Y-10); // alpha cutoff + + // floodfill rejection section with red + BlankFrm.Image1.Canvas.Brush.Color := clRed; + BlankFrm.Image1.Canvas.Brush.Color := clWhite; + + // create labeled axis + HScale(-4.0, 4.0, 11, clWhite, 10, XAxisStart, YAxisStart, XRange, 'z SCALE'); + VScale(0.0, 0.5, 11, clWhite, 10, XAxisStart, YAxisStart, YRange, 'DENSITY'); + + // Print Heading + t := BlankFrm.Image1.Canvas.TextWidth(CharLabel); + X := (BlankFrm.Width - t) div 2; + BlankFrm.Image1.Canvas.TextOut(X, 0, charLabel); + CharLabel := 'Critical Value: ' + Format('%.3f',[z]); + t := BlankFrm.Image1.Canvas.TextWidth(charLabel); + X := (BlankFrm.Image1.Width - t) div 2; + Y := BlankFrm.Image1.Canvas.TextHeight(CharLabel); + BlankFrm.Image1.Canvas.TextOut(X, Y, CharLabel); end; -procedure TDistribFrm.ChiPlot(Sender: TObject); +procedure TDistribFrm.ChiPlot; var - charLabel : string; - Clwidth, Clheight, X, Y, XaxisStart, XaxisEnd, YaxisStart, YaxisEnd : integer; - i, Xrange, Yrange, df, t : integer; - alpha, h, z, hprop, zprop, MaxChi, MaxProb : double; - realpts : TwoCol; - + charLabel: string; + ClWidth, ClHeight, X, Y, XAxisStart, XAxisEnd, YAxisStart, YAxisEnd: integer; + i, Xrange, Yrange, df, t: integer; + alpha, h, z, hprop, zprop, MaxChi, MaxProb: double; + RealPts: TwoCol; begin - BlankFrm.Image1.Canvas.Clear; - for i := 1 to 100 do realpts[1,i] := 0.0; - for i := 1 to 100 do realpts[2,i] := 0.0; - charLabel := 'Chi Squared Distribution. Alpha = '; - MaxProb := 0.0; - BlankFrm.Image1.Canvas.Pen.Color := clBlack; - BlankFrm.Image1.Canvas.Brush.Color := clWhite; - BlankFrm.Image1.Canvas.Clear; - BlankFrm.Image1.Canvas.FloodFill(1,1,clWhite,fsborder); - BlankFrm.Image1.Canvas.Pen.Width := 2; - Clwidth := BlankFrm.Image1.Width; - Clheight := BlankFrm.Image1.Height; - XaxisStart := Clwidth div 8; - XaxisEnd := Clwidth - (Clwidth div 8); - YaxisStart := (Clheight * 7) div 10; - YaxisEnd := Clheight div 10; - Xrange := XaxisEnd - XaxisStart; - Yrange := YaxisStart - YaxisEnd; - alpha := StrToFloat(AlphaEdit.Text); - charLabel := charLabel + AlphaEdit.Text; - df := StrToInt(DF1Edit.Text); - if (df < 1) or (df > 100) then exit; - charLabel := charLabel + ' D.F. = '; - charLabel := charLabel + DF1Edit.Text; - BlankFrm.Caption := charLabel; - BlankFrm.Show; + for i := 1 to 100 do realpts[1,i] := 0.0; + for i := 1 to 100 do realpts[2,i] := 0.0; - // Create values of chi-squared curve - MaxChi := 125.0; - ChiPts(0.0, MaxChi, 100, df, realpts, self); - for i := 1 to 100 do - begin - if (realpts[2,i] > MaxProb) then MaxProb := realpts[2,i]; - end; - PltPts(realpts, MaxChi, 0.0, MaxProb, 0.0, 100, XaxisStart, YaxisStart, Xrange, - Yrange, clBlack, self); + MaxProb := 0.0; + BlankFrm.Image1.Canvas.Pen.Color := clBlack; + BlankFrm.Image1.Canvas.Brush.Color := clWhite; + BlankFrm.Image1.Canvas.Clear; + BlankFrm.Image1.Canvas.FloodFill(1, 1, clWhite, fsBorder); + BlankFrm.Image1.Canvas.Pen.Width := 2; + ClWidth := BlankFrm.Image1.Width; + ClHeight := BlankFrm.Image1.Height; - // Draw line for alpha - z := inversechi(1.0-alpha,df); - zprop := z / MaxChi; - h := chi2func(z,df); - hprop := (MaxProb - h) / MaxProb; - X := round( zprop * Xrange)+ XaxisStart; - Y := YaxisEnd + round( hprop * Yrange); - BlankFrm.Image1.Canvas.MoveTo(X,YaxisStart); - BlankFrm.Image1.Canvas.LineTo(X,Y); // alpha cutoff + XAxisStart := ClWidth div 8; + XAxisEnd := ClWidth - ClWidth div 8; + YAxisStart := (ClHeight * 7) div 10; + YAxisEnd := ClHeight div 10; + XRange := XAxisEnd - XAxisStart; + YRange := YAxisStart - YAxisEnd; + alpha := StrToFloat(AlphaEdit.Text); + charLabel := 'Chi Squared Distribution. Alpha: ' + AlphaEdit.Text; + df := StrToInt(DF1Edit.Text); + if (df < 1) or (df > 100) then + exit; - // floodfill main section with blue - BlankFrm.Image1.Canvas.Brush.Color := clBlue; - BlankFrm.Image1.Canvas.Brush.Color := clWhite; + charLabel := charLabel + ' D.F.: ' + DF1Edit.Text; + BlankFrm.Caption := charLabel; + BlankFrm.Show; - // create charLabeled axis - Hscale(0.0, MaxChi, 11, clWhite, 10, XaxisStart, YaxisStart, - Xrange,'CHI SQUARED SCALE',self); - Vscale(0.0, MaxProb, 11, clWhite, 10, XaxisStart, YaxisStart, - Yrange, 'DENSITY',self); + // Create values of chi-squared curve + MaxChi := 125.0; + ChiPts(0.0, MaxChi, 100, df, realpts); + for i := 1 to 100 do + if (RealPts[2,i] > MaxProb) then + MaxProb := RealPts[2,i]; + PltPts(RealPts, MaxChi, 0.0, MaxProb, 0.0, 100, XAxisStart, YAxisStart, XRange, YRange, clBlack); - // Print Heading - t := BlankFrm.Image1.Canvas.TextWidth(charLabel); - X := (BlankFrm.Width div 2) - (t div 2); - BlankFrm.Image1.Canvas.TextOut(X,0,charLabel); - charLabel := 'Critical Value = '; - charLabel := charLabel + format('%6.3f',[z]); - t := BlankFrm.Image1.Canvas.TextWidth(charLabel); - X := (BlankFrm.Image1.Width div 2) - (t div 2); - BlankFrm.Image1.Canvas.TextOut(X,BlankFrm.Image1.Canvas.TextHeight(charLabel),charLabel); + // Draw line for alpha + z := InverseChi(1.0-alpha, df); + zprop := z / MaxChi; + h := Chi2Func(z, df); + hprop := (MaxProb - h) / MaxProb; + X := round(zprop * Xrange) + XaxisStart; + Y := YaxisEnd + round(hprop * Yrange); + BlankFrm.Image1.Canvas.MoveTo(X, YaxisStart); + BlankFrm.Image1.Canvas.LineTo(X, Y); // alpha cutoff + + // floodfill main section with blue + BlankFrm.Image1.Canvas.Brush.Color := clBlue; + BlankFrm.Image1.Canvas.Brush.Color := clWhite; + + // create charLabeled axis + HScale(0.0, MaxChi, 11, clWhite, 10, XAxisStart, YAxisStart, XRange, 'CHI SQUARED SCALE'); + VScale(0.0, MaxProb, 11, clWhite, 10, XAxisStart, YAxisStart, YRange, 'DENSITY'); + + // Print Heading + t := BlankFrm.Image1.Canvas.TextWidth(CharLabel); + X := (BlankFrm.Width - t) div 2; + BlankFrm.Image1.Canvas.TextOut(X,0,CharLabel); + + CharLabel := 'Critical Value: ' + Format('%6.3f',[z]); + t := BlankFrm.Image1.Canvas.TextWidth(CharLabel); + X := (BlankFrm.Image1.Width - t) div 2; + Y := BlankFrm.Image1.Canvas.TextHeight(CharLabel); + BlankFrm.Image1.Canvas.TextOut(X, Y, CharLabel); end; -procedure TDistribFrm.FPlot(Sender: TObject); +procedure TDistribFrm.FPlot; var - charLabel : string; - Clwidth, Clheight, X, Y, XaxisStart, XaxisEnd, YaxisStart, YaxisEnd : integer; - i, Xrange, Yrange, t, df1, df2 : integer; - realpts : TwoCol; - alpha, h, F, hprop, Fprop, MaxProb, MaxF : double; - done : boolean; + CharLabel: string; + ClWidth, ClHeight, X, Y, XAxisStart, XAxisEnd, YAxisStart, YAxisEnd: integer; + i, Xrange, Yrange, t, df1, df2: integer; + RealPts: TwoCol; + alpha, h, F, hprop, Fprop, MaxProb, MaxF: double; + done: boolean; begin - BlankFrm.Image1.Canvas.Clear; - for i := 1 to 100 do realpts[1,i] := 0.0; - for i := 1 to 100 do realpts[2,i] := 0.0; - MaxProb := 0.0; - charLabel := 'F Distribution. Alpha = '; - BlankFrm.Image1.Canvas.Pen.Color := clBlack; - BlankFrm.Image1.Canvas.Brush.Color := clWhite; - BlankFrm.Image1.Canvas.Clear; - BlankFrm.Image1.Canvas.FloodFill(1,1,clWhite,fsborder); - BlankFrm.Image1.Canvas.Pen.Width := 2; - Clwidth := BlankFrm.Image1.Width; - Clheight := BlankFrm.Image1.Height; - XaxisStart := Clwidth div 8; - XaxisEnd := Clwidth - (Clwidth div 8); - YaxisStart := (Clheight * 7) div 10; - YaxisEnd := Clheight div 10; - Xrange := XaxisEnd - XaxisStart; - Yrange := YaxisStart - YaxisEnd; - alpha := StrToFloat(AlphaEdit.Text); - charLabel := charLabel + AlphaEdit.Text; - df1 := StrToInt(DF1Edit.Text); - charLabel := charLabel + ' D.F.1 = '; - charLabel := charLabel + DF1Edit.Text; - df2 := StrToInt(DF2Edit.Text); - charLabel := charLabel + ' , D.F.2 = '; - charLabel := charLabel + DF2Edit.Text; - BlankFrm.Caption := charLabel; - BlankFrm.Show; + for i := 1 to 100 do + begin + realpts[1,i] := 0.0; + realpts[2,i] := 0.0; + end; - // Create values of F curve - MaxF := 20.0; - done := false; - while not done do - begin - h := Ffunc(MaxF, df1, df2); - if (h < 0.001) then MaxF := MaxF - 1.0 - else done := true; - end; + MaxProb := 0.0; + BlankFrm.Image1.Canvas.Pen.Color := clBlack; + BlankFrm.Image1.Canvas.Brush.Color := clWhite; + BlankFrm.Image1.Canvas.Clear; + BlankFrm.Image1.Canvas.FloodFill(1,1,clWhite,fsborder); + BlankFrm.Image1.Canvas.Pen.Width := 2; + ClWidth := BlankFrm.Image1.Width; + ClHeight := BlankFrm.Image1.Height; + XAxisStart := ClWidth div 8; + XAxisEnd := ClWidth - ClWidth div 8; + YAxisStart := (ClHeight * 7) div 10; + YAxisEnd := ClHeight div 10; + XRange := XAxisEnd - XAxisStart; + YRange := YAxisStart - YAxisEnd; - FPts(0.0, MaxF, 100, df1, df2, realpts, self); - for i := 1 to 100 do - begin - if (realpts[2,i] > MaxProb) then MaxProb := realpts[2,i]; - end; - PltPts(realpts, MaxF, 0.0, MaxProb, 0.0, 100, XaxisStart, YaxisStart, Xrange, - Yrange, clBlack, self); + alpha := StrToFloat(AlphaEdit.Text); + charLabel := 'F Distribution. Alpha: ' + AlphaEdit.Text; + df1 := StrToInt(DF1Edit.Text); + CharLabel := CharLabel + ', D.F.1: '; + CharLabel := CharLabel + DF1Edit.Text; + df2 := StrToInt(DF2Edit.Text); + CharLabel := CharLabel + ', D.F.2: '; + CharLabel := CharLabel + DF2Edit.Text; + BlankFrm.Caption := CharLabel; + BlankFrm.Show; - // Draw line for alpha - F := fpercentpoint(1.0-alpha,df1,df2); - Fprop := F / MaxF; - h := Ffunc(F,df1,df2); - hprop := (MaxProb - h) / MaxProb; - X := round( Fprop * Xrange)+ XaxisStart; - Y := YaxisEnd + round( hprop * Yrange); - BlankFrm.Image1.Canvas.MoveTo(X,YaxisStart); - BlankFrm.Image1.Canvas.LineTo(X,Y); // alpha cutoff + // Create values of F curve + MaxF := 20.0; + done := false; + while not done do + begin + h := Ffunc(MaxF, df1, df2); + if h < 0.001 then + MaxF := MaxF - 1.0 + else + done := true; + end; - // floodfill main section with blue - BlankFrm.Canvas.Brush.Color := clBlue; + FPts(0.0, MaxF, 100, df1, df2, RealPts); + for i := 1 to 100 do + if (RealPts[2,i] > MaxProb) then + MaxProb := RealPts[2,i]; + PltPts(RealPts, MaxF, 0.0, MaxProb, 0.0, 100, XAxisStart, YAxisStart, XRange, YRange, clBlack); - // create charLabeled axis - Hscale(0.0, MaxF, 11, clWhite, 10, XaxisStart, YaxisStart, - Xrange,'F SCALE',self); - Vscale(0.0, MaxProb, 11, clWhite, 10, XaxisStart, YaxisStart, - Yrange, 'DENSITY',self); + // Draw line for alpha + F := FPercentPoint(1.0-alpha, df1, df2); + Fprop := F / MaxF; + h := Ffunc(F, df1, df2); + hprop := (MaxProb - h) / MaxProb; + X := round(Fprop * XRange) + XAxisStart; + Y := YAxisEnd + round(hprop * YRange); + BlankFrm.Image1.Canvas.MoveTo(X, YAxisStart); + BlankFrm.Image1.Canvas.LineTo(X, Y); // alpha cutoff - // Print Heading - t := BlankFrm.Image1.Canvas.TextWidth(charLabel); - X := (BlankFrm.Image1.Width div 2) - (t div 2); - BlankFrm.Image1.Canvas.TextOut(X,0,charLabel); - charLabel := 'Critical Value = '; - charLabel := charLabel + format('%6.3f',[F]); - t := BlankFrm.Image1.Canvas.TextWidth(charLabel); - X := (BlankFrm.Image1.Width div 2) - (t div 2); - BlankFrm.Image1.Canvas.TextOut(X,BlankFrm.Image1.Canvas.TextHeight(charLabel),charLabel); + // floodfill main section with blue + BlankFrm.Canvas.Brush.Color := clBlue; + + // create charLabeled axis + HScale(0.0, MaxF, 11, clWhite, 10, XAxisStart, YAxisStart, XRange, 'F SCALE'); + VScale(0.0, MaxProb, 11, clWhite, 10, XAxisStart, YAxisStart, YRange, 'DENSITY'); + + // Print Heading + t := BlankFrm.Image1.Canvas.TextWidth(CharLabel); + X := (BlankFrm.Image1.Width - t) div 2; + BlankFrm.Image1.Canvas.TextOut(X, 0, CharLabel); + charLabel := 'Critical Value: ' + Format('%.3f', [F]); + t := BlankFrm.Image1.Canvas.TextWidth(charLabel); + X := (BlankFrm.Image1.Width - t) div 2; + Y := BlankFrm.Image1.Canvas.TextHeight(CharLabel); + BlankFrm.Image1.Canvas.TextOut(X, Y, CharLabel); end; -procedure TDistribFrm.Hscale(Xmin, Xmax: double; Nsteps: integer; - acolor: TColor; FontSize: integer; X, Y, Xlength: integer; charLabel: string; - Sender: TObject); +procedure TDistribFrm.HScale(XMin, XMax: double; Nsteps: integer; + AColor: TColor; FontSize: integer; X, Y, XLength: integer; CharLabel: string); var - i, TickEnd, Xpos, Ypos, TextX : integer; - Xincr, Xval : double; - Svalue, Ast : string; + i, TickEnd, Xpos, Ypos, TextX: integer; + Xincr, Xval: double; begin - BlankFrm.Image1.Canvas.MoveTo(X,Y); - BlankFrm.Image1.Canvas.LineTo(X+Xlength,Y); - BlankFrm.Image1.Canvas.Font.Size := FontSize; - BlankFrm.Image1.Canvas.Brush.Color := acolor; - TickEnd := Y + 10; - Xincr := (Xmax - Xmin) / Nsteps; - for i := 0 to Nsteps do - begin - Xpos := round(((Xlength / Nsteps) * i) + X); - BlankFrm.Image1.Canvas.MoveTo(Xpos,Y); - BlankFrm.Image1.Canvas.LineTo(Xpos,TickEnd); - TextX := Xpos - 8; - Xval := Xmin + ( i * Xincr); - Svalue := format('%4.2f',[Xval]); - Ast := Svalue; - BlankFrm.Image1.Canvas.TextOut(TextX, Y+15, Ast); - end; - // print charLabel below X axis - Ypos := Y + 30; - Xpos := round((BlankFrm.Width / 2) - (BlankFrm.Image1.Canvas.TextWidth(charLabel) / 2)); - BlankFrm.Image1.Canvas.TextOut(Xpos,Ypos,charLabel); + BlankFrm.Image1.Canvas.MoveTo(X,Y); + BlankFrm.Image1.Canvas.LineTo(X+Xlength,Y); + BlankFrm.Image1.Canvas.Font.Size := FontSize; + BlankFrm.Image1.Canvas.Brush.Color := AColor; + TickEnd := Y + 10; + Xincr := (Xmax - Xmin) / Nsteps; + for i := 0 to Nsteps do + begin + XPos := round(Xlength/Nsteps*i + X); + BlankFrm.Image1.Canvas.MoveTo(XPos, Y); + BlankFrm.Image1.Canvas.LineTo(XPos, TickEnd); + TextX := XPos - 8; + Xval := Xmin + i*Xincr; + BlankFrm.Image1.Canvas.TextOut(TextX, Y+15, Format('%.2f', [Xval])); + end; + + // print charLabel below X axis + YPos := Y + 30; + XPos := round((BlankFrm.Width / 2) - (BlankFrm.Image1.Canvas.TextWidth(CharLabel) / 2)); + BlankFrm.Image1.Canvas.TextOut(Xpos, Ypos, CharLabel); end; -procedure TDistribFrm.Vscale(Ymin, Ymax: double; Nsteps: integer; - acolor: TColor; FontSize: integer; X, Y, Ylength: integer; charLabel: string; - Sender: TObject); +procedure TDistribFrm.VScale(YMin, YMax: double; NSteps: integer; + AColor: TColor; FontSize: integer; X, Y, YLength: integer; CharLabel: string); var - TickEnd, Ypos, Xpos, TextY : integer; - Yincr, Yval : double; - Svalue, symbol, Ast : string; - chpixs, i : integer; + TickEnd, Ypos, Xpos, TextY: integer; + Yincr, Yval: double; + chpixs, i: integer; begin - BlankFrm.Image1.Canvas.MoveTo(X,Y); - BlankFrm.Image1.Canvas.LineTo(X,Y-Ylength); - BlankFrm.Image1.Canvas.Font.Size := FontSize; - BlankFrm.Image1.Canvas.Brush.Color := acolor; - TickEnd := X - 10; - Yincr := (Ymax - Ymin) / Nsteps; - TextY := 0; - for i := 0 to Nsteps do - begin - Ypos := round(Y - ((Ylength / Nsteps) * i)); - BlankFrm.Image1.Canvas.MoveTo(X,Ypos); - BlankFrm.Image1.Canvas.LineTo(TickEnd,Ypos); - TextY := TickEnd - 30; - Yval := Ymin + ( i * Yincr); - Svalue := format('%4.2f',[Yval]); - Ast := Svalue; - BlankFrm.Image1.Canvas.TextOut(TextY, Ypos-8, Ast); - end; - // print charLabel vertically - Xpos := TextY - 15; - for i := 1 to Length(charLabel) do - begin - chpixs := BlankFrm.Image1.Canvas.TextHeight(charLabel); - Ypos := round(Y - (Ylength / 2) - ( (Length(charLabel) * chpixs) / 2 ) + (chpixs * i)); - symbol := charLabel[i]; -// symbol[2] := 0; - BlankFrm.Image1.Canvas.TextOut(Xpos,Ypos,symbol); - end; + BlankFrm.Image1.Canvas.MoveTo(X,Y); + BlankFrm.Image1.Canvas.LineTo(X,Y-Ylength); + BlankFrm.Image1.Canvas.Font.Size := FontSize; + BlankFrm.Image1.Canvas.Brush.Color := AColor; + + TickEnd := X - 10; + Yincr := (YMax - YMin) / Nsteps; + TextY := 0; + for i := 0 to NSteps do + begin + YPos := round(Y - Ylength / NSteps * i); + BlankFrm.Image1.Canvas.MoveTo(X, YPos); + BlankFrm.Image1.Canvas.LineTo(TickEnd, YPos); + TextY := TickEnd - 30; + Yval := Ymin + i * Yincr; + BlankFrm.Image1.Canvas.TextOut(TextY, Ypos-8, Format('%.2f', [Yval])); + end; + + // print charLabel vertically + chpixs := BlankFrm.Image1.Canvas.TextHeight(CharLabel); + XPos := TextY - 15; + for i := 1 to Length(CharLabel) do + begin + YPos := round(Y - YLength / 2 - Length(charLabel) * chpixs / 2 + chpixs*i); + BlankFrm.Image1.Canvas.TextOut(XPos, YPos, CharLabel[i]); + end; end; -procedure TDistribFrm.NormPts(zMin, zMax: double; Npts: integer; - var realpts: TwoCol; Sender: TObject); +procedure TDistribFrm.NormPts(zMin, zMax: double; NPts: integer; + var RealPts: TwoCol); var - zIncr, z, h : double; - i : integer; + zIncr, z, h: double; + i: integer; begin - zIncr := (zMax - zMin) / Npts; - for i := 1 to Npts do - begin - z := zMin + (zIncr * i); - h := (1.0 / sqrt(2.0 * 3.14159265358979)) * - ( 1.0 / exp(z * z / 2.0)); - realpts[1,i] := z; - realpts[2,i] := h; - end; + zIncr := (zMax - zMin) / Npts; + for i := 1 to Npts do + begin + z := zMin + (zIncr * i); + h := (1.0 / sqrt(2.0 * PI)) * (1.0 / exp(z * z / 2.0)); + RealPts[1, i] := z; + RealPts[2, i] := h; + end; end; -procedure TDistribFrm.PltPts(realpts: TwoCol; Xmax, Xmin, Ymax, Ymin: double; - Npts, XaxisStart, YaxisStart, XaxisRange: integer; YaxisRange: integer; - acolor: TColor; Sender: TObject); +procedure TDistribFrm.PltPts(RealPts: TwoCol; Xmax, Xmin, Ymax, Ymin: double; + NPts, XAxisStart, YAxisStart, XAxisRange, YAxisRange: integer; AColor: TColor); var - hprop, zprop, z, h : double; - i, X, Y : integer; - intpts : array[1..100] of TPoint; + hprop, zprop, z, h: double; + i, X, Y: integer; + intpts: array[1..100] of TPoint; begin - for i := 1 to Npts do - begin - z := realpts[1,i]; - h := realpts[2,i]; - zprop := (z - Xmin) / (Xmax - Xmin); - X := round((zprop * XaxisRange) + XaxisStart); - hprop := (h - Ymin) / (Ymax - Ymin); - Y := round(YaxisStart - (hprop * YaxisRange)); - intpts[i] := Point(X,Y); - end; - BlankFrm.Image1.Canvas.Pen.Color := acolor; - BlankFrm.Image1.Canvas.Polyline(Slice(intpts,Npts - 1)); + for i := 1 to NPts do + begin + z := RealPts[1,i]; + h := RealPts[2,i]; + zprop := (z - XMin) / (XMax - XMin); + X := round(zprop * XAxisRange + XAxisStart); + hprop := (h - Ymin) / (Ymax - Ymin); + Y := round(YAxisStart - hprop * YAxisRange); + intpts[i] := Point(X, Y); + end; + BlankFrm.Image1.Canvas.Pen.Color := AColor; + BlankFrm.Image1.Canvas.Polyline(Slice(intpts, Npts - 1)); end; -procedure TDistribFrm.ChiPts(cMin, cMax: double; Npts, df: integer; - var realpts: TwoCol; Sender: TObject); +procedure TDistribFrm.ChiPts(cMin, cMax: double; NPts, DF: integer; + var RealPts: TwoCol); var - ratio1, ratio2, ratio3, cIncr, chi, h : double; - i : integer; + ratio1, ratio2, ratio3, cIncr, chi, h: double; + i: integer; begin - ratio1 := df / 2.0; - ratio2 := (df - 2.0) / 2.0; - cIncr := (cMax - cMin) / Npts; - for i := 1 to Npts do - begin - chi := cMin + (cIncr * i); + ratio1 := DF / 2.0; + ratio2 := (DF - 2.0) / 2.0; + cIncr := (cMax - cMin) / NPts; + for i := 1 to NPts do + begin + chi := cMin + cIncr*i; // h := inversechi(chi, df); - ratio3 := chi / 2.0; - h := (1.0 / (power(2.0,ratio1) * exp(lngamma(ratio1)))) * power(chi,ratio2) * ( 1.0 / exp(ratio3)); - realpts[1,i] := chi; - realpts[2,i] := h; - end; + ratio3 := chi / 2.0; + h := (1.0 / (power(2.0, ratio1) * exp(lngamma(ratio1)))) * power(chi, ratio2) * (1.0 / exp(ratio3)); + RealPts[1,i] := chi; + RealPts[2,i] := h; + end; end; -procedure TDistribFrm.FPts(FMin, FMax: double; Npts, df1, df2: integer; - var realpts: TwoCol; Sender: TObject); +procedure TDistribFrm.FPts(FMin, FMax: double; NPts, DF1, DF2: integer; + var RealPts: TwoCol); var - FIncr, F, h : double; - i : integer; + FIncr, F, h: double; + i: integer; begin - FIncr := (FMax - FMin) / Npts; - for i := 1 to Npts do - begin - F := FMin + (FIncr * i); - h := Ffunc(F, df1, df2); - realpts[1,i] := F; - realpts[2,i] := h; - end; + FIncr := (FMax - FMin) / NPts; + for i := 1 to NPts do + begin + F := FMin + FIncr * i; + h := Ffunc(F, DF1, DF2); + RealPts[1,i] := F; + RealPts[2,i] := h; + end; end; -function TDistribFrm.chi2func(chisqr, df: double): double; +function TDistribFrm.Chi2Func(ChiSqr, DF: double): double; var - ratio1, ratio2, ratio3, h : double; + ratio1, ratio2, ratio3: double; begin - // Returns the height of the density curve for the chi-squared statistic - ratio1 := df / 2.0; - ratio2 := (df - 2.0) / 2.0; - ratio3 := chisqr / 2.0; - h := (1.0 / (power(2.0,ratio1) * exp(lngamma(ratio1)))) * power(chisqr,ratio2) * ( 1.0 / exp(ratio3)); - Result := h; + // Returns the height of the density curve for the chi-squared statistic + ratio1 := df / 2.0; + ratio2 := (df - 2.0) / 2.0; + ratio3 := chisqr / 2.0; + Result := (1.0 / (power(2.0,ratio1) * exp(lngamma(ratio1)))) * power(chisqr,ratio2) * (1.0 / exp(ratio3)); end; -function TDistribFrm.Ffunc(F: double; df1, df2: integer): double; +function TDistribFrm.FFunc(F: double; DF1, DF2: integer): double; var - ratio1, ratio2, ratio3, ratio4, h : double; - part1, part2, part3, part4, part5, part6, part7, part8, part9 : double; + ratio1, ratio2, ratio3, ratio4: double; + part1, part2, part3, part4, part5, part6, part7, part8, part9: double; begin - // Returns the height of the density curve for the F statistic - ratio1 := (df1 + df2) / 2.0; - ratio2 := (df1 - 2.0) / 2.0; - ratio3 := df1 / 2.0; - ratio4 := df2 / 2.0; - part1 := exp(lngamma(ratio1)); - part2 := power(df1,ratio3); - part3 := power(df2,ratio4); - part4 := exp(lngamma(ratio3)); - part5 := exp(lngamma(ratio4)); - part6 := power(F,ratio2); - part7 := power((F*df1+df2),ratio1); - part8 := (part1 * part2 * part3) / (part4 * part5); - if (part7 = 0.0) then part9 := 0.0 - else part9 := part6 / part7; - h := part8 * part9; + // Returns the height of the density curve for the F statistic + ratio1 := (df1 + df2) / 2.0; + ratio2 := (df1 - 2.0) / 2.0; + ratio3 := df1 / 2.0; + ratio4 := df2 / 2.0; + part1 := exp(lngamma(ratio1)); + part2 := power(df1, ratio3); + part3 := power(df2, ratio4); + part4 := exp(lngamma(ratio3)); + part5 := exp(lngamma(ratio4)); + part6 := power(F,ratio2); + part7 := power((F*df1 + df2), ratio1); + part8 := (part1 * part2 * part3) / (part4 * part5); + if (part7 = 0.0) then + part9 := 0.0 + else + part9 := part6 / part7; + Result := part8 * part9; { ratio1 := (df1 + df2) / 2.0; ratio2 := (df1 - 2.0) / 2.0; @@ -587,7 +587,16 @@ begin (gamma(ratio3) * gamma(ratio4))) * (realraise(f,ratio2) / realraise((f*df1+df2),ratio1)); } - Result := h; +end; + +procedure TDistribFrm.FormActivate(Sender: TObject); +var + w: Integer; +begin + w := MaxValue([ResetBtn.Width, ComputeBtn.Width, CloseBtn.Width]); + ResetBtn.Constraints.MinWidth := w; + ComputeBtn.Constraints.MinWidth := w; + CloseBtn.Constraints.MinWidth := w; end; procedure TDistribFrm.FormCreate(Sender: TObject); @@ -596,6 +605,75 @@ begin Application.CreateForm(TBlankFrm, BlankFrm); end; +function TDistribFrm.Validate(out AMsg: String; out AControl: TWinControl): boolean; +var + x: Double; + n: Integer; +begin + Result := false; + if AlphaEdit.Text = '' then + begin + AMsg := 'Input required.'; + AControl := AlphaEdit; + exit; + end; + if not TryStrToFloat(AlphaEdit.Text, x) or (x <= 0) or (x >= 1.0) then + begin + AMsg := 'Numerical value between 0 and 1 required.'; + AControl := AlphaEdit; + exit; + end; + + if ChiChk.Checked or FChk.Checked then + begin + if DF1Edit.Text = '' then + begin + AMsg := 'Input required.'; + AControl := DF1Edit; + exit; + end; + if not TryStrToInt(DF1Edit.Text, n) or (n <= 0) then + begin + AMsg := 'Positive numerical value required.'; + AControl := DF1Edit; + exit; + end; + end; + + if FChk.Checked then + begin + if DF2Edit.Text = '' then + begin + AMsg := 'Input required.'; + AControl := DF2Edit; + exit; + end; + if not TryStrToInt(DF2Edit.Text, n) or (n <= 0) then + begin + AMsg := 'Positive numerical value required.'; + AControl := DF2Edit; + exit; + end; + end; + + (* + if MeanEdit.Text = '' then + begin + AMsg := 'Input required.'; + AControl := MeanEdit; + exit; + end; + if not TryStrToFloat(MeanEdit.Text, x) then + begin + AMsg := 'Numerical value required.'; + AControl := MeanEdit; + exit; + end; + *) + + Result := true; +end; + initialization {$I distribunit.lrs}