DERS 8 : MATLAB’DE PROGRAMLAMA 1
MATLAB’e giriş kısmı için programlama çok gereklidir.
MATLAB’de oluşturduğumuz durumların kontrol edilmesi,geliştirilen
algoritmaların uygulanması için programlamaya ihtiyaç duyarız.
Programlamaya geçmeden önce problem çözme düzeni oluşturmak
ve algoritma geliştirmek kesinlikle gereklidir.
PROBLEM ÇÖZME TEKNİĞİ :
Problem çözümü için bazı aşamaların uygulanması ,MATLAB’de
programlama yapmamızı kolaylaştıracaktır.Çözüm için 5 adım uygulayacağız.
1.
Problemi belirle.Tam olarak problemi
tanımla.Çünkü problem anlaşılmadığında istem dışı da olsa hata payımız
inanılmaz ölçüde artıyor.
2.
Girdileri ve çıktıları belirle.(Inputs,Outputs)
Problem için gerekli olan,istenen,verilenleri belirle.
3.
Algoritma geliştir.Algoritma geliştirmek için
önce problemi alt problemlere böl,daha sonra adım adım alt problemleri tanımla.
4.
Kurduğun algoritmayı MATLAB kodu olarak yaz.
5.
Programı test et.
Genellikle,3 adımda(algoritma geliştirme) zorlanılır. Bu
adım doğru yapıldığında,diğer adımlarda hata payı azalıyor ve yapılan hatanın
düzeltilmesi de kolaylaşıyor.
ÖRNEK 1 : Bir matris ile vektörün çarpımının sonucu oluşan
vektörün elemanları toplamını yazdıran MATLAB programı yazınız.
1.
Problemi belirle:
Girilen matris ile vektörün çarpımı ve
çıkan sonuç vektörünün elemanların toplanması.
2.
Girdileri ve çıktıları belirle.(Inputs,Outputs)
:
Girdiler(Inputs) : 3x3 boyuntunda bir
matris ve 3 elemanlı sütun vektörü.(3x3 ile 3x1 lik çarpma sonucu, 3x1 lik
matris elde ederiz.)
Çıktı(Output) : Çarpım sonucu çıkan
matrisin elemanları toplamı.
3.
Algoritma Geliştir :
a)
Problemleri alt problemlere böl.
i) Inputları oku.
ii) Matrisleri çarp ve toplamı
bul.
iii) Sonucu yazdır.
b)
Alt problemleri tanımla.
- Inputları oku
i) 3x3 boyutunda matris oku ve M matrisine
ata.
ii) 3x1 boyutunda vektör oku ve x değişkenine
ata.
-Matrisleri
çarp ve toplamı bul
i) y = M * x
ii) output = y nin elemanları toplamı.
4.
MATLAB kodu olarak
yaz :
M = input(' 3x3 matris giriniz M = ');
x = input(' 3x1
sütun vektörü giriniz x = ');
y = M*x;
output = y(1) + y(2) +
y(3);
fprintf('\nelemanların
toplamı = %f\n',output);
5.
Programı test et :
ÖRNEK 2 : Aşağıdaki zaman ,sıcaklık verilerinin ortalamasını hesaplayan
ve zaman,sıcaklık grafiği çizen program yazınız.
Zaman(saat)
|
Sıcaklık(Celcius)
|
2
|
-5
|
6
|
-1
|
10
|
3
|
14
|
12
|
18
|
9
|
22
|
0
|
Problem çözme stratejisinden sonra diğer konulara
geçebiliriz.Şimdi ise kontrol yapıları ,döngüler daha sonra da fonksiyonları
inceleyeceğiz.
Kontrol İfadeleri (if-elseif-else)
Kontrol yapıları ,yapılan seçimlere göre yapılacak olan
işlemin seçilmesini yani kontrol edilmesini sağlar.Kullanımı ise if-elseif
-…- elseif – else-end şeklindedir.
x = input('Please type a non-zero integer: ');
if x > 0
fprintf('Thanks for your positive response!\n');
elseif x == 0
x = 1;
fprintf('Zero is not allowed. I changed it to 1.\n');
else
fprintf('Nice choice!\n');
end
Yukarıdaki kodu inceleyelim.İlk olarak input komutunu kullanarak
kullanıcı tarafından “non-zero integer” sıfır olmayan tamsayı girilmesi
istenmiştir.
if x>0 ifadesi : Eğer
x>0 ise,bu ifade doğrudur ve 1 değerini döndürür.(Yanlış olsaydı 0 değerini
döndürürdü.) if ifadesi doğru olduğunda if ifadesinin içine girer ve içindeki
komutu çalıştırır.Yukarıdaki kodda ise fprintf() ile “thanks your positive
integer” basılır.x>0 ifadesi yanlış ise if yapısının içine girmez ve diğer
yapıya gider.Burada diğeri elseif x==0
elseif x==0 Burada x’in sıfır olup olmadığı kontrol
edilmiştir.Eğer ifade doğru ise,x değerini 2’ye eşitler ve fprintf() komutunu
çalıştırır.x==0 ifadesi yanlışsa,diğeri else ifadesine gider.
else ifadesine ise,hiçbir durum sağlanmadığında
gider.Yukarıdaki kodda ise, ekrana bir şeyler bastırılmıştır :)
*** MATLAB’de if-elseif -…- elseif – else-end
yapısı içinde çoklu komutlar girildiğinde parantez {} ile kontrol etmeye gerek
yoktur.MATLAB diğer ifadeye kadar hepsini aynı blokta kabul eder.
MATLAB’de if-elseif -…- elseif – else-end
yapısı dışında ikinci kontrol yapısı da switch yapısıdır.
switch switch ifadesi
case durum1,
İşlemler
. . .
case durum2,
işlemler
. . .
otherwise
işlemler
. . .
end
switch yapısı seçim yapılacak çok fazla durum varsa,
kullanılması daha uygundur.switch ifadesinin yanına kimin
kontrol edileceği, case lerin yanına kontrol edilenin durumları,otherwise
,hiçbir case olmadığı zaman uygulanan komuttur.end ise switch
yapısını sonlandırmak için kullanılır.
if x == 1
fprintf('bir');
elseif x == 2
fprintf('İki');
elseif x == 3
fprintf('Üç');
else
fprintf('%d', x);end
Yukarıdaki kodu switch yapısı ile de
yapabiliriz.Burada kontrol edilen x ve,x’in durumları x==1, x==2, x==3 olup
olmamasıdır.
switch x
case 1
fprintf('bir');
case 2
fprintf('İki');
case 3
fprintf('Üç');
otherwise
fprintf('%d', x);
end
*** switch-case yapısında case
ifadesini şu şekilde de kullanabiliriz :
case {durum_1,durum_2,…}
işlemler
Bu şekilde kullanılması case
içindeki durumlardan herhangi birinin doğru olması durumunda,bu case
içindeki işlemlerin yapılmasıdır.
ÖRNEK
3 : Kullanıcıdan x ve y değerlerini alan ve aşağıdaki durumlara göre işlemleri
yapan MATLAB kodu yazınız.
(The University of
Edinburgh, School of Engineering , 2010-2014, an interactive
introduction to MATLAB)
Örneğin; x>=0 ve(and) y>=0 durumu için (x>=0
&& y>=0) kullanabilirsiniz.
Mantık(Logic) ve İlişki(Relational)
Operatörleri
İlişki operatörleri :
İlişki operatörleri kullanım sonrasında ifade doğru ise 1
,yanlış ise 0 değerini döndürür.
*** Ayrıca if-else yapısı içine
0(sıfır) olmayan bir sayı girdiğimizde onu logic olarak 1 kabul eder.Yani
non-zero ifadeler logic 1 dödürürür.
Yandaki komutlardan da
anlaşılacağı üzere if 14 olduğuda 1 değeri döndürülür ve if yapısının içine girer.
İkinci olarak if 0
ifadesi 0 döndürüyor.
DÖNGÜLER :
Örneğin,bir otopark ücretlendirmesi için 10 araç bilgisi ve
fiyatı girmek istersek,her araç için ayrı olarak input istemek yerine, aynı
input’tan 10 araç bilgisini istediğimiz takdirde dönüye ihtiyaç duyduğumuz
anlaşılır.MATLAB’de for ve while döngülerini inceleyeceğiz.
Döngülerde,akış aşağıdaki gibidir.
for Döngüsü(loop)
for döngüsü sonlu
sayıda ifadelerden oluşan dizileri çalıştırmak için tasarlanmıştır.for döngüsünün kullanımı karmaşık
değildir.
for değişken = değişim açıklaması
ifadeler
end
“değişken” olarak tanımlanan,index olarak da bilinir.index
olarak genelde program yazanlar “ i ”
kullanırlar ancak karmaşık sayı olan ” i ” ile karışmaması için ” ii “
ya da herhangi bir şey de kullanılabilir.
” değişim açıklaması
” ise, döngünün kaç kez çalıştırılacağını açıklar.Bunun için ise vektör
kullanmamız gerekir. Örneğin, 1:10 ,1 den 10 a kadar sayıların birer birer
artmasıydı.
“ifadeler” bölümü ise,for
döngüsünün içinde her seferinde hangi işlemin yapılacağıdır.
for ii = 1:10
fprintf(‘\n döngü sayacı:
%d’, ii);
end
Bu örnekte 1 den 10 a kadar(10 dahil) sayılar
yazdırılmıştır.
Kontrol İfadelerinin Değiştirilmesi :
for ii = 1:100
Daha önce de söylediğimiz gibi burada,ii = 1,2,3,...,100
iken döngü çalışır.Yani döngü 100 kez çalışır.Biz ii’yi 2 den başlatıp 200 e
kadar,ikişer olarak arttırmak istersek,ii = 2:2:200 ifadesi ile döngüyü kontrol
edebiliriz.
for ii = 2:2:100
Bazen ise standart artış değerlerine sahip olmayabiliriz.Bu
durumu ise kontrol edeceğimiz sayıları vektör olarak girmemiz işi çözecektir.
Örneğin,aşağıdaki x vektöründeki pozitif sayıları yazdırmak
istiyorsak,x vektörünün pozitif sayılarını if-else yapısı ile kontrol edip,tüm
elemanları ise for döngüsü ile kontrol edebiliriz;
x
= [-2 4 6 -7 3 5 -45 1 -0.5 2.6]
for ii = [-2 4
6 -7 3 5 -45 1 -0.5 2.6]
if ii > 0
fprintf(‘%f \n’, ii);
end
end
Bu örnek aslında filtre görevi görmektedir.Çözümde döngü her
seferinde görevini tamamladığında, ii’nin bir sonraki elemanına geçiş yapıyor.Örnekte
ii değişkeni x vektörüne eşitleniyor,yazdırma ve karşılaştırma(if)
kısmında ise, ii yani x vektörünün elemanları karşılaştırılıyor ve
yazdırılıyor.
ii’yi x vektörüne atamadan x vektörü üzerinden karşılaştırma
yaparak,sıfırdan küçük sayıları göstermemek istersek,aşağıdaki gibi bir yöntem
kullanabiliriz.
for ii =
1:length(x)
if x(ii) >
0
fprintf(‘%f \n’, x(ii));
end
end
Yukarıdaki örneğin her aşamasını açıklayalım :
1.
for döngüsünde ii 1’den,x vektörünün
uzunluğu kadar,yani x vektörünün eleman sayısı kadar ii vardır.Bu yöntem
MATLAB’de çok kullanışlıdır.
2.
if ile karşılaştırmada x’in
elemanlarını (toplamda her elemanını) kullanmıştır.ii’de zaten x için
indeksleme olmuştur.İndekslemenin kullanılması x vektörü üzerinden
karşılaştırma yapmamızı kolaylaştırdı.
3.
fprintf() komutu ile yazdırma işlemi
yapıldı.
4.
Son olarak hem if hem de for
sonlandırıldı.
while Döngüsü(loop)
while döngüsü,for döngüsü gibi sonlu değil,sonsuz,bir koşula
göre sonlanan ya da kullanıcı tarafıdan gelen input ile sonlanan döngüdür.
while açıklama
ifadeler
end
“açıklama” olarak tanımlanan durum,for döngüsünün
aksine,logic veya ilişki operatörleri ile kontrol edilir.logic ve ilişki
operatörleri 1(doğru) veya 0(yanlış) döndürürler. “ açıklama ” 1 döndürdüğünde while
döngüsünün içine girilir ve bu durum açıklama doğru olduğu sürece tekrarlanır.
0 döndürüldüğünde ise,while döngüsünden çıkılır.
while 1
fprintf(‘Hello World! \n’);
end
Yukarıdaki gibi while döngüsü sürekli 1
döndürdüğünde,sonsuz döngü oluşur , “ Hello World! ” sonsuza kadar yazdırılır.
n = 1;
total = 0;
while n <= 10
total = total + n;
end
Yukarıdaki örnekte sonlu döngü oluşturmak istiyorduk ancak,n
sayısı döngü her tekrarlandığında 1 ve her zaman n<=10 durumu sağlanıyor.Bu
karmaşayı çözüp sonlu döngü oluşturmak için, n sayısını döngü kendini
tekrarlamadan önce ya da döngü yenilenmeden hemen önce, n sayısını
arttırmaktır.
for döngüsünden hatırlarsak,indeksleme yapmak için sayıyı her
seferinde arttırıyorduk.
Örneğin ; for ii = 1:100
Bu sorun aşağıdaki çözüm ile düzeltilebilir :
n = 1;
total = 0;
while n <= 10
total =
total + n;
n = n + 1;
end
for döngüsünde yaptığımız örneği(x vektörünün sıfırdan büyük
elemanlarını yazdırma programı(filtreleme)),while döngüsü ile yazalım
:
x = input(‘dizi tanımlayınız:
‘)
n = 1;
while n <=
length(x)
if x(n) >
0
fprintf(‘%f \n’, x(n));
end
n = n + 1;
end
Bu örneği while döngüsü ile yaptığımız zaman,
n = n + 1 kullanmak durumunda kaldık.
while n <= length(x) komutu yerine;
while n < length(x)+1 komutunu
girmemiz aynıdır.
Aşağıdaki kodlar da bu örnekle aynı yapıdadır,ancak n
sayısının başlangıç ve arttırması farklı ,ayrıca while tanımlaması farklıdır.
1)
n = 0;
while n <=
length(x) - 1
n = n + 1;
if x(n) >
0
fprintf(‘%f \n’, x(n));
end
end
2)
n = 0;
while n <
length(x)
n = n + 1;
if x(n) >
0
fprintf(‘%f \n’, x(n));
end
end
ÖRNEK 4 : Fibonacci dizisi aşağıdaki gibi verilmiştir.
1 1 2 3 5 8 13 21 34…
Fibonacci dizisini 17.terimine kadar yazdıran MATLAB
programı yazınız.
ÖRNEK 5 : Aşağıdaki tablo için MATLAB kodu yazınız.
HARF NOTU FİNAL
NOTLARI
A
90
< not <= 100
B
80
< not <= 90
C
70
< not <= 80
D 60
< not <= 70
F not <= 60
Final Notları : 70, 85, 90, 97, 50, 60, 71, 83, 91, 86, 77,
45,
67, 88,
64, 79, 75, 92, ve 69
a)
A
ve F harf notu alan öğrenci sayısını hesaplayınız.
b)
Notların
ortalamasını ve standart sapmasını hesaplayınız.(help mean, help std)
(JOHN
O. ATTIA, ELECTRONICS and CIRCUIT ANALYSIS using MATLAB)
Ana Kaynak :
Introduction to Programming with Matlab, 2000-2011 J. Michael Fitzpatrick and John D.
Crocetti, Vanderbilt University
Hiç yorum yok:
Yorum Gönder