MATLAB’DE PROGRAMLAMA 1

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 :)

Aşağıda ise,yukarıdaki kodun algoritma gösterimi verilmiştir.
























*** 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