Критерій відношення правдоподібності для великих вибірок
Курсовой проект - Математика и статистика
Другие курсовые по предмету Математика и статистика
dBtn_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
)then">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
)then">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. Результати виконання програми
Результати одержані при ручному вводі:
Результати отримані при зчитуванні з файлу:
Дані згенеровані компютером: