MATLAB/SIMULINK E BAŞLANGIÇ Hazırlayan: YUSUF ONUR KOÇBERBER Yokocbeber(at)etu edu tr TOBB EKONOMİ VE TEKNOLOJİ ÜNİVERSİTESİ ELEKTRİK VE ELEKTRONİK MÜHENDİSLİĞİ 01.01.2008 v1. 25.02.2009 v2.
İçindekiler Matlab a Başlangıç... 3 Vektörler... 4 Matrisler... 6 Çizgeler... 9 Polinomlar... 12 Transfer Fonksiyonu ve Durum Uzayı Gösterimi... 14 Analiz... 17 Simulink... 20 2
Matlab a Başlangıç Yeni M File Simulink Workspace Çalışma Klasörü Command Window Komut Geçmişi Kılavuz boyunca sık kullanılacak Matlab elemanları yukarıda işaretlenmiştir. Çalışma klasörü olarak belirtilen Current Directory aksi belirtilmedikçe yapılan tüm çalışmaların kaydedildiği klasördür. Birbirine bağlı m dosyaları çalıştırılacaksa tüm dosyaların bu klasörde olması gerekmektedir aksi takdirde m dosyası içinde dosyanın bilgisayardaki konumu tam olarak belirtilmelidir. Çalışmalar sırasında yararlı bir kaç komut: clc: Command window u temizlemektedir. whos: Workspace deki değişkenlerle ilgili bilgileri göstermektedir (özellikle iki değişkenin boyutu uyuşmadığında kontrol etmek amacıyla kullanılır) clear Değişkenİsmi: İlgili değişkeni workspace den siler. help Fonksiyonİsmi: İlgili fonksiyon hakkında özet bir yardım gösterir. syms Değişkenİsmi: ilgili değeri değişken yapar (türev, integral gibi sembollerin kullanıldığı işlemler için). 3
Vektörler Vektörler 1xn boyutlu matrislerdir. Bir vektör tanımlamak için: Command Window a >> a = [1 2 3 4 5 6 9 8 7] komutunu giriniz. Böylece aşağıdaki sonuç elde edilir. Görüldüğü üzere a değeri Workspace penceresinde yerini almıştır. Bu pencereden işlemler sırasında kullanılan tüm parametreler ve onlarla ilgili çeşitli bilgiler (boyutu, en büyük değeri, en küçük değeri, boyu vs.) görülebilir. Benzer şekilde 0 ile 100 arasında eşit dağılmış 5 elemanlı bir vektör yaratmak için >> a=0:20:100 Sonuç: a = 0 20 40 60 80 100 a=0:20:100 gösterimi 0 dan başlayarak 100 e kadar her adımda bir sonraki elemana 20 eklemektedir. a vektörünün ilk elemanına ulaşmak istenildiğinde a(1) komutu kullanılmaktadır. >> a(1) ans = 0 Not: Çoğu programlama dillerinin aksine MATLAB dizilerin ilk elemanını 0 değil 1 olarak indekslemektedir. Bu sebepten dolayı ilk elemana ulaşmak için a(1) komutu kullanılmıştır. 4
Çarpım A vektörünü ile birlikte ikinci bir b vektörü yaratalım. >> b= a - 5 b = -5 15 35 55 75 95 A ile b vektörünü çarpıp c adlı yeni bir matrise atamak istiyoruz. Bu durumda c= a * b komutunu kullanırsak; >> c= a * b??? Error using ==> mtimes Inner matrix dimensions must agree. Yukarıdaki hata ile karşılaşılır. Bunun nedeni * işleci matris çarpımı yapmaktadır yani iki tane 1xn boyutundaki matrisi çarpmak mümkün değildir. Burada vektör çarpımı yapılması gerekmektedir. Vektör Çarpımı işleci.* şeklindedir. >> c= a.* b c = 9500 0 300 1400 3300 6000 Görüldüğü üzere a ve b vektörlerinde konum itibariyle karşılıklı elemanlar birbirleriyle çarpılmıştır. Not: Benzer şekilde kuvvet işleçi de (^) vektör işlemleri için.^ şeklinde kullanılmalıdır. 5
Matrisler Matrisin tanımlanması: Matrisler tanımlanırken değişik yollar bulunmaktadır. En genel yol yeni bir satır için ; kullanılmasıdır. >> a=[1 2 ; 3 4] a = 1 2 3 4 Bir başka yol ise: >> b = [ 1 2 3 4 ] b = 1 2 3 4 Matris değerleri girilirken workspace deki değer isimleri veya sanal sayılar kullanılabilir. Sanal sayılar için i veya j kullanılabilir. Not: Eğer i veya j değişkenine daha önce başka değer atamışsanız bu değişkeni sqrt( 1) e eşitlemeniz yeterlidir. Matrisin Transpozu Daha önceden tanımlanan b matrisinin transpozunu almak için ; >> b' ans = 1 3 2 4 6
Matrisin Tersi Daha önceden tanımlanan b matrisinin tersini almak için ; >> inv(b) ans = -2.0000 1.0000 1.5000-0.5000 Matrisin Özdeğeri Daha önceden tanımlanan b matrisinin özdeğerlerini bulmak için ; >> eig(b) ans = -0.3723 5.3723 Vektör veya matris tanımlarken, kolaylık amacıyla tüm elemanları 0 tanımlamak için zeros, tüm elemanları 1 tanımlamak için ones, tüm elemanları rastgele sayılardan oluşturmak için rand fonkisyonu kullanılabilir. >> zeros (5,1) ans = 0 0 0 0 0 Dizilere uygulanan fonkisyonlar length(a): a dizisinin eleman sayısı yani uzunluğu size(a): a dizisinin boyutu sum(a): a matrisinin sütun başına eleman toplamı (eğer sadece sütün veya satır matrisiyse tüm elemanların toplamını verir) kd(n): kd dizisinin n. eleman değeri A(n,:): A matrisinin sadece n. satırı A(:,n): A matrisinin sadece n. sütunu 7
A : A matrisinin transpozu yani devriği det(a): A matrisinin determinantı inv(a) : A matrisinin tersi diag(a): A matrisinin ana diagonel (çapraz) elemanları [v,d]=eig(a): A matrisinin özvektörleri ve özdeğerleri Elemanter işlemler: Eleman eleman işlem demektir ve. (nokta) işleci kullanılır: Çarpma:.*, Bölme:./, Üs alma:.^ 8
Çizgeler Matlab daki en önemli fonksiyonlardan biri plot fonksiyonudur. Plot(x,y) şeklinde belirtilen bu komutta x değerleri çizgenin yatay eksenine, y değerleri çizgenin düşey eksenine çizilecektir. Örneğin; >> t=0:0.1:5 şeklinde zaman değerlerimizi belirleyelim, >> y=sin(2*pi*t) >>plot (t,y) Bu noktadan sonraki komutları m dosyasına yazmak daha yararlı olacaktır çünkü bir çok komutu arkaya tek satırlık komut penceresine yazmak zaman kaybettirmektedir. Yeni bir m dosyası açmak için File>New>M File Gelen editörün içine yeni değerleri tanımlayınız : t=0:0.1:10; y= 2.^(10-t); plot (t,y,'r:') title ('çizge 1') xlabel (' x ekseni') ylabel ('y ekseni') Dosyayı kaydedip Debug>Run dosyaismi veya kısayol olarak F5 tuşuna basınız. 9
Örnekte görüldüğü üzere plot fonksiyonuna eklenen r: terimi grafiği kırmızı ve noktalı yapmıştır. Başka renkler için g,b,c,m,y,k,w gibi belirteçleri, değişik şekiller için., o, x, ^, +, *., belirteçleri deneyebilirsiniz. Örneğin g grafiği yeşil ve çizgili b* mavi ve yıldızlı göstermektedir. Xlabel ve Ylabel fonksiyonları ile x ve y eksenine eksen ismi formatında istenilen isimler verilebilir. Aynı m dosyasının en sonuna axis tight komutunu ekleyip m dosyasını tekrar çalıştırınız. Görüldüğü üzere grafiğin eksenleri çizdirilen fonksiyonun minimum ve maksimum değerlerine göre ayarlanmıştır. Axis komutu grafiklerin daha anlaşılır olması için önemli bir araçtır ve her zaman plot tan sonra kullanılır. Bu komutun bir diğer kullanımı ise axis([xmin, xmax, ymin, ymax]) şeklindedir. Bu sayede görmek istediğimiz grafiğin eksenlerinin en küçük ve en büyük değerleri ayarlanabilir. Birden Çok Grafiği Yönetmek Birden fazla grafiği (aynı x ekseni baz olmak üzere) üst üste çizmek için; Örneğin: x,y1,y2,.yn için; 1.yol: plot(x,y1,x,y2,..x,yn) 2.yol: plot(x,y1), hold on, plot(x,y2,..x,yn) Çoklu grafiği etiketlemek için: 1.yol: Grafik üzerinde metin ekleme yapılır. 2.yol: legend( 1.grafikmetin, 2.grafikmetin.) fonksiyonu kullanılır. Birden fazla grafiği farklı pencerelerde (aynı veya farklı x ekseni baz olmak üzere) çizmek için subplot(m,n,p) fonksiyonu kullanılır. Bu fonksiyon matris düzeninde çizim alanı açar ve grafikler yine plot fonksiyonu ile çizilir. 10
Örnek: Hold on komutu ile grafiklerin üst üste çizilmesi t = 0:0.01:1 ; x= 0:0.1:10; y = x.^(t); plot(t,y,'b:') hold on z = sin(2*pi*t); plot(t,z,'r+') w = y.*z; plot(t,w,'g--') legend('x^{t}','sin(2*\pi*t)','x^{t}sin(2*\pi*t)') axis tight grid on Örnek: Aynı grafiklerin subplot komutu ile ayrı ayrı pencerelerde çizilmesi; subplot (3,1,1) t = 0:0.01:1; x= 0:0.1:10; y = x.^(t); plot(t,y,'b:') title ('x^{t}') legend('x^{t}') grid on subplot (3,1,2) z = sin(2*pi*t); plot(t,z,'r+') legend ('sin(2*\pi*t)') title ('sin(2*\pi*t)') grid on 11
subplot (3,1,3) w = y.*z; plot(t,w,'g--') legend('x^{t}sin(2*\pi*t)') title ('x^{t}sin(2*\pi*t)') grid on Polinomlar Matlab polinomları bir vektör ile tanımlar. Örnek olarak ; 3s 4 +6s 3 3s 2 +10s+1 Polinomu aşağıdaki vektör ile tanımlanır. >> A=[ 3 6-3 10 1] A = 3 6-3 10 1 Eğer arada eksik katsayılar varsa bu katsayılar 0 ile gösterilir. Örnek olarak; 7s 4 +10 >> A=[7 0 0 0 10] A = 7 0 0 0 10 12
Polinomun değerini bulmak için polyval fonksiyonu kullanılabilir. Örneğin a=[7 0 0 0 10] polinomunun s=3 teki değerini bulmak için ; >> polyval([7 0 0 0 10],3) ans = 577 Aynı yöntemi kullanarak polinom çizdirilebilir. Örnek: t=-5:0.1:3 A=[1 2-10 -7 4] plot(t,polyval(a,t)) 200 150 100 50 0-50 -5-4 -3-2 -1 0 1 2 3 Görüldüğü üzere grafik y=0 eksenini 4 kere kesmektedir. Köklerin tam yeri roots komutu ile tespit edilebilir. >> roots (A) ans = -4.0000 2.6180-1.0000 0.3820 13
Transfer Fonksiyonu ve Durum Uzayı Gösterimi Transfer fonksiyonunu belirtmek için öncelikle pay ve paydayı tanımlamak gerekmektedir. Bunun için >> num=[1] num = 1 >> den=[1 14 56 160] den = 1 14 56 160 >> tf(num,den) Transfer function: 1 ------------------------- s^3 + 14 s^2 + 56 s + 160 Aynı şekilde bu transfer fonksiyonun durum uzayı gösterimlerinden biri aşağıdaki gibidir. y= Bu gösterimi Matlab a aktarmak için ss(a,b,c,d) şeklinde bir gösterim kullanılmalıdır. >> a=[0 1 0 ; 0 0 1; -160-56 -14] a = 0 1 0 0 0 1-160 -56-14 >> b=[0 ;1 ; -14 ] >> c=[1 0 0 ] >> d=[0] a,b,c,d matrisleri tanımlandıktan sonra ss komutu ile gösterim tamamlanır. 14
>> ss(a,b,c,d) a = x1 x2 x3 x1 0 1 0 x2 0 0 1 x3-160 -56-14 b = u1 x1 0 x2 1 x3-14 c = x1 x2 x3 y1 1 0 0 d = u1 y1 0 Transfer fonksiyonundan durum uzayı gösterimi veya durum uzayı gösteriminden transfer fonksiyonu elde edilebilir. Daha önceki örnekte transfer fonksiyonu num ve den isimleri ile tanımlanmıştı. Durum uzayı gösterimini A,B,C,D matrislerine aktarmak için ; >> [A,B,C,D]=tf2ss(num,den) A = B = C = D = -14-56 -160 1 0 0 0 1 0 1 0 0 0 0 1 0 15
Aynı şekilde durum uzayı gösteriminden transfer fonksiyonu çıkarılabilir. Bunun için ss2tf komutu kullanılır. Yukarıdaki örneklerde kullandığımız a,b,c,d matrislerini kullanırsak; >> [pay,payda]=ss2tf(a,b,c,d) pay = 0 0.0000 1.0000 0.0000 payda = 1.0000 14.0000 56.0000 160.0000 16
Analiz Elde edilen gösterimleri analiz etmek için Bode çizgesi Adım cevabı Dürtü cevabı Kutuplar ve sıfırlar bulunabilir. Daha önceden elde ettiğimiz pay ve payda değişkenlerini sistemin_transfer_fonksiyonu isimli bir değişkene atayalım. >> sistemin_transfer_fonksiyonu=tf(num,den) Transfer function: 1 ------------------------- s^3 + 14 s^2 + 56 s + 160 Bode çizgesi için; >>bode(sistemin_transfer_fonksiyonu) -40 Bode Diagram Magnitude (db) -60-80 -100-120 0 Phase (deg) -90-180 -270 10-1 10 0 10 1 10 2 Frequency (rad/sec) Grafikte istenilen noktalara tıklanarak ilgili değerler alınabilir. 17
Adım cevabı için ; >>step(sistemin_transfer_fonksiyonu) 8 x 10-3 Step Response 7 6 5 Amplitude 4 3 2 1 0 0 0.5 1 1.5 2 2.5 3 Time (sec) Yüzde aşım, yükselme zamanı,tepe değeri gibi değerler grafikte ilgili yerlere tıklanarak ölçülebilir fakat 2007 ve sonrası sürümlerde stepinfo komutu bulunmaktadır. >> stepinfo(sistemin_transfer_fonksiyonu) ans = RiseTime: 0.4526 SettlingTime: 2.0948 SettlingMin: 0.0060 SettlingMax: 0.0072 Overshoot: 14.7300 Undershoot: 0 Peak: 0.0072 PeakTime: 1.0067 18
Dürtü cevabı için; >> impulse(sistemin_transfer_fonksiyonu) 14 x 10-3 Impulse Response 12 10 8 Amplitude 6 4 2 0-2 -4 0 0.5 1 1.5 2 2.5 3 3.5 Time (sec) Sistemin kutupları pole komutu ile bulunur. >> pole(sistemin_transfer_fonksiyonu) ans = -10.0000-2.0000 + 3.4641i -2.0000-3.4641i Sistemin sıfırları tzero komutu ile bulunur. >> tzero(sistemin_transfer_fonksiyonu) ans = Empty matrix: 0-by-1 Bu örnekte sistemin sıfırı olmadığından boş matris çıkmıştır. 19
Simulink Simulink modelleme ve benzetim için geliştirilmiş grafiksel ara yüze sahip bir Matlab uzantısıdır.simulinkte sistemler ekran üzerine blok diyagramlar halinde çizilmektedir.transfer fonksiyonu blokları, toplayıcılar gibi blokların dışında osiloskop, fonksiyon üreteci gibi sanal giriş/çıkış cihazları da bulunmaktadır. Simulink, Matlab içinde çalışan bir program olduğundan iki program arasında rahatlıkla veri transferi yapılabilir. Bu kılavuzda her bloğun tek tek tanıtılmasından ziyade örnekler üzerinden gidilecektir. Programın başlatılması; Matlab içerisinde command window a simulink yazılmalıdır. >>simulink Simulink Library Browser penceresi açıldıktan sonra ekleneceği boş ekran elde edilir. File>New>Model seçilerek blokların Simulink Library Browser penceresinden bloklar sürükle bırak şeklinde açılan boş model sayfasına eklenmelidir. 20
Örnek 1: Öncelikle Simulink>sources kütüphanesinden step bloğunu Simulink>continuous kütüphanesinden derivative bloğunu Simulink>math Operations kütüphanesinden add ve gain bloğunu Simulink>commonly used blocks kütüphanesinden scope bloğunu tasarım ekranına ekleyiniz. Blokların girişlerinden farenin tuşuna basılı tutarak sonraki bloğun girişine gittiğiniz takdirde bloklar bağlanır fakat kısa yol olarak ilk bloğu seçtikten sonra ctrl tuşuna basılı tutarak hedef blok üzerine tıklandığı takdirde bloklar kendiliğinden bağlanır. Scope bloğu üzerine iki tıklayarak, parameters sekmesinden, Scope Parametreleri 3 farklı veriyi aynı anda gözlemek amacıyla, number of axes alanını 3 yapınız. Bloklar bağlanıldığında aşağıdaki şekildeki gibi bir görüntü oluşması gerekmektedir. 21
Simülasyon ayarlarını yapmak için, Simulation > Configuration Parameters penceresini açınız. Sistemi sabit adım ile çözmek için gelen pencereden, Solver options Type seçeneğini Fixed Step olarak seçiniz. Fixed step size olarak sırasıyla 1, 0.01 ve auto değerleri kullanılacaktır. Şekilde görülen Simulation Stop Time alanına benzetimin kaç saniye süreceği girilmelidir. Simülasyon süresini 2 olarak girdikten sonra şekilde görülen start simulation tuşuna tıklayarak veya kısayol olarak ctrl+t ile benzetimi başlatınız. Adım aralığı : 1 Adım aralığı : 0.01 Adım aralığı : auto 22
Örnek 2: Öncelikle Simulink>sources kütüphanesinden step bloğunu Simulink>continuous kütüphanesinden transfer fcn bloğunu Simulink>commonly used blocks kütüphanesinden scope bloğunu tasarım ekranına ekleyiniz. Adım cevabı bulunacak transfer fonksiyonu aşağıdaki gibidir Transfer Fcn bloğunun değerlerini değiştirmek için üzerine iki tıklayınız, numerator coefficient ve denominator coefficient alanları ile sırasıyla pay ve paydanın değerleri vektör şeklinde tanımlanmaktadır. 23
Scope bloğuna iki kere tıklayarak sonucu görüntüleyiniz. Sonucun tam olarak görüntülenmesi için şekilde görülen autoscale butonuna tıklayınız. Örnek 3: PID ve Subsystem Oluşturma Öncelikle şekilde görülen blok şemayı kurunuz. Kazançların değerlerini P terimi için Kp, I terimi için Ki ve D terimi için Kd şeklinde değiştirildiğine dikkat ediniz. Daha sonra şema üzerindeki tüm elemanları seçtikten sonra sağ tıklayıp create subsystem seçeneğini seçiniz. 24
Subsystem haline dönüşen blok üzerine tekrar sağ tıklayarak mask subsystem seçeneğini seçiniz. Gelen pencerenin Parameters sekmesinden Add butonu ile yeni parametreler ekleyiniz. Variable alanına daha önce ismi değiştirilen blokların ismini girmeniz gerekmektedir. Aksi takdirde ilgili bloğun değerine dışarıdan erişilemeyecektir. Add Butonu Elde edilen subsystem adlı bloğun ismini PID olarak değiştiriniz ve aşağıdaki blok şemayı kurunuz. 25
PID bloğuna tıkladığınızda Kp, Kd ve Ki değerlerini girebildiğinizi göreceksiniz.farklı Kp, Kd, Ki değerleri ile bu terimlerin sisteme etkisini gözleyebilirsiniz. Scope bloğundan çıkan grafiğin yükselme zamanı, yüzde aşımı gibi değerleri zoom to y axis yakınlaştırma butonları ile ölçebileceğiniz gibi grafiğin değerlerini Matlab ın workspace bölümüne göndererek daha önce anlatılan stepinfo komutunu kullanabilirsiniz. Scope Parametreleri Yakınlaştırma butonları Grafik verisini workspace alanına aktarmak için şekilde gösterildiği gibi scope parameters butonuna tıklayıp data history sekmesini seçmek gerekmektedir. Save data to workspace seçeneği işaretlenerek gönderilecek olan verinin workspace de hangi değişken ismi ile tanımlanacağını belirtmek gerekir bu isim varsayılan şekilde ScopeData olarak belirlenmiştir. Format kısmından Array seçilerek değişkenin nx2 lik bir matris şeklinde belirtilmesi sağlanmalıdır. Bu değişkenin n uzunluğundaki satır kısmı benzetim uzunluğu ile doğru orantılıdır. 1.kolonu zaman değerleri yani x ekseni, 2.kolonu ise bu zaman karşılığında alınan değerleri belirtmektedir yani y eksenidir. Stepinfo(Y ekseni,x ekseni) şeklinde kullandığından doğru sonuç almak için aşağıdaki şekilde kullanılmalıdır. 26
>> stepinfo(scopedata(:,2),scopedata(:,1)) ans = RiseTime: 0.6484 SettlingTime: 3.1281 SettlingMin: 0.9185 SettlingMax: 1.0682 Overshoot: 6.8172 Undershoot: 0 Peak: 1.0682 PeakTime: 1.5505 Örnek 4: Aşağıdaki blok şemayı kurunuz. Daha önceki örnekte olduğu gibi scope parameters penceresine gidilerek axes alanı 3 yapılmalıdır. Bu sayede scope penceresi 3 e bölünecektir. Eğer grafikleri üst üste çizdirmek istiyorsanız mux elemanını kullanabilirsiniz. Tellerin üzerine çift tıklayarak isimlendirebilirsiniz, bu sayede scope ekranındaki grafikleri tespit etmek daha kolay olmaktadır. Simulation time alanını 20 yaparak benzetimi başlatınız. Görüldüğü üzere scope ekranı 3 farklı pencereye bölünmüş ve hepsinin başlığı bulunmaktadır. 27
28