Kaynaklar A'dan Z'ye MATLAB ile ÇALIŞMAK,Doç. Dr. Doğan İbrahim HER YÖNÜ İLE MATLAB, Yrd.Doç.Dr.Mehmet UZUNOĞLU MATLAB ve MÜHENDİSLİK UYGULAMALARI, Cemalettin Kubat MATLAB Kılavuzu, Aslan İnan Bilgisayar Programlama Yrd. Doç. Dr. Ümit Deniz ULUŞAR İletişim : umitulusar@akdeniz.edu.tr Oda: 317 Web sayfası http://www.ulusar.com/prog101.htm Programlamanın Amacı Computational Thinking i öğrenerek küçük çaplı programlar yazabilmek. Başkaları tarafından yazılan programları anlayabilme ve kullanabilme!!!!! Bilimsel problemleri bilgisayarda çözülebilir bir hale getirme. Bilgisayarla konuşmanızı sağlayacak yeni bir dil öğrenme. Program Kontrol HAFIZA(Memory) CPU (İşlemci) ALU (Aritmetik Logic Unit) PC Komut 1 Komut 2 Komut 3... Komut n Programlama Dili Dil geçerli cümlelerden oluşan bir settir. Bir cümlenin geçerli olması için Syntax (Grameri doğru olmalı) Semantics ( Anlamlı olması) Ör: Kavaklar yolda yürüyor. Programlama Dilleri Üst seviye programlama dilleri Alt seviye programlama diller Interpreted diller Derlenen diller Genel amaçlı diller Özel amaçlı diller Matlab bilimsel amaçlı, sayısal hesaplama yapmak üzere geliştirilmiş, yorumlanan ve ki başına çalışamayan kodlar üreten 4. nesil bir dildir. 1
Matlab Kurulumu Command Penceresi Komutları yazabildiğiniz ve hemen sonucunu görebildiğiniz alan. 2
Editör Komutlar bir araya getirilebilir ve bir dosya şeklinde saklanabilir. Genellikle dosya uzantısı.m dir. Workspace Hafızada bulunan değişkenleri gösteriri. Aktif Klasör Çalışmakta olduğunuz klasörü gösterir. Yanındaki ikonları kullanarak aktif klasörünüzü değiştirebilirsiniz. Neden Matlab Veri analizi bilgisayar-tabanlı yöntemlerle yapılmaktadır. Gerçek veriler genellikle büyük miktarlarda olurlar. Genellikle ilk gözlemlenenin dışında birçok ekstra bilgiyi içerirler ancak bu veride gizli olan bilgiyi çıkartmak gelişmiş bir analiz yöntemi gerektirir. (Ör: Finansal verileri kullanarak bir hisse senedinin gelecekteki durumunu tahmin etmek) Matlab i Kullanmaya Başlamak Command penceresinde date yazın. Enter tuşuna basın. Mevcut bulunduğunuz klasörü göstermek pwd yazın. Enter tuşuna basın. Mevcut klasörleri ve dosyaları listelemek ls İstediğiniz bir klasörün içine girmek cd C:\windows Bir komut hakkında yardım almak (doc) doc ls Bulunduğunuz klasörden bir üst klasöre çıkmak cd.. 3
Merhaba Dünya Diğer Dillerde Merhaba Dünya http://www.helloworldexample.net/java-hello-worldexample.html Basit Aritmetik İşlemler Toplama: 1+1 ya da plus(1,1) Çıkartma: 17-12 ya da minus(17,12) Çarpma: 5.*8 ya da times(5,8) Bölme: 17./9 ya da rdivide(17,9) Üs Alma: 99.^2 ya da power(99,2) Karekök: sqrt(15) Değişkenler Belli bir türe ait veriyi saklayan veri deposudur. 2 2 Ör: c a b fonksiyonunda a=3 ve b=4 ise c nin değeri ne olur. a = 3.5 b = 4.1 a+b c=a+b a=3 b=4 c=sqrt(a.^2+b.^2) y = ax 2 + bx + c denklemini a = 2, b = 4, c = 8, x = 3.5 için y nin aldığı değeri hesaplatın. 4
Kullanıcıdan Bilgi Almak - Input Input komutu kullanıcının veri girmesini ister. sonuc=input( Kullanıcıya gösterilecek mesaj ) k=input( Bir sayı giriniz = ) disp( Girmiş olduğunuz sayının iki katı = ) disp(2.*k) İki açısı bilinen üçgenin üçüncü açısını hesaplayan bir program yazınız.? 65 85 Kullanıcınız için bir program yazmak istiyorsunuz. Kullanıcınızın çözmek istediği problem klasik havuz problemi. ( Ör: Birinci musluk havuzu tek başına x saatte dolduruyor ikinci musluk havuzu tek başına y saatte dolduruyor. İki musluk birlikte kaç saatte doldurur.) Burada program kullanıcında birinci ve ikinci musluğun havuzu kaç saatte doldurduğu bilgisini alacak ve sonuçta iki musluk birlikte kaç saatte doldurur bilgisini gösterecek. Matrisler ve Seriler clear all; clc; Matlab da temel veri yapısı matristir. Bütün veriler matris şeklinde tutulmaya ve işlenmeye çalışılır. Matrisi oluştururken köşeli parantezle başlanır. Satırdaki elemanları boşluk karakteriyle ayırırız. Bir alt satıra ; karakteriyle geçilir. Son olarak köşeli parantez kapatılır. a=[1 2 ; 3 4] a = 1 2 3 4 b=[2 1; 0 1] b = 2 1 0 1 5
a+b d=a.*b d = Transpoz a' Tersi inv(a) 3 3 3 5 2 2 0 4 1 3 2 4-2.0000 1.0000 1.5000-0.5000 f=a-b c=a*b Determinant det(a) a*inv(a) f = c = -1 1 3 3 2 3 6 7-2 1.0000 0 0.0000 1.0000 Elemanlara Erişim a(1,1) a(2,:) a(2,:)+b(2,:) a(1,:)+b(2,:) 1 3 4 a(1,:)+b(:,2) a(:,1) 1 3 a.^2 a^2 a(2,:)*a(2,:) Seriler >> t=1:1:10 t = 1 2 3 4 5 6 7 8 9 10 >> t=0:0.1:0.5 t = 0 0.1000 0.2000 0.3000 0.4000 0.5000 x -2 den başlayarak 2 ye 0.1 er değer artışlarıyla kadar giden serisini oluşturan komutu yazın daha sonra bu aralıkta y=x^2 grafiğini çizdirin. x=-2:0.1:2 % x değerlerinin bulunduğu seriyi oluştur y= x.^2 %y değerlerini hesapla plot(x,y) %komutunu kullanarak grafiğini çiz xlim([-4 4]) % grafiğin x eksenini ayarla -4 ile 4 arasında olsun ylim([0 10]) %grafiğin y eksenini ayarlar title( Grafiğin Başlığı ) % grafiğin başlığını belirt 6
y=5x 2 +6x+7 [-2:0.1:2] Dosyadan Veri Yüklemek Matlab de veri yükleme işlemi için load komutu kullanılır. Load komutu çeşitli tiplerde veriyi yüklemek için kullanılabilir. clear all load( gong.mat ); plot(y) sound(y,fs) Burada gong.mat dosyanın adını belirtmektedir. Ör: Ses dosyası load('gong.mat') % iki adet degisken workspace te olusacaktir %Fs ornekleme frekansini gosterir %y sinyali gosterir t=fs*3; ff=y(1:t).*2; % sesi acalim qq=y(1:t)./2; % sesi kisalim y=[ff; qq]; % sesleri birbirine ekleyelim. plot(y); % grafigini cizdirir sound(y,fs); % olusan sinyali ses olarak calar. wavrecord Ses dosyasını kaydetmek ve Matlab de oynatmak Fs = 11025; % saniyede kaç adet veri alınacak y = wavrecord(5*fs,fs,'int16'); % 5 saniyelik kayıt yapalım soundsc(y,fs); % kaydı oynat %Kaydetme wavwrite(y,'c:\matlab\myrecord.wav') %Tekrar Okuma wavread('c:\matlab\myrecord.wav ) Ses Üretmek Tek Bir Ses Üretmek function [s]=sesuret(ft,fs,td) s=sin([1:fs*td]*2*pi*ft/fs); nota=sesuret(440,16000,2) soundsc(note,16000) % sesi ölçekleyip oynat Sembolik Değişkenler syms a b simplify(6*a*b+3*a^2+2*a*b) solve('a*x^2+b*x+c=0') solve('3*x^2+2*x-8=0') syms a solve('a*x^2+b*x+c=0',a) 7
Ör: x^4-8x^2+16=0 denkleminin köklerini bulun. p=solve('x^4-8*x^2-16=0') p = [ 2*(2^(1/2)+1)^(1/2)] [-2*(2^(1/2)+1)^(1/2)] [ 2*(1-2^(1/2))^(1/2)] [-2*(1-2^(1/2))^(1/2)] vpa(p) Ör: Perde a=uint8(zeros(100,100)); % değerleri 0 ile 255 arasında olsun a(10:90,10:90)=255 a(10:90,80:90)=125 a(10:90,10:20)=125 a(:,45:55)=0 a(45:55,:)=0 imtool(a) Matrisler - Resim s = imread('pout.tif'); imtool(s) >> size(s) 291 240 >> s(:,1)=0; >> imtool(s) Çerceve s=imread( pout.tif ) s(:,1:20)=0; s(:,220:240)=0; s(1:20,:)=0; s(271:291,:)=0; imtool(s) Boyut Değiştirme >>s=imread( pout.tif ); >>size(s) 291 240 >>s2=s(1:240,1:240); >> size(s2) 240 240 >>imtool(s2) 8
Ödev Pout resminde çocuğun sol cebinde bulunan armanın yan yatmış şeklini cizdirin. Sayfa düzeni Ad Soyad Resim Program Kodu If ifadesi Eğer koşul doğruysa komutları çalıştırır. Else ifadesi Eğer koşul yanlışsa komutları çalıştırır. >> if (KOŞUL) % doğruysa çalışacak %komutlar else % yanlışsa çalışacak %komutlar Ör: If ifadesi a=5; if (a>10) disp('a 10 dan büyük') else disp('a 10 dan küçük') Ör: If ifadesi ve Input a=input( Bir sayı giriniz ); if (a>10) disp( Girilen sayı 10 dan büyük') else disp( Girilen sayı 10 dan küçük ya da eşit') a 10 dan küçük a=5 b=8 if (a==b) disp('a nin değeri b ye eşit') else disp('a nın değeri b ye eşit değil') Kullanıcıdan bir sayı isteyen ve eğer girilen sayı 50 den küçükse 50 den küçük değilse 50 den büyük yazdıran bir program yazın. 9
1. Vize ve final notlarını soran ve ortalamasını gösteren program yazınız. 2. Eğer ortalama 50 nin üstündeyse geçti değilse kaldı yazan program yazınız. Kullanıcıdan bir sayı isteyen ve eğer girilen sayı 2 nin tamsayı katıysa 2 nin katı değilse 2 nin katı değil yazdıran bir program yazınız. a=input('bir sayı giriniz'); b=mod(a,2); if(b==0) disp('2 nin katı') else disp('2. katı degil') Mantık Operasyonları Mantık Operatörleri x y X&&y (VE) DOĞRU DOĞRU DOĞRU DOĞRU YANLIŞ YANLIŞ YANLIŞ DOĞRU YANLIŞ YANLIŞ YANLIŞ YANLIŞ x y x y (VEYA) DOĞRU DOĞRU DOĞRU DOĞRU YANLIŞ DOĞRU YANLIŞ DOĞRU DOĞRU YANLIŞ YANLIŞ YANLIŞ a=5; b=9; a>b 0 (a<b)&&(a<6) 1 a>5 b>5 1 Döngüler - For Döngüler belirli komutların tekrar çalışmasına olanak sağlar. Matlab deki for yapısı for kelimesiyle başlar ve kelimesiyle biter. for indeks=değerler %çalıştırılacak komutlar Ör: for j=1:4 disp( Bla Bla ) 10
Ör: for i=1:10 disp( i nin aldığı değer = ) disp(i) 10 dan 100 e kadar kadar olan sayıları gösteren programı yazın. for i=10:100 disp(i) Birden 50 ye kadar olan sayıların toplamını gösteren programı yazın. t=0; for i=888:128120 t=t+i; disp(t) Kullanıcıdan 5 sayı girmesini isteyen ve girilen sayıların toplamını bulan bir program yazınız. Ödev Kullanıcıdan 1 ile 365 arasında gün bilgisi isteyen, girilen günün 1 ile 365 arasında olduğunu kontrol eden ve eğer koşul sağlanmışsa girilen günü hafta ve gün cinsinde gösteren bir program yazınız. Ör: 75 gün 10 hafta 5 gün olarak göstersin. 11
Ör: For Döngüsü Kullanarak Standart Sapma Hesaplama clear all;clc; x=[12 8 25 39 43 58 20]; n=length(x); % serinin uzunluğunu bulur t=0; for i=1:n t=t+x(i); xbar=t/n; z=0; for j=1:n z=z+(x(j)-xbar).^2; s=sqrt(z/(n-1)); disp(s) clear all M =[ [1, 4, 7] [2, 5, 8] [3, 6, 9] ]; for i = 1:3 a(i)=m(i,i); disp(a) (FOR IF) For ve if döngüsü iç içe kullanılabilir b=[ ]; a = [ 1 8 12 4 3 2 6 4 9 2 1 4 ]; for i =1:12 if ( a(i) >= 6 ) b(i)= 6; else b(i) = a(i); disp( b de tutulan değerler ) disp(b) İç İçe Döngüler Döngüleri iç içe kullanmak mümkündür. M = [ [1, 4, 7], [2, 5, 8], [3, 6, 9] ]; for i = 1:3 for j = 1:3 N(i, 4-j)= M(i, j); disp(n) Kullanıcıdan For Döngüsüyle Veri Almak for i=1:5 a(i)=input('sayı giriniz ='); disp('girmiş olduğunuz sayılar = ') for i=1:5 disp(a(i)) While Döngüsü while(koşul cümlesi) kod bloğu : Ör: i=0; while (i<99) i=i+2; disp(i) 12
Ör: Asal Sayılar clear all; clc; i=input('bir sayı giriniz ='); j=2; while (j<i-1) k=mod(i,j); if (k==0) break; j=j+1; if (k==0) disp('girilen sayý asal sayı'); else disp('girilen sayı asal sayı değildir') Boyut Değiştirme >>s=imread( pout.tif ); >>size(s) 291 240 >>s2=s(1:240,1:240); >> size(s2) 240 240 >>imtool(s2) : Resmin üstüne siyah renkli bir çarpı işareti ekleyin. Rastgele Sayı Üretmek Matlab de rastgele bir sayı üretmek için rand() fonksiyonu kullanılır. Ör: >> rand() 0.9058 >> rand() 0.1270 50 adet rastgele sayı üretelim ve bunu plot komutuyla ekrana çizdirelim. Sayıları Yuvarlamak Real bir sayıyı en yakın tam sayıya yuvarlamak için round fonksiyonu kullanılır. round(5.5) İçinde kaç tanesin 0.5 den büyük olduğunu saydıralım. 6 13
Ekrana for döngüsü kullanarak alttaki şekilde çıktı veren program yazın. Ödev pout.tif resmine en az 5 piksel kalınlığında bir çember ekleyiniz. Çember en az 50 piksel yarıçapında olacak. x xx xxx xxxx xxxxx Tek sayfa halinde. İsim Resim Çıktı Program (Yazı-Tura) 10 defa yazı tura atan ve sonucunu ekrana yazan bir program yazalım. Program 1 ile 100 arasında rasgele bir sayı üretsin. Eğer üretilen sayı 50 den büyükse ekrana Tura değilse Yazı yazdırsın. Bu işlemi for döngüsünün içinde 10 defa yapsın. : Seriler Kullanıcı tarafından girilen 10 sayıyı küçükten büyüğe doğru sıralanmış şekilde gösteren bir program yazınız. Dört basamaklı ve basamakları tekrarlanmayan bir sayı üreten bir program yazınız. 4 lük bir seri yaratacağız. (Ör: x(1:4)=0; ) [0 9] aralığında rastgele bir tamsayı yaratacağız. ( Ör: r=round(rand()*9); Yaratılan sayının önceki basamaklarda olup olmadığını kontrol edeceğiz. Bir seride en çok tekrarlanan sayıyı bulmak. Resminizin üstüne yaklaşık 10 piksel kalınlığında bir çember ekleyelim. 1. Diskinizin c kısmında resimlerim adı altında bir klasör yaratın. 2. Resminizi bu klasöre kopyalayın. Adını 1 olarak değiştirin. s=imread('c:/resimlerim/1.jpg'); % komutunu kullanarak hafızaya yükleyin s2=rgb2gray(s); % komutunu kullanarak siyah beyaz resim haline çevirin For döngüsünü kullanara s2 matrisinin ilgili değerlerini 0 a eşitleyin. Yazdığınız programı ve resmi bir A4 e bastırın. Fonksiyonlar function [cikti1, cikti2,...] = fonksiyonadi(girdi1, girdi2,...). Ör: function [fark]=cikart(a,b) fark=a-b; 14
Ör: Function rastgele.m adından bir dosya yaratın. İçine alttaki kodu yazın function [s1,s2]=rastgele() s1=rand(); s2=rand(); Sayı Oyunu rakamları birbirinden farklı ve 0 ile başlamayan 4 basamaklı bir sayı tutun Ör:1023 Rakibiniz bu sayıyı tahmin etmeye çalışıyor. Karşılıklı tahmin şeklinde oynanıyor 1032 (+2 2) Komut ekranında >>[x y] = rastgele() Komutuyla fonksiyonu çağırabilirsiniz. Eğer tahmin edilen sayıda rakam ve yeri tutuyorsa + Sadece rakam tutuyor yeri tutmuyorsa - sayiuret function [a1,a2,a3,a4]=sayiuret() a1=round(rand()*8)+1; a2=round(rand()*9); while (a1==a2) a2=round(rand()*9) ; a3=round(rand()*9); while(a3==a1 a3==a2) a3=round(rand()*9); a4=round(rand()*9); while (a4==a1 a4==a2 a4==a3) a4=round(rand()*9); Çağırmak için!!!! >>[t1,t2,t3,t4]=sayiuret() Artı function [arti]=artikac(a1,a2,a3,a4,b1,b2,b3,b4) arti=0; if (a1==b1) arti=arti+1; if (a2==b2) arti=arti+1; if (a3==b3) arti=arti+1; if (a4==b4) arti=arti+1; >>artikac(1,0,3,9,8,0,1,9) 2 Eksi function [eksi]=eksikac(a1,a2,a3,a4,b1,b2,b3,b4) eksi=0; if(a1==b2 a1==b3 a1==b4) eksi=eksi+1; if(a2==b1 a2==b3 a2==b4) eksi=eksi+1; if(a3==b1 a3==b2 a3==b4) eksi=eksi+1; if(a4==b1 a4==b2 a4==b3) eksi=eksi+1; >>eksikac(2,1,3,8,8,0,2,9) 2 Basamaklara Ayır function [b1,b2,b3,b4]=basayir(sayi) b1=fix(sayi/1000); sayi=mod(sayi,1000); b2=fix(sayi/100); sayi=mod(sayi,100); b3=fix(sayi/10); b4=mod(sayi,10); >>[k1,k2,k3,k4]=basayir(1234) k1=1, k2=2, k3=3, k4=4 15
mastermind.m [x1,x2,x3,x4]=sayiuret (); arti=0; while(arti<4) s=input('4 basamaklı sayi giriniz='); [y1,y2,y3,y4]=basayir(s); arti=artikac(x1,x2,x3,x4,y1,y2,y3,y4); eksi=eksikac(x1,x2,x3,x4,y1,y2,y3,y4); disp('+'); disp(arti); disp('-'); disp(eksi); olasisayilar=[ ]; for i=1023:9876 [t1,t2,t3,t4]=basayir(i); if(t1~=t2&& t1~=t3 && t1~=t4 && t2~=t3 && t2~=t4 && t3~=t4) olasisayilar =[olasisayilar; i]; while (true) x=round(rand()*(length(k)-1)+1); olasisayilar(x) e=input('eksi Kaç= '); a=input('arti Kaç= '); if (a>=4) break; qq=[ ]; for i=1:length(olasisayilar) [t1,t2,t3,t4]= basayir(olasisayilar(x)); [x1,x2,x3,x4]= basayir(olasisayilar(i)); ek=eksikac(t1,t2,t3,t4, x1,x2,x3,x4); ar=artikac(t1,t2,t3,t4, x1,x2,x3,x4); if (ek==e && ar==a) qq=[qq; olasisayilar(i)]; olasisayilar =qq; Sayı Oyunu İkinci Versiyon sayiuret function [cikti]=sayiuret() a1=round(rand()*8)+1; a2=round(rand()*9); while (a1==a2) a2=round(rand()*9) ; a3=round(rand()*9); while(a3==a1 a3==a2) a3=round(rand()*9); a4=round(rand()*9); while (a4==a1 a4==a2 a4==a3) a4=round(rand()*9); cikti=[a1, a2, a3, a4]; Çağırmak için!!!! >>[t]=sayiuret() Artı function [arti]=artikac(sayi1,sayi2) arti=0; for i=1:4; if(sayi1(i)==sayi2(i)) arti=arti+1; >>artikac([1,0,3,9],[8,0,1,9]) 2 Eksi function [eksi]=eksikac(sayi1,sayi2) eksi=0; if(sayi1(1)==sayi2(2) sayi1(1)==sayi2(3) sayi1(1)==sayi2(4)) eksi=eksi+1; if(sayi1(2)==sayi2(1) sayi1(2)==sayi2(3) sayi1(2)==sayi2(4)) eksi=eksi+1; if(sayi1(3)==sayi2(1) sayi1(3)==sayi2(2) sayi1(3)==sayi2(4)) eksi=eksi+1; if(sayi1(4)==sayi2(1) sayi1(4)==sayi2(2) sayi1(4)==sayi2(3)) eksi=eksi+1; >>eksikac([2,1,3,8],[8,0,2,9]) 16
Basamaklara Ayır function [sonuc]=basayir(sayi) b1=fix(sayi/1000); sayi=mod(sayi,1000); b2=fix(sayi/100); sayi=mod(sayi,100); b3=fix(sayi/10); b4=mod(sayi,10); sonuc= [b1,b2,b3,b4]; >>[s]=basayir(1234) mastermind.m sayi1=sayiuret (); arti=0; while(arti<4) s=input('4 basamaklı sayi giriniz='); sayi2=basayir(s); arti=artikac(sayi1,sayi2); eksi=eksikac(sayi1,sayi2); disp('+'); disp(arti); disp('-'); disp(eksi); olasisayilar=[ ]; for i=1023:9876 a=basayir(i); if(a(1)~=a(2)&& a(1)~=a(3) && a(1)~=a(4) && a(2)~=a(3) && a(2)~=a(4) && a(3)~=a(4)) olasisayilar =[olasisayilar; i]; while (true) y=round(rand()*(length(olasisayilar)-1)+1); olasisayilar(y) eksi=input('eksi Kaç= '); arti=input('arti Kaç= '); if (arti>=4) break; yeniliste=[ ]; for i=1:length(olasisayilar) sayi1= basayir(olasisayilar(y)); sayi2= basayir(olasisayilar(i)); ek=eksikac(sayi1, sayi2); ar=artikac(sayi1, sayi2); if (ek==eksi && ar==arti) yeniliste=[yeniliste; olasisayilar(i)]; olasisayilar =yeniliste; 17