PROJE RAPORU Projenin Adı: 3x3 Matrisin Tersinin Satır İndirgeme (Row Reduced Echelon Form) İşlemleri ile Tersinin Bulunması ve Çözüm Basamaklarının Gösterilmesine Dair Yeni Bir Uygulama Projenin Amacı: Rasyonel terimi her hangi bir 3x3 matrisin tersi bulunurken çözüm basamaklarının da gösterildiği yeni bir yöntem geliştirmek. Giriş: 3x3 matrisin tersi satır indirgenme (Row Reduced Echelon Form) işlemleri ile bulunabilmektedir. Bu yöntem oldukça uzun, zaman alan ve işlem hatası yapmaya müsait bir yöntemdir. Bununla ilgili bir program araştırdığımda [1,2,3] bulduğum programların tümünün, ters matrisi rasyonel terimli olarak bulduğunu ancak işleminin ara basamaklarını göstermediğini fark ettim. Geliştireceğim programında rasyonel terimli matrisleri desteklemesi için internette araştırma yaptım ve Delphi programında çalışan bir rasyonel sayı class ının olduğunu gördüm [4]. Okuldaki kulüp çalışmalarında matematik öğretmenimin açtığı Delphi Kulübünde bulunman ve bu kulüpte 2 seneden beri program yazma konusunda edindiğim tecrübe ile bu projeyi gerçekleştirebileceğime karar verdim. Bu projede rasyonel terimli her hangi bir 3x3 matrisin tersi bulunurken çözüm basamaklarının hepsinin detaylı olarak gösterilmesi ve matrisin tersinin terimlerinin kesirli olarak (a/b şeklinde) ifade edilmesini amaçladım. Ayrıca, 3x3 matrisin tersinin bulunması konusu işlenirken işlemler için harcanan sürenin kısaltılması amaç edinilmiştir. Son olarak, öğrencilerin bu konu üzerinde yaptığı bireysel çalışmalarda sağlama yapma imkânı sunulması amaçlanmıştı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 and Define_B then Print_Mesaj('A matrisi:'+#9+#9+#9+'a matrisinin tersi:'); {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]); Multiply_Row(DummyRat,B[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); atla2: 2
{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]); Multiply_Row(DummyRat,B[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} if not A[3][2].IsZero then DummyRat.AsString:=A[3][2].AsString; 3
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]); Multiply_Row(DummyRat,B[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); {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; 4
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; Örnek: [ 1 4 5 2 3 1 1 2 3 ] Çözüm: Varolan programlar: 1. Program: matrisinin tersini bulunuz. 2. Program: 5
3. Program: Bizim Programımız: Sonuçlar: Sonuç 1: Geliştirdiğimiz program rasyonel terimli 3x3 verilen bir matrisin tersini buldu. Sonuç 2: 3x3 matrisin tersinin bulunurken uygulanan satır indirgenme işlemleri adım adım gösterildi. Tartışma ve Öneri: Yapılan program 4x4 ve daha büyük boyutlu matrislerde geliştirilip, sistem çözümlerinde de kullanılabilir. 6
Kaynaklar: 1. http://www.bluebit.gr/matrix calculator/ 2. http://www.mathportal.org/calculators/matrices calculators/matrix calculator.php 3. http://ncalculators.com/matrix/inverse matrix.htm 4. http://fundementals.sourceforge.net 7