Python 2.x İle Bisection Yöntemi(İkiye Bölme) Uygulaması

İyi günler arkadaşlar,

Sayısal Analiz dersini alanlar olduysa bu yöntemi mutlak hatırlayacaklardır fakat ben yinede bilmeyenler için tekrardan anlatayım.

Bisection yöntemi bir denklemin kökünü bulmakta kullanılır. Şimdi kafalarda şu soruyu sorar gibiyim; “∆=b^2-4ac diskriminant alıp duruma göre -b±∆/2a yapıp bulamaz mıyız?” diyebilirsiniz fakat bu çok karmaşık formüllerde işe pekte yaramaz. Heleki söz konusu işlemi yapacak olan bilgisayar ise bazen çıldırabilmeniz bile söz konusu. Peki bu Bisection yöntemi nedir? Nasıl kullanılır? Bunlardan bahsedeyim öncelikle.

Bisection yöntemi 3 farklı sınır değişkeniyle kök arama yöntemidir. Buna örnek olarak y=x^2 denkleminde kökü bulalım ve küçük sınır değişkenimizin ismi a, büyük sınır değişikenimizin ismi b olsun. Bu ikisinin ortalamasının bulunduğu nokta ise orta sınır değişkenimizdir ve o da c olsun. Bunları örneğimize ekleyecek olursak a=-1.5, b=1, c=a+b/2 olur. Şimdi c’yi x’e eşitlersek (-0.5)^2=-0.25 ediyor fakat sonuç sıfır olmadığı için halen daha kökü bulmuş sayılmayız. O yüzden şimdi a=c diyoruz ve yeniden c=a+b/2 hesaplamasını yapıyoruz. Bu insan eliyle zor bir işlem fakat bilgisayarlar bu işlemi çok zorlanmadan yapabiliyorlar. Şimdi işleri biraz zorlaştıralım ve kendimiz bir örnek oluşturalım.

import math

a = -14631516
b = 15163168
c = (a+b)/2.0
ceksi=c
epsilon = 0.00000001
iterasyon = 0

Daha önce de dediğim gibi a sayısı; alt sınır, b sayısı; üst sınır ve c sayısı; her ikisini aritmatik ortalamasına denk gelen yer. ceksi değikeni ise; c’nin önceki değerini tutacak olan değişkenimiz. Peki epsilon ile iterasyon değişkenleri ne ola ki? epsilon değişkeni bu işlemi ne kadar hassasiyet ile yapacağımızı söyleyecek olan değişkenimiz. iterasyon ise kaç kere ikiye bölme yöntemi yapıldığını söyleyecek ve adım adım söyleyecek olan değişkenimiz.

28946431_10216444751457845_447958116_o

Fotoğrafta kullanacağımız değişkenimiz ve şekli görünüyor. Görüldüğü üzere -6 ile -5 arasında bir değer bekliyoruz.

class main:
    while (a+math.sin(a)+5)*(c+math.sin(c)+5) != 0 or (b+math.sin(b)+5)*(c+math.sin(c)+5) !=0:
        if(a+math.sin(a)+5)*(c+math.sin(c)+5)<0:
            b = c
            ceksi=c
            c = (a+b)/2
            iterasyon = iterasyon + 1
            print str(iterasyon) + "-" + str(c)
 
        elif(a+math.sin(a)+5)*(c+math.sin(c)+5)>0:
            a = c
            ceksi=c
            c = (a+b)/2
            iterasyon = iterasyon + 1
            print str(iterasyon) + "-" + str(c)
        if abs(c-ceksi)<epsilon:
            break
    print "Kok: " + str(c)

main()

Peki bu kodlar ne anlama geliyorlar?

“while (a+math.sin(a)+5)*(c+math.sin(c)+5) != 0 or (b+math.sin(b)+5)*(c+math.sin(c)+5) != 0” kısmı ile f(a)*f(c)’yi ve f(b)*f(c)’yi sorguluyorum. Eğer her iki işlemde 0’dan farklıysa işlemler tekrarlanacak, değilse zaten kökü bulmuşuz demektir.

if(a+math.sin(a)+5)*(c+math.sin(c)+5)<0:
    b = c
    ceksi=c
    c = (a+b)/2
    iterasyon = iterasyon + 1
    print str(iterasyon) + "-" + str(c)

Bu kısım çok önemli bir kısım. Bunun aynısını aslında elif kısmında tekrardan yazıyorum. Eğer f(a)*f(c) 0’dan küçükse eğer b’yi c’ye eşitleyerek aralığı artı sonsuz kısmından küçültüyoruz. elif kısmında ise f(b)*f(c) 0’dan küçükse eğer a’yı c’ye eşitleyerek aralığı eksi sonsuz kısmından küçültüyoruz. ceksi=c ile önceki değeri alıp c’yi tekrardan orta noktaya atıyorum. Bu sırada iterasyon sayısını 1 arttırıp c ile yazdırıyorum.

if abs(c-ceksi)<epsilon:
    break

Bu kısımda bahsettiğim hassasiyet sınamasına tutuyorum. Eğer epsilon değerinden küçükse while döngüsünden çıkıp kökü yazdıracak, değilse devam edecek.

print "Kok: " + str(c)

Burada da kökü yazdırıyoruz ve programımız bitiyor. 🙂

Yorum bırakın