İkiye Bölme Yöntemi Bisection

Merhaba, bugün Sayısal Analizde kapalı yöntemlerden biri olan ikiye bölme yöntemi (bisection) konusunu ele alacağız. Karışık gibi gözükse de oldukça basit bir yöntemdir. İlk olarak tanımı üzerinde durup ardından bir örnek yaparak matlab üzerinde kullanımını da inceleyeceğiz. Hadi başlayalım !


Bisection İkiye Bölme Yöntemi Nedir?

Kapalı yöntemlerin tümünde olduğu gibi lineer olmayan aynı zamanda da analitik çözümü olmayan bir bilinmeyenli denklemlerin köklerini bulmada kullanacağımız kapalı yöntemlerden biridir. Bildiğimiz üzere denklemi sıfır yapan değerler bizim denklemimizin kökleridir. Tam sıfır olarak bulamasak da bize verilen tolerans değeri arasında bir değer bulmamız yeterli olacaktır. Unutmayalım ki sayısal analiz her zaman tam sonuç bulacak diye bir şey yok. Zaten analitik çözüm yerine kullanılmasının nedeni en yakın sonucu bulmamızdır.

Şimdi pekiştirmemiz adına ve tanım açısından kafanızdaki soru işaretlerini kaldıracak bir örnek verelim.

Örneğin elimizde f(x)=0 denklemi olsun ve bu denklem [x, y] aralığında tanımlı, sürekli olsun.

Bu durumda x ve y’nin fonksiyonda yerine yazılması ile bulanacak sonuçlar eğer zıt işaretliyse, bu [x, y] aralığında mutlaka x eksenini kesen en az bir kök bulunur. Sonuçlar zıt işaretliyse dedik yani f(x) = pozitif (+) , f(y) = negatif (-) veya tam tersi durum için geçerlidir. Yani sonuçların çarpımları negatif olmalı da diyebiliriz.

Yani temel şartımızın bu olduğunu öğrendik. Peki bu köke nasıl yaklaşacağız.


Bisection İkiye Bölme Yöntemi Nasıl Hesaplanır?

Örneğin f(x) fonksiyonu için [1, 3] aralığında arayacağımızı varsayalım. f(1) için sonuç pozitif, f(3) için ise negatif olsun. Bir diğer aşamada bu iki noktanın aritmetik ortalamasını alıp orta noktasını bulacağız. Formül gibi düşünecek olursak orta noktayı (a+b/2) yani bizim değerlerimiz için ((1+3)/2) olarak hesaplıyoruz. Şimdi ise orta noktamız olan f(2) değerinin sonucunun negatif mi pozitif mi olacağı önemli. Varsayalım ki f(2) değeri pozitif çıktı. Bu durumda önceki pozitif çıkan değerimizin yerine artık 2 değeri gelmiş gibi düşüneceğiz. Yani ilk başta f(1) için pozitif demiştik artık 2 değeri 1’in yerine geçecek. Yeni aralığımız böylece [2, 3] şeklinde olacaktır. Aslında f(2) değeri negatifte çıkabilirdi bu sefer aralığımız orta noktanın işaretine göre değişeceği için [1, 2] şeklinde olacaktır.

Buraya kadar dediklerimi anladıysanız gerçekten bundan sonrası için çok büyük bir adım atmış olacaksınız. Çünkü sayısal analizdeki kapalı, açık fark etmeksizin çoğunda mantık bu orta noktanın bulunmasıyla değişiyor. Örneğin burada aritmetik ortalamasını alarak daralttığı aralığı, başka bir yöntemde farklı bir formül üzerinde daraltıyor. Anlayacağınız işin özü bu aralığı daraltmakta 🙂

Yukarıda belirttiğim cümlede sayısal analizde asla tam sonuç bulamayız gibi bir kavram çıksın istemem. Elbette ki denediğimiz aralıkta bir değer f(x) fonksiyonunu sıfıra eşitleyebilmektedir. Bu değer 0,51321 gibi bir değer olsa da bu ihtimal mevcuttur. Lakin genelde bize burada tolerans değeri üzerinden hesaplama yapmamızı isterler. Bu tolerans değeri Mutlak hata, Bağıl hata, Yaklaşık Bağıl hata veya diğerleri olabilir veya direkt bize hesaplanmış bir sayı olarak da verilebilir. Tolerans değeri ve Sayısal Analizde hata kavramı ile ilgili de bir yazı yazmayı düşünüyorum 🙂

Hadi şimdi buraya kadar konuştuklarımızı bir örnek üzerinde Matlab kullanarak toparlayalım.


Bisection İkiye Bölme Yöntemi Örneği

Örneğimiz f(x) = x^3 – 7x + 13 denkleminin [-2, 1] aralığında köklerini bulma şeklinde olacak. Burada durma koşulumuz aralıktaki iki sayımızın mutlak değer içerisinde farklarının tolerans değerimizden küçük olması. Tolerans değeri olarak bize 1E-6 değeri verilmiş.

Şimdi aşağıda oluşturduğum kodları inceleyelim

MatlabKodlari
MATLAB Kodları

Burada gerçekten konunun ne kadar basit olduğunu görebilirsiniz. Yaptığımız işlemler oldukça basit. Öncelikle aralığımın ilk 2 değerini a ve b olacak şekilde tanımladım. Ardından tolerans değerimi tanımladım. Ne kadar 100′ e kadar gitmeyeceğini bilsem de for döngüsünü 1 den 100′ e kadar oluşturdum. Ardından fonka fonkb olucak şekilde aralığımdaki 2 değerin fonksiyonda yerine yazıldıklarındaki sonuçlarını tuttum. Sonrasında orta noktayı bulmak için xm diye bir değişken oluşturup aralığımdaki 2 değerin aritmetik ortalamasını eşitledim. Ardından orta nokta için de fonksiyondaki değerini bulup bunu fonkm isimli değişkende tuttum. İşlem yaptığım kısım bu kadardı bundan sonra sadece kontrol kısmı kalıyor.

Eğer fonka ve fonkm değerlerinin çarpımı sıfırdan küçükse yani negatifse, yeni b değerim artık bulduğum orta noktam olacak. Çünkü biliyorum ki bu ikisinin çarpımı negatifse demek ki orta noktamın işareti, b’nin işareti ile aynı ve orta noktam (xm) değerim b den daha küçük olduğu için yeni b değerim olacak. Aynı işlemler aksi taktirde de geçerli. Bu sefer aynı mantıkla yeni a değerim, bulduğum orta noktam olacak. Son olarak sonlandırma koşulum olan aralığımdaki değerlerin mutlak farkı eğer tolerans değerimden küçükse orada döngümü durduracağım.

Son bölümde yazdığım 20-26. satırlar arası kodlar ise aşağıdaki şekilde çıktı almamızı sağlamak için.

MATLABciktisi
MATLAB Çıktısı

Bu yöntemimizin de sonuna geldik. Takıldığınız bir yer olursa bana ulaşabilirsiniz. Umarım çok iyi bir şekilde anlaşılmıştır. Bu konu gerçekten diğer yöntemlerin temeli açısından önemli. Bir sonraki yazıda görüşünceye dek, Herkese sağlıklı günler dilerim! ✧☾✧