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

  1. 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.

>> polinom = [1,4,4] % x^2+2x+4'un yazimi.

polinom =

     1     4     4

>> polyval(polinom,-2)

ans =

     0

Şimdi roots fonksiyonunu kullanalım:

>> roots(polinom)

ans =

    -2
    -2

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:

>> poly([-2,-2])

ans =

     1     4     4

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:

>> katsayi = [2 3;3 -2]

katsayi =

     2     3
     3    -2

>> sonuc = [15; 30]

sonuc =

    15
    30

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.

>> linsolve(katsayi,sonuc)

ans =

    9.2308
   -1.1538

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.

>> cevap = linsolve(katsayi,sonuc)

cevap =

    9.2308
   -1.1538
>> katsayi*cevap

ans =

   15.0000
   30.0000

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:

>> 6 == 2*3

ans =

     1

>> 6 == 3*4

ans =

     0

>> 6 == 2*4

ans =

     0

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.

>> kontrol = katsayi*cevap

kontrol =

   15.0000
   30.0000
>> kontrol == sonuc

ans =

     0
     1

Ş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.

>> round(kontrol)

ans =

    15
    30

>> round(kontrol) == sonuc

ans =

     1
     1

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.

toplam = 0;

for i = 1:100;
    toplam = toplam + i;
end;
toplam

Çıktısı ise:

>> dosya
toplam =

        5050

Ş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.

toplam = 0;
eklenecek = 1;
while eklenecek<101;
    toplam = toplam + eklenecek;
    eklenecek = eklenecek + 1;
end;
toplam

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

>> dosya

toplam =

        5050

ş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.

 
comments powered by Disqus