4 Şubat 2 Pazartesi günü uygulamada çözdüğümüz 2. Soruyu, aynı sıra ile bu defa MATLAB kullanarak çözelim. MATLAB programı sembolik çözümler yapabilmekle birlikte, problemleri numerik olarak çözmeye yarar. Lisansı ücretli olan fakat İTÜ içinden erişebileceğiniz bu programa benzeyen ücretsiz programlar da bulunmaktadır. (Octave, Numpy, Scipy, Scilab gibi) Bunların kullanımı da MATLAB a benzemektedir. MATLAB programını açtığınızda karşınızda kutlarınızı çağırabileceğiniz bir command window göreceksiniz. Biz komutlarımızı bir dosyaya saklamak istediğimizden, bir editör yardımıyla kodumuzu yazıp, daha sonra çalıştıracağız. Herhangi bir editör kullanabilirsiniz, ancak renklendirmeleri size yardımcı olacağından ben MATLAB editörünü tavsiye ederim. Şekil : MATLAB Görünüm Şekil de görüldüğü gibi command window ve editöre ek olarak çalışmanızda kullandığınız değişkenleri, matrisleri, vektörleri görebileceğiniz workspace, çalıştığınız klasörün içreriğini gösteren current directory ve son kullandığınız komutları listeleyen command history pencereleri vardır. Kodunuzu teslim edeceğiniz için, komutlarınızı editor yardımıyla bir dosyaya yazıp.m uzantılı olarak kaydedebilirsiniz. Böylece daha sonra aynı kodu, yazdığınız dosyayı çağırarak tekrar kullanabilirsiniz.
İlk önce soruda verilen matrisleri tanımlayalım. A Şeklinde verilen A matrisini A = [- ;- -]; İle yazabiliriz. Bir matris, [] ile tanımlanır. Matrisin sütunlarını ayırmak için sayılar arasında boşluk bırakmak yeterlidir. Matrisin satırları ise ; ile ayrılır. Satır sonuna koyulan ; işareti ise command windowda sonuçların yazdırılmamasını sağlar. Kısaca ikiye ikilik bir matris Matris = [a a2; a2 a22]; Şeklinde yazılabilir. Benzer şekilde B matrisi de B=[ ; ]; olarak tanımlanabilir. Henüz yazdığınız koddan tam olarak emin olamadığınız için, kodunuzu satır satır çalıştırmayı deneyeceksiniz. Bunun için çalıştıracağınız komutu/komutları seçili hale getirip, sağ tık ile Evaluate Selection (kısayol:f9) diyebilirsiniz. A ve B matrislerini tanımladığınız satırları çalıştırdığınızda workspace te bu matrisleri göreceksiniz. Şimdi devrenin kararlı olup olmadığını görmek için A matrisinin özdeğer ve özvektörlerini hesaplayalım: [ov od]= eig(a) eig(a) komutu A matrisinin özdeğer ve özvektörlerini hesaplamak için kullanılır. Herhangi bir işlem için bir MATLAB komutu olup olmadığını MATLAB yardımı kullanarak bulabilirsiniz. Örneğin Help penceresini açıp eigenvalue kelimesini aradığınızda, bu komutu bulacaksınız. Bu komutun ne iş yaptığını ve nasıl kullanıldığını kısaca öğrenmek isterseniz command window a help eig yazın. Yukarıdaki komutu seçip çalıştırdığımızda, komutun sonuna ; koymadığımız için command window da aşağıdakileri göreceğiz: ov =.77.77 +.77i -.77i od = -. +.i -. -.i Özdeğerler od matrisinin diagonalında verilmiş. Birinci özvektör, ov matrisinin birinci sütunu, ikinci özvektör ise ov sütununun ikinci sütunu. (Özvektörler bizim derste hesapladıklarımızla aynı değil, ama farklı özvektör çiftleri bulabileceğinizi biliyordunuz.)
Birinci özdeğeri od değişkenine atayalım: od=od(,); Benzer şekilde od vektörünün 2,2 elemanı olan ikinci özdeğeri de od2=od(2,2); olarak yazabiliriz. Değişken sayısını arttırmak bize bir şey kazandırmayacağından, bu iki komutu çalıştırmaktansa, birinci özvektörü kullanmak istediğimiz yerde od(,) yazabiliriz. Ancak kodun anlaşılırlığı açısından da yeni değişken tanımlamak faydalı olabilir. Özdeğerleri command window da görüntüleyerek özdeğerlerin jw eksenine göre yerini tayin edebilir, dolayısıyla devrenin kararlı olup olmadığını anlayabiliriz. Şimdi durum geçiş matrisini bulmak için M matrisini bulalım. M=[ov(:,)*exp(od(,)*t) ov(:,2)*exp(od(2,)*t)]; * İşareti çarpma yapmak için kullanılır, e d ise exp(d) komutu ile hesaplanabilir. M matrisinin birinci sütunu birinci özvektör ile e λ.t nin çarpımı olduğuna göre, matrisin birinci sütun ov(:,)*exp(od(,)*t) ile hesaplanabilir. Gördüğünüz gibi, bir matrisin. sütununu ov(:,) yazarak seçebiliyoruz. Benzer şekilde. satırını da ov(,:) şeklinde seçebilirdik. Dikkat ederseniz, biz şimdiye kadar t değeri tanımlamadık. MATLAB ile şu anda numerik işlem yaptığımıza göre, t için de bir değere ihtiyacımız var. Bu sebeple öncelikle t= için M() değerini hesaplayalım: t=; M_=[ov(:,)*exp(od()*t) ov(:,2)*exp(od(2)*t)]; Bize bu matris değil, bunun tersi gerekiyor. Yardımda inverse ararsanız matris tersini alan komutu kolayca bulabilirsiniz: M ters=inv(m_); Şimdi düşünelim, bizim her t değeri için M(t) matrisini kaydetmeye ihtiyacımız var mı? Yok, ama grafik olarak çizdirmek istediğimiz özçözüm = Φ(t).x(). Doğrudan Φ(t).x() değerlerini de kaydedebiliriz. adet t değeri için özçözümü hesaplayıp bir matrise nasıl yazabiliriz? Aradığımız x oz (t) iki satırlı bir vektör. Her bir t değeri için bulduğumuz değeri matrisin ilgili sütununa yazabiliriz. MATLAB satır ve sütun indisleri için sadece pozitif tam sayıları kabul eder. Oysaki bizim ilgilendiğimiz t değerleri pozitif reel sayılar. Bu sebeple ben matris işlemlerinde kullanabileceğim bir T değişkeni tanımlıyorum. Aşağıda t nin değeri için özçözümü hesaplayan bir for döngüsü var. Her for döngüsü end komutu ile bitmek zorunda. Döngünün tamamını çalıştırmak için de for ve end satırlarının seçili olduğuna emin olun. x_=[;]; for T=:; t=t/; x_oz(:,t)=[ov(:,)*exp(od(,)*t) ov(:,2)*exp(od(2,2)*t)]*m ters*x_; end Yukarıdaki döngüye göre, matrisin değeridir. birinci sütunu (T= iken), t=. için hesaplanan özçözüm
İki adet durum değişkenimizin zaman içinde aldığı özçözüm değeri x_oz matrisinin satırlarında verilmiş oldu böylece. Başka bir değişle, x_oz(,:) x için özçözümü verir. İki çözümü de üst üste çizdirelim: figure; plot(x_oz(,:));hold all; plot(x_oz(2,:)); Figure komutu bir resim penceresi açar. plot(vektor) komutu bir vektörün elemanlarını sıra ile çizer. Aynı figür üzerine başka eğriler de çizmek istiyorsak hold on deriz, aksi takdirde ikinci defa plot komutunu çalıştırdığımızda ilk çizdiğimiz eğri siliniz. Önceki eğrileri kaybetmemenin bir yolu da her bir plot komutundan önce figure komutu ile yeni bir pencere açmaktır. Şekil 2: Özçözüm Ben yukarıdaki gibi bir resim elde ettim. Çizgilerin rengiyle, şekliyle, eksen isimleri ile oynayıp, eğrilerin ismini komutlarla da değiştirebilirsiniz ya da sağ taraftaki show plot tools and dock figure butonuna basabilirsiniz.
Şekil 3: Şekil özelliklerini değiştirme Şekil 3 teki gibi elde ettiğiniz grafiğin görsel özellikleri ile oynayabilir, daha sonra istediğiniz formatta kaydedebilirsiniz save as diyerek..fig uzantılı dosyalar, tekrar bu pencere ile açmaya dolayısıyla daha fazla değişiklik yapmaya ve değerleri okumaya izin verir. Özel çözüm önerip, A, A2,B,B2 değerlerini bulalım. A A2 B B2 Denklem takımını MATLAB kullanarak çözelim. Ax=[- - ; - ; - - -; - - ]; b=[-; ; ; -]; AB = inv(ax)*b
command window da karşımıza çıkan sonuç: AB =.4.2.2 -.4 Özçözümü bulduğumuz gibi özel çözümü de bulabiliriz: x_ozel_=[ab(2); AB(4)]; for T=:; t=t/; x_tam(:,t)=[ov(:,)*exp(od()*t) ov(:,2)*exp(od(2)*t)]*m ters*x_ + [AB()*sin(t)+ AB(2)*cos(t); AB(3)*sin(t)+AB(4)*cos(t)] -[ov(:,)*exp(od()*t) ov(:,2)*exp(od(2)*t)]*m ters*x_ozel_; end figure; plot(x_tam(,:));hold all; plot(x_tam(2,:)) Fazör kavramından yararlanarak Öncelikle kaynakları ve açısal frekansı tanımlayalım: w=;u=[/sqrt(2); -i/sqrt(2)]; i ve j eğer kod içinde başka şekilde atanmadılarsa olarak tanımlıdırlar. Bir sayının karekökünü almak için sqrt(sayı) ya da sayı^(/2) komutları kullanılabilir. Çözümü bulabilmek için, U ikiye ikilik birim matris olmak üzere, x = (jwu-a) - Bu işlemini aşağıdaki şekilde yapabiliriz: x=inv(i*w*eye(2)-a)*b*u; Burada birim matris eye(2) komutu ile tanımlanmıştır. (ara: identity matrix) İşlemin sonucunda 2 elemanlı bir sütun vektör elde edilir. Birinci eleman x, ikinci eleman ise x2 olur: x=x(); x2=x(2); Bu iki karmaşık sayının genliği ve açısı kullanılarak işaretin efektif değeri ve fazı elde edilebilir: X=abs(x);faz=angle(x); X2=abs(x2);faz2=angle(x2); Şimdi tek yapmamız gereken yukarıdaki değerler ile bir kosinüs eğrisini zamanın fonksiyonu olarak çizdirmek. Bunun için bu defa bir for döngüsü kullanmak yerine, öncelikle bir t vektörü tanımlayabiliriz. t=:.:; figure; plot(sqrt(2)*x*cos(w*t+faz));hold all; plot(sqrt(2)*x2*cos(w*t+faz2));