Binomial Distribution :) Baynomiyal distrubişın Delphide Kodlanması

 Merhaba arkadaşlar sizlerle yeni yazdığım programcığı paylaşmak istedim.İstatistik öğrencilerinin işine yarayacak bir seri hazırlamak istiyorum.Sizdebilirsiniz ki istatistik zor bir birim birde bunun kodlanması algoritması daha daha karışık..Programa binx diyorum yazı genelinde bu ismi kullanacağım...
Öncelikle Kodlarını delphi 2010 da yazdım. Ve matematiksel işlemlerin yapılması için Uses kısmına Math kütüphanesi eklemek gerekiyor. Tabloda bazı değerler yuvarlandığından dolayı farklılıklar olabilir binx değerlerde yuvarlama yapmıyor öncelikle bunu söylemek istiyorum.Gerçek değerlerini yazıyor :) Algortimayı yanlış yazdığımı düşünmüştüm ancak sonrasında doğru yazdığımın farkına vardım. İşinize yararsa kullanabilirsiniz.Çoğu değer extended kullanıldı ondalık basamaklarda hata olmasın düşüncesiyle...
Öncelikle solda gördüğünüz ekranda

  • Kombinasyon değerini
  • Sonucunu
  • Varyansını
  • Ortalamasını
  • Çarpıklığını
  • Basıklığını
  • Standart Sapmasını
  • Ve Kümülatif değerlerini veriyor
Ekranda p=0.5 değerinde olan 7-4,20-6,40-8 değerlerini hesaplattım onlar yer alıyor.


Gelelim kod kısmına aslında düşününce algoritmasının kolay olduğunu görüyoruz ancak kodlamaya gelince bazen 3 döngü iç içe kullanıldı buda biraz kafa karışıklığı oluşturuyor.Programı elle çalıştırıp denemelerini yaparak programa güven sağlayabildim


Teorik değerleri wolframalpha.com dan alabilirsiniz
Gelelim Programa aslında programda 2 buton var ayrı ayrı yapmak istemiştim ama tek tıklamayla hepsini tetikledim :)
kodları veriyorum aralarınada yazıcam nedemk istediğimi ;
///// işaretleri delphinin açıklama olarak kabul ettiği karakterdir işleme almaz açıklama yaparken bu "////" işaretini kullanacağım
3 buton 3 edit 1 memo ekliyoruz.


kodlar burada
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

unit binom;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,math;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Hesapla: TButton;
    Label1: TLabel;
    Edit3: TEdit;
    Label2: TLabel;
    Label3: TLabel;
    Binom: TLabel;
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    procedure HesaplaClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject); ////Kümülatifi farklı bir alogritma ile hesaplattırıyoruz.Ancak button2 ile tetiklenen algoritma biraz daha anlaşılması kolay bir işlem :) tavsiyem button2deki algoritma :) 


var
sonuc,carpik,basik,sapma,toplam:Extended;
ussu,q,p,n,qussu,pussu:extended;
i,s,k,z:integer;
fak,nde,rde,kombi:extended;
deger:integer;
begin
n:=strtofloat(edit1.text);
fak:=1;
rde:=1;
nde:=1;
 toplam:=0;
 sonuc:=0;
  /////////////     kombinasyon üst değer
for i:= 1 to strtoint(edit1.Text) do
begin
  fak:=fak*(i);
  end;
begin

 /// nde:=nde*(k);

  end;
      /////////////  n-r faktöriyel

  for s:= 1 to strtoint(edit2.Text) do

begin
     p:= strtofloat(edit3.text);
     pussu:=intPower(p, s);
     q:= 1-strtofloat(edit3.text);
     qussu:= intPower( q , strtoint(edit1.text)-s)    ;
    rde:=rde*(s);
    nde:=1;
    for k := 1 to strtoint(edit1.Text)-s  do
   begin
    nde:=nde*(k);

   end;

     Kombi:= (fak / (nde*rde)) ;
     sonuc :=kombi*pussu*qussu  ;
     toplam:=toplam+sonuc ;



 end;




   memo1.lines.Add('x='+inttostr(s-1)+'.............  '+floattostr(sonuc))  ;
   memo1.lines.Add('x<='+edit2.text+'............  '+floattostr(toplam));
   memo1.lines.Add('x<'+edit2.text+'.............  '+floattostr(toplam-sonuc)) ;
   memo1.lines.Add('x>'+edit2.text+'.............  '+floattostr(1-sonuc)) ;



end;

procedure TForm1.Button2Click(Sender: TObject);  ///Burada Kümülatifi hesaplattırıyoruz
var
sonuc,carpik,basik,sapma:Extended;
ussu,q,p,n,qussu,pussu:extended;
i,s,k,o,sonnn:integer;
fak,nde,rde,kombi,toplam:extended;
deger:integer;
begin
   toplam:=0;
   sonnn:=strtoint(edit2.Text)   ;

  for o := 1 to sonnn do

     begin
n:=strtofloat(edit1.text);
fak:=1;
rde:=1;
nde:=1;
for i:= 1 to strtoint(edit1.text) do
begin
  fak:=fak*(i);
   end;
 for k:= 1 to strtoint(edit1.Text)-o do
begin
  nde:=nde*(k);
   end;
  for s:= 1 to o do
begin
  rde:=rde*(s);
end;

Kombi:= (fak / (nde*rde)) ;

 pussu:=intPower(strtofloat(edit3.text), o)    ;
     q:= 1-strtofloat(edit3.text);
  p:= strtofloat(edit3.text);
 qussu:= intPower( 1-strtofloat(edit3.text), strtoint(edit1.text)-o)    ;

         sonuc :=kombi*pussu*qussu  ;
         toplam:=toplam+sonuc;



     end;
     memo1.Lines.Add('x<='+edit2.text+'...........=  '+floattostr(toplam));
     memo1.Lines.Add('x<'+edit2.text+'............=  '+floattostr(toplam-sonuc))  ;
     memo1.Lines.Add('x>'+edit2.text+'............=  '+floattostr(1-toplam))
  end;


procedure TForm1.HesaplaClick(Sender: TObject); /// tüm işlemlerimizin döndüğü kısım burası aslında burada tüm hesaplamlar gerçekleşitor basıklık çarpıklık vs vs :)
var 
///// öncelikle  değişken tiplerimizi tanımlıyoruz
sonuc,carpik,basik,sapma:Extended;
ussu,q,p,n,qussu,pussu:extended;
i,s,k:integer;
fak,nde,rde,kombi:extended;
deger:integer;

begin

n:=strtofloat(edit1.text);  //// n i tamılıyoruz edit1. deki değer string olduğundan floata çeviriyoruz ve aktarıyoruz
fak:=1;
rde:=1;
nde:=1;

for i:= 1 to strtoint(edit1.Text) do ///////buarada  döngü ile faktöriyel değerini buluyoruz
begin
  fak:=fak*(i);
end;

 for k:= 1 to strtoint(edit1.Text)-strtoint(edit2.Text) do /////burada kombinasyonun (n-r)! değerini hesaplıyoruz
begin
  nde:=nde*(k);

  end;
  for s:= 1 to strtoint(edit2.Text) do  /////burada kombinasyonun (r)! değerini hesaplıyoruz
begin
  rde:=rde*(s);
end;

Kombi:= (fak / (nde*rde)) ; /////burada kombinasyonun tam değerini (nCr) hesaplıyoruz


/////burada kombinasyonu (nCr) memo ya aktarıyoruz 
 memo1.Lines.Add((edit1.text)+'C'+edit2.Text+' Kombinasyon=  '+floattostr(kombi));
/////Formüldeki p üssü değerini intpower komutuyla hesaplıyoruz
 pussu:=intPower(strtofloat(edit3.text), strtoint(edit2.text))    ;
   
  q:= 1-strtofloat(edit3.text); /////1-p yani q değerini tanımladık
  p:= strtofloat(edit3.text); /////p yi  tanımladık
/////Formüldeki q üssü değerini intpower komutuyla hesaplıyoruz
 qussu:= intPower( 1-strtofloat(edit3.text), strtoint(edit1.text)-strtoint(edit2.text))    ; 

         sonuc :=kombi*pussu*qussu  ;///// sonucumuzu elde ettik :)
  carpik:=(1-2*p)/(power((n*p*q),(0.5))); /////Çarpıklık değeri
  basik:=((1-6*p*q)/(n*p*q))+3; /////Basıklık değeri
  sapma:=(power((n*p*q),(0.5)));   /////sapma değeri


//////////////////////////////Tamamını memo1.e aktarıyoruz//////////////////////////////////
  memo1.Lines.Add('Sonuç..........=  '+floattostr(sonuc));
  memo1.Lines.Add('Varyans........=  '+floattostr(n*p*q))   ;
  memo1.Lines.Add('Ortalama.......=  '+floattostr(n*p))   ;
  memo1.Lines.Add('Çarpıklık......=  '+floattostr(carpik));
  memo1.Lines.Add('Basıklık.......=  '+floattostr(basik))  ;
  memo1.Lines.Add('Standart Sapma.=  '+floattostr(sapma))  ;



   button2.Click; ///////////////button2 yi tetikliyoruz ve ordaki işlemi yaptırıyoruz

  end;

end.





 Source ekranları













Bu kadar kodun sonunda da yukardaki programı elde ediyoruz :)

Umarım işinize yarar programı da burdan indirebilirsiiz

Yorumlar