27

Aralık
2013

Matlab ile Inline Fonksiyonlar

Yazar: Gur@y  |  Kategori: Matlab  |  Yorum: Yok   |  126 görüntüleme

Uzun zamandır Matlab hakkında bir şeyler yazmamıştım. Hazır bir ödev için lazım olunca, Inline fonksiyonların Matlab üzerinde nasıl kullanıldığından bir örnekle bu yazıda bahsedeyim.

İlk olarak, inline fonksiyonu ne için kullandığımıza bir bakalım. Normalde Matlab ile fonksiyon tanımlamak için bir .m dosyası oluşturup içerisine uygun formatta bir fonksiyon tanımlar, dosyayı fonksiyon adıyla kaydettikten sonra eğer path’e ekliyse bu fonksiyonu çalıştırabiliyor olurduk. Bunda bir değişiklik yok. Inline fonksiyonlar bize bunu yapmadan, işimizi göreceğimiz tek satırda ifade edilebilen fonksiyonlar sağlıyor.

Matlab dökümantasyonuna göre, inline fonksiyonlar yerini anonymous fonksiyonlara bırakıyor. (http://www.mathworks.com/help/matlab/ref/inline.html)

23

Temmuz
2012

10 – Matlab ile Denklem Çözme ve Döngüler (For ve While Döngüsü)

Yazar: Gur@y  |  Kategori: Matlab  |  Yorum: Yok   |  5.296 görüntüleme

10. yazıda, yaptığımız işlemleri artık daha seri ve daha çok yapmak istediğimizde, yani bilgisayarda bir şeyler yapmanın faydasını gerçek anlamda görmek istediğimizde akla ilk gelenlerden olan döngüleri ve Matlab’ın güzelliklerinden olan denklem çözmeyi göreceğiz. İsterseniz lafı hiç uzatmadan başlayalım.

İlk olarak, elimizde bir polinomun olduğunu varsayalım. Bir polinomun köklerini bulmak için Matlab altında roots() isimli bir fonksiyon kullanıyoruz. Şimdi o fonksiyonun çıktısını bir örnekle görelim. (x+2)^2 ifadesinin açılımını zaten biliyoruz. Bu açılımın kaysayılarını yazalım ve gelecek kökün -2 olduğunu görelim. Bunu önceden hesaplamak için de, daha önce grafik çiziminde kullandığımız polyval() fonksiyonu ile fonksiyonun istediğimiz nokta veya noktalardaki değerini belirleyelim. Burada -2 noktasındaki değerinin 0 olduğunu görmekte kullanalım.

Şimdi roots fonksiyonunu kullanalım:

Gördüğümüz gibi fonksiyon çift katlı olduğu için sonuç da 2 tane -2 içeriyor. Hazır başlamışken, elimizde kökleri olan bir polinomu nasıl elde edeceğimizi de görelim. Bunu yapmak için poly() adlı fonksiyonu kullanacağız. Bu fonksiyona kökleri bir vektör olarak gönderiyoruz. Yani yapısı poly([kökler vektörü]) şeklinde oluyor. Şimdi bu köklerden polinomumuzu elde edelim:

Gördüğümüz üzere (x+2)^2′nin açılımını elde ettik. Bunu farklı örnekler yaparak peşiktirebiliriz. Bunu da belirttikten sonra konumuza dönelim. Elimizde vektör veya matrislerden oluşan, yani birden fazla denklemden oluşan bir denklem sistemi varsa kullanacağımız fonksiyon da değişiyor. Şimdi onu açıklayalım.

Öncelikle, daha önceki yazılarda denklem sistemini matrislere nasıl geçirdiğimizi hatırlayalım. Katsayıları yazdığımız matris katsayılar matrisi, eşitliklerin sağ kısımlarını da eklediğimiz matris ise genişletilmiş matris oluyordu. Şimdi isterseniz bir denklem sistemini Matlab’a aktaralım ve onun üzerinden devam edelim.

2x+3y = 15

3x – 2y = 30

Bu denklem sistemini aktarmaya çalışırsak:

Genişletilmiş matrisi tanımlamadan, katsayılar matrisini ve sonuç matrisini ayrı ayrı tanımladığımıza dikkat edin. Şimdi bu matrisleri linsolve() fonksiyonuna aktararak çözümleri içeren vektörü elde edeceğiz. linsolve fonksiyonuna 2 argüman gönderiyoruz. İlkine katsayılar matrisini, 2.’sine değer matrisini, yani burada sonuc isimli değişkende tuttuğumuz vektörü gönderiyoruz. İsterseniz bu işlemi yapalım ve sonucu görelim.

Elimizde bir cevap var. Denklem sistemimizin Ax=b yapısında olduğunu kabul edersek, bizim bulduğumuz vektör x‘e eşit olmalı. O halde katsayı matrisi ile x’in çarpımıb’yi vermeli. Hemen sonucu görelim ve yepyeni bir konuya giriş yapmış olalım.

Gördüğümüz üzere başlangıçtaki b vektörümüzü(sonuc ismini vermiştik) elde ettik. Şimdi az önce bahsettiğim yeni konuya girelim. Bu elde ettiğimiz sonucun bizim beklediğimiz değere eşit olup olmadığını görmek için kullanabileceğimiz, hatta sadece burada değil ileride göreceğimiz if ve bir sürü yapıda kullanabileceğimiz bir kontrol operatörümüz var: ==. Bu operatör bize sonuçlar aynı ise 1, farklı ise 0 döndürür. Kısa bir bağımsız örnek üzerinde görelim:

Gördüğümüz gibi eşitlikler sağlandığında 1, sağlanmadığında ise 0 döndürdü. Şimdi bunu elde ettiğimiz çözüm matrisi üzerinde uygulayalım ve sonucumuzu inceleyelim. Öncelikle, elde ettiğimiz matrisi kontrol isimli bir değişkene atayalım.

Şimdi burada dikkat etmemiz gereken noktalar var. Öncelikle, 1 veya 0 beklerken 2 öğesi olan bir vektör geldi. Bunun sebebi, elimizde karşılaştırdığımız öğeler vektör olarak bulunuyorsa sonucun aynı boyutlarda vektör olarak dönmesidir. Mantığı ise, her öğenin ayrı ayrı karşılaştırılıp, istediğimiz dönüş vektörüne sonuçlarının yerleştirilmesidir. Yani iki vektörün 1. öğeleri karşılaştırıp ikisi aynıysa onların yerine 1, ikinciler için yine ikisi aynıysa 1 yazılır. O halde neden bizim aldığımız sonuçta ilk eleman 0 geldi, çözümümüz doğru değil miydi?

Burada devreye anlamlı sayılar geliyor. Bizim elde ettiğimiz 15.0000 sayısı 15 sayısından daha fazla kesinliğe sahip. Dolayısıyla bunlara Matlab eşit diyemiyor. Bunu engellemek için bu gibi durumlarda yuvarlama yapmamız gerekebilir. Bununla özellikle 0′ı tam yakalayamadığımızda karşılaşırız. Bize verilen çok küçük sayılar eşitlik kontrolünün 0 sonucunu döndürmesine neden olabilir. Bunu engellemek için de az önce belirttiğimiz, ancak adını vermediğimiz round() yuvarlama fonksiyonunu kullanmamız iyi bir çözüm olacaktır. Bu fonksiyon burada 30.0000 sayısını 30′a yuvarlayacak ve eşitliğin sağlanmasında iyi bir rol oynayacaktır. Tabii bir diğer yöntem sayıları girerken 15 yerine 15.0000 ve 30 yerine 30.0000 girmektir. Şimdi tekrar bakalım ve sonucu test edelim.

Gördüğümüz üzere artık net bir sonucumuz var. Tabii ki round() fonksiyonu her zaman istediğimiz işi görmeyebilir. Ancak bu gibi durumlarda verdiğimiz sayının kesinliğini göz önüne katmamız ya da daha önce defalarca üzerinde durduğumuz format niteliğini kullanmamız gerekebilir.

Kontrol yapılarına(if ve yardımcılarına) bu yazıda girmeden, daha sonra devam etmek üzere burada 1 ve 0′lardan oluşan sonuçlarımızda bırakalım. Şimdi bu yazıda başlıkta da belirttiğimiz gibi esas işimiz olan döngülere girelim.

En başta da söylediğim gibi, döngüler yapacağımız bir işi otomatikleştirmeye yarıyor. Yani kullanıcıdan 100 adet sayı alacaksak, bir işlemi onlarca kez yapacaksak, bir serinin toplamlarını hesaplayacaksak, bir işi istediğimiz sayıda yaptıracak ve dilediğimiz bir durumda yapılmasını durdurmak isteyeceksek kullanımları ideal olacak. Bunlar şu anlık kapalı ifadeler gibi gözükebilir. Ancak Taylor serisi ile trigonometrik fonksiyonlara veya exp fonksiyonuna yaklaşım yapmaya çalıştığımızda(bir sonraki yazı bunların uygulamasını içerecek) oldukça işe yaradığını göreceksiniz. Ayrıca bir sonraki yazıda kullanıcıdan veri almayı da göreceğiz.

Döngüleri isterseniz bir uygulama üzerinden görelim. 1′den 100 ‘e kadar olan sayıların toplamını bulmak istediğimizi varsayalım. Matlab’da bu iş için de hazır bir fonksiyon bulunmakla birlikte(sum([1,2,....,100])) bu işlemi birkaç satır kodla kendimiz de yapabiliriz.  Öncelikle, toplamımızı tutacak değişkenimizin adı toplam olsun. Bu değişkenimizin 1-100 aralığında hiçbir sayı eklenmemiş haline 0 değerini veriyoruz. Yani henüz toplama işlemi yapılmadığı için, başlangıç değeri 0 olacak. Daha sonra ise 1-100 arasındaki sayıları sırayla buna ekliyoruz. En son elde ettiğimiz toplam n(n+1)/2 ile basitçe hesaplayabileceğimiz 5050 olacak. Şimdi bunu aşama aşama yapalım.

Matlab ortamında, birçok programlama dilinde olduğu gibi 2 tane döngü yer alır. Bunlar for ve while döngüleri. Çoğu zaman bu döngüler birbirinin işlerini oldukça iyi bir şekilde yaparlar. Biz bu uygulamayı 2 döngü ile de ayrı ayrı yapacağız. Öncelikle for döngüsüyle başlayalım. Her iki döngünün de bitişini Matlab’a end; ifadesini yazarak belirtiriz. Şimdi kodları yazalım ve daha sonra açıklamaya devam edelim.

Çıktısı ise:

Şimdi kodumuzu açıklamaya geçelim.  İlk satırda, neden toplam = 0; ifadesini kullandığımızı biraz önce belirtmiştik. Hemen ardından döngü yapımız başladı. for döngüsünün kaç kere döneceğini döngüyü başlattığımız satırda belirtebiliyoruz. Bu döngünün yaptığı şey, eklenecek isimli değişkene sırasıyla 1 ile 100 arasındaki değerleri vererek, alttaki kodları end; ifadesini görene kadar işlemek oldu. Yani biraz daha anlaşılır şekliyle, önce eklenecek isimli değişkene 1 değeri verildi. Daha sonra toplam = toplam + eklenecek ifadesinde, toplam = 0+1; işlemi yapıldı. Buradaki eşitliğe takılmış olabilirsiniz. Onu da şöyle açıklayalım. Programlamada = ifadesi eşitliği belirtmez, oatama operatörüdür. Yaptığı iş sağ tarafında bulunan değeri sol tarafına aktarmaktır. Yani x = x+1 dersek, x in önceki değerini alır, 1 ekler ve soldaki değişkene atar, buradaki değişken yine x olduğu için eski x değerinin üzerine yazılır. Bu konuda birkaç basit örnek yaparak mantığını anlayabilirsiniz. Şimdi anlatmaya devam edelim. İlk dönmede toplam = 0+1′den toplam = 1 oldu. Daha sonra end ifadesini gören döngü başa sardı ve bu defa eklenecek isimli değişkene 2 değerini verdi. Daha sonra, toplam = toplam + eklenecek satırında toplam = 1+2 işlenmiş oldu ve toplamın değeri artık 3 oldu. Bu işlem eklenecek = 100 olana kadar devam etti ve en son elde edilen toplam 5050 oldu. Bu konuda sorunuz olursa sorabilirsiniz.

Şimdi aynı işlemi while döngüsü kullanarak yapalım. While döngüsünü başlatırken ona bir koşul veriyoruz. Bu koşul sağlandığı sürece while döngüsü çalışmaya devam ediyor. Yani mesela, x isimli bir değişkenin değerinin 3 ten küçük olduğu müddetçe döngünün dönmesini sağlar. x =3 veya x>3(mesela 5) olduğunda ise döngü sonlanır. x’in değerinin değişimi için de tıpkı for döngüsünde yaptığımız gibi ona bir sayı ekleme şansımız var. Şimdi while döngüsünün hesapladığımız bu toplam için nasıl kullanılabileceğini görelim.

Bunun çıktısı da aynı şekilde:

şeklinde olur. Burada yaptıklarımıza bakacak olursak, öncelikle eklenecek isimli değişkene ilk değerini biz atadık. Döngünün içerisinde de her seferinde değerini 1 artırma işlemini elle yaptık. Bu örnekte for döngüsüne göre daha zahmetli olsa da onda yapamayacağımız şeyleri yaptırdığına da şahit olabilirsiniz. Onun için bilmekte fayda var. Şimdi devam edelim, eklenecek değişkeninin 101′den küçük olduğu müddetçe, yani en fazla 100 olabilir, döngünün sürmesini istedik. Döngü esnasında da tıpkı for döngüsünde olduğu gibi eklenecek isimli değişkenin değerini toplam isimli değişkene atadık. Böylece aynı sonucu elde ettik.

Bu yazıda daha önce bu konularla uğraşmadıysanız size oldukça yabancı gelebilecek konuları ele aldık. Takıldıklarınızı buradan sorabilirsiniz.

19

Temmuz
2012

9 – Matlab Dosyası Oluşturma, Vektör Örneği ve Temel Grafik Çizimi

Yazar: Gur@y  |  Kategori: Matlab  |  Yorum: Yok   |  355 görüntüleme

Merhaba, bu 9. yazıda, önceki yazının sonunda da belirttiğim üzere ilk olarak Matlab ortamında yazdığımız programları nasıl kaydedeceğimizi göreceğiz. Öncelikle, birkaç satır kod yazalım ve bunun neden gerekli olduğunu söyleyelim. Ardından da nasıl yapacağımıza bakalım.

İlk olarak, 3 adet x,y,z isimli değişkenlerimizi tanımlayalım. İstediğimiz herhangi bir değeri verebiliriz. Daha sonra da z ye x+y değerini verelim. Daha sonra x’in değerini 1 azaltıp z’de değişme olup olmadığına bakalım:

Gördüğümüz üzere z’nin değeri x’ten bağımsız. Ve z’nin ilk değerini tekrar kullanma şansımız yok. Bu küçük örnekte pek işe yaramıyor da olsa, programlar büyüdükçe, varsayılan değerleri tekrar tekrar atamak zorlaşacak. Hepsinden önce, yazdığımız programları bir yerde kaydedip istediğimiz zaman çalıştırmak veya üzerlerinde değişiklik yapmak isteyeceğiz. Bu işlemler için Matlab bize m-file(m dosyası) sunuyor. Aslında korkulacak bir şey yok. Uzantısı .m olan dosyaların Matlab dosyası olduğunu bilmemiz ve dosyalarımızı buna göre kaydetmemiz gerekiyor. Şimdi yeni bir m dosyasını nasıl oluşturacağımıza bakalım:

Resimde de görebileceğimiz üzere File=>New=>Script menülerini izleyerek ya da CTRL+N(bu zaten klasiktir) kısayolunu kullanarak bir m dosyası oluşturabiliriz. M dosyası oluşturduğumuzda karşımıza bir editör gelecektir.

Karşımıza çıkan editörden de kısaca bahsedeyim. Kodlarımızı tıpkı komut satırına yazdığımız gibi yazıyoruz. Farklı olarak, burada >> yer almıyor ve biz de eklemiyoruz. Yani not alır gibi yazıyoruz. Deneme amaçlı olarak yukarıda yaptığımız tanımlamaları yapabiliriz:

Kodlarımızı çalıştırmak için, önce bu dosyası kaydetmemiz gerekiyor. İsterseniz yukarıdaki yeşil oynatma butonunu kullanarak, isterseniz klavyeden F5′e basarak dosyayı çalıştırmak için işleme koyabilirsiniz. Çalıştırmadan önce sizden eğer kaydetmediyseniz kaydetmenizi isteyecek, kayıt penceresi açılacaktır. Yok ama ben sadece kaydetmek istiyorum, çalıştırmak istemiyorum derseniz CTRL+S yine klasikler arasında sizi bekliyor.

Bu esnada eğer dosyanızı Matlab’ın yolu(path’i) üzerinde yer almayan bir klasöre kaydederseniz, size change location ve add to path seçeneklerini sunacaktır. Kodların problemsiz işleyebilmesi için add to path seçeneğini öneririm. Tabii isterseniz path içerisinde yer alan klasörleri de deneyebilirsiniz(bu klasörler ezberimde olmamakla birlikte genel olarak Matlab program dosyalarının olduğu klasörler).

Bu işlemleri sorunsuz yaptıysanız program çalıştığında değişkenler kısmında, ya da who veya whos yazarak tanımlanmış değişkenleri görebilirsiniz. Bu konudaki sorularınızı burdan sorarsanız elimden geldiğince yanıtlarım.

Önceki dersimizde, vektörlerle ilgili örnek soru yapacağımızı söylemiştim. Şimdi, vektörlerin işlevlerini biraz daha iyi anlama amaçlı olarak bu dediğimi yapalım. 2x^2+4x+5 fonksiyonunun -5 ile 5 arasındaki 1000 değerdeki sonucunu hesaplayalım ve son olarak da, bu hesaplamayı anlattıktan sonra bu dediğimi grafiğe dökelim.

Öncelikle, x değerlerinin -5 ile 5 arasında değiştiğini biliyoruz. Bunun anlamı da 1000 sayı koyacaksak linspace fonksiyonunun uygun olabileceği. O halde x = linspace(-5,5,1000) ilk satırımızı oluşturacak. Bu arada, bu kodları bir m dosyasına yazıyorum, isterseniz m dosyasından, isterseniz de komut satırından kopyalayarak veya yazarak(öneridir) deneyebilirsiniz. Şimdi de, fonksiyonumuzun sonuçlarını fonk isimli bir değişkende toplayalım. Vektörlerle işlem yapmanın rahatlığını burada göreceğiz. Tüm elemanları tek tek hesaplatmak yerinex değişkenini direk yerine koyacağız. İsterseniz bu kısmı kodları yazıp inceleyelim:

fonk’in değerini incelerseniz, -5 ile 5 dahil olmak üzere o aralıktaki 1000 sayının bu fonksiyondaki değerlerinin atanmış olduğunu görebilirsiniz. Burada yapılan şey aslında x vektörünün tüm elemanlarının fonksiyon ile işleme sokarak fonk isimli değişkene atanmasıydı. Kodu ve çıktılarını biraz incelerseniz daha iyi oturacaktır.

Şimdi elimizde bir değişkenin aldığı 1000 değer ve bu değerlerin fonksiyonda hesaplanmış sonuçları var. Bunları nasıl grafiğe dökeceğimize bakalım. Burada belirtmem gereken nokta, grafik çizimlerinin çok daha detaylı şekilde yeri geldiğince anlatılacağıdır. Onun için şu an bir giriş yapmakla yetineceğiz. Basit olarak, x ve y eksenlerinden oluşan 2d bir grafiği Matlab ile(ya da Python ile matplotlib yardımıyla) çizerken plot fonksiyonunu kullanıyoruz. Zaten biraz araştırma yaparsanız, matplotlib’de bulunan grafik çizim fonksiyonunun Matlab ile büyük oranda aynı olduğunu, bunun sebebinin ise ikisi arasındaki geçişleri rahatlatmak olduğunu görebilirsiniz. Şimdi plot fonksiyonunu en ilkel hallerinden biriyle nasıl kullanacağımıza bakalım:

plot(x ekseni değişkeni, y ekseni değişkeni)

Elimizde x eksenine yazılacak değişken olarak halihazırda x var. Yine y ekseni için de fonk isimli bir vektör tanımladık. Şimdi isterseniz bu komutu kullanalım ve çıktımızı görelim. Burada çıktıyı paylaşmamakla birlikte, m dosyasının bu halini tümüyle paylaşacağım.

Kodu yazdığımızda ekranda bir grafiğin belirdiğini görüyoruz. Burada isterseniz 1000 değer için değil de, 10 değer için de grafiği çizersiniz. Ancak değer sayısı arttıkça detaylar netleşecek ve büyüttüğünüzde alacağınız sonuç o kadar verimli olacaktır.

Şu an elimizdeki bir polinomun grafiğini çizebiliyoruz. Tabii ki burada bu şekilde bir polinom olması gerekmiyor. Sinüs, kosinüs,exp veya aklınıza gelen her türlü tek değişkenli fonksiyonu plot fonksiyonu yardımıyla çizebiliriz. Ancak polinomlarla çalışıyorsak elimizde bir yöntem daha var. Onu da hemen belirtelim.

polyval() fonksiyonu elimizde bir polinomun katsayılar vektörü ve bir de değişkenin değerlerinin bulunduğu vektör varken işimize yarıyor. Yani polinomumuz [2 4 5] şeklinde ifade edilirse( help polyval yazdığımızda bu ifadenin açılımı için bir ifade görebiliriz), bir başka deyişle, sağa 0. derecenin üssü gelecek şekilde yazılırsa ve bu polinom isimli bir vektöre atanırsa polyval fonksiyonu işimizi görür. Kullanımı ise polyval(polinom,değişken değerleri) şeklindedir. Bunu bir değişkene atarsak fonksiyonun sonucunda elde edilen değerleri atamış oluruz. Kısacası, yukarıda yaptığımız işin aynısını polinomlar için farklı bir yolla yapmış oluyoruz. Kodu çalıştırdığımızda karşımıza aynı grafik gelecektir.

Bu aşamaya kadar grafiklerle ilgili ve vektörlerin kullanımıyla ilgili bir örnek üzerinde dilim döndüğünce açıklamaya çalıştım. Takıldığınız bir nokta olursa, nasıl ulaşacağınızı biliyorsunuz.

15

Temmuz
2012

8 – Matlab’da Vektör ve Matris İşlemleri, Linspace Fonksiyonu

Yazar: Gur@y  |  Kategori: Matlab  |  Yorum: Yok   |  1.272 görüntüleme

8. yazıda, Matlab’a gücünü veren en önemli öğelerden olan vektör ve matrisleri inceleyeceğiz. Başlamadan önce, önceki yazılarda da belirttiğimiz gibi vektörleri tek boyutlu matrisler olarak ele alabiliriz. Bu da ayrı bir konu olarak düşünmemizi gerektirmeyeceği için bizi bir konudan kurtarmış olur.

Lafı uzatmadan, vektörlerin tanımlanması ve üzerlerindeki temel işlemler ile başlayalım. Öncelikle, x isimli bir vektöre, 1′den 10 a kadar olan sayıları nasıl vereceğimizi görelim:

Gördüğümüz üzere atama yapıldı. Aradaki : işareti bize sağında ve solunda yer alan iki sayının arasındaki tam sayıları bu sayılar dahil olmak üzere vermeyi sağlıyor.  Yaptığımız atamanın öğelerine ulaşırken daha önceki yazılarımızda tanımlanmış değişkenlerin listesini who veya whos ile bir başka değişkene atarken kullanmıştık. Burada da benzer bir kullanım mevcut. Bu atamayı yeri gelmişken daha iyi anlamak için başka bir tanımlama yapalım ve birkaç örnek verelim. Bu defa, sayılarımız 25 ile 35 arasında olsun. Şimdi kodlarımızı inceleyelim:

Hazır başlamışken, elimizdeki vektörün birden fazla öğesini de aynı yöntemle alabiliriz. Yani mantığını açıklamak gerekirse, 1:10 yazdığımızda 1 ile 10 arasındaki sayıları alıyorduk. Şimdi yapacağımız örnekte ise, yine bu sayıları alacağız ancak bu defa indis belirtmede kullanacağız. Dilerseniz devam etmeden önce kodumuzu bir görelim:

Bu değer bize sayilar isimli vektörün 3., 4., 5., 6., 7. ve 8. öğelerini, yani : işareti ile sınırlanmış öğelerini vermeye yaradı. Buradaki 3:8 ifadesinin en başta 1:10 tanımını yaparken kullandığımız ifadeyle aynı olduğuna, fakat kullanım yerinin farklı olması sebebiyle böyle bir sonuç aldığımıza dikkat edin.

Ardışık sayıları artık rahatça alabiliyoruz. Peki, 3′er 3′er ya da 5′er 5′er artan ardışık sayıları almak istersek ne yapacağız? Bunun da tabii ki kolay bir yolu var. Bu defa, tek : işareti yerine 2 tane kullanıyoruz ve yapımız şöyle bir hal alıyor: başlangıç:artış:bitiş. Yani, 2 ile 100 arasına 5′er 5′er artan ardışık sayıları koymak istersek 2:5:10 yazmamız gerekecek. Bunu da hemen onaylayalım:

Burada dikkat etmemiz gereken, başlangıç değeriyle başladığımız, ve hesaplanacak son değer bitiş değerine denk gelmiyorsa, kendisinden bir önceki değerin son değer olarak verildiğine dikkat etmemiz. Yani biraz daha açıklayacak olursak, başlangıç değerimiz 2 sabit kalırken, 92-97-102 sırasıyla giden ardışık sayılardan bitiş değerinden hemen önceki olan 97′yi kullandık. Eğer burada bu ardışık sayılar arasında 100 olsaydı, daha önceki 1:10 örneğinde olduğu gibi sonucumuzun son öğesi 100 olacaktı. Bunu farklı örnekler yaparak pekiştirebilirsiniz.

Şimdi bu tanımlamayı biraz daha geliştirelim. Mesela, 5 ile 10 arasına 100 adet sayı girmek istediğimizi varsayalım. Bunu yapmak için bu aralığı eşit bölümlendirmemiz vs. gerekecekken, Matlab bize kolayca yapabilmemiz için linspace isimli bir fonksiyon sağlıyor. Bu fonksiyonun kullanımı ise şu şekilde:

linspace(başlangıç,bitiş,sayı miktarı)

Hemen bir örneğini de görelim:

Çıktımız biraz uzun olsa da, sanırım fonksiyonun ne yaptığını bize iyi bir şekilde anlatıyor. Şimdi de bu sonucu bir değişkene atayıp, indislerle ilgili biraz pekiştirme yapalım.

Devam etmeden önce bilmemiz gereken birkaç küçük özellik var. Vektörlerin tamamını veya bir kısmını, matematik işlemlerine tabii tutabiliriz. Yapacağımız işlem vektörlerin tüm öğelerine etki eder. İsterseniz, 1 ile 2 arasına 5 tane sayı koyup daha sonra bu sayılar üzerinde farklı birkaç işlem yapıp ne demek istediğimi daha açık şekilde görelim.

Şimdi ne yaptığımıza bir bakalım, öncelikle yukarıda bahsettiğim tanımlamayı yapıp vektor isimli bir değişkene atadık. Yani 1 ile 2 arasına 5 sayı koyup vektor değişkenine atadık. Böylece bu değişkenin öğeleri sırayla 1,1.25,1.5,1.75 ve 2 oldu. Daha sonra bu vektörü farklı sayılarla çarpıp böldük. Sinüsünü aldık, exp(e üssü) fonksiyonuna tabii tuttuk. Burada dikkat etmeniz gereken, yaptığımız işlemin vektörün tüm öğelerine etki ettiğidir. Bu aynı şekilde matrislerde de geçerlidir. En sonra da, yaptığımız bu işlemlerden vektörün etkilenmediğini ve ilk halinde kaldığını göstermek için vektörü tekrar ekrana bastırdık. Burada, daha önce de bahsettiğimiz gibi, vektörün sadece istediğimiz öğelerini de işleme sokabilirdik. Bunu vektor(başlangıç:bitiş)/5 gibi bir formatta yapabilirdik. Vektörün veya vektörün bazı öğelerinin üzerinde yaptığımız işlemlerin kaydedilmesi için farklı bir değişkene sonucu atayabilir, veya yine vektör değişkenine atayabiliriz. Yani:

Vektörleri otomatik olarak tanımlayabiliyoruz. Peki, elle tanımlamak istersek? Bunu yaparken köşeli parantezlerden faydalanıyoruz. Öğelerin arasına da boşluk bırakıyoruz. Yani içeriği 43 543 123 6734 olan 4 öğeli bir vektör oluşturmak istersek:

yapısını kullanıyoruz.  Şimdi 2 vektörü birbiriyle çarpmamız gerektiğinde ne yapacağımıza bakalım.

Vektörlerin tek boyutlu matrisler olduğunu söylemiştik. Dolayısıyla, vektörlerin çarpımında da matrislerin çarpımında geçerli olan kuralları uyguluyoruz. Yani, vektörlerin boyutları uygun olmalı. 1xm ile mx1 türünde 2 vektörü çarpabilirken 1xm ile 1xm türündeki iki vektörü çarpamayız. Bu konuda hatalar alırsanız matris çarpımları hakkında bilgi edinmenizi öneririm. Şimdi, boyutları uymayan 2 vektör oluşturup çarpmaya çalışalım:

Gördüğümüz üzere matris boyutları uyuşmadığı için hata verdi. Çünkü elimizdeki vektörlerin ikisi de 1×5 boyutunda. Ancak bu vektörler arasında nokta çarpım (skaler çarpım, dot product) yapma şansımız var. Nokta çarpımı normal çarpma işleminden ufak bir işaret farkıyla: .* operatörünü kullanarak yapıyoruz. Yukarıdaki 2 vektörü nokta çarpımla çarpacak olursak:

sonucunu alırız. Yani karşılıklı olarak aynı indisli öğeler çarpılmış olur. Bu işlemin bölme halini de ./ kullanarak yapabilirsiniz. Ayrıca, her elemanın belirli bir kuvvetini almak isterseniz .^ ifadesini kullanabilirsiniz. Bunu aynı boyutlu matrislerde de kullanacağız. Şimdi matris çarpımını vektörler üzerinde nasıl uygulayacağımıza geçmeden önce, satır ve sütun vektörleri kısaca hatırlayalım.

Satır vektörler, bu yazıda şu ana kadar tanımladığımız gibi, tek satırdan oluşan vektörlerdir. Dolayısıyla m öğe içerdiklerini varsayarsak boyutları 1xm şeklinde olacaktır. Sütun vektörler ise tek sütun, birden fazla satırdan oluşan vektörlerdir. Boyutları da satır vektörlerin tersine, mx1 şeklinde olacaktır(m öğe içerdikleri varsayılsın). Şimdi, sütun vektör tanımlamak istersek, birden fazla satırı nasıl ifade edeceğimize gelelim. Matlab’da satırları ; ile ayırıyoruz. Yani tanımlama esnasında şöyle bir şey yaparsak sütun vektör oluşturmuş oluruz:

Şimdi matris çarpmasını tekrar deneyelim:

Burada, vektor1′in boyutları 1×5, sütun vektörünün boyutları da 5×1 olduğu için sonuç 1×1 oldu, yani bir sayı elde ettik. Biliyoruz ki matris çarpımlarında sıralama önemlidir. Yani 5×1 ile 1×5 i çarparsak 5×5 boyutunda bir matris elde ederiz. Hemen görelim:

Vektörlerle ilgili söyleyeceklerimiz şimdilik bu kadar. Şimdi matrislere doğru bir geçiş yapalım. En son elde ettiğimiz çarpımın sonucu da gördüğümüz üzere bir 5×5 boyutunda matristi. Zaten konunun başından beri, matrislerin tek boyutlu vektörler olduklarını söylemiştik.

Matrisleri tanımlarken çok boyutlu vektör tanımladığımızı düşünebiliriz. Yani birden fazla satır ve sütun içerirler. Şimdi 3×3 boyutunda örnek bir matris tanımlayıp görelim:

Biraz tuş takımını andıran bu sonuç, matris tanımlama ile ilgili kafamızda bir şeylerin oluşmasını sağlamış olmalı. Şimdi de örnek olarak bir denklem sisteminin katsayılar matrisini ve genişletilmiş matrisini oluşturalım:

x + 3y -5z = 12
3x + 7z = 8
5y + 8z = 32

Matrislerimiz şu şekilde oluşacak:

Elimizdeki matris bir kare matrisse, bu matrisin kuvvetlerini alabiliriz. Elimizdeki katsayılar matrisi bir kare matris olduğu için, kuvvetini almayı deneyelim. Buradaki kuvvet almanın, vektörlerde her elemanın kuvvetini aldığımız .^ işlevinden tamamen farklı olduğunu belirtmekte fayda var. Ancak yine de, o işlevi kullanarak orada olduğu gibi her elemanın kuvvetini alabiliriz. İkisini de hesaplayalım ve aynı olmadığını görelim:

Bunu da hallettiğimize göre matris işlemlerine devam edebiliriz. Şimdi, matrisin istediğimiz öğesini veya öğelerini nasıl alacağımızı görelim. Bu işlemin mantığı da aslında vektörlerdekiyle aynı. İlk sıraya satır numarasını, ikinci sıraya sütun numarasını yazıyoruz. Yani matris(satır,sütun) şeklinde bir kullanım var. Ayrıca, Belirli satırları ve/veya sütunları almak istersek araya : koyarak istediğimizi yapabiliriz. Şimdi bununla ilgili farklı örnekler yapalım.

Bu konuda daha büyük matrislerle farklı örnekler yapıp konuya ısınabilirsiniz. Şimdi bazı temel matris tanımlamalarını görelim. Birim matris, sıfır matrisi gibi matrisleri tanımlarken uzun uzun matrisleri yazmamıza gerek kalmaz. Matlab bunları kolayca tanımlamamızı sağlayan fonksiyonları içerisinde bulundurur. Şimdi dilerseniz, bu fonksiyonları inceleyelim.

a) Sıfır matrisi oluşturma

Sıfır matrisi oluşturmak için zeros isimli bir fonksiyon kullanıyoruz. Bu fonksiyon 2 argüman alıyor: zeros(satır,sütun). Yani istediğimiz satır ve sütun sayısında sıfır matrisi oluşturabiliyoruz.

 b) Tüm elemanları 1 olan matris oluşturma

Satır ve sütunlarındaki tüm elemanları 1 olan bir matris oluşturabilmek için ones isimli fonksiyonu kullanırız. Bu fonksiyonun argümanları zeros fonksiyonu ile aynıdır: ones(satır,sütun).

 c) Birim ve diagonal matris oluşturma

Esas köşegen üzerinde olan elemanları 1, diğerleri 0 olan matris kare matris ise birim, kare matris değil ise diagonal matris olarak isimlendiriliyordu. Bu kısa hatırlatmanın ardından bu matrislerin nasıl tanımlandığına bakalım. Fonksiyonumuz eye(satır,sütun)‘dur.

 d) Rastgele sayılarla(random) matris oluşturma

0 ile 1 arasında rastgele sayılar seçerek bir rastgele matris oluşturabiliriz. Bu matris kare matris olabileceği gibi herhangi bir boyuttaki matris de olabilir. Kullanacağımız fonksiyon: rand(satır,sütun).

Not: Gerekirse bu matrisi istediğimiz sayıyla genişleterek sonucumuzun aralığını değiştirebiliriz.

Not2: Bunun dışında randn(satır,sütun) adlı bir rastgele değerlerle matris oluşturan fonksiyonumuz daha var. Bu fonksiyon farklı olarak değerleri -1 ile 1 arasından seçiyor. Bu da doğal olarak negatif değerler sağlıyor. Kullanımı tamamen aynı.

Not3: Bu başlıklarda verdiğim fonksiyonlardan kare matrisler elde etmek için ones(4,4) şeklinde yazmak yerine ones(4) şeklinde bir kullanım mümkün. Yani random(n) yazarsak nxn boyutlarında bir rastgele matris oluşturur.

Matrislerle ilgili tabii ki diyeceklerimiz bitmedi. Ancak bu yazının fazla uzamaması için burda kesiyorum. 8. yazıda altta belirttiklerim olacak. 9. yazıda ise matrislerle yapabileceğimiz işlemlere devam edeceğiz.

Bundan sonraki yazıda bu yaptıklarımızı nasıl kaydedeceğimizi görelim ve vektörlerle ilgili örnek yapalım. Bunları ufak grafiklere dökelim.

Sorularınızı bu konu altından sorabilirsiniz.

14

Temmuz
2012

7 – Sin(pi) Neden 0 Çıkmaz?

Yazar: Gur@y  |  Kategori: Matlab  |  Yorum: Yok   |  47 görüntüleme

Merhabalar, bu yazıda Matlab veya herhangi bir programlama dilinde karşılaşmamızın olası olduğu bir sorundan bahsedeceğim. Daha önce hesaplamadıysanız, değerlerini zaten bildiğimiz sin(pi) ve cos(pi/2) yi hesaplayın. Hatta cos(3*pi/2) ve sin(2*pi)’yi de hesaplayın. Karşılaştığınız sonucun 0 olmaması şaşırtıcı görünebilir. Bu yazıda bunun sebebini açıklayacağım. Bunun mantığını anlamanın sonraki yazılarda ve olası programlama hayatınızda işe yarayacağını düşünüyorum. Döngüleri işlerken özellikle Taylor ve Macluarin serileriyle birçok fonksiyonun değerlerini hesaplamaya başladığımızda ne demek istediğim daha iyi anlaşılacaktır.

Not: Bu yazıyı anlamanız bir sonraki yazılar için gerekli değildir. Ancak yapacağınız hesaplamalarda ortaya çıkan ilginç sayıları anlamanız için elimden geldiğince yardımcı olmaya çalıştım.

Öncelikle, verdiğim bilgiler konuyla ilgili anladığım kısmı kapsamakta, zira konunun açıklaması oldukça genişleyebiliyor. Yanlışım olursa şimdiden özür dilerim. Bu konuda Wikipedi üzerinde “Floating point number” araması yaparak çok daha kapsamlı bilgi edinebilirsiniz.

Bilgisayarlar sinüs, cosinüs, exp veya başka değerleri hafızalarında tutmazlar. Zaten tutmaları da pek olası bir şey değildir(bunun için onlarca sebep sayılabilir).  Dolayısıyla elde edeceğimiz değer de belirli bir basamakla sınırlı olmak zorundadır. Bu da bir hata payını gerektirir. Bilgisayarlar hafızalarında genel olarak virgülden sonra 16 basamak tutarlar. Yani bazı hesaplamalarda 1.0 beklerken 0.99999999999.. şeklinde 16 haneli bir sayı görmemiz olağan dışı bir durum değildir. Daha sonra serilerle yaptığımız hesaplamalarda da bulduğumuz hataların yüzde hata payını bulurken hata paylarını elimizden geldiğince azaltmaya çalışacağız.

Bu 16 basamaklı sayı üzerinde oluşan ufak hatalar “round-off errors” (yuvarlama hataları) olarak geçer. Bu hataları azaltmanın farklı yolları olmasına rağmen(örnek olarak, Python altında decimal adlı modül), hesaplamalarda kullanılan yakınsamalar bizim bu hatalarımızdan oldukça daha fazla hata paylarına yol açtığı için çok fazla kullanılmazlar. Bir Python kitabında bu bilgiye rastlamıştım. Uygulamada da henüz sıkıntı yaşamadım.

Ayrıca, Matlab altında epsilon olarak kabul edilen bir sayı var. Komut satırına eps yazarak bu sayıyı elde edebiliriz: 2.2204e-16. Bu sayı Matlab altında 0′a çok yakın bir sayı olarak kabul edilir. Başta söylediğimiz değerleri hesaplarsanız bu sayıdan daha küçük değerler verdiğini görebilirsiniz.

Round-off errors’ları azaltmanın bir yolu olarak görünen hane sayısını artırmak gösterilebilir. Ayrıca şu adresi de incelemekte fayda var, round-off errors’ları azaltmak için kullanılan bir teknikmiş. Tabii o kadar hassas hesaplamalar yapmanız gerekliyse.

14

Temmuz
2012

6 – Matlab’da İstenen Değişkeni veya Tüm Değişkenleri Sıfırlama, Ekranı Temizleme

Yazar: Gur@y  |  Kategori: Matlab  |  Yorum: Yok   |  258 görüntüleme

Matlab yazılarına, artık gittikçe büyümeye başlayan kodlar, uzayan komut ekranları ve tekrar kullanmayacağımız halde oluşturduğumuz değişkenleri nasıl daha sade hale getireceğimizi veya nasıl tamamen sileceğimizi öğrenerek devam ediyoruz. Bu yazı diğerlerine göre oldukça kısa olacak ancak fazlasıyla işe yarayan 2 komut göreceğiz.

İlk olarak, tanımlanmış bütün değişkenleri nasıl sileceğimizi öğrenelim. Öncelikle, bu işlem sonucunda veri kaybımız olabileceği için yapmadan önce elimizde daha sonra işimize yarayabilecek bir değişken olup olmadığını kontrol etmemiz faydamıza olur. Şimdi konuya geçelim. Tanımlanmış tüm değişkenleri silmek için clear adlı komuttan faydalanıyoruz. Komutun kullanımı için ekstra bir şey yazmamız gerekmiyor. Tabii ki bütün değişkenleri silmeyeceksek bir şeyler yazmamız gerekecek. Hemen bir örnek yapalım:

Gördüğümüz üzere, x’i tanımladıktan sonra verdiğimiz clear komutunun ardından x’in tanımlanmış bir fonksiyon veya değişken olmadığını, dolayısıyla kullanılamadığını söylüyor.

Tüm değişkenleri silebildiğimize göre, önemli yerlerde daha çok işinize yarayacağına inandığım sadece istenilen değişkeni ya da değişkenleri nasıl sileceğimiz konusuna gelelim. Bu iş için yine clear komutunu kullanacağız. Ancak bu seferki kullanımımız şu şekilde olacak:

x1, x2, x3.. xn silinecek değişkenler(veya fonksiyonlar) olmak üzere:

clear x1 x2 x3 …. xn şeklinde istediklerimizi siliyoruz. Bir örnek üzerinde görelim:

Gördüğümüz üzere, x2 hala tanımlı ve değerini korurken, x1 ve x5 isimli değişkenler artık yok. clear komutuna değişkenleri verirken arada virgül kullanmadığımıza dikkat edin.

Clear komutuna başlamışken, help yazarak bulabileceğimiz bazı diğer kullanımları da kısaca belirtmekte fayda var. İleride işiniz düşerse rahatça bakabilmeniz için bulunsun:

clear VARIABLES => Tüm değişkenleri siler. clear komutunu tek başına yazdığımızda yapılan işlemle aynı işi yapar.

clear FUNCTIONS => Tanımladığımız tüm fonksiyonları siler.

clear GLOBAL => Tanımladığımız tüm global değişkenleri siler. Not: Global değişkenleri ileride göreceğiz, şu an takılmaya gerek yok, bulunsun diye ekledim.

clear ALL => Yukarıdakilerin hepsini yapar. Tüm değişkenleri fonksiyonları, global değişkenleri vs. siler.

NOT: clear komutuyla önceki yazıda söylediğimiz düzenli ifadeleri birlikte kullanabiliriz. Yani s ile başlayan i ile biten bütün değişkenleri tek seferde silebiliriz.

Örnek: x1,x2,x3,x4 ve y1,y2,elma,armut isimli değişkenler arasından x’li olanları silelim:

Şimdi ne yaptığımıza bakalım. Öncelikle değişkenlerimizi tanımladık. Daha sonra x ile başlayan değişkenleri silmesini clear x* ile istedik. Sonra da tanımlanmış değişkenlerimize bakmak için who komutunu kullandık. Not: sağ üstteki panelde de tanımlanmış değişkenler yer alıyor, oradan da kontrol edebilirsiniz.

Hazır düzenli ifadeler kullanacağımızı söylemişken, aynı işi onlarla yapalım:

Gördüğünüz üzere yine aynı sonucu aldık. Şimdi de bu düzenli ifadede ne yaptığımızı anlatalım. İleride düzenli ifadeleri detaylı işlediğimizde bu ön pratikler oldukça hız kazandırır. -regexp ile düzenli ifadeleri kullanacağımızı söyledik. Daha sonra, x ile başlayan değişkenleri belirtmek için ^x ifadesini kullandık. Sayı olması gerektiğini belirtirken de yine help regexp ile görebileceğiniz listede bulunan \d ifadesini kullandık. Burada varsayılan olarak 1 tane sayı bulunan değişkeni sildi. Yani x21 değişkeni tanımlı olsaydı onu silmezdi. Onu silmek için şöyle bir şey yapabilirdik: \d{2} Yani, “digit olarak 2 tane ile takip edilen değişkenleri sil.” komutunu Matlab’a vermiş olurduk. Bu ifadeye dönecek olursak, en sonda da x1s gibi, sayıdan sonra başka bir elemanı olan değişkenin kazara silinmesini engellemek için $ işaretini koyduk. Böylece, değişkenin bir sayı ile bitmesi gerektiğini söyledik.

Düzenli ifadelerde kafanız karışırsa şu anlık dert etmeyin. Kendi konularına geldiğimizde detaylı olarak inceleyeceğiz. Yine de sormak isterseniz buradan elimden geldiğince yanıtlarım.

Şimdi diğer komutumuz olan clc‘yi inceleyelim. clc komutu bize o anki komut penceresini temizlememizi sağlar. Kullanımı da oldukça basittir. Örneği vermeden önce, bu iki komutun genelde bir sonraki derste göreceğimiz .m uzantılı dosyaların başına yazıldığını ve böylece program her denendiğinde eski değişkenlerin temizlenerek istenmeyen hataların önlenmeye çalışıldığını belirteyim. O dosyaların başına ne yazdığımız da örneğimiz olsun:

Bu satırı komut ekranında da çalıştırabiliriz.

 

14

Temmuz
2012

5 – Tanımlanan Değişkenleri, Türlerini Listeleme ve Stringler

Yazar: Gur@y  |  Kategori: Matlab  |  Yorum: Yok   |  57 görüntüleme

Daha önceki yazılarda Matlab üzerinde birçok değişken tanımlayıp bunlarla basit işlemler yapmıştık. Şimdi, tanımladığımız değişkenlerin bir listesini görmek istediğimizde, ya da herhangi bir filtreleme uygulayarak görmek istediğimizde (mesela, “a” ile başlayan değişkenler gibi) neler yapmamız gerektiğine bakalım. Ayrıca, stringler ile ilgili de ufak bir giriş yapacağız, nedir, nasıl tanımlanır bir inceleyelim.

İlk olarak, elimizdeki değişkenleri nasıl listeleyeceğimizi görelim. Tabii ki bunu yapmadan önce birkaç değişken tanımlamak gerekiyor.  Değişkenleri listelerken who ifadesinden yararlanıyoruz. Burada incelediğimizden daha detaylı bilgiyi her zamanki gibi help who komutu vererek edinebilirsiniz. Lafı daha fazla uzatmadan, ufak bir örnek üzerinde görelim:

Gördüğümüz üzere, çıktıda Your variables are: ifadesinden sonra elimizdeki değişkenler listeleniyor. Şu an listelemeyi yaptık, ancak diyelim ki elimizde 300 adet değişken var ve aralarından s ile başlayıp 3 hane daha içeren, yani 4 karakterli ve s ile başlayan bir değişken bulmak istiyoruz. Bunu yapmamız için, önce istediğimiz karakterle başlayan değişkeni bulalım, daha sonra da 3 haneyi nasıl ekleyeceğimize bakalım.

who ifadesi ardından kullanacağımız parametrelerle elde edeceğimiz çıktıya şekil verebiliriz. Öncelikle, sali isimli bir değişken oluşturup 15 değerini verelim.

Şimdi de, who ifadesine s ile başlayan değişkenleri bulması için vereceğimiz komutu verelim ve bu komut hakkında bilgi vermeye çalışalım. Öncelikle, komutumuz * karakteri. Yazmamız gereken kod ise şöyle bir hal alıyor:

Şimdi biraz daha genişletip, s ile başlayan ve “li” ile biten bir değişken olarak ele alalım ve bu değişkeni nasıl bulacağımıza bakalım. Aslında mantığımız hala aynı. Biraz önce açıklayacağımızı söylediğim yere şimdi geldik. * karakteri, birçok programlama dilinde düzenli ifadeler(regular expressions, regex ya da re olarak geçer) konusunda da benzer işlevlere sahiptir. (“düzenli ifadeler*: yazıları seçmek için filtreler oluşturmamıza yarar”) Tanım için Fatih‘e teşekkürler:) Yani araya karakter gelebilmesi için kullanılan belirteçler arasındadır ve özel bir anlam ifade eder. Bu konuda ayrıntılı bilgi için ufak bir Google araması yapabilirsiniz. Şimdi kodumuzu görelim:

Peki, aradığımız değişken yoksawho ifadesi bize ne döndürür? Hemen deneyelim:

elimizde s ile başlayan ve lil ile biten bir değişken olmadığı içinwho komutu boş sonuç döndürdü ve komut satırı yeni komutu beklemeye başladı.

Bu ifadenin sonuçlarının işimize nasıl yarayabileceğiyle ilgili ufak bir örnek yapalım. Elimizdeki değişken isimlerini görebiliyor olmak belki pek bir şey ifade etmiyor ancak onları yazı olarak kullanabilmek işimize yarayabilir. Yani değişken isimlerini ekrana bastırırken bunu kullanabiliriz. Örnek olarak, elimizdeki değişken isimlerinin bir listesini yapmak istediğimizi varsayalım ve bunu nasıl yapacağımıza bakalım. Öncelikle, who ifadesinin döndürdüğü sonucu bir değişkene atarsak, elimizde bu isimleri içeren bir liste olur. Hemen bir örnek üzerinde görelim:

Gördüğümüz üzere, elimizde 5 tane öğesi olan bir liste var. Şimdi bu listeyi biraz daha detaylı inceleyelim.

Listemiz içerisinde ‘sali’ isimli bir değişken ismi içeriyor. Burada aslında string olarak belirttiğimiz yapı mevcut. Yani string, bizim yazı diye tabir edebileceğimiz ifadelerin programlama dilindeki karşılığını oluşturuyor. Yukarıda bahsettiğimiz regular expressions olayının da stringler üzerine döndüğünü belirtelim. Peki başka stringler tanımlamak istersek ne yapmalıyız?

Öncelikle, başka bir programlama diliyle uğraştıysanız, tırnak işaretlerinin tutarlılığının önemini biliyorsunuzdur. Ancak Matlab üzerinde string tanımlarken tutarlılık kuralını uygulamak sorun yaşatabilir, zira Matlab yazıları tek tırnak içerisinde istiyor. Hemen görelim:

Bu yüzden tırnak işaretlerine dikkat etmemiz önemli.

String’lere giriş için bu yeterli sanıyorum. İleride karşımıza çok daha detaylı kullanımları zaten çıkacak. Şimdi isterseniz, az önce liste olarak belirttiğimiz kavramı mercek altında tutalım.

Aslında orda tanımladığımız değişkenin türü bir liste değil, matristi. Çünkü Matlab’da o işi gören yapılar matrislerdir. Birden çok öğeyi satır ve sütunlara dizeceksek kullanacağımız yapılar matrisler olacak. Ayrıca, tek satırsa veya tek sütunsa da yine matris olarak değerlendirmemiz mümkün. Zaten kullanımda vektör dediklerimiz de bildiğimiz üzere tek boyutlu matris olarak geçiyor. O halde, şu an elimizde tek boyutlu bir matris var. Biz bu matris içerisinden istediğimiz öğeyi almak istiyoruz. Burada devreye matrislerin indisleri geliyor. Yani bir matrisin istediğimiz öğesini gösterirken, bildiğiniz üzere satır ve sütun numarasından faydalanıyorduk. Burada matrisimiz tek sütundan oluştuğu için, sadece satır numarasını göstermemiz yeterli olacak. Onun için de devreye oldukça basit olarak faydalanabileceğimiz parantez işaretleri gelecek. Diğer programlama dillerinde listeler veya dizilerle çalıştıysanız, onların indisleri 0′dan başlıyordu. Matlab ile çalışırken burda da bir değişiklik var. Normalde matematikte yaptığımız indisleme geçerli oluyor ve satır ve sütun numaraları 1′den başlıyor. 0 yazarsanız sorun alıyorsunuz. Şimdi birkaç örnek yapıp ne demek istediğimizi daha iyi anlayalım:

Bunda zaten bildiğimiz lineer cebir kuralları geçerli olduğu için sorun yaşamayacağımızı varsayarak devam ediyorum. Sorunuz olursa konu altından sorabilirsiniz. Ayrıca, artık değişken isimlerini bir matrise atayıp sonra istediklerimizi nasıl çekeceğimizi de biliyoruz.

Değişkenlerimizin isimlerini who ile alıp yanına eklediğimiz * karakteri ile istediğimiz başlangıç ve bitişi içeren değişkenleri listeleyebiliyoruz. Yukarıda yapacağımızı söylediğim, 4 karakter içeren bir değişken ismini nasıl bulacağımıza bakalım.

Şimdi bu kodu inceleyelim. Öncelikle, daha önce de bahsettiğimiz gibi regular expressions, yani düzenli ifadelerin işin içine girdiğini -regexp ifadesinden anlıyoruz. Daha sonrası ise bu konunun detaylarından. Konuyu ilerleyen zamanlarda oldukça detaylı olarak işleyeceğiz ancak burda kullandığımız ifadeleri kısaca açıklayalım.

^ ifadesi stringin başında arama yapmaya yarar. Yani ^ ifadesinden sonra gelen harf aradığımız değişkenin en başında olursa eşleşme gerçekleşir. Burada s ile başlayan sali adlı değişkeni aradığımız için ^s yazımını kullandık.

Daha sonra yazdığımız \w ifadesi ise bize w harfini ifade etmiyor. Buradaki \ ters slash işareti kaçış karakteri olarak duymuş olabileceğiniz, yanındaki karakterin beklenenden farklı bir anlamı olduğunu belirtiyor(belki biraz kaba bir tabir oldu ancak şu anlık yeterli). Burada help regexp ile daha detaylı listesine ulaşabileceğiniz belirteçlerden birini kullandık: \w belirteci. Bu, listede belirtildiği üzere, a-z_A-Z0-9 aralığındaki bütün karakterleri kabul etmeye yarar. Yani nokta ve virgül gibi ifadeler dışındakileri alır. Değişkenlerde bunları zaten kullanamıyoruz ancak ileride yazılar üzerinde bu işlemleri yaparken kullanacağız.

Hemen \w ifadesinin yanında yer alan {3} ifadesi ise kendinden hemen önce belirtilen ifadenin kaç kere aranacağını söylüyor. Köşeli parantezler içerisine 3 yazdığımız için, \w ile belirtilen ifadeden 3 tane arıyor. Yani harf ya da sayıdan 3 tane bulursa sonuç döndürüyor.

$ ifadesi ise elimizdeki ifadenin sonunu, bitişini belirtiyor. Yani $ koyduğumuzda, diğer şartlar sağlanıyorsa bile eğer elimizdeki yazı henüz bitmemişse(burada yazı değişken isimleri oluyor) bize sonuç vermiyor.

Şimdi işleyeceğimiz son konu olan whos ifadesine bakalım. Bu ifade, bize değişkenlerin sadece isimlerini değil, aynı zamanda boyutlarını, kapladıkları bayt cinsinden alanı ve türlerini de döndürür. Matlab ve Python ile çalışırken değişken türlerini tanımlama esnasında belirtmediğimiz için bazı zamanlarda oldukça işe yarayan bir işlev(not: python’da tür almayı type() fonksiyonuyla yapıyoruz). Şimdi ufak bir örnek yapalım:

Ayrıca, whos ifadesini de who gibi düzenli ifadelerle kullanabiliriz:

Bir değişkene de atayabiliriz, yalnız bunun çıktısı dizi(array) türünde oluyor, dikkat etmemiz gerekli:

Fazlasıyla uzun oldu. Sorularınızı bu başlık altında sorabilirsiniz.

12

Temmuz
2012

4 – Matlab’da Bilimsel Yazım (10 üzeri gösterimi) ve Basit Matematik Fonksiyonları

Yazar: Gur@y  |  Kategori: Matlab  |  Yorum: Yok   |  1.044 görüntüleme

Matlab üzerinde işlem yaparken 4.23* 10 üzeri 43 sayısını girmek için elbet de bu sayıyı 1000….000 ile çarpmamız gerekmiyor. İşte bu 4. yazıya bunu kısa yoldan nasıl yapacağımızla başlayıp kök alma, sinüs, kosinüs değerleri bulma, yuvarlama, mutlak değer alma gibi basit fonksiyonları vererek bitireceğiz. İsterseniz vakit kaybetmeden başlayalım.

İlk olarak, başlangıçta belirttiğimiz sayıyı girmek istersek ne yapacağımıza bakalım. Matlab’te üsleri girerken 10 üzerileri e harfi ile gösteriyoruz. Yani şöyle:

Aldığımız çıktı da şu şekilde olacak:
ans =
   4.2300e+43

Buradaki + ifadesini de açıklamakta fayda var. Daha doğrusu, 10′un negatif kuvvetleri için – koyabiliriz. Yani 4*10 üzeri -12 için:

yazmamız yeterli. Şimdi ilk sayımızı bir değişkene atayıp önceki yazıda belirttiğimiz format niteliği için ufacık bir örnek yapalım:

Burada, ilk ve son yazımın aynı olduğuna dikkat edin. Önceki yazıda belirtmediğimiz bir yenilikle karşılaştık. format niteliğini herhangi bir ek ifade kullanmadan yazdık. Bu, varsayılan yazım formatına döndürmeye yarar. Önceki yazıda varsayılan yazım formatının short olduğunu söylemiştik. Yani son yazdığımız ifade format short ile aynı işi görür. long yazım şeklini ve rat yazım şeklini de önceki yazıdan zaten biliyoruz. Burada rat‘ın nasıl sonuç verdiğine dikkat edin.

Artık sayılarımızı 10 üzeri formatında yazabildiğimize göre, basit matematik fonksiyonlarına geçebiliriz.

a) round() fonksiyonu: Bu fonksiyon en yakın tamsayıya yuvarlamayı sağlar. Bildiğimiz, matematikteki yuvarlama mantığı geçerlidir. Ufak bir örnek yapacak olursak:

 

 

b) floor() fonksiyonu: Verilen sayının ondalıklı kısmını atmaya yarar. Bir başka deyişle, bir alt tamsayıya yuvarlar.

Gördüğümüz gibi, 1.9 ile 1.0 aynı sonucu verdi. Daha önce de belirttiğimiz sonuç buydu.

c) ceil() fonksiyonu: Round fonksiyonunun tersi denilebilecek bir fonksiyondur. Sayıları bir üst tamsayıya vuvarlama özelliğini kadar.

d) fix() fonksiyonu:  Sayıyı sıfıra doğru yuvarlar. Daha iyi anlayabilmek için öğrneği inceleyelim:

e) abs(x) fonksiyonu:  Sayının mutlak değerini döndürür.

f) sign(x) fonksiyonu: Sayının işaretini döndürür. Sonucu -1 veya +1 olarak verir.

g) factor(x) fonksiyonu: Sayının asal çarpanlarını döndürür. Çarpanlarına ayırma olarak düşünebiliriz. İsterseniz bir örnek üzerinde görelim:

ı) log(x) fonksiyonu: Ln alma işlemini yapar. Verilen x değerinin doğal logaritmasını almaya yarar.

i) sin(x)/cos(x)/tan(x)/cot(x) fonksiyonları: Her biri kendi ismindeki geometrik işlemi yapmaya yarar. Not: Bilgisayar hesaplama yaparak sonuç verdiği için, sinüs 180′in değerini hesaplarken aldığımız değer 0′dan farklı oluyor(1.2246e-16). Burada hata payı 10 üzeri -16 dolaylarında olduğu için dikkate alınmıyor ve bulunan sonuç 0 kabul ediliyor. Not2: Bu fonksiyonlara birimleri radyan cinsinden vermemiz gerekiyor. Yani sin(180) yazınca doğru sonucu elde etmiyoruz(açılar için konuşuyorsak), sin(pi) yazınca ilk notta da belirttiğimiz üzere hata payı çok düşük olan bir ifade ile karşılaşıyoruz.

Bu yazı burada bitiyor. Aklınıza takılanları, düzeltmek istediğiniz yerleri buradan istediğiniz gibi sorabilirsiniz.

11

Temmuz
2012

3 – Matlab Üzerinde Format Özelliği ile Çıktı Formatını Düzenlemek

Yazar: Gur@y  |  Kategori: Matlab  |  Yorum: Yok   |  728 görüntüleme

Matlab üzerinde yaptığımız bir işlemden elde edeceğimiz çıktının her zaman 0.2323 şeklinde olmasını istemeyebiliriz. Burada en yaygın olarak kullanıldığına inandığım çıktı formatlarından bahsedeceğim. Öncelikle, format niteliğinin nasıl kullanıldığından bahsedelim:

format çıktışekli

Burada çıktışekli yazarak belirttiğim kısma istediğimizi yazamıyoruz. Ama mesela ondalıklı bir sonuç yerine orantısal bir sonuç istiyorsak rat yazmamız yeterli. Bu yazıda, format niteliğinin short, long ve rat çıktılarından bahsedeceğiz. Öncelikle, Matlab varsayılan olarak short formatında çıktı verir. Bunu hemen şu şekilde kontrol edebiliriz:

Aldığımız çıktı ondalıklıdır. Burada short formatı çıktının ondalıklı olmasının yanısıra virgülden sonraki kaç basamağının gösterileceğini de belirler. Bunu artırmak için yazının ilerleyen kısımlarında long formatından yararlanacağız.

Konumuza dönecek olursak, yukarıdaki x tanımlamasından short formatında sonuç alamıyorsak şunu yapmamız gerekir:

Yazının başından beri belirttiğimiz üzere format niteliğinin çıktısını short olarak, yani Matlab’ın varsayılan çıktı şekli olarak ayarladık.

Bu arada, format niteliği hemen sonrasındaki sonucu değil, programın tamamındaki çıktıları etkiliyor. Onun için, farklı formatta çıktılar elde etmek istiyorsak istediğimiz format her değiştiğinde format niteliğini tekrar belirtmemiz gerekiyor.

Şimdi, elimizdeki sayının virgülden sonraki basamak sayısını artırmak istersek ne yapacağımıza bakalım:

Burada programın verdiği 2 çıktı arasındaki fark, short ile long formatları arasındaki farkı verir. Şimdi de, bu yazıda belirteceğimiz son format olan rat‘a bir bakalım. Dediğimiz gibi, orantılı bir sonuç istiyorsak rat bizim için idealdir. Yani yukarıdaki kodun altına

yazarsak 2/3 sonucunu elde ederiz. Bu da rat formatının bize vaad ettiği sonuçtur.

11

Temmuz
2012

2 – Matlab Değişkenlerine Değer Atama ve Basit Matematik İşlemleri

Yazar: Gur@y  |  Kategori: Matlab  |  Yorum: Yok   |  108 görüntüleme

İlk yazının devamı gibi olacak olan bu yazıda, değişkenlerde tutulan değerleri kullanma üzerinde duracağız. Yani bir değişkenin değerini başka bir değişkene atamak, onun farklı bir versiyonunu atamak gibi. Gelin ne demek istediğime biraz daha detaylı bakalım.

Öncelikle, önceki yazıda yaptığımız gibi basit bir atamayı x = 3 şeklinde yapabildiğimizi hatırlayalım. Şimdi, elimizde bir y fonksiyonu olduğunu ve bu fonksiyonun şu şekilde tanımlandığını düşünelim:

y = f(x) = 3x+5

O halde, elimizdeki x değerinin 3 katını alıp daha sonra 5 eklememiz gerekiyor. Bunu en ilkel şekilde şöyle yapmamız mümkün:

Şimdi ne yaptığımızı biraz incelememiz gerekiyor. Öncelikle, bir değişken üzerinde yaptığımız herhangi bir işlemi başka bir değişkene aynı değişken tanımlarken yaptığımız gibi atayabiliriz. Yani burada “=” işareti atama işlevini görür. Programlamada da kendisine atama operatörü demekteyiz. x isimli değişkenin değerini 3 yaptıktan sonra, bu değişkenin 3 katını tutması için aradeger isimli bir değişken oluşturduk. Burada en başta söylediğimizi, yani bir değişken üzerinde yaptığımız işlemi başka bir değişken üzerinde tutma örneğini yaptık. En son satırda da bunun başka bir örneğini bize gerekli olan son değeri, yani y‘yi bulurken uyguladık.

Tabii ki bu kod verimli değil, birçok eksiği var. Öncelikle, 50 tane değişken tanımlamak bilgisayar hafızasında ciddi anlamda yer işgal eder. Bundan kaçınmak için yaptığımız tanımlamaları azaltmak yapacağımız ilk işler arasında. Ayrıca kodları okurken de ciddi karışıklığa sebep olabilir. Bundan kaçınmak için bu kodu kısaca şöyle yazabiliriz:

Burada belirmek istediğim birkaç nokta daha var. Öncelikle, üstte de yaptığımız üzere, çarpma işlemini *, toplama işlemini + operatörleriyle yaptığımıza dikkat edin. Yani bunlar için ekstra bir kod bilgisi gerekmiyor. Windows ortamında hesap makinesi kullanmış birisi oldukça rahat yazabilir. Tabii bu 4 işlem için geçerli, ilerleyen zamanlarda olaylar değişecek.

Son olarak, sayıları önceden atayarak bu basit matematik işlemlerini değişkenler üzerinden de yapabildiğimizi söyleyelim. Bu dediğimizin de havada kalmaması için ufak bir kod yazalım:

Burada yaptığımız kodta aslında yeni bir şey görmedik. x ve y isimli değişkenler tanımlayıp onlara değerler atadık ve son satırda bunların birbirine bölümünü z isimli yeni bir değişkene atadık. Burada şöyle bir kullanım ekrana vereceğimiz çıktıyı kısaltabilir:

Bunu söyleme sebebim, tanımlamaları zaten yaparken değerleri yazdığımız için özellikle ilk 2 satırda tekrar bu atamaları görmemiz pek gerekli değil. Eğer z’nin değerini görmemiz gerekmiyorsa, mesela başka bir yerde kullanmak için hesapladıysak, onun değerini de göstermeyebiliriz. Ayrıca, birçok programlama diline satır sonuna ; konulmakta, gerekli yerlere koymaya alışmamız ilerde başka dillere geçtiğimizde rahat etmemizi sağlayacaktır. Kolay gelsin.

Toplam 2 sayfa, 1. sayfa gösteriliyor.12

© Tüm Hakları Saklıdır - Güray YILDIRIM | Blog
Tüm içerik lisansı:
Creative Commons Lisansı

Wordpress wordpress tema alexa bilgilerim Webmaster Creative Commons v3 ile Lisanslanmıştır!