12 Ağustos 2012 Pazar

Matrisin Tersini Alma (Matrix Inverse Calculation)


Bir matrisin tersini almak çarpma işlemine göre tersini almak anlamındadır. Örneğin A ve B matrislerinin çarpımından C matrisi çıkıyorsa; C matrisi ile A matrisinin tersi B matrisini vermelidir. Bunu bir nevi bölme olarak düşünmek de mümkündür.
2 boyutlu bir matrisin tersini bulmak içn öncelike determinantı hesaplanır ardından aşağıda gösterildiği üzere elemanları yer değiştirilir:
Yukarda, ilk satırda verilen A matrisinin determinantı hesaplanmış ( |A| ) ve gösterilen yerdeğiştirmiş matris ile skalar (scalar) çarpım yapılmıştır.
Sonuçta elde edilen matris, orjinal A matrisinin tersidir.
Matris 3×3 boyutlarında olsaydı bu hesaplama aşağıdaki şekilde yapılmalıydı:
Görüldüğü üzere matrisin boyutunun değişmesi halinde ters alma işlemi de değişmektedir. Yukarıdaki mantık ile örneğin 4×4′lük bir matris’in tersi alınırken önce 3×3 alt matrislerinin yazılması ardından her bir alt matrisin determinantının yukarıdakine benzer şekilde yerleştirilmesi gerekir.
4×4′lük matrisin tersinin alınması (Utku Bey’in isteği üzerine yazıyorum)
matris tersi alınırken, matrisin boyutunun önemi olunmaksızın determinant alınarak işlem yapılır. Örneğin matris boyutu nxn ise bu matriste (n-1)x(n-1) boyutlarındaki alt matrislerin determinantlarının yer değiştirmiş halleri hesaplanır ve 1/|A| değeri ile skalar çarpım yapılır.
Örneğin matrisimiz aşağıdaki şekilde 4×4 boyutlarında bir matris olsun
Yukarıdaki bu matrisin tersini almak için öncelikle determinantını hesaplayalım:
Ters alma işlemi için determinant sıfırdan farklı olmalıdır. Ardından matrisin tersini alalım:
Buradaki kapalı şekilde yazılan b değerleri ters alma işleminden sonra yapılan yer değiştirmeyi göstermektedir. Yani örneğin b11 değeri, 1. satır ve 1. sütundaki değerleri kapanmış halde matrisin determinantının alınması ile bulunur.
Benzer şekilde b23 değeri için, orjinal matriste bulunan 2. satır ve 3. sütundaki sayılar dışında kalan sayılardan (ki bu sayılar 3×3 boyutlarında bir matris oluşturur) elde edilen determinant değeridir.
Buradaki b değerleri, matrisin verilen satır ve sütun için kofaktörüdür (cofactor).
Bu değerleri açık şekilde yazacak olursak:
şeklinde sayıları sıralayabiliriz.
Yukarıdaki ters alma işlemi kısaca olay iki parçadan oluşuyor, birinci aşamada determinant almanız gerekiyor (nxn boyutundaki bir matris determinantı bilgisayar kullanarak en kolay leibniz yöntemi ile alınır)
ikinci adımda b terimlerini hesaplamanız gerekiyor. Bu terimlerin hesabı için hangi koordinat hesaplanacaksa, o koordinatın satır ve sütunu kapatılıp geri kalan elemanlar bir sarmal şeklinde çarpılır. Bu durumu linkteki örnekten açıkça görebilirsiniz. Örneğin b21 için 2. satır ve 1. sütun kapatılıp kalan elemanlar bir sarmal şeklinde çarpılıp toplanmıştır. Burada mod işlemi ile sarmallık sağlanabilir.
Gauss Jordan Yöntemi
Gelen bir soru üzerine, Gauss Jordan yöntemini adım adım anlatan yeni bir bölüm ekliyorum. Öncelikle yukarıdaki kodda, Gauss Jordan metodunu kullanıyoruz. Bu metotta amaç bir matrisin tersini almak için tersi olan matris ile çarpımını, birim matrise dönüştürmektir.
A x A-1 = I
işlemine göre şayet A matrisinin tersi isteniyorsa
A x B = I , şeklinde yazdığımız B matrisi, A matrisinin tersidir ve
I = A x B , şeklinde yazılabilir.
Buradaki B matrisini elde ederken aslında birim matris üzerinde işlem yapılarak A matrisinin tersi alınmış olur.
Örneğin aşağıdaki matrisi ele alalım:
101
021
111
Bu matrisin tersini alırken öncelikle yanına bir çizgi çekip birim matrisi yazıyoruz:
101|100
021|010
111|001
Buradaki amacımız sol ve sağ tarafta aynı işlemleri yaparak sol tarafta birim matrisi elde etmektir. Böylelikle sağ tarafta matrisin tersi oluşacaktır. Bu satırlar üzerinde yapılan işlemlerre yalın satır işlemleri (elementary row operations) ismi verilir. Bu işlemler aşağıdaki şekilde sıralanabilir:
  • bir satırın bir sabit ile çarpılması
  • Bir satırın diğer bir satır ile yer değiştirmesi
  • Bir satırın diğer bir satırdan çıkarılması
Elbette yukarıdaki bu işlemler, çizginin iki tarafına da uygulanacaktır. Buradaki işlemler aslında bir matriste bir denklemin tutulması durumunda denklemler üzerine yapılan işlemlere benzetilebilir. Örneğin 3 bilinmeyenli 3 denklem ele alınırsa bir denklemin diğer denklemin çözümünde kullanılırken yapılan işlemler gibidir.
Şimdi matrisin tersini alma işlemi ile devam edelim. Amacımız ilk sütunu birim matrise benzetmek. İlk sütunda 3. satırda bulunan 1 tek farklı sayıdır. Dolayısıyla 3. satırın ilk terimini 0 yapabilmek için ilk satırı, 3. satırdan çıkarabiliriz.
101|100
021|010
010|-101
yukarıdaki işlem sonucunda görüldüğü üzere çizginin solundaki ilk satır 3. satırdan ve çizginin sağındaki ilk satır yine çizginin sağındaki 3. satırdan çıkarılmıştır.
çizginin solunda elde edilen 3. satır aslında birim matrisin ikinci satırıdır. O halde 3. satır ile 2. satırı yer değiştirirsek matrisin sol tarafından birim matrise daha çok yaklaşılmış olunur.
101|100
010|-101
021|010
Yine 3. satırı birim matrise benzetmek için bu sefer 2. satırın 2 mislini, 3. satırdan çıkarmak yeterlidir.
101|100
010|-101
001|21-2
Yukarıda görüldüğü üzere çizginin iki yanında da ikinci satır 2 ile çarpılmış ve 3. satırdan çıkarılmıştır.
Sırada ilk satırı birim matrise benzetmek var. Bu işlem için ilk satırdan 3. satırı çıkarmak yeterlidir:
100|-1-12
010|-101
001|21-2
Görüldüğü üzere çizginin sol tarafından birim matri elde edildi. Bu durumda matrisin sağ tarafında elde ettiğimiz matris, ilk matrisin tersidir.
1-12
-101
21-2
sonucunu bulmuş oluruz.
Programlama
Matrisin tersinin alınması işleminin bilgisayarlar marifetiyle yapılması için algoritmik bir yaklaşıma ihtiyaç vardır. Bu bağlamda matrisin boyu ve içeriğinden bağımsız olarka matrisin tersini almak için aşağıdaki yaklaşımı kullanabiliriz.
Bir matrisin tersi, matrisin kendisi ile çarpıldığına birim matrisi veren matristir. Birim matris (identity matrix) ise diyagonu 1 ve diğer elemanları 0 olan matristir.
Öyleyse bir matrisi gerekli işlemleri yaparak birim matrise dönüştürürsek ve bu işlemler sırasında her elemana yapılan değişimi tutarsak sonuçta elde ettiğimiz bu değişim matrisi, orjinal matrisimizin tersi olacaktır.
Aşağıda bu işlemleri adım adım yapan C kodunu yazıp açıklamaya çalışalım.
İlk adımda matris boyutunu ve içeriğini dolduralım.
Kodun ilk kısmında görüldüğü üzere 4×4 boyutlarında bir matris tanımlanmış ve bu matrisin içeriği ekrana bastırılmıştır. Yukarıdaki tanım itibariyle matrisimizin içeriği aşağıdaki şekildedir:
Şimdi bu matrisin tersini alma işlemi sırasında kullanacağımız birim matrisi döngüler ile oluşturabiliriz:
Yukarıdaki kod, köşegeninde (diagon) 1 olan ve diğer elemanları 0 olan bir matris inşa etmektedir. Bu işlem için matrisin satır ve sütun koordinatlarını tutan i ve j döngü değişkenlerinin eşit olması durumu 1, diğer durumlar 0 olarak döngülerde kodlanmıştır.
Şu anda, tersi alınması istenen matris a dizisinde, birim matris ise b dizisinde tutulmaktadır. Yapılaması gereken, a matrisini b matrisine dönüştürmektir.
Yukarıda görüldüğü üzere kodun 24-27. satırları arasında matrisin diyagonu olan değerleri 1 yapacak değerler bulunmaktadır. Bir sayının kendisine bölümü 1′dir. Dolayısıyla matrisin tersi olan sonuç matrisimizdeki, ki şu an itibariyle birim matristir, diyagon değerleri, orjinal matrisin diyagon değerlerine bölünmüştür.
Ardından diyagon olmayan değerler için dönene ve 28. satırda başlayan ikinci döngü ile diyagonda olmayan elemanlardan, diyagondaki elemanla çarpımları çıkarılmaktadır. (kodun 32. satırındaki k değişkeni o satırdaki diyagon değerini vermektedir. Bu değer orjinal matristeki değer ile çarpılıp yine aynı satır ve sütundaki değerden çıkarılmaktadır)
Bu işlem hem orjinal matris hem de sonuç matrisinde bire bir yapılır ve sonuçta sonuç matrisimiz b değişkeni içinde oluşur. Bu değeri bastırmak için aşağıdaki şekilde bir döngü yazılması yeterlidir.
Kodumuzun çalışan hali aşağıda verilmiştir:

1 yorum: