Dr.phil.nat. Fuat Altunsu
mpci
Secme YazilarMatlab IIMatlab IMatlabTeknik Mekanik ProblemleriFiziksel ModellemeElektromanyetik Dalgalarin Madde ile Etkilesmesi ve LaserNonlineer Optige GirisSpektroskopiye Girisyari ilektkenler ve Fotovoltaik
Matlab II

 Programlamaya Giris


 

 Birinci bölümde genel olarak Matlab'in gramer yapisi anlatildi.  Bu bölümde Matlab dil yapisinin ayrintilarina giris yapacagiz. Ilk önce bir editör yardimiyla m-dosyalarina fonksiyonlar yazacagiz sonrada bu fonksiyonlarin geri cagrilmasi operasyonlarini görüp, kontrol yapilarinin (for,if,else vs..) nasil kullanilacagina dair bir cok örnek vererek programlar yazacagiz.

  IIa) M Dosyalari ve Editör

Simdiye kadar Command Window'u (CW) hesap makinasi gibi kullandik ve girdigimiz veriler hafizaya .mat uzantili dosyalar seklinde saklandi. Artik CW'u veri girmek icin kullanmiyacagiz, bu pencerye yalnizca komutlar ya da gerekli oldugu -interaktif calisma- durumlarinda parmetreler yazacagiz ve burada yazilan programlarin isletilmesinden elde edilen sonuclara bakacagiz. Bunu haricinde bütün kodlamalari bir Matlab editörü ile yazacagiz ve m- uzantili dosyalar halinde kaydedecegiz. Böylece ayni dosyaya kaydedilmis bir CW-dosyasini ve editör araciligiyla yazilmis bir dosyayi sonlarindaki .mat ve .m takilarindan dolayi ayirt edebilecegiz. Simdi yine CW'a gidelim ve burada

                                               File ----->New----->M-File

sekmelerini sirasi ile secelim. Bu islemlerin sonucunda karsimiza basligi -Untitled1- olan bos bir editör sayfasi acilacaktir. Bu sayfada artik istedigimiz verilerin,programlarin, yazilarin editörlügünü yapabilir ve bu defa editörün menüsündeki 

                                               File ----->Save As

sekmeleri kullanilarak secilen bir dosyaya yazmis oldugumuz programlari kaydedebiliriz. Simdi birinci bölümde gördügümüz hesaplamalara benzer hesaplamlari editör kullanaraktan yapalim. Örnekler:

     

 Figürx1: Matlab editörüne veriler yazmak: Command Window, Plot ve editör yüzeyleri.

Figür x1 deki pencerlere ulasmak icin yapilan islemleri tekrarlayalim. Önce CW'da File-->New-->M-File secildi. Acilan editör penceresinde File--> Save As sekmeleri secilerek editörün adi SinGrafCiz1 olarak C kütügündeki MatlabaGiris1 dosyasina kaydedildi. Bundan sonra editöre hesaplamak istedigimiz fonksiyonlari, cizilmesini istedigimiz grafiklerin programlarini yaziyoruz. Yukardaki SinGrafCiz1 adli editöre yazilan program asagida tekrar verilmistir:

% Yine bir sinüs fonksiyonunun grafigini cizelim

% Bölüm I'deki grafik cizimde kullandigimiz prosüdürleri yerine

% getirelim.Bu sayfanin adini SinGrafCiz1 koyalim, bunu icin

% yukardaki File menüsünde Save As de bu programi istedigimiz

% bir dosyaya kaydedelim.

% Burada bu program C:\MatalbaGiris1\SinGrafCiz1 adi

% ile saklanmistir. Görüldügü gibi Untitled1 adi Save As den sonra

% degiserek C:\MatalbaGiris1\SinGrafCiz1 adini almistir.

x=[-2*pi:0.001*pi:2*pi];

y=sin(x);

plot(x,y,'r+')

axis([-2*pi 2*pi -1.2 1.2])

xlabel('x')

ylabel('sinx')

title('Bir sinüs fonksiyonunu cizim')

text(0,0,'Burasi sifir noktasidir')

gtext('y nin maksimum noktasi'

Görüldügü gibi editöre yazdigimiz yorumlarda yine bir % isareti ile baslamaktadir. Editörün menüsündeki Text sekmesinde Command ve Uncommand komutlariyla istenilen bir ve ya birden fazla satirlar yorum satirina cevrilebilirler ya da yorum satirindan komut satirina geri cevrilebilirler. Editörde satirlar CW'da oldugu gibi >> bir girdi yap sembolü ile baslamamaktadir. Editöre girilen ara islemlerin hesaplama bittikten sonra görüntülenmesini istemiyorsak yine satir sonlarini bir  ; isareti ile kapatmaliyiz. Ayrica editörde yaptigimiz her degisikligi hemen save komutu ile kaydedip güvence altina aliyoruz (editör penceresinde buluna disket semboli daha pratiktir). Editörde biten her satir enter ile kapatilir. Böylece kursor bir alt satira gecerek yeni satira nereden baslanacagini kendisi organize eder. Dolayisyla bir satirin baslangic sütün sayisi keyfi degistirilemez, bunu enterden sonra editör belirleyecektir. Simdi SinGrafCiz1.m adli dosyamizdaki islemleri hesap etmek istiyoruz. Yukardaki örnekte bir sinüs fonksiyonunun grafigi cizilmesi isteniyor. Bunu icin CW' a geliyoruz ve burada sadece sekilde görüldügü gibi SinGrafCiz1 dosya ismini veriyoruz ve enteri tusluyoruz. Bu dosya icinde grafik komutlari oldugu icin, dogrudan istedigimiz fonksiyonun grafigi cizilmis olarak bir plot pencersi acilacaktir. Bu örnekten görüldügü gibi, editöre yapilamsi gereken görevleri yüklüyoruz, CW'da  dosaya adi ile cagirip yapilan görevlerin sonuclarina ulasiyoruz. Burada unutulmamasi gereken bir konu, SinGrafCiz1.m adli dosyamizin Current Directory penceresinde görünür olmasidir. SinGrafCiz1. dosayinin bulundugu ana dosyanin acik olmamasi durumunda, bu dosyaya nasil ulasilacagi Matlab'a addpath komutuyla birinci bölümde anlatildigi gibi tanitilmalidir. Bundan dolayi bu yol, yani SinGrafCiz1.mat dosyainin bulundugu hat CW'a yine asagidaki gibi yazilir:

                                        >> addpath C:\MatlabaGiris1

Bu komutun ardindan SinGrafCiz1 dosya adi CW'a yazilarak bu dosyadaki hesaplamalar yerine getirilir. Baska bir örnekte yeni bir editör aciyoruz ve adini BirDmatIleIslemler ( bir D matrisi ile islemler ):

% Bu örnekte üce üc bir D matrisi yazacagiz.

% D'nin transpozunu, özvektörlerini, özfonksiyonlarin

% terinsi, determinantini,elemanlarini ortalamsini,karesini

% hesaplayacagiz.....

D=[2 3 4; 2 4 1; 1 3 0]

Transpozu=D'

[Ozvek Ozdeg]=eig(D)

Tersi=inv(D)

Determinanti=det(D)

Ortalamasi=sum(sum(D)/length(D))/3

Karesi=D^2

Editöre yazdigimiz yukardaki islemleri hesaplanmasini istiyoruz. Yine bunu icin CW'a dönüp orada dosaya adini BirDmatIleIslemler veriyoruz. Bundan sonra enter ile CW'da asagidaki islem sonuclarini aliyoruz:

>> BirDmatIleIslemler

D =

     2     3     4
     2     4     1
     1     3     0


Transpozu =

     2     2     1
     3     4     3
     4     1     0


Ozvek =

   0.6917             0.8660             0.8660         
   0.6187            -0.3077 - 0.1065i  -0.3077 + 0.1065i
   0.3726            -0.2930 + 0.2412i  -0.2930 - 0.2412i


Ozdeg =

   6.8381                  0                  0         
        0            -0.4191 + 0.7454i        0         
        0                  0            -0.4191 - 0.7454i


Tersi =

   -0.6000    2.4000   -2.6000
    0.2000   -0.8000    1.2000
    0.4000   -0.6000    0.4000


Determinanti =

     5


Ortalamasi =

    2.2222


Karesi =

    14    30    11
    13    25    12
     8    15     7

Bir baska kodlama sekli etkilesimli ( interaktif) kodlamadir. Simdi buna örnek verecegiz ve yukardaki programi kullanacagiz. Yeni programin adini InterakDmatIleIslem koyalim.

% Bu örnekte kare bir D matrisi yazacagiz.

% D'nin transpozunu, özvektörlerini, özfonksiyonlarin

% terinsi, determinantini,elemanlarini ortalamsini,karesini

% hesaplayacagiz.....

% D matrisini bu editöre yazmiyacagiz, etkilesimli bir

% sekilde CW'da matrisi girecegiz.

clc          % CW'u siliyoruz

disp('---Karesel bir D matisi üzerinde islemler---')

Bir_Karesel_D_Matrisi=D

D=input('Bir Kare Matris Giriniz: D= ');

D_matrisinin_Devrigi=D'

D_matrisinin_Tersi=inv(D)

D_matrisinin_determinanti=det(D)

 Editöre yazdigimiz bu programi CW'da dosya adi ile cagiracagiz. Bunun icin CW'a  InterakDmatIleIslem dosya adini yazip enter basiyoruz. CW'da karsimiza programladigimiz gibi

 ---Karesel bir D matisi üzerinde islemler---
Bir Kare Matris Giriniz: D=

yazisi cikacaktir ve bir karesel bir D matrisinin girilmes beklencektir. D'nin devamina [1 2, 4 5] gibi istenilen bir kare matris yaziyoruz ve enterliyoruz. Bundan sonra istilen bütün hesaplamalar yapilacak ve CW'da cikti olarak görüntülenecektir. Baska bir matris girmek icin yukari kursor isreti ile son kullanilan komutlar CW'da secilebilir ve yine InterakDmatIleIslem dosya ismi girilerek baska bir matris icin ayni hesaplamalar yapilir. Görüldügü gibi ana program InterakDmatIleIslem.m adli dosyada saklidir ve biz kolayca istenilen her hangi bir karesel matris girisi icin yalniz CW ile etkilesim icindeyiz. 

---Karesel bir D matisi üzerinde islemler---
Bir Kare Matris Giriniz:D=[1 2; 4 5]

Bir_Karesel_D_Matrisi =

     1     2
     4     5

D_matrisinin_Devrigi =

     1     4
     2     5

D_matrisinin_Tersi =

   -1.6667    0.6667
    1.3333   -0.3333

D_matrisinin_determinanti =

-3

>>

Bir baska örnek; iki sinüs titresiminin farkili acilar altinda süperpozisyonlarini inceleyelim. Bunlarin grafikleri fizikte Lissajous (Fr.Fizikci)-figürleri olarak bilinir. Ilerde Simulink'le bu figürleri giris parametrelerine bagli olarak osiloskopla görsellestirecegiz. Burada yukarda oldugu gibi ana programi editöre yazacagiz ve giris parametrelerini interaktif CW'da verecegiz.

%::::::::::::Matlab Program::::::::::::

%............Lissajous-Figürleri........

%            fu@ altunsu,16.10.09

% Program Adi: SinSalSupPoz1(sinüs salinimlarin süperpozisyonu),V1.

% Web page fuat-altunsu.eu./Fizik/Matlab'a Giris icin yazilmistir.

% Bu programda iki sinüs salinimini farkili acilar altinda üstüste

% getirecegiz.

% Üst üste gelis acilari ve diger parametreler CW'da degistirilebilecek.

% Yani laboratuara gitmede salinimlar olusturacagiz ve bu salinimlarin

% bütün parameterlerini degistirebilecegiz, böyece Matlab'i

% fizik laboratuari gibi kullanacagiz.

clear

clc

disp('Iki Salinimin Grafiksel Üstüste Gelmesi');

disp(' ' );

A=input('Birinci salinimin genligini giriniz, A=');

B=input('Ikinci salinimin genligini giriniz, B=');

ph=input('iki salnim arasindaki faz(evre)farkini giriniz(derece), ph=');

f1=input('Birinci salinimin frekansini(Hz) giriniz, f1=');

f2=input('Ikinci salinimin frekansini(Hz) giriniz, f2=');

theta_Acisi= input('iki salinimin cakisima acisini giriniz(rad,pi/2,pi/3), theta=');

% Buraya kadar yazilmis olan giris argümanlarini CW'da girecegiz.

% önce salinim zaman araligini belirliyoruz

t=(-3:0.01:3);

% sinüs fonksiyonlarini giriyoruz

y1=A*sin(2*pi*f1*t);

y2=B*sin(2*pi*f2*t+(ph/180)*pi*(ones(size(2*f2*pi*t))));

%Koordinat dönüsüm matrisini yaziyoruz. Bu matris ile iki salinimi

% istedigimiz aci altinda üst üste getirebiliriz.

% yani bir titresim y yönünde kutuplu ise digerini kuzey doguya kutuplaya

% biliriz ve girisimlerine bakariz.

v = [cos(theta_Acisi) -sin(theta_Acisi);

sin(theta_Acisi) cos(theta_Acisi)];

D = [y1' y2']*v;

%Grafik cizimleri yine gecmiste oldugu gibidir.

subplot(2,2,1),plot(t,y1,'g'),title('y1 in Grafigi'),xlabel('Zaman(s)'),ylabel('Asin(2*pi*f1*t)'),grid on;

subplot(2,2,2),plot(t,y2,'b'),title('y2 nin Grafigi'),xlabel('Zaman(s)'),ylabel('Asin(2*pi*f1*t+faz)'),grid on;

x=subplot(2,2,3),plot(D(:,1),D(:,2)),title('Lissajous-Figürleri'),xlabel('D2'),ylabel('D1'),grid on;

% Asagidaki komutla alttaki,yani ücüncü pencereyi 2.3kat genisletiyoruz.

pos = get(x, 'position');

pos(3) = pos(3)*2.3;

set(x,'position', pos);

 Yine satir satir kirmizi ile baslayan girisler CW'a kopyalanip yapistirilip programin calismasi görülebilir. Bu programi calistirmak icin CW'a yine dosaya adini veriyor sonrada enterliyoruz.

Iki Salinimin Grafiksel Üstüste Gelmesi
 
Birinci salinimin genligini giriniz, A=10
ikinci salinimin genligini giriniz, B=10
iki salnim arasindaki faz(evre)farkini giriniz(derece), ph=45
Birinci salinimin frekansini(Hz) giriniz, f1=3
Ikinci salinimin frekansini(Hz) giriniz, f2=6
iki salinimin cakisima acisini giriniz(rad,pi/2,pi/3), theta=pi/2

x =

  160.0057

Böylece CW'da karsimiza yukardaki hangi parametreleri girecegimize dair biri biri ardinca satirlar cikiyor. Görüldügü gibi sistem üzerinde deney yapabilmemiz icin alti özgür parametre bulunmaktadir. Yukarda sirasi ile A=10,B=10, ph=45,f1=3,f2=6, theta=pi/2 kullanilarak sekil xx deki figür elde edilmistir.

                         

Figürxx: Iki sinüs titresiminin dik kesismesi: Üstteki grafikler bir birinden faz farki (45°) olan iki sinüs salinimlaridir. Alttaki grafik f1/f2=2 olan bu iki sinüs saliniminin üstüste gelmesinden elde edilen Lissajous figürdür.

Simdi egik atis problemini iceleyelim. Bu hareket yeryüzü yakinlarinda bir cismin yatayla bellirli bir aci altinda firlatilmasi ile olusan harekttir. Düsey boyunca cisme yercekimi kuvveti ve yatay boyunca  bir kuvvet etki etmedigi icin, egik atis hareketinin düsey hareketi ivmeli, yatay hareketi düzgün dogrusal harekettir. Bir bileseninin ivmeli diger bileseninin ivmesiz hareket olmasindan dolayi yörüngesi egriseldir. Simdi bu hareketin yörüngesini inceleyelim. Ilk önce bir editör acalim ve adini EgikAtYorIncele1 koyalim. Burada yapacagimiz islem her bir bilesenin yol denklemlerini kullanarak, bunlarin biribirlerine karsi degisimini grafigini cizecegiz. Bu grafik yörünge grafigidir. Ilk hiz, atis acisi gibi baslangic sartlarin yine interaktif bir sekilde CW'da verip, dosya adi ile programi calistiracagiz. Asagidaki programda bu yapilmistir.

clear

clc

%::::::::::::Matlab Program::::::::::::

%.......Egik Atisin Yörüngeleri.......

%       fu@ altunsu, 17.10.09

% Program Adi: EgikAtYorIncele1(Egik Atis Yörünge Incelenmesi),V1.

% Web page fuat-altunsu.eu./Fizik/Matlab'a Giris icin yazilmistir.

% Bu programda egik atisin yörüngesi incelenecektir. Hareketin x ve y

% bilesenlerinin bir birine göre cizimleri yörünge egrilerini vercektir.

% V atis hizi CW'da m/s cinsinden verilecektir ,

% Atis acisi alfaGrad derece cinsinden girilecektir.

V= input('Atis Hizi Giriniz: V-ilkhiz=')

alfaDerece=input('Derece Cinsinden Atis Acisi Giriniz:AtisAcisi=')

g = 9.81;

alfaRad = alfaDerece*pi/180; % Atis acisini rad cevirme

ucussuresi = (2*V/g)*sin(alfaRad);

t = 0:0.01:ucussuresi;

x = V*t.*cos(alfaRad);

y = V*t.*sin(alfaRad) - 0.5*g*(t).^2;

subplot(1,3,1)

plot(x,y,'r')

title('Bir Egik Atisin Yörüngesi')

xlabel('Yatayda Alinan Yol (m)')

ylabel('Düseyde Alinan Yol (m)')

grid on

 

subplot(1,3,2)

plot(t,x,'b')

title('x-t Grafigi')

xlabel('Zaman(sn)')

ylabel('Yatayda Alinan Yol (m)')

grid on

 

subplot(1,3,3)

plot(t,y,'g')

title('y-t Grafigi')

xlabel('Zaman(sn)')

ylabel('Düseyde Alinan Yol (m)')

grid on

 Böylece programi calistirdigimizda CW'da karsimiza programin basinda yazilan ve verileri girmemizi isteyen ard arda altdaki satirlar cikacaktir:

Atis Hizi Giriniz: V-ilkhiz=10

V =

    10

Derece Cinsinden Atis Acisi Giriniz:AtisAcisi=45

alfaDerece =

    45

Elapsed time is 0.000182 seconds. 

Örnekte atis hizin 10m/s olarak giriyoruz, enterden sonra atis acisini grimemiz isteniyor, bunada 45 derce giriyoruz. Bu baslangic degerleri ile asagidaki üc grafigi elde ediyoruz. Ilk grafik hareketin yörüngesidir, digerleri konum-zaman grafikleridir.

                         

Figürxx: Bir Egik atis hareketinin yörüngesi ve yol-zaman grafikler. Baslangic sartlari olarak ilk hiz 10m/s ve atis acisi 45 derce verilmistir.

Bu bölümde CW'dan cikip editöre veri yazmayi ve interatktif veri girmeyi isledik. Bundan sonraki bölümde yine editörle calismaya devam edecegiz.

IIb) function Olusturma

Matlab'in kütüphanesinde bulunan fonksiyonlara ek olarak bu baslik altinda editöre function deyimiyle baslayan fonksiyonlar yazarak bu fonksiyonlarin girdi-cikti argümanlarinin nasil kullanilacagini aciklayacagiz. Yazacagimiz bu fonksiyonlar Matlab'in kendi öz dosyalariymis gibi bünyesine kurulacak ve help 'dosya adi' komutuyla da yazilan programlar konusunda biligi edinebilinecektir. Genel olarak function olusturma editöre yazilan asagidaki yöntemdir: 

       function[Cikt1, Cikti2, Cikti3,....]=fonksiyonadi( Girdi1, Girdi2, Girdi3,...)

 Burada dikkat edilmesi gereken, fonksiyonadi ile dosya adinin ayni olmasidir! Fonksiyon adi Yatayatis1 ise dosya da Yatayatis1.m adinda olmalidir. Simdi örnekler verelim. Kenarlarini uzunluklari a ve b  olan bir diktörtgenin alani A'yi hesaplayan fonksiyonel bir program yazalim. Baslangicta bir Matlab editörü aciyoruz ve adini DikdortgenAlani1 koyup save as ile kaydediyoruz.

 function A= DikdortgenAlani1(a,b)

% burada a ve b diktörtgenin kenar uzunluklaridir.

%A, a ve b'nin carpimidan olusan alani verir.

  A=a*b;

Editöre yazdigimiz bu dört satira geri dönelim. Ortdaki satirlar daha önceden bildigimiz ve yüzde isaretiyle baslayan, programin yapisini etkilemeyen yorum satirlaridir. Editöre girdigimiz ilk deyim function'dur, sonra almak istedigimiz ciktinin adini yaziyoruz (arada bir bosluk var), esit isaretinden sonra fonksiyonun adini DikdortgenAlani1 koyup parantez icinde girdi argümanlarini yaziyoruz. Alt satirda diktörgenin alanini tanimliyoruz. Özetle DikdortgenAlani1 adinda bir fonksiyon tanimliyoruz. Alani vercek olan A harfi cikti, kenar uzunluklari a ve b'de girdi parametreleridir. Simdi programin nasil calistigina bakalim. Bunun icin CW'a dosya adini yaziyor ver paranteze degerler veriyoruz. Asagida bu gösterilmistir:

>> A=DikdortgenAlani1(5,6)

A =

    30

Böylece dosya adindan sonra gelen parantez icindeki giridi degiskenleri Matlab'ta hemen a ve b'ye karsi geldikleri kabule edilerek ve A'da tanimlanan formülde yerine konularak sonuc cikti olarak atanacaktir. Artik CW'da fonksiyon adi yazilarak ve parantez icin istedigimiz degerleri vererek alan hesabi yapabiliriz. Matlab'in bünyesinde bir diktörgenin alaninin hesaplamasini yapan paket bir program yoktur. Böylece function deyimi ile DikdortgenAlani1 fonksiyonunu bir Matlab fonksiyonu yapmis oluyoruz. Öyleki CW'a help DiktortgenAlani1 komutu verildiginde, bu fonksiyon icin yazdigimiz yorumlar gözlenecektir.

>> help DikdortgenAlani1
  burada a ve b diktörtgenin kenar uzunluklaridir.
  A, a ve b'nin carpimidan olusan alani verir.

Baska bir örnekte bir silindirin yüzey ve hacim hesabini yapalim:

function [Y,H]= SilindirHesab1(r,h)

% Bu programda silindirin yüzeyini ve hacmini hesaplayacagiz.

H=(pi*r^2)*h;

Y= 2*pi*r*h+2*pi*r^2;

Burada SilindirHesab1 adinda bir fonksiyon ve ayni adili bir dosya olusturuyoruz. Girdi parametreleri r ve h, cikti parametreleri Y ve H'dir (silindirin yüzeyi ve hacmidir). CW'da fonksiyonu adi ile cagiriyor ve giris argumanlarini  sirasi ile 2 ve 10 veriyoruz:  

>> [Y ,H]= SilindirHesab1(2,10)

Y =

  150.7964

H =

  125.6637

Böylece cikti degerleride hesaplanip CW'de görüntülenir. Burada sadece bir cikti argümani yazilsa idi, ilk fonksiyon olan silindirin yüzeyi görüntülenecekti. Girdi ve cikti argümanlarinin degerlerini ve sayilarini degistirerek, calisanlar bu basit örneklerde girdi cikti parametreleri kullanmakta böylesi önemli bir konu icin el aliskanligi kazanabilirler. Baska bir örnekte 5 giris argümanli ve üc cikis argümanli IntYTurev1 adli bir fonksiyonun bagimsiz degiskeninin degeri, integrali ve türevi hesaplanacaktir.

function [inty,y,dify] = IntYTurev1(x,a,b,c,d)  

if nargin<5   % bu kontrol yapisi ile; eger giris argüman sayisi besten kücük

d=1;            % ise d'ye 1degeri atanmalidir anlamindadir.

end              % her kontrol yapisi bir end ile bitirilir.             

inty=(a*x^3/3)+(b*x^2/2)+c*x+d;

y=a*x^2+b*x+c;

dify=2*a*x+b;

 Programa y fonksiyonunun integrali, türevi ve kendisi girilmistir ve giris argümanlarinin degerleriyle bunlar hesplanacaktir. Burda if nargin < 5 kontrolüyle girs argüman sayisini kontrol ediyoruz. CW'da besten kücük giris argümani verilirse, d=1 kabul edilecektir. Asagida CW'de bu yapilmistir.

>> [inty,y,dify]=IntYTurev1(1,2,3,4)

inty =

    7.1667

y =

     9

dify =    

      7

Görüldügü gibi dört  adet giris argümani girilmistir ve bu deger besten gücük oldugu icin besinci argümanin degeri d=1 olarak programda yazildigi gibi alinmistir. Ayni sekilde cikti parameterleri nargout komutu ile kontrol edilir. Örnek olarak programa if nargout<3  ve dify=10  ve end satirlarini eklersek, CW'da iki argümanli bir cikti komutu verbiliriz. Bu durumda cikti olarak dify'ye 10 degeri atanacaktir. Böylece nargin ve nargout komutlari ile giris ve cikis argümanlarinin sayisini bir hata raporu almadan kontrol edebiliriz. Baska bir fonsiyon yazacagiz ve bu kez T sicaklikta bir kabin icinde hareket eden gaz toplulugunu hiz dagilimini, olasi hizi, ortalama  hizi ve hiz standart sapmasini hesap edecegiz. Cikis noktamiz hiz dagilim fonksiyonu olan Maxwell-Boltzmann dagilimidir.

function [f,v1,v2,v3,stsp]=InMaxwBoltzHDag1(T,vi);

k=1.3806504*10^(-23); % Boltzmann sabiti

mHe=3.346*10^(-27); %Hidrojen dimer

v=[0:1:5000];

f=4*pi*((mHe/(2*pi*k*T))^3/2)*(v.^2).*exp((-mHe*v.^2)/(2*k*T));

v1=sqrt(2*k*T/mHe)           % olasi hiz

v2=sqrt(8*k*T/(pi*mHe))    % ortalama hiz

v3=sqrt(3*k*T/mHe)           % hizin karesinin ortalamasinin karekökü

stsp = sqrt(sum((vi-v2).^2)/(length(v)-1))        % standart sapma

 plot(v,f,'r')

xlabel('hiz')

ylabel('olasilik dagilimi, N(v)/N')

title('Maxwell-Boltzmann Hiz Dagilimi')

CW'a hic cikti argümani yazmadan fonksiyon adi ile programi T=150K ve vi=60m/s ile cagriyoruz ve cikti degerlerini asagidaki gibi elde ediyoruz. Burada v1 en cok gözlenen hiz(olasi hiz), v2 ortalama hiz, v3 hizlarin karelerinin ortalamasinin kare köküdür.

 >> InMaxwBoltzHDag1(150,60);

v1 =

  1.1126e+003


v2 =

  1.2554e+003

 
v3 =

  1.3627e+003


stsp =

   16.9060

CW'da cikti argümanlarini kullanarak ve argümanlarin sirasini degistirerek yazmis olsaydik sonucta hic bir degisiklik gözlenmeyecekti. Yapilan hesaplamalar degiskene duyarli olup, cikti argümanlarinin siralamasindan ve sayisindan bagimsizdir. Girdi argümanlarinda sira ve sayi önemlidir. Degiskenlerin yerlerinin degistirilmesi yanlis sonuc vercektir. Deneyiniz. H2 gazini 150K de ve 0-5000m/s arasindaki ve Maxwell-Boltzmann hiz dagilimi yukardaki programla hesaplanarak asagida, figür xx gösterilmistir.

                                 

Fig.xx: Kapali bir kabin icine hapsedilmis H2 gaz toplulugunu 0-5000m/s arsinda ve 150K hiz dagilimi.

Buraya kadar yazdigimiz progamlar kisa ve sade programlardi, bu yüzden programlarda degisiklik yaparken her hangi bir karmasaya meydan verilmemistir. Uzun yazilan ve icinde bir cok function'u, fonksiyonu, parametreyi, degiskeni barindiran progamlarda, program üzerinde kontrolü kaybetmek kolaylasir. Programlari parcalayarak yazmak yani birden fazla editörde calisimak bu sorunu ortadan kaldirir. Okuyucularin en basit programi dahi parcalayarak programlamalari ve parcali programla calisma gelenegi olusturmalari salik verilir. Ayrica her program baslangicinda isleri kolaylastirmak ve yazilan programlarin kolay anlasilmalari icin ayrintili yorumlar yazilmalidir( program adi, versiyonu, hazirlayanin adi, tarih, degiskenler vb. oldukca etrafli ve acik anlatilmalidir).  En basit olarak  parcali programdan kastimiz, üc editör kullanarak, giris, cikis ve ana progarami farkili editörlere yazmaktir. Burada dikkat etilmesi gereken konu, her bir editöre farkli dosya isimleri ya da function'lar yazacagimiz icin, bu farkli editördeki functionlarin biri biri ile haberlesmeleri saglanmalidir. Bundan sonraki örneklerde programlar giris(input), cikis(output) ve ana program olmak üzere üc temele oturtacagiz ve böylece programlar ne kadar uzarsa uzasin, progam üzerinde bir hükümsüzlük yasamayacagiz. Simdi buna örnekler. Yine Lissajous figürleri. Artik üc editörde calisacagiz. Birinci editör hesaplanmasini istedigimiz fonksiyonun bulundugu editör olacaktir ve bu editörde bir function tanimlayacagiz. Ikinci editöre yalniz girdi verilerini yazacagiz burada bir function tanimlanmasi zorunlu degildir. Ücüncü editöre yalniz almak istedigimiz cikti degerlerine ulasmak icin gerekli yöntemleri yazacagimiz alan olacaktir, burada da bir function tanimlayacagiz. Simdi bir editör aciyor ve adini LissaAnaPro1 koyup kaydediyoruz. Bu birinci editördür ve ana programi buraya yazacagiz. Bunun icin adi dosya adiyla ayni olan, yani LissaAnaPro1 olan bir fonksiyon olusturuyoruz.

%:::::::::::Matlab Pogram::::::::::::

%............Lissajous-Figürleri..........

%           fu@ altunsu, 19.10.09

% Program Adi: LisaAnaPro1

% Web page fuat-altunsu.eu./Fizik/Matlab'a Giris icin yazilmistir.

 % Birbirlerine göre dik salinan iki sinüs titresiminin Lissajous Figürleri

 function [y1,y2,t]= LissaAnaPro1(faz,A1,A2,f1,f2,t)

D1=[1;0]*(A1*sin(2*pi*f1.*t));

D2=[0;1]*(A2*sin(2*pi*f2.*t+faz/180*pi*(ones(size(t)))));

y1=D1(1,:);

y2=D2(2,:);

Programi aciklayalim, bir birinden faz farkli ve bir birine dik iki sinüs saliniminin üst üste gelmelerini inceleyecegiz. Burada faz farki, her bir sinüs saliniminin Ai genlikleri ve fi frekanslari, zamanla birlikte alti tane girdi argümanini olustururlar. (1;0) ve (0;1) birbirine dik birim vektörler olup, sinüs salinmlarinin nasil kutuplu olduklarini tanimlar. Daha genel bir üst üste gelisi daha önce bir dönme matrisi ile tanimlamistik. Simdi yalniz dik iki salinima bakiyoruz. Problemin dogasi geregi üc girdi argümanimiz var, bunlar y1,y2,t'dir. y1'in ve y2'nin t'ye göre davranislarini görmek istiyoruz, bu yüzden t'yi cikti argümani olarak yaziyoruz. Burada asil görmek istedigimiz y1'in y2'ye göre davranislari olan Lissajous figürleridir. Bu nedenle bu üc cikti argümani ile istedigimiz sonuca ulasabiliyoruz. Simdi ikinci editöre bakiyoruz.

%:::::::::::Matlab Pogram::::::::::::
%............Lissajous-Figürleri..........
%                    fu@ altunsu ,19.10.09
% Program Adi: LissaGirdiPro1
% Web page fuat-altunsu.eu./Fizik/Matlab'a Giris icin yazilmistir.

%CW'da veri girisi yapilabilmesi icin program.
disp('Doksan derece altinda kesisen iki sinüs saliniminin Grafigi' );
disp(' ')

f1=input('y1 icin bir frekans giriniz(Hz), f1=')
f2=input('y2 icin bir frekans giriniz(Hz), f2=')
faz=input('Bir faz acisi(derece) giriniz:faz=')
A1=input('Birinci salinimin genligi,A1=')
A2=input('Ikinci salinimin genligi,A2=')
t=[-2:0.01:2];

[y1,y2,t]= LissaAnaPro1(faz,A1,A2,f1,f2,t);
[y1,y2,t]=LissaCiktiPro1(y1,y2,t);

Görüldügü gibi ikinci editör giridi argümalarin degerlerinin giris yapilacagi tüm yöntemleri iceriyor. Birinci yöntemle CW'a baslik atiyoru ikincisi ile bir sonraki islemler arasinda bir bosluk birakiyoruz. Takip eden alti girdi argümani ile CW'da bu alti girdi argüman icin veri girisi yapilacaktir. Son iki satir, programlari biri birine baglayan yöntemlerdir. Ilk yöntemde, girdi degerleri ile LissaAnaPro1 ana programda hesaplanilmasini istenilen degerleri yani y1,y2 hesapla ve t ile birlikte cikti icin bu degerleri devret, anlamidadir. Ikinci yöntemde ise bir sonraki cikti programi ile bu girdi progamin diyalogu anlatiliyor. Bu program bir birim program olup ana programdan aldigi y1,y2,t ciktilarini grafik cizimi icin hazir tutuyor. Sonucta cikti programi su sekildedir;

%:::::::::::Matlab Pogram::::::::::::
%............Lissajous-Figürleri..........
% yazan Fuat Altunsu @19.10.09
% Program Adi: LissaCiktiPro1
% Web page fuat-altunsu.eu./Fizik/Matlab'a Giris icin yazilmistir.

%Bu program ile cikti verileri yorumlanacaktir.

function [y1,y2,t]=LissaCiktiPro1(y1,y2,t)

subplot(1,3,1)
plot(t,y1,'r')
xlabel('t')
ylabel('sin(2*pi*f*t)')
title('sin(2*pi*f*t)-t')
grid on

subplot(1,3,2)
plot(t,y2,'b')
xlabel('t')
ylabel('sin(2*pi*f*t+faz)')
title('sin(2*pi*f*t)-t')
grid on

subplot(1,3,3)
plot(y1,y2,'g')
xlabel('y1')
ylabel('y2')
title('Lissajous-Figürleri')


 Ücüncü editördeki LissaCiktiPro1 fonsiyonunun görevi ana programdan aldigi verilerin grafiklerini cizmektir. Simdi programin nasil calistirilacagina bakiyoruz. Bunu icin CW'a girdi dosya adini yaziyoruz, burada girmemiz istenilen degiskenler karsimiza cikacaktir.

>> LissaGirdiPro1
Doksan derece altinda kesisen iki sinüs saliniminin Grafigi
 
y1 icin bir frekans giriniz(Hz), f1=1

f1 =

     1

y2 icin bir frekans giriniz(Hz), f2=3

f2 =

     3

Bir faz acisi(derece) giriniz:faz=60

faz =

    60

Birinci salinimin genligi,A1=1

A1 =

     1

Ikinci salinimin genligi,A2=1

A2 =

     1

 Bundan sonra acilacak figür penceresinde asagidaki grafikleri elde edecegiz. 

                     

Fig.cc:  Genlikleri orani 1, frekanslari orani 3 olan, altmis derece faz farkli iki sinüs saliniminin grafikleri ve 90° altinda birbirine göre davranislari.

Görüldügü gibi girdi programinda bir function tanimlamadik ve ve bütün programi bu programin dosya adini CW'a vererek calistirdik. Bir baska örnekte dagilim fonksiyonlarini inceleyelim ve ana program kuantumlanmis isimayi yani Planck isima formülünü digeri ise klasik yasalarla türetilmis isima formülünü (ultra viyole yikim) icersin. Önümüzdeki programda bu iki isima yasasini bir editörde programlayacagiz. Simdi programlara bakalim: Birinci editöre yine ana programi yaziyoruz. Burada Uq Planck isimasi, Uk Rayleigh-Jeans isimasini göstermektedir.

function [Uq,nu,T,k,c,h,Uk]= SiyahCisPlanck1Ana(nu,T,k,c,h);
%1.Kuantum mekaniksel isma, Planck isimasi
F1=8*pi*h/c^3;
F2=(nu.^3)./((exp(h*nu./k*T)-1));
Uq=F1*F2;
%2.Klasik isma- Rayleigh-Jeans isimasi
Uk=k*T*8*pi*nu.^2/c^3;

Ikinci editöre girdi degerlerini yaziyoruz.

T=input('bir derece giriniz (Kelvin), T=')
k=1.3806504*10^(-23);
c=299792458;
h=6.62*10^(-34);
nu=(1:10000:650000000)';

[Uq,nu,T,k,c,h,Uk]= SiyahCisPlanck1Ana(nu,T,k,c,h);
[Uq,nu,T,k,c,h,Uk]= SiyahCisPlanck1Cikti(Uq,nu,T,k,c,h,Uk);

Ücüncü editöre almak istedigimiz cikti deyimlerini yaziyoruz.

function [Uq,nu,T,k,c,h,Uk]= SiyahCisPlanck1Cikti(Uq,nu,T,k,c,h,Uk)

subplot(2,1,1)
plot(nu,Uq,'r')
title('Kuantum mekaniksel isima')
xlabel('Frekans/Hz')
ylabel('Olasilik')

subplot (2,1,2)
plot(nu,Uk,'b')
title('Klasik mekaniksel isima')
xlabel('Frekans/Hz')
ylabel('Olasilik')


Programi calistirmak icin girdi deyimlerini yazmis oldugumuz dosyanin adini CW'a yaziyor ve enter tusu ile dagilim fonksiyonlarinin kac Kelvinde cizilecegini belirliyoruz. Asagida iki dagilim fonksiyonlarinin grafikleri gösterilmistir.

                                    
Fig.cc: Isima olasiliklari: Görüldügü gibi düsük frekanslarda (büyük dalga boylarinda ) kuatum mekaniksel isima ile klasik isima dagilimi bir biri ile uyusmaktadir. Ultraviyole bölgesinde klasik isima olasiligi sonsuza gider. Bu duruma  UV-yikimi denir. Yukardaki programlari kopyala ve yapistir yöntemiyle  kendi  editörlerinize alarak grafiklerin davranislarini farkli sicakliklarda deneyiniz. (Isin fizigi Laserler bölümünde analtilacaktir)

Böylece coklu editörle calisma yöntemini görmüs olduk. Programlarin yapisina bakarak ücten fazla editörlede calisilabilir. Dördüncü editördede bir fuction yazilir ve sonunda bu da girdi editörüne digerleri ile birlikte yazilir. Bir programin cevresini genisletmek icin ana programin yapisina dokunmadan, ek bir editöre yardimci fonksiyonlar yazilarak bu da diger editörlere baglanabilir.

IIc) Kontrol Yapilari


Programlarin yapisi ve akisi döngüler ve alternatif yönlendirmeler iceren kontrol yapillari ile belirlenir. Matlab’ta for ve while döngüleri ile programi alternatif kanallara aktarma olanagi saglayan if ve switch kontrol yapilari ile calisilir. Bunlarla nasil calisildigina girmeden önce mantiksal islemciler ve anlamlarini verelim.

Mantiksal islemciler:

== denktir
~= denk degildir
>= büyük esit
<= kücük esit
> büyüktür
< kücüktür

 Iliskilendirme islemciler:

&  mantiksal "ve"
| mantiksal " ya da"
~ degilleme

 

1. for-Kontrol Yapisi

Anlam olarak -dek , kadar, icin’le es anlamli kullanilir. Örnegin, her hangi bir islemin 100‘e kadar devam ettirilmesi, 200 icin ya da 0‘dan baslayarak 5‘er 5‘er 40‘a kadar bir fonksiyonun degerinin hesaplanmasi gibi döngülü islemler for kontrol yapisi ile yerine getirilir. Böylece for döngüsü yapilmasi gereken bir islemi, öngörülen bir degere kadar calistirma islevini tasir. for döngüsünün argümaninin icinde döngünün isleyecegi sinir degerler ve artirim degeri bulunur. Asagida döngünün genel yapisi verilmistir. 

for  i=Baslangic deger: artirim degeri: Son deger
   yerine getirilmesi gereken islemler
end

Görüldügü gibi ilk satirda  for döngüsünün argümani, ikinci satirda yerine getirilmesi gereken islemler, ücüncü satirda end komutu bulunmaktadir. If ile baslayan ve end ile biten bu döngüde, baslangic degerde baslanir ve artirim degeri kadar artirimla son degere gelene kadar her bir adim icin yerine getirilmesi gereken islemler yerine getiriliertek end komutu ile döngüden cikilir. Asagidaki örnekleri inceleyiniz.

y1=0;           % baslangic degeri döngünün disindadir!
for k=8:1:10
  y1=y1+k;
end
y1                % hesaplanan deger döngünün disindadir!

Bu birinci örnekte for döngüsünün ne yaptigina bakalim. Birinci adimda disardan bir y1=0 degeri ile döngü icine giriliyor ve k’nin ilk degeri olan 8 alinaraktan y1 degeri hesaplaniyor. Bu durumda döngü icinde y1=8 degerine sahiptir. Döngü daha tamamlanmadigi icin y1=8 ile bu defa k=9 icin yukardan asagiya tekrar hesap ediliyor. Böylece y1‘in yeni degeri 17‘dir. Döngü daha tamamlanmamistir. Bu degerle yukardan asagiya dogru tekrar hesap basliyor. Sonuc olarak y1‘e sayacin son degeri 10 eklenerekten 27 degerine ulasiliyor ve sinir degere ulasildigi icin döngüden disari cikiliyor. Görüldügü gibi for-döngüsü islem süresince k degerlerini sürekli kontrol ederek son k degerine ulasip ulasilmadigina bakiyor. Bu örnekte döngünün disinda y1=0 baslangic degeri ile döngü baslatilip ve yine döngünün disinda sonuc degeri olan y1 ile döngü bitirilmistir. Asagidaki örnekte bu defa baslangic degeri y2=0‘i döngü icine aliyor ve döngünün ne yaptigina bakiyoruz.

for k=8:1:10

     y2=0;               % baslangic deger döngünün icindedir!

y2=y2+k;

end

y2                         % hesaplanan deger döngünün disindadir!

Burada k’nin ilk degeri olan 8 ile döngü icine girerken y2=0 baslangic degerini alip ilk hesabi yapiyoruz. Böylece y2‘nin yeni degeri 8 dir. Bu yeni deger ile yukardan asagiya dogru hesaba tekrar basliyoruz. k=9 alip döngü icinde dolanmaya baslarken siradaki y2=0 degeri birden y2 degerini sifira indirip, ard gelen islem icin k=9 ve y2=0 degeri ile isleme devam ediyoruz. Böylece ikinci adimda y2‘nin degeri 9 oluyor ve bu degerle yine yukardan asagiya hesaba basliyoruz. Ilk k degeri bir deger artirilarak 10 ile isleme girerken ikinci satirdaki y2=0 degeri ile y2=9 degeri sifirlanarak son deger olan 10‘a ulasiliyor. Asagidaki örnekte en son cikti degerinide döngü icine alalim ve islemdeki degisikligi inceleyelim.

for k=8:1:10

       y3=0;                  % Baslangic deger döngünün icindedir!

y3=y3+k;

y3                              % Hesaplanan deger döngünün icindedir!

end

Bu yazis bicimde hesaplama yukardaki örnekle aynidir, sadece cikti olarak her bir k degeri icin hesaplanan deger döngü disina verilerek ekranda görüntülenir. Böylece sonuc olarak ara degerler y3=8, y3=9, y3= 10 ulasilir. Baslangic ve cikti degerlerinin yerlerini degistirerek ciktinin nasil oldugunu görmek okuyuculara birakilmistir. Ancak yukardak örnekler isiginda asagidaki genellemeye gidiyoruz:

1.Baslangic deger döngünün disinda olmasi durumunda, döngü icinde bir kez ve ilk basta isleme konulur, bundan sonra döngü icin hükümsüzdür.

2.Bir degiskene atanan deger, bu degiskene bir sonraki adimda atanan baska bir degerle ortadan kalkar. Böylece bir degiskenin aktuel degeri gecmisinden bagimsiz olup, yalniz son atanan degeri icerir.

3.En son hesaplanan cikti degeri döngünün disinda olmasi durmunda, döngüden alinan son degeri veraset eder. En son hesaplanan cikti degeri döngünün icinde olmasi durumunda, döngü icinde hesap edilen her ara hesap asamasini cikti olarak ortama verir.

Iki boyutlu sayma islemlerinde ic ice iki for döngüsü kullanilir. Bu yöntemde disdaki döngüden ilk indis alinir ve alttaki for döngüsü icine girilir. Buradan da ilk indis alinarak yapilmasi gereken islemler yapilir. Ic döngünün ilk indisle calismasindan sonra ikinci indisi ile islemler yapilir. Bu durum ic döngünün indisleri kullanilana kadar sürer ve islemler bittikten sonra dis döngüden ikinci indis alinir. Bundan sonra yine dis for döngüsünün ikinci indisi sabit tutularak ic döngünün bütün indisleri taranir. Bu durum dis döngünün bütün indisleri kullanilana kadar devam eder. Ic ice for döngülü yapilar her bir for icin iki tane end komutu ile bitirilir. Genel yapi asagidaki gibidir.

for k=baslangic deger:dk: son deger

                                           for h=baslangic deger:dh:son deger

                                               yapilmasi gereken islemler

                                           end

                                        end

 

Bir örnek verelim:

y9=0;                         % Baslangic deger her iki döngünün disindadir

for k=1:1:3

  for p=8:1:10

      y9=y9+k+p;

  end

end

y9                              % Son hesaplanan deger her iki döngünün disindadir.

 

Ic ice bu iki for döngüsünün nasil calistigina bakalim. Ilk önce döngü disindaki, yani en dis kabuktaki y9=0 baslangic degeri ile ilk döngü icine girilirken beraberinde ilk döngünün ilk indisi tasinarak ikinci döngüye girilir. Baslangic deger, dis döngünün ilk indisi ve ic döngünün ilk indisi ile y9=y9+k+p hesaplamasi yapilir. Bu deger birinci adimda 9 esittir. 9 degeri ile ic döngünün ikinci indisi alinarak toplama islemi tekrarlanir. Bu durumda k’nin degeri hala birdir. Sonra yine k=1 degeri ve p=10 degeri ile toplam sonucu isleme konur. Ic indisler kullanildiktan sonra, yukarda deginildigi gibi dis döngünün ikinci indisi ile ayni islemler devam ettirilir. Son olarak 99 degerine ulasilir. Okuyucular baskalngic ve bitis degerlerini döngülerin farkli yerlerine koyarak, bütün kombinasyonlari deneye biliriler. Bu islemler CW’da yapilmadan önce kagit üzerinde yapilirsa daha ögretici olacagi aciktir. Matlab’in Java, C, C++‘a göre avantajli oldugu durmlardan birisi for döngüsünün alternatifinin olmasidir. Bu alternatif durum daha önce vektör gösterimi icin kullandigimiz yöntem olan

k=[ baslangic deger:dk: son deger]


ile gösterilen tek satirlik islemdir. Islemcinin yorulmamasi icin vektörel yapinin kullanillmasi daha uygundur, öyleki iki islem arasinda en basit islem göz önüne alinirsa yüzde 30‘luk bir zaman farki vardir, bu da icinde birden cok for döngüsü kullanilan hesaplamalarda önemli zaman dilimine karsilik gelir. Buna bir örnek, 1‘den 50‘ye kadar sayilarin toplanmasini (n(n+1)/2=1275) iki yöntemlede hesaplayip islem süresini ölcelim:

>> tic; ,s=sum(1:1:50), toc;
s =                                     
      1275
Elapsed time is 0.000114 seconds.

tic; i=0;, for k=1:1:50;, i=i+k ,end, toc;
i =
        1275
Elapsed time is 0.000470 seconds.

Bu örnekte görüldügü gibi for döngüsü vektörel yöntemden en az dört kat daha fazla zaman harcamistir.

 

2) while-Kontrol Yapisi

Yürürlükte oldugu sürece ya da gecerli ise anlamlarina gelen while döngüsü, argümanindaki kosul saglandigi sürece kenisini takip eden islemleri yerine getirir. Aksi durumda döngüden cikilir.  Genel yapisi asagidaki gibidir.

while (kosul)
  kosul yerine geldigi sürece yapilmasi gereken islemler
end

Örnek:

                  a=5;
                  while(a<15)
                      a=a+4
                  end

Döngünün ne yaptigina bakalim: argümanda ki kosul a’nin degerinin 15 kücük olmasidir. Bu kosul yerine getirildigi sürece a=a+4 islemi yerine getirilecektir. a’nin degeri 15‘e esit ya da 15‘den büyük olmasi durumunda islem yapilmayacaktir. Döngüye baslangic degri olan a=5 ile giriyoruz. Böylece toplamin ilk sonucu 9 dur. Sonra 9 ile döngü icinde isleme devam edilir, bu ikinci turda toplam sonucu 13 olur. Bu deger 15 den daha kücüktür, böylece isleme devam edilir. Sonucta a=13+4=17 degerine ulasilir ve bu deger while döngüsünün argümani icindeki a’dan daha büyük oldugu icin ard gelen islemlerin yapilamsi icin gerekli kosul ortanda kalkmis demektir, bu nedenle end ile döngüden cikilir. 

3) if- Kontrol Yapisi

Eger anlamindaki yapi, kendisindan sonra yapilacak islemlerin yerine getirilmesi icin argümanindaki mantiksal kosulun saglanmasini bekler. Kosulun saglanmadigi durumlardaelse ile devam edilir ve bunu izleyen islemler yerine getirilir. If programlamada en cok kullanilan kontrol yapisidir.

    if  ( mantiksal kosul)


        matiksal kosul dogru ise yerine getirilmesi gereken islemler
     else
        mantiksal kosul dogru degil ise yerine getirilmesi gereken islemler

    end       

                                                           

Bir örnek:

a=4;
 if(a==4)
disp('a nin degeri 4 tür')
    elseif(a==5)
disp('a nin degeri 5 dir')
    else(a==6)
disp('a nin degeri 6 dir')
end
a nin degeri 4 tür

Görüldügü gibi a’nin baslangic degeri 4 verilmistir ve if’li, elseif’li ve else’li yapilarla a’nin degeri sorgulanmaktadir. Sonucta dogru olan a=4 degeridir ve bu degerin ekrana yazdirlimasi isteniyor. Baska bir örnek:

x=8; y=4;
if (x>y)
    A=y;
     y=x;
     x=A;
end
     [x y]

ans  4     8 olacaktir. Burada yapilmasi istenilen sey x’in y’den büyük olmasi durumunda x ve y’nin degerlerinin degistirilmesidir. Baska örnekte :

a=0;, b=8;

if a~=0       % a sifira denk degilse b'nin  karesini al

b^2

elseif a==0 & b==8    % a sifira denk ve b'de sekize denkse b'nin küp kökünü al.

b^(1/3)

end

 

4) switch-case -Kontrol Yapisi

switch-case yapisinda switch argümani icine test edilecek bir deger girilir, bunu izleyen case yapilarinin argümanlarina switch yapisinin argümani ile karsilastirilacak verileri girilir. Sonucta hangi durumun ''case'in yapisi test degeri ile uyum icinde ise o case izleyen islemler yerine getirilir. Hic bir case test ile uyusmuyorsa otherwise altindaki islemler yerine gertirilir. Sematik olarak asagida gösterilmistir.

                                                                                                 

 

switch  test edilecek deger
case  karsilatirilacak veri1
         yerine getirlecek islem
case karsilastirilacak veri2
         yerine getirilecek islem
...
...
otherwise
        yerine getirilecek islem
end

 

 

 

Örnek verelim. Dört degerini farkli durumlarla karsilastiriyoruz ve durumlarla test degerinin uyum icinde olmamasi durumda cikti olarak 'baska degerler' verisini elde etmek istiyoruz. Cell '{}' icinde  3,4,5 degerleri switch ile karsilatiriliyor. Bu durum switch ile uyumlu oldugu icin üc,dört,bes ciktisi elde ediliyor.

 switch 4
case 0
disp('eksi deger')
case 1
disp('sifir')
case 2
disp(' iki degeri')
case {3,4,5}
disp('üc,dört,bes')
otherwise
disp('baska degerler')
end
üc,dört,bes

Simdi döngüleri kullanarak programlar yazalim.  Ilkin basit örnekler yapalim.

p1) Toplam. Birinci örnekte 45‘den baslanarak 5er artirimla 60 kadar sayilarin karelerinin toplami yazilacak. Balangic degerini 50 alalim:

     toplam=50;
for k=45:5:60
     toplam= toplam +k^2;
end
toplam

toplam
      11200


Gerek carpma iceren gerekse toplama iceren bu tür örneklerde baslangic degerin döngü disinda tutulduguna dikkat ediniz. Basalangic degerin döngü icine alinmasindaki amac her kendi basina bir islemden sonra sayaci sifirlamaktir!

p2) Carpim.  2‘den baslayarak (ikiser artirimla) 6‘ya kadar sayilarin karelerinin carpimini veren program:

carpim=1;
for k=2:2:6
  carpim=carpim*k^2;
end
carpim

carpim =

        2304


p3) Faktöriyel. Bir sayinin  (5‘in) faktöriyelini veren program:

faktoriyel=1;
for i=1:1:5
 faktoriyel =faktoriyel*i;
end
faktoriyel

faktoriyel=
         120


p4) Elemanlar toplami.  Baska bir örnekte bir vektörün elemanlarinin toplamini bulalim;

U=[1,4,12 ];
toplam=0;
for i=1:3
    toplam=toplam+U(i);
end
toplam

toplam=
         17

Burada görüldügü gibi i indisi ile vektörün elemanlari taranmaktadir ve bu tür islemlerde indisin uzunlugu kadar vektörün elemanlari olmalidir.

p5) Vektör boyu. Bu örnekte  bir vektörün boyu hesplanacaktir:

A=[1,2,3];
toplam=0;
for i=1:3
    toplam=toplam+A(i)^2;
end
sqrt(toplam)

ans =

    3.7417


Burada i indisi ile vektörün her bir  elemani sirasi ile döngü icine alinarak kareleri alinir ve bir önceki indis degerinin karesi ile toplanir. Bu islem bütün indisler taranana kadar devam eder. end komutundan sonra karekök alinaraktan vektörün boyuna ulasilir.

p6) Skaler carpim. Iki vektörün skaler carpimina bakalim:

U=[1,2,-2 ];
V=[1,3,-4];
skalercarpim=0;
for i=1:3
    skalercarpim=skalercarpim+U(i)*V(i);
end
skalercarpim
 
skalercarpim =

    15

Burada i indisi iki vektörün elemanlarinin taranmasi icin kullanilir. Ayrica U(i)*V(i) gösterimi ile eleman elemana carpim yapilmaktadir. Burada da vektörlerin boylari ve indis boyu esit olmak zorundadir.

p7) Iki verinin karsilatirilmasi. Iki degerin karsilatirilmasi ve ekrana yazilmasi istenilen cikti degerini veren program:

A=17;
B =18;
if( A==B)    
    disp('onyedi Subat , dogum günü')
elseif A>B
    disp('bu gün dogum günü degil')
else
    disp(' dün dogum günü idi')
end

dün dogum günü idi


p8) Diagonal matris olusturma.  Diagonal elemanlari 1,2,3 ve diagonal disi elemanlari sifir olan üce üc bir matris olusturalim:

n=3;
for i=1:n
    for j=1:n
        if i~=j
            A(i,j)=0;
        elseif i==1
            A(i,j)=1;
        elseif i==2
            A(i,j)=2;
        elseif i==3
            A(i,j)=3;
        end
    end
end

>> A


A =

     1     0     0
     0     2     0
     0     0     3

p9) for döngüsü kullanilarak bir den fazla grafik. Bu program -3pi ile 3pi arasinda genlikleri 3 birim olan ve frekanslari farkli dört sinüs grafiginin cizilmesini verir.

 

x=(-3*pi:0.01*pi:3*pi)'

A=3;

S=zeros(length(x),4);

for j=1:4

S(:,j) =A*sin(x*j);

end

plot(x,S)

axis([-11, 11, -5, 5])

 



p10)

%                                                              Matlab Program
%                        Bir sayi dizisi icinde bir alt sayi dizisinin yerlesiminin veren program
%                                                   fu@ altunsu, 04.12.09                         
%                                        Web-page Fizik/ Matlaba giris icin yazilmistir               
%                        Bu programda x dizisinin icinde 1 2 1 sayi dizisinin siralanisi aranacak

x=[1 2 1 2 1 1 1 1 1 2 2 1 1 1 1 2 2 2 2 2 1 1 1 1 2 1 2 1 2 1 2 1 2  ...
    1 2 1 1 2 1 2 1 2 1 2 2 2 2 2 2 1 1 1 1 1 1 1 2 2 2 2 1 2 1 2 1 2 ...
    1 2 1 2 1 2 1 2 2 2 2 1 2 2 2 2 2 1 1 2 1 2 1 2 1 2 1 2 1 2 2 1 2 ...
    2 2 1 2 1 2 1 2 1 2 1 2 2 2 1 2 2 1 2 1 2 2 1 2 1 2 2 1 2 2 2 2 2 ...];

   tic;
N=length(x)
for i=1:N-2;
    for j=(i+1):N-1;
        for k=(i+2):N;
    if x(i)==1&x(j)==2&x(k)==1&i<j&j<k ;
        if j==i+1&k==j+1  
           v=[i j k]
        end
    end
        end
    end
end
 toc;

p11) Sicaklik ölcümü: Iletkenlerin iletkenliklerinin ya da direnclerinin sicakliga bagli oldugu bilinmektedir. Iletkenlerin bu özelligi kullanilarak yüksek sicakliklarida ölcebilecek bir sicaklik ölcer, yani bir termometre dizayn edebiliriz. Teknolojide en cok kullanilan sicaklik ölcer düzeneginin basinda PT-1000 sensörleri gelmektedir. Platin -1000, 0°C derecede 1000 ohm'a sahiptir ve bu direnc dis sicaklik degisimi ile lineer degisim gösterir. Bu özelliginden dolayi sicaklik ölcer sensörü yapimi icin iyi bir adaydir. Asagida direncin -40 ile 400°C arasindaki degisimi verilmistir.

R=842,882,921,960,1000,1039,1077,1116,1155,1193,1232,1270,1308,1422,1460,1498,1535,1573,1610,1647,

1684,1721,1758,1795,1831,1868,1904,1940,1977,2031,2049,2084,2120,2156,2191,2226,2262,2297,2332,

2367,2401,2436,2470

Pratikte Pt-1000 direnci üzerinden mA büyüklügünde sabit bir akim gönderilir ve direncin uclarindaki potansiyel degisiminin sicakliga karsi davranisi belirlenir. Akim sabit oldugu icin potansiyel farki direnc degisiminden kaynaklanacaktir. Bu durumda dT ile dU lineer davranis gösterir. Burada devre üzerine mA büyüklügünde akim göndermemizin nedeni PT-1000 direncinin kendisinin ortama bir isi yaymasini engellemektir. Gercekte direnc üzerinden gecen akim bir öz sicaklik degisimine nede olsada bu cok kücük bir deger oldgugu icin ihmal edilir. Böylece dis sicaklikla PT-1000 direnci arasinda bir termal denge kurulur. Ölctügümüz deger her direnc degisimi icin bu denge sicakligidir.

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

 

 

 

 

 

 



     

 

 

 

 

 

 

 

 

 

Matlab II