PROJE RAPORU Projenin Adı: Üç bilinmeyenli Rasyonel Katsayılı Denklem Sistemi Çözümü Projenin Amacı: Üç bilinmeyenli rasyonel katsayılı denklem sisteminin Gauss indirgenme metodu ile çözümünü algoritmaya dökerek çözüm basamaklarının gösteren bir bilgisayara programı yazılması. Giriş: Üç bilinmeyenli denklem sistemlerinin çözümü 3 yolla mümkündür. 1. Yerine koyma metodu: Bu metotla denklemlerin bir tanesinden değişkenlerden her hangi biri yalnız bırakılarak diğer denklemlerin her hangi birinde yerine yazılarak sistem iki bilinmeyenli denklem sistemi haline getirilir ve yok etme metodu ile sistemin çözüm kümesine ulaşılır. 2. Ters matris yardımıyla: Denklem sistemi A. X B formuna getirilerek A ve B 1 1 matrisleri bulunmuş olur. X A. B yardımıyla değişkenlere ulaşılır. Bu yolda A ne 1 ulaşmak güç olduğu gibi A ni bulamama durumunda söz konusudur. 3. Gauss metodu: : Denklem sistemi matrisin Eşelon biçimi oluşturulduktan sonra matrisin satırca indirgenmiş biçimleri elde edilir ve çözüm kümesine ulaşılır. Yukarıda belirtilen üç yolda zaman alıcı ve hata yapmaya müsait yollardır. Yaptığım projede Gauss indirgenme metodu için algoritma geliştirdim. Yaptığım araştırmalarda sistem çözümleri için bir çok programın olduğunu ancak hiç birinin ara basakları göstermediğini ve çözüm kümesini reel sayı olarak yaklaşık değerlerle verdiğini fark ettim. Pascal da geliştirdiğim DENKLEM ÇÖZ programı çözüm basamaklarını ayrıntılı göstermekte ve çözüm kümesini rasyonel sayılarla ifade etmekte yani hiç bir yuvarlama yapmamaktadır.. Yöntem: Algoritmanın nasıl çalıştığını göstermek için kaynak koddan örnek bir kesit aldım. {Katsayı matrisi tanımlanıyor} if Define_A then RichEdit.Clear; Print_Mesaj('Çözülecek katsayı matrisi:'); {1. Sütundaki 0'dan farklı ilk değere sahip satır ilk satıra getiriliyor} A_Row:=FindNonZero(1); if A_Row>1 then Print_Mesaj('1. Satır ile '+inttostr(a_row)+'. Satır yer değiştirildi.'); Exchange_Rows_A(1,A_Row); 1
end else if A_Row=0 then goto atla2; {A11 1 olacak şekilde 1. satır bir rasyonel sayı ile çarpılıyor} if not A[1][1].IsOne then DummyRat.AsString:=A[1][1].AsString; DummyRat.Reciprocal; Print_Mesaj('1. Satır '+DummyRat.Asstring+' ile çarpıldı.'); Multiply_Row(DummyRat,A[1]); {1. satır A21'yi 0'layacak şekilde bir sayı ile çarpılıp 2. satıra ekleniyor} if not A[2][1].IsZero then DummyRat.AsString:=A[2][1].AsString; Print_Mesaj('1. Satır '+DummyRat.AsString+' ile çarpıldı ve 2. Satıra eklendi.'); Minus_Rxy_To_Row(1,1,2); {1. satır A31'i 0'layacak şekilde bir sayı ile çarpılıp 3. satıra ekleniyor} if not A[3][1].IsZero then DummyRat.AsString:=A[3][1].AsString; Print_Mesaj('1. Satır '+DummyRat.AsString+' ile çarpıldı ve 3. Satıra eklendi.'); Minus_Rxy_To_Row(1,1,3); 2
atla2: {2. Sütundaki 0'dan farklı ilk değere sahip olan satır ikinci satıra getiriliyor} A_Row:=FindNonZero(2); if A_Row=3 then Print_Mesaj('2. Satır ile '+inttostr(a_row)+'. Satır yer değiştirildi.'); Exchange_Rows_A(2,A_Row); end else if A_Row=0 then goto atla3; {A22 1 olacak şekilde 2.satır bir rasyonel sayı ile çarpılıyor} if not A[2][2].IsOne then DummyRat.AsString:=A[2][2].AsString; DummyRat.Reciprocal; Print_Mesaj('2. Satır '+DummyRat.Asstring+' ile çarpıldı.'); Multiply_Row(DummyRat,A[2]); {2. satır A12'yi 0'layacak şekilde bir sayı ile çarpılıp 1. satıra ekleniyor} if not A[1][2].IsZero then DummyRat.AsString:=A[1][2].AsString; Print_Mesaj('2. Satır '+DummyRat.AsString+' ile çarpıldı ve 1. Satıra eklendi.'); Minus_Rxy_To_Row(2,2,1); {2. satır A32'yi 0'layacak şekilde bir sayı ile çarpılıp 3. satıra ekleniyor} 3
if not A[3][2].IsZero then DummyRat.AsString:=A[3][2].AsString; Print_Mesaj('2. Satır '+DummyRat.AsString+' ile çarpıldı ve 3. Satıra eklendi.'); Minus_Rxy_To_Row(2,2,3); atla3: {3. Sütundaki 0'dan farklı ilk değere sahip olan satır üçüncü satıra getiriliyor} A_Row:=FindNonZero(3); if A_Row=0 then goto atla4; {A33 1 olacak şekilde 3. satır bir rasyonel sayı ile çarpılıyor} if not A[3][3].IsOne then DummyRat.AsString:=A[3][3].AsString; DummyRat.Reciprocal; Print_Mesaj('3. Satır '+DummyRat.Asstring+' ile çarpıldı.'); Multiply_Row(DummyRat,A[3]); {3. satır A13'ü 0'layacak şekilde bir sayı ile çarpılıp 1. satıra ekleniyor} if not A[1][3].IsZero then DummyRat.AsString:=A[1][3].AsString; Print_Mesaj('3. Satır '+DummyRat.AsString+' ile çarpıldı ve 1. Satıra eklendi.'); Minus_Rxy_To_Row(3,3,1); 4
{3. satır A23'ü 0'layacak şekilde bir sayı ile çarpılıp 2. satıra ekleniyor} if not A[2][3].IsZero then DummyRat.AsString:=A[2][3].AsString; Print_Mesaj('3. Satır '+DummyRat.AsString+' ile çarpıldı ve 2. Satıra eklendi.'); Minus_Rxy_To_Row(3,3,2); atla4: Print_Sonuc; 2- Gerçekleme: Yukarıda adımları sıralanan algoritma, Pascal dili kullanılarak Delphi de yapılmıştır. Aşağıda üç farklı türde denklem sistemlerinin çözümüne ait örnekler gösterilmiştir. 1 3 x y 2z 3 2 4 2x 4y 5z 7 4x y z 3 sisteminin çözümünü 107 11 8 x, y, z 98 49 7 olarak bulmuştur. 5
1 3 x y 2z 3 2 4 2x 3y 8z 7 sisteminin çözümünü sonsuz olarak elemanlı (parametrik) olarak bulmuştur. 4x y z 3 3 5 17 z R, x z, y 3 z 2 14 7 olarak bulmuştur. 1 3 x y 2z 3 2 4 2x 3y 8z 11 4x y z 3 sisteminin çözümünü boş küme olarak bulmuştur. 6
Sonuçlar ve Tartışma: Denklem sistemlerinin cebirsel yolla çözümü hata yapmaya çok elverişlidir. DENKLEM ÇÖZ programı her türlü rasyonel katsayılı üç bilinmeyenli denklemi hatasız(yuvarlama yapmadan) çözebilmektedir. Bu programda her adım sistemi çözmek isteyen kişi tarafından görülebilmekte ve GAUSS indirgenme metodunun kavranmasına yardımcı olmaktadır. İleriki aşamada bu metot geliştirilerek bir matrisin tersinin bulunması sağlanabilir. KAYNAKLAR http://fundementals.sourceforge.net adresinden cmath ve crational class ları alındı. Haeussler, E. F. & Paul, R.S (1999). Introductory Mathematical Analysis. New Jersey: Prentice Hall 7