(* En küçük kareler yöntemi *)

 

program ekk;

 

uses wincrt;

 

const

     max = 20;

 

type

   boyut          = 1..max;

   dizi           = array[boyut] of real;

   matris         = array[boyut,boyut] of real;

 

 

var

   n               : boyut;

   a, b            : real;

   apsis , ordinat : dizi;

 

 

Procedure DiziGir (var   s, t : dizi ; k : integer);

var

  i : integer;

Begin

    for i:=1 to k do     

    begin

       WriteLn('x(' ,i, ')' , ' , y(',i,') sayılarını giriniz :');

       readln(s[i],t[i]);

    end;

End;

 

 

procedure DiziYaz (s, t : dizi; k : boyut);

 

var

   i : boyut;

 

Begin

   for i := 1 to k do

      writeLn('(', S[i]:5:2,  ',' , T[i]:5:2 , ')' );

      writeln

End;

 

 

(* Aşağıdaki fonksiyon dizinin terimlerinin toplamını bulur *)

 

Function DiziTopla (d : dizi; k : boyut): real;

var

  i      : boyut;

  toplam : real;

Begin

  toplam := 0;

   for i := 1 to k do

    toplam := toplam + d[i];  

    DiziTopla := toplam

End;

 

(* Aşağıdaki fonksiyon dizinin aritmetik ortalamasını bulur  *)

 

Function AritmetikOrta (s : dizi; k : boyut): real;

Begin

    AritmetikOrta := DiziTopla(s,k)/k ;      

End;

 

 

 

(* Aşağıdaki fonksiyon koordinatların çarpımlarının toplamını bulur : XY   *)

 

Function CarpimlarToplami (s, t : dizi; k : boyut) : real; 

var

  i         : boyut;

  carpimTop : real ;

Begin

  carpimTop := 0;

  for i  := 1 to k do

     carpimTop := carpimTop + s[i] * t[i];

  CarpimlarToplami := carpimTop;

End;

 

 

(* Aşağıdaki fonksiyon dizinin terimlerinin karelerinin toplamını bulur  *)

 

Function KarelerToplami (d : dizi; k : boyut) : real;

var

  i       : boyut;

  kareler : real ;

Begin

  kareler := 0;

  for  i  := 1 to k do

     kareler := kareler + sqr(d[i]);

  KarelerToplami := kareler;

End;

 

 

 

(* Aşağıdaki fonksiyon dizinin toplamının karesini  bulur  *)

 

Function ToplaminKaresi (d : dizi; k : boyut) : real;

var

  i      : boyut;

  toplam : real;

Begin

  toplam := 0;

   for i := 1 to k do

     toplam := toplam + d[i];

     ToplaminKaresi := SQR(toplam);

End;

 

 

{ Aşağıdaki fonksiyon dizilerin terimlerinin toplamlarının

çarpımını bulur  ( Ss[i] )*( St[i])    }

 

Function ToplamlarCarpimi (s, t : dizi; k : boyut): real;

Begin

   ToplamlarCarpimi :=  DiziTopla(s, k) * DiziTopla(t, k);

End;

 

 

 

(* Aşağıdaki fonksiyon y = a + bX için  b katsayısını bulur  *)

 

Function Beta (s, t : dizi; k : boyut): real;

Begin

   Beta :=  (CarpimlarToplami(s,t,k) - (ToplamlarCarpimi(s,t,k)/n)) / (KarelerToplami(s,k) - (ToplaminKaresi(s,k)/n));

End;

 

 

 

 

(* Aşağıdaki fonksiyon y = a + bX için  a katsayısını bulur  *)

 

Function Alfa (s, t : dizi; k : boyut): real;

Begin

   Alfa :=  AritmetikOrta(t,n) -  b * AritmetikOrta(s,n);

End;

 

 

BEGIN

   clrscr;

   write('Kaç tane  (xi ,yi) noktası var ? ');

   repeat

      readln(n);

      if not (n in [1..max]) then

         WriteLn('1..',max, ' arasında bir sayı girmelisiniz! ');

         WriteLn;

         write('Kaç tane  (xi ,yi) noktası var ? ');

   until n in [1..max];

   DiziGir(apsis,ordinat,n);

   DiziYaz(apsis,ordinat,n);

   AritmetikOrta(apsis  ,n); 

   AritmetikOrta(ordinat,n); 

   b := Beta(apsis,ordinat,n);

   a := Alfa(apsis, ordinat,n);

   WriteLn('Doğru denklemi : y =  ', a:10:5,' + ', b:10:5,'X');

 

END.