LazStats: Refactor DistribUnit. Add pdf help to chm.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@7408 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2020-04-26 22:36:07 +00:00
parent 516ebcad09
commit cf4ce2f94a
4 changed files with 620 additions and 559 deletions

View File

@ -1,13 +1,14 @@
object DistribFrm: TDistribFrm object DistribFrm: TDistribFrm
Left = 420 Left = 420
Height = 301 Height = 223
Top = 215 Top = 215
Width = 307 Width = 384
AutoSize = True AutoSize = True
BorderStyle = bsDialog BorderStyle = bsDialog
Caption = 'Distributions' Caption = 'Distributions'
ClientHeight = 301 ClientHeight = 223
ClientWidth = 307 ClientWidth = 384
OnActivate = FormActivate
OnCreate = FormCreate OnCreate = FormCreate
OnShow = FormShow OnShow = FormShow
Position = poMainFormCenter Position = poMainFormCenter
@ -32,7 +33,7 @@ object DistribFrm: TDistribFrm
ClientHeight = 89 ClientHeight = 89
ClientWidth = 176 ClientWidth = 176
TabOrder = 0 TabOrder = 0
object NDChk: TCheckBox object NDChk: TRadioButton
Left = 16 Left = 16
Height = 19 Height = 19
Top = 8 Top = 8
@ -41,7 +42,7 @@ object DistribFrm: TDistribFrm
OnClick = NDChkClick OnClick = NDChkClick
TabOrder = 0 TabOrder = 0
end end
object ChiChk: TCheckBox object ChiChk: TRadioButton
Left = 16 Left = 16
Height = 19 Height = 19
Top = 35 Top = 35
@ -50,7 +51,7 @@ object DistribFrm: TDistribFrm
OnClick = ChiChkClick OnClick = ChiChkClick
TabOrder = 1 TabOrder = 1
end end
object FChk: TCheckBox object FChk: TRadioButton
Left = 16 Left = 16
Height = 19 Height = 19
Top = 62 Top = 62
@ -61,29 +62,28 @@ object DistribFrm: TDistribFrm
end end
end end
object GroupBox2: TGroupBox object GroupBox2: TGroupBox
AnchorSideLeft.Control = Owner AnchorSideLeft.Control = GroupBox1
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = GroupBox1 AnchorSideTop.Control = GroupBox1
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = GroupBox1 AnchorSideRight.Control = GroupBox1
AnchorSideRight.Side = asrBottom AnchorSideRight.Side = asrBottom
Left = 12 Left = 204
Height = 146 Height = 140
Top = 137 Top = 12
Width = 180 Width = 170
Anchors = [akTop, akLeft, akRight]
AutoSize = True AutoSize = True
BorderSpacing.Left = 12 BorderSpacing.Left = 12
BorderSpacing.Top = 16 BorderSpacing.Right = 12
BorderSpacing.Bottom = 12 BorderSpacing.Bottom = 12
Caption = 'Parameters' Caption = 'Parameters'
ClientHeight = 126 ClientHeight = 120
ClientWidth = 176 ClientWidth = 166
TabOrder = 1 TabOrder = 1
object AlphaLabel: TLabel object AlphaLabel: TLabel
AnchorSideTop.Control = AlphaEdit AnchorSideTop.Control = AlphaEdit
AnchorSideTop.Side = asrCenter AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = AlphaEdit AnchorSideRight.Control = AlphaEdit
Left = 33 Left = 19
Height = 15 Height = 15
Top = 6 Top = 6
Width = 84 Width = 84
@ -92,57 +92,60 @@ object DistribFrm: TDistribFrm
Caption = 'Type I Error Rate' Caption = 'Type I Error Rate'
ParentColor = False ParentColor = False
end end
object Label2: TLabel object DF1Label: TLabel
AnchorSideTop.Control = DF1Edit AnchorSideTop.Control = DF1Edit
AnchorSideTop.Side = asrCenter AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = DF1Edit AnchorSideRight.Control = DF1Edit
Left = 26 Left = 12
Height = 15 Height = 15
Top = 37 Top = 33
Width = 91 Width = 91
Anchors = [akTop, akRight] Anchors = [akTop, akRight]
BorderSpacing.Right = 8 BorderSpacing.Right = 8
Caption = 'Deg. Freedom (1)' Caption = 'Deg. Freedom (1)'
ParentColor = False ParentColor = False
end end
object Label3: TLabel object DF2Label: TLabel
AnchorSideLeft.Control = GroupBox2
AnchorSideTop.Control = DF2Edit AnchorSideTop.Control = DF2Edit
AnchorSideTop.Side = asrCenter AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = DF2Edit AnchorSideRight.Control = DF2Edit
Left = 26 Left = 12
Height = 15 Height = 15
Top = 68 Top = 60
Width = 91 Width = 91
Anchors = [akTop, akRight] Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 12
BorderSpacing.Right = 8 BorderSpacing.Right = 8
Caption = 'Deg. Freedom (2)' Caption = 'Deg. Freedom (2)'
ParentColor = False ParentColor = False
end end
object Label4: TLabel object MeanLabel: TLabel
AnchorSideTop.Control = MeanEdit AnchorSideTop.Control = MeanEdit
AnchorSideTop.Side = asrCenter AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = MeanEdit AnchorSideRight.Control = MeanEdit
Left = 87 Left = 73
Height = 15 Height = 15
Top = 99 Top = 93
Width = 30 Width = 30
Anchors = [akTop, akRight] Anchors = [akTop, akRight]
BorderSpacing.Right = 8 BorderSpacing.Right = 8
Caption = 'Mean' Caption = 'Mean'
ParentColor = False ParentColor = False
Visible = False
end end
object AlphaEdit: TEdit object AlphaEdit: TEdit
AnchorSideTop.Control = GroupBox2 AnchorSideTop.Control = GroupBox2
AnchorSideRight.Control = GroupBox2 AnchorSideRight.Control = GroupBox2
AnchorSideRight.Side = asrBottom AnchorSideRight.Side = asrBottom
Left = 125 Left = 111
Height = 23 Height = 23
Top = 2 Top = 2
Width = 43 Width = 43
Alignment = taRightJustify Alignment = taRightJustify
Anchors = [akTop, akRight] Anchors = [akTop, akRight]
BorderSpacing.Top = 2 BorderSpacing.Top = 2
BorderSpacing.Right = 8 BorderSpacing.Right = 12
TabOrder = 0 TabOrder = 0
Text = 'AlphaEdit' Text = 'AlphaEdit'
end end
@ -151,130 +154,110 @@ object DistribFrm: TDistribFrm
AnchorSideTop.Side = asrBottom AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = AlphaEdit AnchorSideRight.Control = AlphaEdit
AnchorSideRight.Side = asrBottom AnchorSideRight.Side = asrBottom
Left = 125 Left = 111
Height = 23 Height = 23
Top = 33 Top = 29
Width = 43 Width = 43
Alignment = taRightJustify Alignment = taRightJustify
Anchors = [akTop, akRight] Anchors = [akTop, akRight]
BorderSpacing.Top = 8 BorderSpacing.Top = 4
TabOrder = 1 TabOrder = 1
Text = 'Edit1' Text = 'DF1Edit'
end end
object MeanEdit: TEdit object MeanEdit: TEdit
AnchorSideTop.Control = DF2Edit AnchorSideTop.Control = DF2Edit
AnchorSideTop.Side = asrBottom AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = AlphaEdit AnchorSideRight.Control = AlphaEdit
AnchorSideRight.Side = asrBottom AnchorSideRight.Side = asrBottom
Left = 125 Left = 111
Height = 23 Height = 23
Top = 95 Top = 89
Width = 43 Width = 43
Alignment = taRightJustify Alignment = taRightJustify
Anchors = [akTop, akRight] Anchors = [akTop, akRight]
BorderSpacing.Top = 8 BorderSpacing.Top = 4
BorderSpacing.Bottom = 8 BorderSpacing.Bottom = 8
TabOrder = 3 TabOrder = 3
Text = 'Edit1' Text = 'MeanEdit'
Visible = False
end end
object DF2Edit: TEdit object DF2Edit: TEdit
AnchorSideTop.Control = DF1Edit AnchorSideTop.Control = DF1Edit
AnchorSideTop.Side = asrBottom AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = AlphaEdit AnchorSideRight.Control = AlphaEdit
AnchorSideRight.Side = asrBottom AnchorSideRight.Side = asrBottom
Left = 125 Left = 111
Height = 23 Height = 23
Top = 64 Top = 56
Width = 43 Width = 43
Alignment = taRightJustify Alignment = taRightJustify
Anchors = [akTop, akRight] Anchors = [akTop, akRight]
BorderSpacing.Top = 8 BorderSpacing.Top = 4
BorderSpacing.Bottom = 10
TabOrder = 2 TabOrder = 2
Text = 'Edit1' Text = 'DF2Edit'
end end
end end
object Panel1: TPanel object CloseBtn: TButton
AnchorSideLeft.Control = GroupBox1 AnchorSideTop.Control = Bevel1
AnchorSideLeft.Side = asrBottom AnchorSideTop.Side = asrBottom
AnchorSideBottom.Control = GroupBox2 AnchorSideRight.Control = Owner
AnchorSideBottom.Side = asrBottom
Left = 208
Height = 136
Top = 147
Width = 76
Anchors = [akLeft, akBottom]
AutoSize = True
BorderSpacing.Left = 16
BorderSpacing.Right = 12
BevelOuter = bvNone
ChildSizing.VerticalSpacing = 12
ClientHeight = 136
ClientWidth = 76
TabOrder = 2
object ResetBtn: TButton
AnchorSideLeft.Control = Panel1
AnchorSideTop.Control = Panel1
AnchorSideRight.Control = Panel1
AnchorSideRight.Side = asrBottom AnchorSideRight.Side = asrBottom
Left = 0 AnchorSideBottom.Side = asrBottom
Left = 321
Height = 25 Height = 25
Top = 0 Top = 180
Width = 76 Width = 55
Anchors = [akTop, akLeft, akRight] Anchors = [akTop, akRight]
AutoSize = True AutoSize = True
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 BorderSpacing.Bottom = 8
Caption = 'Reset' Caption = 'Reset'
OnClick = ResetBtnClick 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 TabOrder = 2
end end
object ReturnBtn: TButton object Bevel1: TBevel
AnchorSideLeft.Control = Panel1 AnchorSideLeft.Control = Owner
AnchorSideTop.Control = ComputeBtn AnchorSideTop.Control = GroupBox2
AnchorSideTop.Side = asrBottom AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Panel1 AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom AnchorSideRight.Side = asrBottom
AnchorSideBottom.Side = asrBottom
Left = 0 Left = 0
Height = 25 Height = 8
Top = 111 Top = 164
Width = 76 Width = 384
Anchors = [akTop, akLeft, akRight] Anchors = [akTop, akLeft, akRight]
AutoSize = True Shape = bsBottomLine
Caption = 'Return'
ModalResult = 1
TabOrder = 3
end
end end
end end

View File

@ -1,3 +1,8 @@
// Testing: no file needed
//
// Test input parameters:
// - F distribution: DF1 = 3, DF2 = 20
unit DistribUnit; unit DistribUnit;
{$mode objfpc}{$H+} {$mode objfpc}{$H+}
@ -10,7 +15,7 @@ uses
BlankFrmUnit, FunctionsLib, Globals; BlankFrmUnit, FunctionsLib, Globals;
type type
TwoCol = array[1..2,1..100] of double; TwoCol = array[1..2, 1..100] of double;
type type
@ -18,62 +23,48 @@ type
TDistribFrm = class(TForm) TDistribFrm = class(TForm)
AlphaEdit: TEdit; AlphaEdit: TEdit;
Bevel1: TBevel;
ChiChk: TRadioButton;
DF1Edit: TEdit; DF1Edit: TEdit;
DF2Edit: TEdit; DF2Edit: TEdit;
FChk: TRadioButton;
MeanEdit: TEdit; MeanEdit: TEdit;
Panel1: TPanel; NDChk: TRadioButton;
ResetBtn: TButton; ResetBtn: TButton;
CancelBtn: TButton;
ComputeBtn: TButton; ComputeBtn: TButton;
ReturnBtn: TButton; CloseBtn: TButton;
GroupBox2: TGroupBox; GroupBox2: TGroupBox;
AlphaLabel: TLabel; AlphaLabel: TLabel;
Label2: TLabel; DF1Label: TLabel;
Label3: TLabel; DF2Label: TLabel;
Label4: TLabel; MeanLabel: TLabel;
NDChk: TCheckBox;
ChiChk: TCheckBox;
FChk: TCheckBox;
GroupBox1: TGroupBox; GroupBox1: TGroupBox;
procedure ChiChkClick(Sender: TObject); procedure ChiChkClick(Sender: TObject);
procedure ComputeBtnClick(Sender: TObject); procedure ComputeBtnClick(Sender: TObject);
procedure FChkClick(Sender: TObject); procedure FChkClick(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure FormCreate(Sender: TObject); procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject); procedure FormShow(Sender: TObject);
procedure NDChkClick(Sender: TObject); procedure NDChkClick(Sender: TObject);
procedure ResetBtnClick(Sender: TObject); procedure ResetBtnClick(Sender: TObject);
private private
{ private declarations } { private declarations }
procedure NDPlot(Sender : TObject); procedure NDPlot;
procedure ChiPlot(Sender : TObject); procedure ChiPlot;
procedure FPlot(Sender : TObject); procedure FPlot;
procedure Hscale(Xmin, Xmax : double; Nsteps : integer; procedure HScale(Xmin, Xmax: double; NSteps: integer; AColor: TColor;
acolor : TColor; FontSize : integer; FontSize: integer; X, Y, XLength: integer; CharLabel: string);
X, Y, Xlength : integer; procedure VScale(Ymin, Ymax: double; NSteps: integer; AColor: TColor;
charLabel : string; Sender : TObject); FontSize: integer; X, Y, YLength: integer; CharLabel: string);
procedure Vscale(Ymin, Ymax : double; Nsteps : integer; procedure NormPts(zMin, zMax: double; NPts: integer; var RealPts: TwoCol);
acolor : TColor; FontSize : integer; procedure PltPts(RealPts: TwoCol; XMax, XMin, YMax, YMin: double;
X, Y, Ylength : integer; Npts, XAxisStart, YAxisStart, XAxisRange, YAxisRange: integer; AColor: TColor);
charLabel : string; Sender : TObject); procedure ChiPts(cMin, cMax: double; NPts, DF: integer; var RealPts: TwoCol);
procedure NormPts(zMin, zMax : double; Npts : integer; procedure FPts(FMin, FMax: double; NPts, DF1, DF2: integer; var RealPts: TwoCol);
VAR realpts : TwoCol; function Chi2Func(chisqr, df: double): double;
Sender : TObject); function FFunc(F: double; DF1, DF2: integer): double;
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;
function Validate(out AMsg: String; out AControl: TWinControl): Boolean;
public public
{ public declarations } { public declarations }
end; end;
@ -90,7 +81,7 @@ begin
NDChk.Checked := false; NDChk.Checked := false;
ChiChk.Checked := false; ChiChk.Checked := false;
FChk.Checked := false; FChk.Checked := false;
AlphaEdit.Text := '0.05'; AlphaEdit.Text := FormatFloat('0.00', DEFAULT_ALPHA_LEVEL);
DF1Edit.Text := ''; DF1Edit.Text := '';
DF2Edit.Text := ''; DF2Edit.Text := '';
MeanEdit.Text := ''; MeanEdit.Text := '';
@ -110,9 +101,9 @@ begin
AlphaLabel.Enabled := true; AlphaLabel.Enabled := true;
AlphaEdit.Enabled := true; AlphaEdit.Enabled := true;
DF1Edit.Enabled := false; DF1Edit.Enabled := false;
Label2.Enabled := false; DF1Label.Enabled := false;
Label3.Enabled := false; DF2Label.Enabled := false;
Label4.Enabled := false; MeanLabel.Enabled := false;
DF2Edit.Enabled := false; DF2Edit.Enabled := false;
MeanEdit.Enabled := false; MeanEdit.Enabled := false;
end end
@ -121,19 +112,39 @@ begin
end; end;
procedure TDistribFrm.ComputeBtnClick(Sender: TObject); procedure TDistribFrm.ComputeBtnClick(Sender: TObject);
var
msg: String;
C: TWinControl;
ok: Boolean;
begin begin
if not Validate(msg, C) then
begin
C.SetFocus;
MessageDlg(msg, mtError, [mbOK], 0);
exit;
end;
ok := false;
if NDChk.Checked then if NDChk.Checked then
begin begin
NDPlot(self); NDPlot();
ok := true;
end; end;
if ChiChk.Checked then if ChiChk.Checked then
begin begin
ChiPlot(self); ChiPlot();
ok := true;
end; end;
if FChk.Checked then if FChk.Checked then
begin begin
FPlot(self); FPlot();
ok := true;
end; end;
if not ok then
MessageDlg('Please select a distribution.', mtError, [mbOK], 0);
end; end;
procedure TDistribFrm.FChkClick(Sender: TObject); procedure TDistribFrm.FChkClick(Sender: TObject);
@ -141,13 +152,13 @@ begin
if FChk.Checked then if FChk.Checked then
begin begin
GroupBox2.Enabled := true; GroupBox2.Enabled := true;
Label3.Enabled := true; DF2Label.Enabled := true;
AlphaLabel.Enabled := true; AlphaLabel.Enabled := true;
AlphaEdit.Enabled := true; AlphaEdit.Enabled := true;
DF1Edit.Enabled := true; DF1Edit.Enabled := true;
DF2Edit.Enabled := true; DF2Edit.Enabled := true;
Label2.Enabled := true; DF1Label.Enabled := true;
Label4.Enabled := false; MeanLabel.Enabled := false;
MeanEdit.Enabled := false; MeanEdit.Enabled := false;
end end
else else
@ -159,10 +170,10 @@ begin
if ChiChk.Checked then if ChiChk.Checked then
begin begin
GroupBox2.Enabled := true; GroupBox2.Enabled := true;
Label2.Enabled := true; DF1Label.Enabled := true;
DF1Edit.Enabled := true; DF1Edit.Enabled := true;
Label3.Enabled := false; DF2Label.Enabled := false;
Label4.Enabled := false; MeanLabel.Enabled := false;
AlphaLabel.Enabled := true; AlphaLabel.Enabled := true;
AlphaEdit.Enabled := true; AlphaEdit.Enabled := true;
DF2Edit.Enabled := false; DF2Edit.Enabled := false;
@ -171,19 +182,17 @@ begin
GroupBox2.Enabled := false; GroupBox2.Enabled := false;
end; end;
procedure TDistribFrm.NDPlot(Sender: TObject); procedure TDistribFrm.NDPlot;
var var
charLabel : string; CharLabel: string;
Clwidth, Clheight,X, Y, XaxisStart, XaxisEnd, YaxisStart, YaxisEnd : integer; Clwidth, Clheight,X, Y, XAxisStart, XAxisEnd, YAxisStart, YAxisEnd: integer;
i, Xrange, Yrange, t : integer; i, Xrange, Yrange, t: integer;
alpha, h, z, hprop, zprop : double; alpha, h, z, hprop, zprop: double;
realpts : TwoCol; RealPts: TwoCol;
begin begin
for i := 1 to 100 do realpts[1,i] := 0.0; for i := 1 to 100 do realpts[1,i] := 0.0;
for i := 1 to 100 do realpts[2,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.Pen.Color := clBlack;
BlankFrm.Image1.Canvas.Brush.Color := clWhite; BlankFrm.Image1.Canvas.Brush.Color := clWhite;
BlankFrm.Image1.Canvas.Clear; BlankFrm.Image1.Canvas.Clear;
@ -191,164 +200,165 @@ begin
BlankFrm.Image1.Canvas.Pen.Width := 2; BlankFrm.Image1.Canvas.Pen.Width := 2;
Clwidth := BlankFrm.Image1.Width; Clwidth := BlankFrm.Image1.Width;
Clheight := BlankFrm.Image1.Height; Clheight := BlankFrm.Image1.Height;
XaxisStart := Clwidth div 8;
XaxisEnd := Clwidth - (Clwidth div 8); XAxisStart := Clwidth div 8;
YaxisStart := (Clheight * 7) div 10; XAxisEnd := Clwidth - Clwidth div 8;
YaxisEnd := Clheight div 10; YAxisStart := (Clheight * 7) div 10;
Xrange := XaxisEnd - XaxisStart; YAxisEnd := Clheight div 10;
Yrange := YaxisStart - YaxisEnd; XRange := XAxisEnd - XAxisStart;
YRange := YAxisStart - YAxisEnd;
alpha := StrToFloat(AlphaEdit.Text); alpha := StrToFloat(AlphaEdit.Text);
BlankFrm.Show; BlankFrm.Show;
// Create values of normal curve // Create values of normal curve
NormPts(-4.0, 4.0, 100, realpts, self); NormPts(-4.0, 4.0, 100, RealPts);
PltPts(realpts, 4.0, -4.0, 0.5, 0.0, 100, XaxisStart, YaxisStart, Xrange, PltPts(RealPts, 4.0, -4.0, 0.5, 0.0, 100, XAxisStart, YAxisStart, XRange, YRange, clBlack);
Yrange, clBlack, self);
// Draw line for alpha z := 1.645 // Draw line for alpha z := 1.645
charLabel := charLabel + AlphaEdit.Text; CharLabel := 'Normal Distribution. Alpha: ' + AlphaEdit.Text;
BlankFrm.Caption := charLabel; BlankFrm.Caption := CharLabel;
z := inversez(1.0 - alpha); z := inversez(1.0 - alpha);
zprop := (4.0 + z) / 8.0; zprop := (4.0 + z) / 8.0;
h := (1.0 / sqrt(2.0 * 3.1415)) * (1.0 / exp(z * z / 2.0)); h := (1.0 / sqrt(2.0 * 3.1415)) * (1.0 / exp(z * z / 2.0));
hprop := (0.5 - h) / 0.5; hprop := (0.5 - h) / 0.5;
X := round( zprop * Xrange)+ XaxisStart; X := round(zprop * XRange) + XAxisStart;
Y := YaxisEnd + round( hprop * Yrange); Y := YAxisEnd + round(hprop * YRange);
BlankFrm.Image1.Canvas.MoveTo(X,YaxisStart); BlankFrm.Image1.Canvas.MoveTo(X, YAxisStart);
BlankFrm.Image1.Canvas.LineTo(X,Y-10); // alpha cutoff BlankFrm.Image1.Canvas.LineTo(X, Y-10); // alpha cutoff
// floodfill rejection section with red // floodfill rejection section with red
BlankFrm.Image1.Canvas.Brush.Color := clRed; BlankFrm.Image1.Canvas.Brush.Color := clRed;
BlankFrm.Image1.Canvas.Brush.Color := clWhite; BlankFrm.Image1.Canvas.Brush.Color := clWhite;
// create labeled axis // create labeled axis
Hscale(-4.0, 4.0, 11, clWhite, 10, XaxisStart, YaxisStart, Xrange,'z SCALE',self); 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',self); VScale(0.0, 0.5, 11, clWhite, 10, XAxisStart, YAxisStart, YRange, 'DENSITY');
// Print Heading // 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); t := BlankFrm.Image1.Canvas.TextWidth(charLabel);
X := (BlankFrm.Width div 2) - (t div 2); X := (BlankFrm.Image1.Width - t) div 2;
BlankFrm.Image1.Canvas.TextOut(X,0,charLabel); Y := BlankFrm.Image1.Canvas.TextHeight(CharLabel);
charLabel := 'Critical Value = '; BlankFrm.Image1.Canvas.TextOut(X, Y, CharLabel);
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);
end; end;
procedure TDistribFrm.ChiPlot(Sender: TObject); procedure TDistribFrm.ChiPlot;
var var
charLabel : string; charLabel: string;
Clwidth, Clheight, X, Y, XaxisStart, XaxisEnd, YaxisStart, YaxisEnd : integer; ClWidth, ClHeight, X, Y, XAxisStart, XAxisEnd, YAxisStart, YAxisEnd: integer;
i, Xrange, Yrange, df, t : integer; i, Xrange, Yrange, df, t: integer;
alpha, h, z, hprop, zprop, MaxChi, MaxProb : double; alpha, h, z, hprop, zprop, MaxChi, MaxProb: double;
realpts : TwoCol; RealPts: TwoCol;
begin begin
BlankFrm.Image1.Canvas.Clear;
for i := 1 to 100 do realpts[1,i] := 0.0; for i := 1 to 100 do realpts[1,i] := 0.0;
for i := 1 to 100 do realpts[2,i] := 0.0; for i := 1 to 100 do realpts[2,i] := 0.0;
charLabel := 'Chi Squared Distribution. Alpha = ';
MaxProb := 0.0; MaxProb := 0.0;
BlankFrm.Image1.Canvas.Pen.Color := clBlack; BlankFrm.Image1.Canvas.Pen.Color := clBlack;
BlankFrm.Image1.Canvas.Brush.Color := clWhite; BlankFrm.Image1.Canvas.Brush.Color := clWhite;
BlankFrm.Image1.Canvas.Clear; BlankFrm.Image1.Canvas.Clear;
BlankFrm.Image1.Canvas.FloodFill(1,1,clWhite,fsborder); BlankFrm.Image1.Canvas.FloodFill(1, 1, clWhite, fsBorder);
BlankFrm.Image1.Canvas.Pen.Width := 2; BlankFrm.Image1.Canvas.Pen.Width := 2;
Clwidth := BlankFrm.Image1.Width; ClWidth := BlankFrm.Image1.Width;
Clheight := BlankFrm.Image1.Height; ClHeight := BlankFrm.Image1.Height;
XaxisStart := Clwidth div 8;
XaxisEnd := Clwidth - (Clwidth div 8); XAxisStart := ClWidth div 8;
YaxisStart := (Clheight * 7) div 10; XAxisEnd := ClWidth - ClWidth div 8;
YaxisEnd := Clheight div 10; YAxisStart := (ClHeight * 7) div 10;
Xrange := XaxisEnd - XaxisStart; YAxisEnd := ClHeight div 10;
Yrange := YaxisStart - YaxisEnd; XRange := XAxisEnd - XAxisStart;
YRange := YAxisStart - YAxisEnd;
alpha := StrToFloat(AlphaEdit.Text); alpha := StrToFloat(AlphaEdit.Text);
charLabel := charLabel + AlphaEdit.Text; charLabel := 'Chi Squared Distribution. Alpha: ' + AlphaEdit.Text;
df := StrToInt(DF1Edit.Text); df := StrToInt(DF1Edit.Text);
if (df < 1) or (df > 100) then exit; if (df < 1) or (df > 100) then
charLabel := charLabel + ' D.F. = '; exit;
charLabel := charLabel + DF1Edit.Text;
charLabel := charLabel + ' D.F.: ' + DF1Edit.Text;
BlankFrm.Caption := charLabel; BlankFrm.Caption := charLabel;
BlankFrm.Show; BlankFrm.Show;
// Create values of chi-squared curve // Create values of chi-squared curve
MaxChi := 125.0; MaxChi := 125.0;
ChiPts(0.0, MaxChi, 100, df, realpts, self); ChiPts(0.0, MaxChi, 100, df, realpts);
for i := 1 to 100 do for i := 1 to 100 do
begin if (RealPts[2,i] > MaxProb) then
if (realpts[2,i] > MaxProb) then MaxProb := realpts[2,i]; MaxProb := RealPts[2,i];
end; PltPts(RealPts, MaxChi, 0.0, MaxProb, 0.0, 100, XAxisStart, YAxisStart, XRange, YRange, clBlack);
PltPts(realpts, MaxChi, 0.0, MaxProb, 0.0, 100, XaxisStart, YaxisStart, Xrange,
Yrange, clBlack, self);
// Draw line for alpha // Draw line for alpha
z := inversechi(1.0-alpha,df); z := InverseChi(1.0-alpha, df);
zprop := z / MaxChi; zprop := z / MaxChi;
h := chi2func(z,df); h := Chi2Func(z, df);
hprop := (MaxProb - h) / MaxProb; hprop := (MaxProb - h) / MaxProb;
X := round( zprop * Xrange)+ XaxisStart; X := round(zprop * Xrange) + XaxisStart;
Y := YaxisEnd + round( hprop * Yrange); Y := YaxisEnd + round(hprop * Yrange);
BlankFrm.Image1.Canvas.MoveTo(X,YaxisStart); BlankFrm.Image1.Canvas.MoveTo(X, YaxisStart);
BlankFrm.Image1.Canvas.LineTo(X,Y); // alpha cutoff BlankFrm.Image1.Canvas.LineTo(X, Y); // alpha cutoff
// floodfill main section with blue // floodfill main section with blue
BlankFrm.Image1.Canvas.Brush.Color := clBlue; BlankFrm.Image1.Canvas.Brush.Color := clBlue;
BlankFrm.Image1.Canvas.Brush.Color := clWhite; BlankFrm.Image1.Canvas.Brush.Color := clWhite;
// create charLabeled axis // create charLabeled axis
Hscale(0.0, MaxChi, 11, clWhite, 10, XaxisStart, YaxisStart, HScale(0.0, MaxChi, 11, clWhite, 10, XAxisStart, YAxisStart, XRange, 'CHI SQUARED SCALE');
Xrange,'CHI SQUARED SCALE',self); VScale(0.0, MaxProb, 11, clWhite, 10, XAxisStart, YAxisStart, YRange, 'DENSITY');
Vscale(0.0, MaxProb, 11, clWhite, 10, XaxisStart, YaxisStart,
Yrange, 'DENSITY',self);
// Print Heading // Print Heading
t := BlankFrm.Image1.Canvas.TextWidth(charLabel); t := BlankFrm.Image1.Canvas.TextWidth(CharLabel);
X := (BlankFrm.Width div 2) - (t div 2); X := (BlankFrm.Width - t) div 2;
BlankFrm.Image1.Canvas.TextOut(X,0,charLabel); BlankFrm.Image1.Canvas.TextOut(X,0,CharLabel);
charLabel := 'Critical Value = ';
charLabel := charLabel + format('%6.3f',[z]); CharLabel := 'Critical Value: ' + Format('%6.3f',[z]);
t := BlankFrm.Image1.Canvas.TextWidth(charLabel); t := BlankFrm.Image1.Canvas.TextWidth(CharLabel);
X := (BlankFrm.Image1.Width div 2) - (t div 2); X := (BlankFrm.Image1.Width - t) div 2;
BlankFrm.Image1.Canvas.TextOut(X,BlankFrm.Image1.Canvas.TextHeight(charLabel),charLabel); Y := BlankFrm.Image1.Canvas.TextHeight(CharLabel);
BlankFrm.Image1.Canvas.TextOut(X, Y, CharLabel);
end; end;
procedure TDistribFrm.FPlot(Sender: TObject); procedure TDistribFrm.FPlot;
var var
charLabel : string; CharLabel: string;
Clwidth, Clheight, X, Y, XaxisStart, XaxisEnd, YaxisStart, YaxisEnd : integer; ClWidth, ClHeight, X, Y, XAxisStart, XAxisEnd, YAxisStart, YAxisEnd: integer;
i, Xrange, Yrange, t, df1, df2 : integer; i, Xrange, Yrange, t, df1, df2: integer;
realpts : TwoCol; RealPts: TwoCol;
alpha, h, F, hprop, Fprop, MaxProb, MaxF : double; alpha, h, F, hprop, Fprop, MaxProb, MaxF: double;
done : boolean; done: boolean;
begin begin
BlankFrm.Image1.Canvas.Clear; for i := 1 to 100 do
for i := 1 to 100 do realpts[1,i] := 0.0; begin
for i := 1 to 100 do realpts[2,i] := 0.0; realpts[1,i] := 0.0;
realpts[2,i] := 0.0;
end;
MaxProb := 0.0; MaxProb := 0.0;
charLabel := 'F Distribution. Alpha = ';
BlankFrm.Image1.Canvas.Pen.Color := clBlack; BlankFrm.Image1.Canvas.Pen.Color := clBlack;
BlankFrm.Image1.Canvas.Brush.Color := clWhite; BlankFrm.Image1.Canvas.Brush.Color := clWhite;
BlankFrm.Image1.Canvas.Clear; BlankFrm.Image1.Canvas.Clear;
BlankFrm.Image1.Canvas.FloodFill(1,1,clWhite,fsborder); BlankFrm.Image1.Canvas.FloodFill(1,1,clWhite,fsborder);
BlankFrm.Image1.Canvas.Pen.Width := 2; BlankFrm.Image1.Canvas.Pen.Width := 2;
Clwidth := BlankFrm.Image1.Width; ClWidth := BlankFrm.Image1.Width;
Clheight := BlankFrm.Image1.Height; ClHeight := BlankFrm.Image1.Height;
XaxisStart := Clwidth div 8; XAxisStart := ClWidth div 8;
XaxisEnd := Clwidth - (Clwidth div 8); XAxisEnd := ClWidth - ClWidth div 8;
YaxisStart := (Clheight * 7) div 10; YAxisStart := (ClHeight * 7) div 10;
YaxisEnd := Clheight div 10; YAxisEnd := ClHeight div 10;
Xrange := XaxisEnd - XaxisStart; XRange := XAxisEnd - XAxisStart;
Yrange := YaxisStart - YaxisEnd; YRange := YAxisStart - YAxisEnd;
alpha := StrToFloat(AlphaEdit.Text); alpha := StrToFloat(AlphaEdit.Text);
charLabel := charLabel + AlphaEdit.Text; charLabel := 'F Distribution. Alpha: ' + AlphaEdit.Text;
df1 := StrToInt(DF1Edit.Text); df1 := StrToInt(DF1Edit.Text);
charLabel := charLabel + ' D.F.1 = '; CharLabel := CharLabel + ', D.F.1: ';
charLabel := charLabel + DF1Edit.Text; CharLabel := CharLabel + DF1Edit.Text;
df2 := StrToInt(DF2Edit.Text); df2 := StrToInt(DF2Edit.Text);
charLabel := charLabel + ' , D.F.2 = '; CharLabel := CharLabel + ', D.F.2: ';
charLabel := charLabel + DF2Edit.Text; CharLabel := CharLabel + DF2Edit.Text;
BlankFrm.Caption := charLabel; BlankFrm.Caption := CharLabel;
BlankFrm.Show; BlankFrm.Show;
// Create values of F curve // Create values of F curve
@ -357,209 +367,197 @@ begin
while not done do while not done do
begin begin
h := Ffunc(MaxF, df1, df2); h := Ffunc(MaxF, df1, df2);
if (h < 0.001) then MaxF := MaxF - 1.0 if h < 0.001 then
else done := true; MaxF := MaxF - 1.0
else
done := true;
end; end;
FPts(0.0, MaxF, 100, df1, df2, realpts, self); FPts(0.0, MaxF, 100, df1, df2, RealPts);
for i := 1 to 100 do for i := 1 to 100 do
begin if (RealPts[2,i] > MaxProb) then
if (realpts[2,i] > MaxProb) then MaxProb := realpts[2,i]; MaxProb := RealPts[2,i];
end; PltPts(RealPts, MaxF, 0.0, MaxProb, 0.0, 100, XAxisStart, YAxisStart, XRange, YRange, clBlack);
PltPts(realpts, MaxF, 0.0, MaxProb, 0.0, 100, XaxisStart, YaxisStart, Xrange,
Yrange, clBlack, self);
// Draw line for alpha // Draw line for alpha
F := fpercentpoint(1.0-alpha,df1,df2); F := FPercentPoint(1.0-alpha, df1, df2);
Fprop := F / MaxF; Fprop := F / MaxF;
h := Ffunc(F,df1,df2); h := Ffunc(F, df1, df2);
hprop := (MaxProb - h) / MaxProb; hprop := (MaxProb - h) / MaxProb;
X := round( Fprop * Xrange)+ XaxisStart; X := round(Fprop * XRange) + XAxisStart;
Y := YaxisEnd + round( hprop * Yrange); Y := YAxisEnd + round(hprop * YRange);
BlankFrm.Image1.Canvas.MoveTo(X,YaxisStart); BlankFrm.Image1.Canvas.MoveTo(X, YAxisStart);
BlankFrm.Image1.Canvas.LineTo(X,Y); // alpha cutoff BlankFrm.Image1.Canvas.LineTo(X, Y); // alpha cutoff
// floodfill main section with blue // floodfill main section with blue
BlankFrm.Canvas.Brush.Color := clBlue; BlankFrm.Canvas.Brush.Color := clBlue;
// create charLabeled axis // create charLabeled axis
Hscale(0.0, MaxF, 11, clWhite, 10, XaxisStart, YaxisStart, HScale(0.0, MaxF, 11, clWhite, 10, XAxisStart, YAxisStart, XRange, 'F SCALE');
Xrange,'F SCALE',self); VScale(0.0, MaxProb, 11, clWhite, 10, XAxisStart, YAxisStart, YRange, 'DENSITY');
Vscale(0.0, MaxProb, 11, clWhite, 10, XaxisStart, YaxisStart,
Yrange, 'DENSITY',self);
// Print Heading // 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); t := BlankFrm.Image1.Canvas.TextWidth(charLabel);
X := (BlankFrm.Image1.Width div 2) - (t div 2); X := (BlankFrm.Image1.Width - t) div 2;
BlankFrm.Image1.Canvas.TextOut(X,0,charLabel); Y := BlankFrm.Image1.Canvas.TextHeight(CharLabel);
charLabel := 'Critical Value = '; BlankFrm.Image1.Canvas.TextOut(X, Y, CharLabel);
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);
end; end;
procedure TDistribFrm.Hscale(Xmin, Xmax: double; Nsteps: integer; procedure TDistribFrm.HScale(XMin, XMax: double; Nsteps: integer;
acolor: TColor; FontSize: integer; X, Y, Xlength: integer; charLabel: string; AColor: TColor; FontSize: integer; X, Y, XLength: integer; CharLabel: string);
Sender: TObject);
var var
i, TickEnd, Xpos, Ypos, TextX : integer; i, TickEnd, Xpos, Ypos, TextX: integer;
Xincr, Xval : double; Xincr, Xval: double;
Svalue, Ast : string;
begin begin
BlankFrm.Image1.Canvas.MoveTo(X,Y); BlankFrm.Image1.Canvas.MoveTo(X,Y);
BlankFrm.Image1.Canvas.LineTo(X+Xlength,Y); BlankFrm.Image1.Canvas.LineTo(X+Xlength,Y);
BlankFrm.Image1.Canvas.Font.Size := FontSize; BlankFrm.Image1.Canvas.Font.Size := FontSize;
BlankFrm.Image1.Canvas.Brush.Color := acolor; BlankFrm.Image1.Canvas.Brush.Color := AColor;
TickEnd := Y + 10; TickEnd := Y + 10;
Xincr := (Xmax - Xmin) / Nsteps; Xincr := (Xmax - Xmin) / Nsteps;
for i := 0 to Nsteps do for i := 0 to Nsteps do
begin begin
Xpos := round(((Xlength / Nsteps) * i) + X); XPos := round(Xlength/Nsteps*i + X);
BlankFrm.Image1.Canvas.MoveTo(Xpos,Y); BlankFrm.Image1.Canvas.MoveTo(XPos, Y);
BlankFrm.Image1.Canvas.LineTo(Xpos,TickEnd); BlankFrm.Image1.Canvas.LineTo(XPos, TickEnd);
TextX := Xpos - 8; TextX := XPos - 8;
Xval := Xmin + ( i * Xincr); Xval := Xmin + i*Xincr;
Svalue := format('%4.2f',[Xval]); BlankFrm.Image1.Canvas.TextOut(TextX, Y+15, Format('%.2f', [Xval]));
Ast := Svalue;
BlankFrm.Image1.Canvas.TextOut(TextX, Y+15, Ast);
end; end;
// print charLabel below X axis // print charLabel below X axis
Ypos := Y + 30; YPos := Y + 30;
Xpos := round((BlankFrm.Width / 2) - (BlankFrm.Image1.Canvas.TextWidth(charLabel) / 2)); XPos := round((BlankFrm.Width / 2) - (BlankFrm.Image1.Canvas.TextWidth(CharLabel) / 2));
BlankFrm.Image1.Canvas.TextOut(Xpos,Ypos,charLabel); BlankFrm.Image1.Canvas.TextOut(Xpos, Ypos, CharLabel);
end; end;
procedure TDistribFrm.Vscale(Ymin, Ymax: double; Nsteps: integer; procedure TDistribFrm.VScale(YMin, YMax: double; NSteps: integer;
acolor: TColor; FontSize: integer; X, Y, Ylength: integer; charLabel: string; AColor: TColor; FontSize: integer; X, Y, YLength: integer; CharLabel: string);
Sender: TObject);
var var
TickEnd, Ypos, Xpos, TextY : integer; TickEnd, Ypos, Xpos, TextY: integer;
Yincr, Yval : double; Yincr, Yval: double;
Svalue, symbol, Ast : string; chpixs, i: integer;
chpixs, i : integer;
begin begin
BlankFrm.Image1.Canvas.MoveTo(X,Y); BlankFrm.Image1.Canvas.MoveTo(X,Y);
BlankFrm.Image1.Canvas.LineTo(X,Y-Ylength); BlankFrm.Image1.Canvas.LineTo(X,Y-Ylength);
BlankFrm.Image1.Canvas.Font.Size := FontSize; BlankFrm.Image1.Canvas.Font.Size := FontSize;
BlankFrm.Image1.Canvas.Brush.Color := acolor; BlankFrm.Image1.Canvas.Brush.Color := AColor;
TickEnd := X - 10; TickEnd := X - 10;
Yincr := (Ymax - Ymin) / Nsteps; Yincr := (YMax - YMin) / Nsteps;
TextY := 0; TextY := 0;
for i := 0 to Nsteps do for i := 0 to NSteps do
begin begin
Ypos := round(Y - ((Ylength / Nsteps) * i)); YPos := round(Y - Ylength / NSteps * i);
BlankFrm.Image1.Canvas.MoveTo(X,Ypos); BlankFrm.Image1.Canvas.MoveTo(X, YPos);
BlankFrm.Image1.Canvas.LineTo(TickEnd,Ypos); BlankFrm.Image1.Canvas.LineTo(TickEnd, YPos);
TextY := TickEnd - 30; TextY := TickEnd - 30;
Yval := Ymin + ( i * Yincr); Yval := Ymin + i * Yincr;
Svalue := format('%4.2f',[Yval]); BlankFrm.Image1.Canvas.TextOut(TextY, Ypos-8, Format('%.2f', [Yval]));
Ast := Svalue;
BlankFrm.Image1.Canvas.TextOut(TextY, Ypos-8, Ast);
end; end;
// print charLabel vertically // print charLabel vertically
Xpos := TextY - 15; chpixs := BlankFrm.Image1.Canvas.TextHeight(CharLabel);
for i := 1 to Length(charLabel) do XPos := TextY - 15;
for i := 1 to Length(CharLabel) do
begin begin
chpixs := BlankFrm.Image1.Canvas.TextHeight(charLabel); YPos := round(Y - YLength / 2 - Length(charLabel) * chpixs / 2 + chpixs*i);
Ypos := round(Y - (Ylength / 2) - ( (Length(charLabel) * chpixs) / 2 ) + (chpixs * i)); BlankFrm.Image1.Canvas.TextOut(XPos, YPos, CharLabel[i]);
symbol := charLabel[i];
// symbol[2] := 0;
BlankFrm.Image1.Canvas.TextOut(Xpos,Ypos,symbol);
end; end;
end; end;
procedure TDistribFrm.NormPts(zMin, zMax: double; Npts: integer; procedure TDistribFrm.NormPts(zMin, zMax: double; NPts: integer;
var realpts: TwoCol; Sender: TObject); var RealPts: TwoCol);
var var
zIncr, z, h : double; zIncr, z, h: double;
i : integer; i: integer;
begin begin
zIncr := (zMax - zMin) / Npts; zIncr := (zMax - zMin) / Npts;
for i := 1 to Npts do for i := 1 to Npts do
begin begin
z := zMin + (zIncr * i); z := zMin + (zIncr * i);
h := (1.0 / sqrt(2.0 * 3.14159265358979)) * h := (1.0 / sqrt(2.0 * PI)) * (1.0 / exp(z * z / 2.0));
( 1.0 / exp(z * z / 2.0)); RealPts[1, i] := z;
realpts[1,i] := z; RealPts[2, i] := h;
realpts[2,i] := h;
end; end;
end; end;
procedure TDistribFrm.PltPts(realpts: TwoCol; Xmax, Xmin, Ymax, Ymin: double; procedure TDistribFrm.PltPts(RealPts: TwoCol; Xmax, Xmin, Ymax, Ymin: double;
Npts, XaxisStart, YaxisStart, XaxisRange: integer; YaxisRange: integer; NPts, XAxisStart, YAxisStart, XAxisRange, YAxisRange: integer; AColor: TColor);
acolor: TColor; Sender: TObject);
var var
hprop, zprop, z, h : double; hprop, zprop, z, h: double;
i, X, Y : integer; i, X, Y: integer;
intpts : array[1..100] of TPoint; intpts: array[1..100] of TPoint;
begin begin
for i := 1 to Npts do for i := 1 to NPts do
begin begin
z := realpts[1,i]; z := RealPts[1,i];
h := realpts[2,i]; h := RealPts[2,i];
zprop := (z - Xmin) / (Xmax - Xmin); zprop := (z - XMin) / (XMax - XMin);
X := round((zprop * XaxisRange) + XaxisStart); X := round(zprop * XAxisRange + XAxisStart);
hprop := (h - Ymin) / (Ymax - Ymin); hprop := (h - Ymin) / (Ymax - Ymin);
Y := round(YaxisStart - (hprop * YaxisRange)); Y := round(YAxisStart - hprop * YAxisRange);
intpts[i] := Point(X,Y); intpts[i] := Point(X, Y);
end; end;
BlankFrm.Image1.Canvas.Pen.Color := acolor; BlankFrm.Image1.Canvas.Pen.Color := AColor;
BlankFrm.Image1.Canvas.Polyline(Slice(intpts,Npts - 1)); BlankFrm.Image1.Canvas.Polyline(Slice(intpts, Npts - 1));
end; end;
procedure TDistribFrm.ChiPts(cMin, cMax: double; Npts, df: integer; procedure TDistribFrm.ChiPts(cMin, cMax: double; NPts, DF: integer;
var realpts: TwoCol; Sender: TObject); var RealPts: TwoCol);
var var
ratio1, ratio2, ratio3, cIncr, chi, h : double; ratio1, ratio2, ratio3, cIncr, chi, h: double;
i : integer; i: integer;
begin begin
ratio1 := df / 2.0; ratio1 := DF / 2.0;
ratio2 := (df - 2.0) / 2.0; ratio2 := (DF - 2.0) / 2.0;
cIncr := (cMax - cMin) / Npts; cIncr := (cMax - cMin) / NPts;
for i := 1 to Npts do for i := 1 to NPts do
begin begin
chi := cMin + (cIncr * i); chi := cMin + cIncr*i;
// h := inversechi(chi, df); // h := inversechi(chi, df);
ratio3 := chi / 2.0; ratio3 := chi / 2.0;
h := (1.0 / (power(2.0,ratio1) * exp(lngamma(ratio1)))) * power(chi,ratio2) * ( 1.0 / exp(ratio3)); h := (1.0 / (power(2.0, ratio1) * exp(lngamma(ratio1)))) * power(chi, ratio2) * (1.0 / exp(ratio3));
realpts[1,i] := chi; RealPts[1,i] := chi;
realpts[2,i] := h; RealPts[2,i] := h;
end; end;
end; end;
procedure TDistribFrm.FPts(FMin, FMax: double; Npts, df1, df2: integer; procedure TDistribFrm.FPts(FMin, FMax: double; NPts, DF1, DF2: integer;
var realpts: TwoCol; Sender: TObject); var RealPts: TwoCol);
var var
FIncr, F, h : double; FIncr, F, h: double;
i : integer; i: integer;
begin begin
FIncr := (FMax - FMin) / Npts; FIncr := (FMax - FMin) / NPts;
for i := 1 to Npts do for i := 1 to NPts do
begin begin
F := FMin + (FIncr * i); F := FMin + FIncr * i;
h := Ffunc(F, df1, df2); h := Ffunc(F, DF1, DF2);
realpts[1,i] := F; RealPts[1,i] := F;
realpts[2,i] := h; RealPts[2,i] := h;
end; end;
end; end;
function TDistribFrm.chi2func(chisqr, df: double): double; function TDistribFrm.Chi2Func(ChiSqr, DF: double): double;
var var
ratio1, ratio2, ratio3, h : double; ratio1, ratio2, ratio3: double;
begin begin
// Returns the height of the density curve for the chi-squared statistic // Returns the height of the density curve for the chi-squared statistic
ratio1 := df / 2.0; ratio1 := df / 2.0;
ratio2 := (df - 2.0) / 2.0; ratio2 := (df - 2.0) / 2.0;
ratio3 := chisqr / 2.0; ratio3 := chisqr / 2.0;
h := (1.0 / (power(2.0,ratio1) * exp(lngamma(ratio1)))) * power(chisqr,ratio2) * ( 1.0 / exp(ratio3)); Result := (1.0 / (power(2.0,ratio1) * exp(lngamma(ratio1)))) * power(chisqr,ratio2) * (1.0 / exp(ratio3));
Result := h;
end; end;
function TDistribFrm.Ffunc(F: double; df1, df2: integer): double; function TDistribFrm.FFunc(F: double; DF1, DF2: integer): double;
var var
ratio1, ratio2, ratio3, ratio4, h : double; ratio1, ratio2, ratio3, ratio4: double;
part1, part2, part3, part4, part5, part6, part7, part8, part9 : double; part1, part2, part3, part4, part5, part6, part7, part8, part9: double;
begin begin
// Returns the height of the density curve for the F statistic // Returns the height of the density curve for the F statistic
ratio1 := (df1 + df2) / 2.0; ratio1 := (df1 + df2) / 2.0;
@ -567,16 +565,18 @@ begin
ratio3 := df1 / 2.0; ratio3 := df1 / 2.0;
ratio4 := df2 / 2.0; ratio4 := df2 / 2.0;
part1 := exp(lngamma(ratio1)); part1 := exp(lngamma(ratio1));
part2 := power(df1,ratio3); part2 := power(df1, ratio3);
part3 := power(df2,ratio4); part3 := power(df2, ratio4);
part4 := exp(lngamma(ratio3)); part4 := exp(lngamma(ratio3));
part5 := exp(lngamma(ratio4)); part5 := exp(lngamma(ratio4));
part6 := power(F,ratio2); part6 := power(F,ratio2);
part7 := power((F*df1+df2),ratio1); part7 := power((F*df1 + df2), ratio1);
part8 := (part1 * part2 * part3) / (part4 * part5); part8 := (part1 * part2 * part3) / (part4 * part5);
if (part7 = 0.0) then part9 := 0.0 if (part7 = 0.0) then
else part9 := part6 / part7; part9 := 0.0
h := part8 * part9; else
part9 := part6 / part7;
Result := part8 * part9;
{ {
ratio1 := (df1 + df2) / 2.0; ratio1 := (df1 + df2) / 2.0;
ratio2 := (df1 - 2.0) / 2.0; ratio2 := (df1 - 2.0) / 2.0;
@ -587,7 +587,16 @@ begin
(gamma(ratio3) * gamma(ratio4))) * (gamma(ratio3) * gamma(ratio4))) *
(realraise(f,ratio2) / realraise((f*df1+df2),ratio1)); (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; end;
procedure TDistribFrm.FormCreate(Sender: TObject); procedure TDistribFrm.FormCreate(Sender: TObject);
@ -596,6 +605,75 @@ begin
Application.CreateForm(TBlankFrm, BlankFrm); Application.CreateForm(TBlankFrm, BlankFrm);
end; 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 initialization
{$I distribunit.lrs} {$I distribunit.lrs}