Курсовая работа: Критерій відношення правдоподібності для великих вибірок
unit Unit1;
interface
uses
Windows,
Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,
StdCtrls, Grids, ExtCtrls, Math;
type
TFrm =
class(TForm)
GrpBox_HandEnter:
TGroupBox;
RdoGrp_CaseEnter:
TRadioGroup;
RdBtn_FileRead:
TRadioButton;
RdBtn_HandEnter:
TRadioButton;
StrGrd:
TStringGrid;
Lbl_LevelMean:
TLabel;
Cmb_LevelMean:
TComboBox;
Lbl_CountValue:
TLabel;
Cmb_CountValue:
TComboBox;
GrpB_Result:
TGroupBox;
Memo_WriteResult:
TMemo;
Button1:
TButton;
OpnDg:
TOpenDialog;
RdB_CompGenerate:
TRadioButton;
Edt_Average:
TEdit;
Edt_Dispersion:
TEdit;
Lbl_Average:
TLabel;
Lbl_Dispersion:
TLabel;
procedure
Button1Click(Sender: TObject);
procedure
RdBtn_HandEnterClick(Sender: TObject);
procedure
Cmb_CountValueChange(Sender: TObject);
procedure
RdBtn_FileReadClick(Sender: TObject);
procedure
RdB_CompGenerateClick(Sender: TObject);
procedure
Edt_AverageChange(Sender: TObject);
procedure
Edt_DispersionChange(Sender: TObject);
private
{ Private
declarations }
public
{ Public
declarations }
end;
var
Frm: TFrm;
List:TStringList;
implementation
{$R *.dfm}
Function
Factorial(N:Integer):Integer;
var s:Integer;
begin
s:=1;
if(N>0)
then
while (N>0)
do
begin
s:=N*s;
N:=N-1;
end;
Result:=s;
end;
function
FactorialHalf(N:Integer):Double;
var s:Double;
begin
s:=1;
if(N>=0)
then
begin
while
(N>=0) do
begin
s:=(1./2+N)*s;
N:=N-1;
end;
end;
Result:=s;
end;
Function
Abs(s:Double):Double;
begin
if(s>0)
then
Abs:=s
else
Abs:=-s;
end;
function
FindCriticalPoint(N: Integer): Double;
var
Gamma,Integral,c, h,level_mean: Double;
i: Integer;
NumPointsIntegrate:LongInt;
begin
c:=0.1; i:=0;
Integral:=0;h:=c/2;
level_mean:=
StrToFloat(Frm.Cmb_LevelMean.Text);
NumPointsIntegrate:=1000;
if(((N-1) mod
2)=1) then
Gamma:=Power(ArcCos(-1),1./2)*FactorialHalf(((N-1)div
2)-1)
else
Gamma:=Factorial(((N-1)
div 2)-1);
while(Abs(((1-level_mean)
-Integral/(Gamma*Power(2,0.5*(N-1)))))>0.00001) do
begin
Integral:=0;
for i:=1 to
NumPointsIntegrate do
Integral:=Integral+
(c/(NumPointsIntegrate))*Power(i*c/(NumPointsIntegrate),(0.5*N-1.5))*exp(-i*c/(2*NumPointsIntegrate));
if
((((1-level_mean) )-Integral/(Gamma*Power(2,0.5*(N-1)))))>0 then
begin
c:=c+h ;
NumPointsIntegrate:=NumPointsIntegrate+100;
end
else
begin
c:=c-h;
h:=h/10;
c:=c+h;
end;
end;
FindCriticalPoint:=c;
end;
function
EvaluteStatistic(aOfValues:Array of Double; aOfProbabil:Array of Double;
CountVal:Integer; f:Boolean):Double;
var
i,n:Integer;
s,sum,s_2,disp,aver:Double;
begin
s:=0; n:=0;
sum:=0;
if(not f) then
begin
for i:=0 to
CountVal-1 do
sum:=sum+aOfValues[i];
for i:=0 to
CountVal-1 do
s:=s+2*aOfValues[i]*LnXP1(aOfValues[i]/(sum*aOfProbabil[i])-1);
Result:=s;
end
else
begin
for i:=1 to
Frm.StrGrd.ColCount-1 do
if(Frm.StrGrd.Cells[i,2]<>'')
then
begin
s:=s+Power(StrToFloat(Frm.StrGrd.Cells[i,1]),2);
sum:=sum+StrToFloat(Frm.StrGrd.Cells[i,1]);
n:=n+StrToInt(Frm.StrGrd.Cells[i,2]);
end;
s_2:=(s/n)-Power(sum/n,2);
disp:=
StrToFloat(Frm.Edt_Dispersion.Text);
aver:=
StrToFloat(Frm.Edt_Average.Text);
Result:=n*LnXP1((disp/s_2)-1)-n+s/disp-2*sum*aver/disp+n*Power(aver,2)/disp;//n*LnXP1((disp/s_2)-1);
end;
end;
procedure
TFrm.Button1Click(Sender: TObject);
var
ValArr:array of Double; ProbArray:array of Double;
i:Integer;
s:TStringList; st,critical_point:Double;
begin
if(RdBtn_HandEnter.Checked
) then
begin
SetLength(ValArr,StrGrd.ColCount-1);
SetLength(ProbArray,StrGrd.ColCount-1);
For i:=0 to
StrGrd.ColCount-2 do
begin
try
ValArr[i]:=StrToFloat(StrGrd.Cells[i+1,1]);
ProbArray[i]:=
StrToFloat(StrGrd.Cells[i+1,2]);
finally end;
end;
end
else
if
(RdBtn_FileRead.Checked ) then
begin
s:=
TStringList.Create;
s.Text:=StringReplace(List[0],'
',#13#10,[rfReplaceAll]);
SetLength(ValArr,s.Count);
Cmb_CountValue.Text
:= IntToStr(s.Count );
RdBtn_HandEnter.Checked
:=false;
for i:=0 to
s.Count-1 do
ValArr[i]:=StrToFloat(s[i]);
s.Text:=StringReplace(List[1],'
',#13#10,[rfReplaceAll]);
SetLength(ProbArray,s.Count);
for i:=0 to
s.Count -1 do
ProbArray[i]:=StrToFloat(s[i]);
end;
Memo_WriteResult.Lines.Clear();
Memo_WriteResult.Lines.Add('Значення
статистики критерію:');
if(RdBtn_HandEnter.Checked
) then
begin
st:=EvaluteStatistic(ValArr,
ProbArray, StrGrd.ColCount-1,false);
Memo_WriteResult.Lines.Add(FloatToStr(st));
end
else
if
(RdBtn_FileRead.Checked ) then
begin
st:=EvaluteStatistic(ValArr,
ProbArray,s.Count,false );
Memo_WriteResult.Lines.Add(FloatToStr(st));
end
else
begin
st:=EvaluteStatistic(ValArr,
ProbArray,0,true);
Memo_WriteResult.Lines.Add(FloatToStr(st));
end;
Memo_WriteResult.Lines.Add('Значення
критичної точки:');
if(RdB_CompGenerate.Checked
)then
critical_point:=FindCriticalPoint(3)
else
critical_point:=FindCriticalPoint(StrToInt(Frm.Cmb_CountValue.Text));
Memo_WriteResult.Lines.Add(FloatToStr(critical_point));
if(st<critical_point)
then
Memo_WriteResult.Lines.Add('Висновок:
гіпотеза не суперечить реалізації вибірки.')
else
Memo_WriteResult.Lines.Add('Висновок:
гіпотеза суперечить реалізації вибірки.');
end;
procedure
TFrm.RdBtn_HandEnterClick(Sender: TObject);
var i:Integer;
begin
Memo_WriteResult.Lines.Clear();
Edt_Average.Visible:=false;
Lbl_Average.Visible:=false;Cmb_CountValue.Visible:=true;
Edt_Dispersion.Visible:
= false; Lbl_Dispersion. Visible: = false;Lbl_CountValue.Visible :=true;
StrGrd.ColCount:=StrToInt(Cmb_CountValue.Text
)+1;
for i:=1 to StrGrd.ColCount
do
StrGrd.Cols[i].Text:='x'+IntToStr(i);
StrGrd.RowCount:=3;
StrGrd.Rows[1].Text:='Частоти';
StrGrd.Rows[2].Text:='Ймовірності';
end;
procedure
TFrm.Cmb_CountValueChange(Sender: TObject);
begin
RdBtn_HandEnterClick(
Sender);
RdBtn_HandEnter.Checked:=true;
end;
procedure
TFrm.RdBtn_FileReadClick(Sender: TObject);
begin
Memo_WriteResult.Lines.Clear();
Edt_Average.Visible:=false;
Lbl_Average.Visible:=false;Cmb_CountValue.Visible:=false;
Edt_Dispersion.Visible:=
false; Lbl_Dispersion.Visible:=false;Lbl_CountValue.Visible :=false;
List:=
TStringList.Create;
if
OpnDg.Execute then
List.LoadFromFile(OpnDg.FileName
);
end;
function
SetGaussNumber(a:String):Boolean;
var i:Integer;
begin
SetGaussNumber:=false;
for i:=1 to
Frm.StrGrd.ColCount-1 do
begin
if(
Frm.StrGrd.Cells[i,0]<>'') then
begin
if(Frm.StrGrd.Cells[i,2]='')
then
Frm.StrGrd.cells[i,2]:='1';
if(Frm.StrGrd.Cells[i,1]=a)
then
begin
Frm.StrGrd.cells[i,2]:=IntToStr(StrToInt(Frm.StrGrd.cells[i,2])+1);
SetGaussNumber:=true;
end
end;
end;
end;
procedure
TFrm.RdB_CompGenerateClick(Sender: TObject);
var i:Integer;
begin
Memo_WriteResult.Lines.Clear();
Randomize;
StrGrd.Rows[1].Text:='Значення';
StrGrd.Rows[2].Text:='Частоти';
Edt_Average.Visible:=true;
Lbl_Average.Visible:=true;Cmb_CountValue.Visible:=false;
Edt_Dispersion.Visible:=
true; Lbl_Dispersion.Visible:=true;Lbl_CountValue.Visible :=false;
for i:=0 to 50
do
begin
if StrGrd.Col
<i+1 then
StrGrd.ColCount:=StrGrd.ColCount+1;
if(not(SetGaussNumber(FloatToStr(StrToFloat(Frm.Edt_Average.Text)+RandG(0
,1)*Power(StrToFloat(Frm.Edt_Dispersion.Text),1./2))))) then //StrToFloat(Frm.Edt_Average.Text)
,StrToFloat(Frm.Edt_Dispersion.Text )
begin
StrGrd.Cells[i+1,0]:='x'+IntToStr(i+1);
StrGrd.Cells[i+1,1]:=FloatToStr(StrToFloat(Frm.Edt_Average.Text)+RandG(0
,1)*Power(StrToFloat(Frm.Edt_Dispersion.Text),1./2));
StrGrd.Cells[i+1,2]:='1';
end;
end;
end;
procedure
TFrm.Edt_AverageChange(Sender: TObject);
begin
RdB_CompGenerate.Checked:=false;
RdB_CompGenerate.Checked:=true;
end;
procedure
TFrm.Edt_DispersionChange(Sender: TObject);
begin
RdB_CompGenerate.Checked:=false;
RdB_CompGenerate.Checked:=true;
end;
end.
Додаток C. Результати виконання програми
Результати
одержані при ручному вводі:

Результати
отримані при зчитуванні з файлу:

Дані згенеровані
комп’ютером:

Страницы: 1, 2, 3, 4, 5, 6, 7 |