Ödev: 2

FİZ220 - Bilgisayar Programlama II | 10/05/2020

Matrisler, Operatörler

Son gönderim tarihi: 20 Mayıs Perşembe, 23:59
Gönderim şekli: FIZ220_Odev_02Grup#.ipynb isimli jupyter ipynb formatında dosyayı ödev sayfasından göndermek suretiyle
Gönderecek kişi: Grup temsilcisi

Dr. Emre S. Taşcı, emre.tasci@hacettepe.edu.tr
Fizik Mühendisliği Bölümü
Hacettepe Üniversitesi

Matrisler, operatörler

1. Soru: Dönüş operatörü

  1. x-ekseninde, x=1, y=0 noktasında başlıyoruz. (1000x2)'lik bir noktalar matrisi tanımlıyoruz.
  2. $\theta \in [0,360)$ aralığında rasgele bir $\theta$ değeri seçip ($\theta$'nın tam sayı olması gerekmiyor), noktamızı o kadar döndürüyoruz.
  3. Geldiği noktanın x ve y değerlerini noktalar matrisinde kaydediyoruz: matrisin her bir satırı, o elde gelinen koordinatı gösteriyor.
  4. 2-3 adımlarını 1000 kere tekrarlıyoruz (noktanın bir önceki elde geldiği noktadan devam ederek)
  5. noktalar matrisinin x ve y değerlerini tuttuğumuz 0 ve 1 sütunlarının ortalamalarını ekrana yazdırıyoruz
  6. 1-5 adımlarını 30 kere tekrarlıyoruz.

Çözüm

Bu alıştırmadaki amaç, düzgün dağılımın gayet düzgün çalıştığını göstermekti. Döndürmeler sonucunda ulaşılan yeni noktalar koordinat sistemine o kadar güzel yayılmış ki, ortalamaları hemen hemen (0,0) çıkıyor. Her seferinde aynı (1,0) noktasını rastgele bir açıyla çeviriyor olsaydık belki bu normal gelecekti (dönüş açılarının $[0,360^o)$ aralığında olmasından ötürü) ama burada her seferinde kaldığımız yerden yeni bir dönüş yapıyoruz, ona rağmen, gayet güzel, sağlıklı, düzgün bir dağılıma sahip oluyoruz. Hazır ortalamalardan bahsediyorken, bir de "Merkezi Limit Teoremi" (Central Limit Theorem) adı verilen, "dağılımların dağılımları" ile ilgilenen müthiş bir teorem var ki, ona da FİZ371 - Bilimsel ve Teknik Hesaplamalar dersinde ucundan değiniyoruz. 8)

2. Soru: 65.419 (veya -114.581) özdeğerse, 145.544 ne? Üveydeğer mi? 8~(

$$A=\begin{pmatrix}1&2\\3&4\end{pmatrix}$$

matrisini ele alalım: bu matrisin iki tane özdeğeri, onlara karşılık gelen de iki tane özvektörü var. Derste öğrendiğimiz eig() fonksiyonu ile bunları bulalım:

yani:

$$\lambda_1 = -0.372\leftrightarrow u_1 = \begin{bmatrix}-0.825\\0.566\end{bmatrix}$$$$\lambda_2 = 5.372\leftrightarrow u_2 = \begin{bmatrix}-0.416\\-0.909\end{bmatrix}$$
  1. Her bir özvektörün x-ekseni ile yaptığı açıyı hesaplayın. (145.544 ve -114.581 derece bulacaksınız - buraya kadar bir sıkıntı yok 8)

Çözüm

Özvektörleri yine derste öğrendiğimiz "vura vura buldurma" metoduyla bulmaya çalışalım:

  1. Bileşenleri ${x,y}\in [-1,1]$ aralığında olan iki boyutlu rasgele bir k vektörü oluşturun (bileşenler tamsayı olmak zorunda değil)
  2. Bu vektörün yatayla yaptığı açıyı hesaplayın
  3. Vektörün üzerine A matrisini etki ettirin, ortaya çıkan vektörün yatayla yaptığı açıyı hesaplayın -- bu açıyla, bir önceki hesapladığınız açı arasındaki fark 0.0001 dereceden küçük olana kadar bu adımı tekrarlayın (kaç adımda bu küçük farka ulaştığınızı ekrana yazdırın). Yani k vektörüne matrisimizi etki ettirdik, diyelim ki k' vektörünü elde ettik, aralarındaki açı 0.0001 dereceden büyükse, matrisi k' vektörüne vurdurup, bu sefer k'' vektörünü bulduk. Şimdi açı kontrolünü k' ile k'' arasında yapıyoruz: yani hep şimdi hesapladığımız açı ile bir önceki hesapladığımız açı arasında oluyor bu kontrol.
  4. En son elde ettiğiniz vektörün boyunu 1 olacak şekilde ayarlayın, yönü aynı kalsın (anahtar terim: "normalize etmek" 8) Açıyı ve vektörü yazdırın.
  5. 1-4 arasını 20 kere tekrarlayın. Bulduğunuz açı 145.544 veya -114.581'den biri mi? Değilse niye değil, durumu kurtarabiliyor musunuz? ;)

Ultra Bonus Soru: 1-4 adımlarını 1000 kere tekrarlayın -- her seferinde aynı özvektöre mi gitti? Eğer öyle ise bu metotla diğerine nasıl ulaşırız?

#5
Yukarıdaki kodu kaç kere çalıştırırsanız çalıştırın sonuç olarak %99.999999... ihtimalle şu iki vektör (ve açıdan) birini bulacaksınız:

$$a_1 = \begin{bmatrix}{0.416\\ 0.909}\end{bmatrix}, \theta_1 = 65.419^o$$$$a_2 = \begin{bmatrix}{-0.416\\ -0.909}\end{bmatrix}, \theta_2 = -114.581^o$$

İkinci vektörü zaten 0. adımdan yaptığımız hesaptan biliyorduk. Buradaki iki açının arasındaki farkın 180 derece olduğu, buna ek olarak da iki vektörün birbirlerinin zıttı oldukları da bize bir şey anlatıyor: bu vektörlerin aynı doğru üzerinde olduklarını. Yani bu iki vektör iki farklı özvektör değil. Bildiğiniz üzere $\vec{u}$ bir özvektörse, herhangi bir skalerle çarpılmış hali de aynı özdeğerli özvektördür, yani matrisimizin etkimesi altında dönmez, boyu da özdeğer kadar ölçeklenir (bu gerçeği "Bariz bilgi" başlığıyla "Lineer Cebir" uygulama dersimizde ispatlamıştık).

Demek ki bu metotla aslında aynı özvektörü bulup duruyormuşuz. 145.544 derecelik açı yapan $$\lambda_1 = -0.372\leftrightarrow u_1 = \begin{bmatrix}-0.825\\0.566\end{bmatrix}$$ $\lambda_1$ özdeğerli $u_1$ özvektörü bu metotla gerçekten de üvey evlat muamelesi görüyor.

Son olarak bizim bulduğumuz ve bulamadığımız iki özvektör yön doğrusunu hatıra olarak yan yana çizelim:

Grafikte kırmızı doğru bizim bu metotla bulduğumuz özvektör yönünü (x ekseniyle -114.581 = 65.419 derecelik açı yapan), mavi doğru ise bulamadığımız yönü (x ekseniyle 145.544 = -34.456 derecelik açı yapan) göstermekte.

Ultra bonus kısmı

Bu notkadan sonrası, işlerin biraz ciddiye bindiği kısım, o nedenle sadece ilgisi ve merakı olanların devam etmesini tavsiye ederim, zira kafa karışıklığı yaratabilir.

(2x2)'lik $A$ matrisinin, iki boyutlu bir düzlemdeki vektörleri onların değerlerine (boy & yön) göre çevirip ölçeklendireceğini biliyoruz. Eğer bu vektörler yukarıdaki grafikte işaretlediğimiz doğrulara paralel iseler, sadece boyları ölçekleniyor (kırmızı doğrunun üzerindeyse boyu $\lambda_2 = 5.372$ kadar uzuyor; mavi doğrunun üzerindeyse bu sefer de $\lambda_1 = -0.372$ kadar (yani önce yönü zıt yön oluyor (-), ardından da boyu 0.372 oranında kısalıyor).

Vektörleri -yönlerini ve boylarını değiştirmediğimiz sürece- istediğimiz gibi taşıyabiliriz. O halde gelin başlangıç noktaları orijin olacak şekilde hepsini taşıyalım:

Böyle de çok karışık oldu. Zaten orijinden başladıklarını bildiğimizden, sadece uçlarını işaretleyelim:

(önce vektörler + uç noktaları yapalım, ardından sadece uç noktalarını gösterelim)

(Bu kırmızı noktaların her birinin bir vektörü temsil ettiğini aklımızda tutarak), $A$ operatörünü bu vektörlere vurduralım ve çıkan vektörün boyunu ve yönünü kullanarak, vektörümüzün ne yöne nasıl bir dönüşüm geçireceğini oklarla gösterelim:

Hazır yapıyorken, bizim özvektörlerimizin yönlerini gösteren doğruları da grafiğe ekleyelim:

Bu da epey karmaşık görünüyor -- en iyisi sadece kırmızı noktaların olduğu yeri gösteren konum vektörlerinin $A$ operatörünün vurması sonucu gidecekleri yön ve -orantılı- mesafeyi gösteren oklarla özvektör doğrularını gösterelim:

Bir daha hatırlatmak gerekirse, kırmızı doğru bizim bu ödevde kullandığımız metotla bulduğumuz özvektör yönü; mavi doğru ise bu metotla ulaşamadığımız yönü gösteriyor. Gerçekten de tam mavi doğrunun üzerinde olmayan herhangi bir noktadan başladığımızda oklar bizi kırmızı çizgiye (vektör yönlerinden bahsettiğimizden "kırmızı çizgiyle paralel yönlere" diyoruz aslında) doğru sürüklüyor, bu nedenle kendimizi kırmızı çizginin üzerinde buluveriyoruz (ayrıca yukarıdaki grafikten açıkça görüldüğünü umut ettiğim üzere, mavi çizginin yukarısında bir noktadan (örneğin: (0,1)) başladığımızda kırmızı çizginin 65.419 derecelik açı yapan kısmına (yani yukarı doğru giden kısma); mavi çizginin altında bir noktadan (örneğin: (-1,0)) başladığımızda ise kırmızı çizginin -114.581 derecelik açı yapan kısmına (yani aşağıya doğru giden kısma) denk gelmekteyiz -- metodumuzun başlangıç değerine göre 65.419 veya -114.581 derece vermesinin sebebi bu.

Sonuçta tam olarak mavi çizginin üzerinde, yani birinci özvektörün yönünde bir yerde başlamadığımız sürece "dalgalar" bizi sürükleyecek, kendimizi kırmızı çizginin, yani ikinci özvektörün yönünde bulacağız.

Az evvel yapmış olduğumuz "dalgalar" benzetmesi güzel bir analoji olabilir ama daha iyisi var: üzerinde ok figürlerinin olduğu bir masa örtümüz olduğunu düşünün. Bunu mavi çizgi boyunca sıradağların, kırmızı çizgi boyunca da vadilerin/kanyonların/hendeklerin/çukrların olduğu bir yere örttüğümüzü aklımızda canlandıralım. Normal durumda masa örtümüzün üzerindeki oklar birbirlerine paraleller (örtünün ortasının üstündekiler yukarı doğru, altındakiler aşağı doğru çizilmişler). Örtümüzün orta çizgisini mavi çizginin üzerine gelecek şekilde serip, yukarıdan baktığımızda görürüz ki, altındaki yükseklikten ötürü, mavi çizginin etrafındaki oklar birbirinden ayrık dururken, kırmızı çizginin etrafındaki oklar giderek birbirine yaklaşırlar.

Yani mavi çizginin (yüksek bir tepenin) yanından bir top bıraksak, bu top gidip gidip nihayetinde kırmızı çizginin (vadinin) içine girecektir.

Peki durum buysa, mavi çizgiyi hiç mi bulma şansımız yok? Tabii ki var: ters yüz etmek! Yani tepeleri çukur, çukurları tepe olarak tanımlarsak (matematiksel olarak okların yönünü tersine gösterirsek) bu işi yapmış oluruz:

Artık bütün oklar mavi çizgiye getiriyor! 8)

Bu dediğimizi matematiksel olarak nasıl ifade edebiliriz? Elimizde bir $\vec{a}$ vektörü olsun. Bunu $A$ matrisiyle çarptığımızda kırmızı doğrultuya doğru döndürülüp uzatılacak bu yeni vektörü de $\vec b$ ile gösterelim.

Örneğin, $\vec a = \begin{bmatrix}1.0\\0.5\end{bmatrix}$ için:

Burada siyah "eksenler" birinci ve ikinci özvektör doğrultularını göstermektedir (çizgi-çizgi: birincil (145.544 derecelik) doğrultu; nokta-nokta: ikincil (-114.581 derecelik) doğrultu).

Mavi $\color{blue}{\vec a}$ vektörümüzü kırmızı $\color{red}{\vec b}$ vektörüne götüren değişikliğe de $\color{green}{\vec c}$ vektörü deyip, yeşille gösterelim:

Grafikten de açıkça görüldüğü üzere: $$\color{blue}{\vec a} + \color{green}{\vec c} = \color{red}{\vec b}$$ olur.

"Tepeleri çukura, çukurları tepelere çevirmek" demek, mavi okun ucundan bıraktığımız topumuzun yeşil ok doğrultusunda yukarı doğru kayması yerine zıt yönde kayması anlamına geliyor. Yani:

(yukarıdaki denklemden) $$\color{green}{\vec c} = \color{red}{\vec b} - \color{blue}{\vec a}$$

$\color{green}{\vec c}$ vektörünü tersine çevirip $\color{blue}{\vec a}$ vektörüne eklemek demek:

$$\vec a - \vec c = \vec a - (\vec b - \vec a) = 2\vec a - \vec b$$

Görüldüğü üzere, bu yaklaşım başlangıç vektörümüzü 2. özvektör doğrultusu yerine 1. özvektör doğrultusuna yöneltiyor.

İşimiz neredeyse bitti ama atlatmamız gereken son bir tehlike var: Yönlendirmeyi tersine aldık ama ölçeklendirme genel olarak hala arttırıcı şekilde davranacak (2. özvektör doğrultusuna yaklaştıkça ölçeklendirme de o özvektörün özdeğerine (5.372 katı) yaklaşıyordu). Bu nedenle değişim miktarının boyunu her seferinde $\vec{b}$'nin boyunu yarılayarak kontrol altında tutuyoruz.

Bu bulgularımızı uyguladığımızda, metodumuz artık diğer özvektöre yakınsayıp onu bulabiliyor!