Problem :
(x1,y1) , (x2,y2) , (x3,y3) , ... , (xn,yn)
serpme noktalarına en yakın olan eğrinin belirlenmesi uygulamada önemli bir problemdir. Serpme noktalarının dağılımına göre, uygulamacı, öncelikle eğrinin ne olabileceğine karar vermelidir. Çoğunlukla karşılaşılan haller şunlardır:
1. y =
ax doğrusu,
2.
2.
2.
2.
y = a +
bx doğrusu,
3.
3.
3.
3.
y = a +
bx + cx2 parabolü.
İlk durum, ikincinin özel bir durumudur. Burada, ikinci durum için matris denklemlerinden yararlanan bir çözüm yapacağız. Aynı problemin, doğrusal denklem sistemlerine dayanan bir çözümü için bkz. : Doğrusal Denklemler Sistemleriyle En Küçük Kareler Yöntemi
En
Küçük Kareler Yöntemi,
y = a + bx doğrusu
üzerindeki (xi , y)
noktaları ile verilen (xi , yi) serpme noktaları
arasındaki uzaklıkların kareleri toplamını minumum yapan a ve b katsayılarını bulma işleminden
ibarettir. Bu katsayılar bulununca, y =
a + bx doğrusu (regresyon doğrusu) bulunmuş olur.
Bu
uzaklıkların kareleri toplamı
T yi minumum yapan a ve b sayılarını bulmak
için, T nin a ve b ye
göre kısmi türevlerini sıfır yapan değerleri bulmalıyız. Bunun için
denklem sisteminin çözülmesi gerekir. Bu denklemleri düzenlersek,
yazabiliriz. Bu matrisleri soldan sağa doğru M, A, N ile gösterirsek
matris eşitliği elde edilir. Serpme diyağramındaki noktaların koordinatlarından yararlanarak,
ve
matrisleri tanımlanırsa,
ve
olduğu görülür. Buradan,
çıkar. Bu matris eşitliğinden A matrisini çözersek,
buluruz. Sağ taraftaki matrisleri yerlerine yazarak A matrisini bulabiliriz. Bu da aradığımız a ve b katsayılarının bulunması demektir.
Aşağıdaki Pascal programı, bu matris denklemini çözmektedir.
Pascal Programı ile En Küçük
Kareler Yöntemi
(* En Küçük
Kareler Yöntemi *)
(* Matris
Denklemiyle Çözüm *)
program
ekareler;
uses wincrt;
const
max = 20;
type
boyut = 1..max;
dizi =
array[boyut] of real;
matris =
array[boyut,boyut] of real;
var
m : boyut;
apsis , ordinat : dizi;
A, V, W, X , Y,
TX, tersW : matris;
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(T : dizi; k : boyut);
var
i : boyut;
Begin
for i := 1 to k do
write(T[i]:5:2);
writeln
End;
Procedure
XMatrisYap(var U : matris ; k : integer);
var
i : integer;
Begin
for i := 1 to k do
begin
U[i,1] := 1;
U[i,2] := apsis[i];
end;
End;
Procedure
Transpose(W : matris ; var TW:matris; p,q : boyut);
var
i,j : boyut;
Begin
for i := 1 to p do
for j := 1 to q do
TW[i,j] := W[j,i];
End;
Procedure YMatrisYap(d
: dizi; var R : matris; k : integer);
var
i : boyut;
Begin
for i := 1 to k do
R[i,1] := ordinat[i];
End;
procedure
Matris_Carp(U : matris; V : matris; var W : matris; p,q,r :
boyut);
{U matrisi p x
q tipinden, V matrisi q x r tipinden olmak üzere,
W çarpım
matrisi p x r tipinden olur.}
var
i,j,k : boyut;
toplam : real;
begin
for i := 1 to p do
for j := 1 to r do
begin
toplam := 0;
for k := 1 to q do
toplam := toplam + U[i,k]*V[k,j];
W[i,j] := toplam
end
end;
Function
Determinant(U : matris): real;
var
i,j : integer;
D : real;
Begin
D := U[1,1] * U[2,2] - U[1,2] * U[2,1];
Determinant := D;
End;
Procedure
TersMatris(U : matris; var tersU : matris);
Begin
tersU[1,1] :=
U[2,2]/Determinant(U);
tersU[1,2] := -U[1,2]/Determinant(U);
tersU[2,1] := -U[2,1]/Determinant(U);
tersU[2,2] :=
U[1,1]/Determinant(U);
End;
Procedure
MatrisYaz(M : matris; p,q : boyut);
var
i,j : boyut;
Begin
for i := 1 to p do
begin
for j:= 1 to q do
Write(M[i,j]:8:2);
WriteLn;
end;
End;
BEGIN
clrscr;
write('Kaç tane (xi ,yi)
noktası var ? ');
repeat
readln(m);
if not (m in [1..max]) then
WriteLn('1..',max, ' arasında bir sayı girmelisiniz! ');
until m in [1..max];
DiziGir(apsis,ordinat,m);
DiziYaz(apsis,m);
DiziYaz(ordinat,m);
writeLn;
XMatrisYap(X,m);
YMatrisYap(ordinat,Y,m);
Transpose(X,TX,2,m);
Matris_Carp(TX,X,W,2,m,2);
TersMatris(W, tersW);
Matris_Carp(TX,Y,V,2,m,1);
Matris_Carp(tersW,V,A,2,2,1);
WriteLn('Doğru denklemi : y = ',A[2,1]:10:5,'x + ',
A[1,1]:10:5);
END.