SİSTEM ANALİZİ Ders notları yanında yardımcı referans kaynaklar: • • System Analysis and Signal Processing, 1998, Philip Denbigh An Intrduction to Random Vibrations, Spectral & Wavelet Analysis, 3rd ed., 1993 Longman Scientific & Technical, David E. Newland Signals and Systems – ‘97 (Alain V. Oppenheim) A Course in Digital Signal Processing by Boaz Pont – ‘97 Analog and Digital Signal Processing by Ashok Ambers Matlab for Engineers, - ’95, ’99, ’00 (Adrian Byran & Moshe Breiner) MATLAB, Programming for Engineers (Stephen Chepman) • • • • • 1. GİRİŞ İşaret İşlemede temel MATLAB kullanımı >> a=5; (;) eklenmezse enter’a basıldığında Matlab, ekranda a = 5 şeklinde çıkış verir. Değişkene değer atama bir işlemin sonucu şeklinde de olabilir: >> parmaklarim = 5 * 2; Diziler >> x = [15.3 17.2 14.7 18.1; 12.3 13.6 14.5 16.2; 18.1 20.2 18.2 20.6]; Buradaki (;) matris yazarken alt satıra geçişi ifade eder. ↵ >> x 15.3 12.3 18.1 17.2 13.6 20.1 >> size(x) 14.7 14.5 18.2 18.1 16.2 20.6 ↵ 3 4 19 karaktere kadar değişken ismi kullanılabilir. İlk karakter harf olmak zorundadır, büyük küçük harf ayırımı vardır. >> x = [1 3 5 7] 1 3 5 7 ↵ Satır vektörü ↵ >> x = [1; 3; 5; 7] Sütun vektörü 1 3 5 7 >> clear ↵ Hafızayı boşaltır. >> clc ↵ Sadece komut penceresini temizler. Resmi temizler (clear figure). >> clf ↵ Bir vektörün oluşturulması: >> x = [0*pi .1*pi .2*pi .3*pi .4*pi .5*pi] ↵ x = 0 0.3142 0.6283 0.9425 1.2566 1.5708 >> x = (3 : 6) ↵ x = 3 4 5 6 >> x = (0: .1 : .5) * pi Bu ifade x = [0*pi .1*pi .2*pi .. .5*pi] ile aynı sonucu verir. (0 ve .5 sınırlar, .1 adım büyüklüğü olmak üzere) >> x = linspace(0, 0.5*pi, 6) Adım büyüklüğü bilinmiyorsa linspace komutu kullanılabilir, üstteki komut ile aynı sonuç alınır. (0: başlangıç, 0.5*pi: bitiş, 6: eleman sayısı) >> >> >> >> >> t y a b c = = = = = linspace(0, 50*pi, 501) sin(t); [1 3 5]; [2 4 6 8 10]; [a b a] Adım Büyüklüğü = 50π / (501-1) = 0.1 π c = 1 3 5 2 4 6 8 10 1 3 5 >> a = zeros(3, 5) a 3×5 Sıfırlar Matrisi = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >> c = ones(1, 7) 1×7 Birler Matrisi (birim vektör) c = 1 1 1 1 1 1 1 Önceden üretilmiş bir matrisin boyutunda sıfır/bir matrisi üretir. >> ones(size(d)) >> zeros(size(d)) “Zero padding” diye anılan işlem. Elimizdeki matrisin değerini değiştirmeden 2n = (belirli bir sayıya) tamamlamak için 0 ile doldurmak. >> g(4:6)= (8 2 7) g = 4’ten 6’ya kadar olan elemanları verince boşlukları 0 ile dolduruyor. 0 0 0 8 2 7 >> g(10) = 0 g = ↵ ↵ 7’den 10’a kadar olan elemanları 0 yapıyor. 0 0 0 8 2 7 0 0 0 0 >> f(7) = 0 ↵ f = 0 0 0 0 0 0 0 7 elemanlı sıfır vektörü >> f(7) = 1 ↵ f = 1 1 1 1 1 1 1 7 elemanlı birim vektör >> x = (3: 10); >> x(3) ↵ ans= 5 3. elemanı çağırma >> y = x(2:6) ↵ Sub-vector (alt vektör) mevcut vektörün (x) bir kısmını başka bir vektöre atayabiliriz. y= 4 5 6 7 8 >> z = x(6:-2:2) z= 8 6 4 ↵ (6. elemandan 2. elemana doğru -2 eksilterek) Dizi Matematiği Matlab’te işlem öncelik sırası aşağıdaki gibidir: • • • Güç alma Çarpma ve Bölme (eşit öncelikli, hangisi önce geliyorsa o işlem yapılır) Toplama ve Çıkarma (eşit öncelikli, hangisi önce geliyorsa o işlem yapılır) 4/3 * 2 = (4/3) * 2 4 + 3/4 = 4 + (3/4) >> y = [9 7 4]; >> z = y * 2 – 3^2 ↵ z= 9 5 –1 >> x = linspace(0, 10, 6) ↵ x= 0 2 4 6 8 10 >> y = linspace(0 1 6) ↵ y= 0 .2 .4 .6 .8 1 >> z = x + y z= 0 2.2000 4.4000 6.6000 8.8000 >> z = x .* y z = 0 0.4000 1.6000 3.6000 6.4000 11.0000 10.0000 (.) eleman eleman çarpım uygulamasını sağlar, bölme önünde de kullanılabilir. (.) olmasaydı satır-sütun sayısı uyuşmazlığı yüzünden hata verirdi. >> z = x ./ y z= NaN 10 10 10 10 10 (NaN = not a number) (x/y ≠ y\x) >> z = x .\ y z= NaN .1 .1 .1 .1 .1 >> z = x.^2 z= 0 4 16 36 64 100 Eleman İndeksleme ve Zaman İndeksleme x = [8 6 4] , n = (0:2) n’nin değeri x’in sırasını (indeksini) verir plot(n,x) (x’i n’ye göre çizer) >> x = [23000 41000 67000 81000] , n = (1996:1999) x = 23000 41000 67000 81000 n = 1996 1997 1998 1999 Bir vektörün ve indeksinin uzatılması Sayısal işaret işlemede indeksi de dikkate alarak bir diziyi her iki ucundan uzatmak çokça yapılan bir işlemdir. Mesela bir dizi ve indeksi aşağıdaki gibi olsun, >> x = [8 2 7], n =(3 : 5); diziyi indeksi -2’den 8’e uzayacak şekilde sıfırla destekleyelim. >> nn = (-4 : 15); Bunun en kolay yolu diziyi ve indeksini elle girmektir: >> xx =[0 0 0 0 0 8 2 7 0 0 0], nn=(-2:8) Bu giriş ekranda şöyle bir çıktı verir: xx = 0 0 nn = -2 -1 0 0 0 8 2 7 0 0 0 0 1 2 3 4 5 6 7 8 Uzun vektörlerle çalışıldığında daha pratik yollar gereklidir. Şimdi aynı işlemi MATLAB’in yeteneklerinden yararlanarak yapalım. n(1)-nn(1) ile x’in soluna gelecek 0 sayısını buluruz (yani 3-(-2)=5). Sol tarafı 5 sıfırla uzatılmış x dizisi: >> xx = [zeros(1,n(1)-nn(1)) x] xx = 0 0 0 0 0 8 2 7 Şimdi de xx’i sağdan nn’in uzunluğuna gelinceye kadar uzatalım: >> xx(length(nn)) = 0 xx = 0 0 0 0 0 8 2 7 0 0 0 Başta elle elde edilen diziye ulaşılır. Lineer Cebir ve Matris İşlemleri >> A= [1 2 3; 4 5 6; 7 8 9], B=[9 7 5; 8 6 4; 3 2 1] A = 1 4 7 2 5 8 3 6 9 9 8 3 7 6 2 5 4 1 B = Matrislerin boyutları: >> size(A), size(B) ans = 3 3 ans = 3 3 Girilen adresteki elemanların çağrılması: >> A(3,2), B(1,3) ans= 8 ans= 5 Matrislerin yan yana ve alt alta birleştirilmesi: >> C=[A,B], D=[A;B] C = 1 2 3 9 7 5 4 5 6 8 6 4 7 8 9 3 2 1 D = 1 2 3 4 5 6 7 8 9 9 7 5 8 6 4 3 2 1 >> size(C) ans= >> size(D) ans= 3 6 6 3 Matrislerden istenen alt-vektörlerin çekilip alınması: >> A(1,:) A’nın birinci satırını alır. (:) Tüm elemanları ifade eder. ans= 1 2 3 >> C(:,2) ans = 2 5 8 % (normal matris çarpımı [karşılıklı satır-sütun]) >> A*B ans = 34 94 154 25 70 115 16 46 76 (elemanların karşılıklı çarpımını yapar) >> A.*B ans = 9 32 21 14 30 16 15 24 9 Örnek: 3 bilinmeyenli 3 denklem. x , y ve z’nin bulunması: 2x + 3y + 4z = 5 5x + 2y + 3z = 10 8x – 2y – 5z = -10 _____________ >> A= [2 3 4; 5 2 3; 8 -2 -5], B=[5; 10; -10] A = 2 3 4 5 2 3 8 -2 -5 B = 5 10 -10 AX = B x = [x y z] x = A-1 B >> X = inv(A) * B X = 1.1429 -9.0000 7.4286 x,y ve z bilinmeyenleri sırasıyla 1.1429, -9 ve 7.4286 olarak bulunur. ‘plot’ ve ‘stem’ Komutları plot girilen noktaların grafiğini ”enterpolasyon”la birleştirirken, stem ayrık olarak çizer. >> t= 0:0.01:6; >> y= sin(2*pi*1*t); >> subplot (2, 1, 1) >> plot(t,y) >> subplot (2, 1, 2) >> t= 0:.125:6; y= sin(2*pi*1*t); stem(t,y,'r') >> stem(t,y) t= 0:0.01:6; y= sin(2*pi*1*t); plot(t,y), grid 1 0.5 ) V ( kil n e g 0 -0.5 -1 0 1 2 3 4 5 6 zaman (s) 5 6 zaman (s) t= 0:.125:6; y= sin(2*pi*1*t); stem(t,y,'r'), grid 1 0.5 ) V ( kil n e g 0 -0.5 -1 0 1 2 3 4 Matlab özellikle bir çok bilim ve mühendislik dalı için hazırlanmış zengin “alet kutu”larıyla büyük kolaylıklar sağlar. Bunlardan bazıları Signal Processing, Filter Design, Image Processing, Wavelet, Control Systems, Robust Control Communications, Data Acquisition Statistical, Financial, Neural Network, Fuzzy Logic, System Identification, Symbolic Math, İlgili alet kutularından yararlanılarak elde edilmiş birkaç örnek grafik aşağıya alınmıştır: İleri yol transfer fonksiyonu aşağıdaki gibi verilen bir negatif birim geri beslemeli kontrol sistemini ele alalım. G(s) = K ( s + 3)( s + 4)( s + 8) s 2 ( s + 2)( s + 15) >> pay = [20*(conv([1 3],(conv([1 4],[1 8]))))]; >> payda = [conv([1 0 0],(conv([1 2],[1 15])))]; Bu sisteme ait açık-çevrim transfer fonksiyonu: >> sis1 = tf(pay,payda) Transfer function: 20 s^3 + 300 s^2 + 1360 s + 1920 -------------------------------s^4 + 17 s^3 + 30 s^2 sisteme ait kapalı-açık çevrim transfer fonksiyonu: >> sis2 = [1]; >> gbsistem = FEEDBACK(sis1,sis2) Transfer function: 20 s^3 + 300 s^2 + 1360 s + 1920 -------------------------------------s^4 + 37 s^3 + 330 s^2 + 1360 s + 1920 Başka bir sistemin kök yer eğrisini çizelim: >> num=[1]; denum=[conv(conv([1 2],[1 4]),[1 6])]; rlocus(num,denum) Root Locus 10 0.84 0.72 0.6 8 6 0.92 System: sys Gain: 193 Pole: -10 0.98 Damping: 1 2 Overshoot (%): 0 Frequency (rad/sec): 1010 14 12 0 System: sys Gain: 480 Pole: 0.00159 + 6.63i 0.46 Damping: 0.3 -0.00024 0.16 Overshoot (%): 100 Frequency (rad/sec): 6.63 4 si x A y r a ni g a m I 8 6 4 2 -2 0.98 -4 -6 0.92 -8 -10 -16 0.84 0.72 -14 -12 -10 0.6 -8 0.46 -6 Real Axis 0.3 -4 0.16 -2 0 2 Basit bir RC devresiyle kurulan bir alçak geçiren filtrenin frekans analizi: 1 kΩ vi vo 0.1 µF num=[1]; denum=[1e-4 1]; bode(num,denum), grid Bode Diagram 0 -10 ) B d( e d uti n g a M -20 -30 -40 0 ) g e d( e s a h P -45 -90 2 10 3 10 4 10 5 10 6 10 Frequency (rad/sec) Ayrıca SIMULINK kullanarak çok daha kullanımı ve geliştirmesi kolay uygulamalar gerçekleştirebiliriz: 1 ] n[ 1 x 0.5 0 -4 -2 0 2 4 10 12 14 6 8 10 12 14 6 8 10 12 14 0.5 0 -4 4 ] n[ 2 x*] n[ 1 x -2 0 2 4 n 2 0 -4 -2 0 2 4 n Convstem.m Final1.m 8 n 1 ] n[ 2 x 6