5 Ocak 2012 Perşembe

C DİLİNDE BİSECTİON METHOD İLE FONKSİYON KÖKÜ BULMA

           #include <stdio.h>
#include <stdlib.h>
#include <math.h>
//coding by M.UYSAL
float hesap_fonk(int derece,int deger_dizi[],float hesabin_degeri)//f(x) fonk.nun hesaplanmasý.
{
    int i,n;
    float toplam=0;//for deðiþkenlerinin ve toplamýn tutulacaðý deðiþkenin tanýmlanmasý.
    float deger[derece+1];//döngüden elde edilen sonuçlarýn tutulacaðý dizi.
    for (i=0;i<derece+1;i++)//katsayýlarýn tutulduðu diziyi dolaþan for döngüsü.
    {
        if (i==derece)//eðer dizinin son elemaný ile iþlem yapýlacaksa
        {
            deger[i] = deger_dizi[i];//son eleman üzerinde iþlem yapýlmaksýzýn diziye aktarýlýyor.
        }
        else//eðer son eleman deðil ise
        {
            deger[i] = (pow(hesabin_degeri,derece-i)*deger_dizi[i]);/*
            diziden dönen katsayý ile x'in üslü deðerinin çarpýmý sonucunda elde edilen sonuçlarýn diziye aktarýlmasý
            */
        }
    }
    for(n=0;n<derece+1;n++)//dizi içindeki deðerleri toplayan döngü
    {
        toplam = toplam + deger[n];
    }
    return toplam;//f(x)'in sonucunun döndürülmesi.
}
 float ara_ver(float a,float b)//iki aralýk deðeri arasýnda yeni bir deðerin belirlenmesi
 {
     float c;
     c=(a+b)/2;
     return c;
 }
 float bisection(int derece,int deger_dizi[],float bas,float son)//bisection method ile kök deðerin bulunmasý
 {
     float donen;//yeni ara deðerin tutulacaðý deðiþken
     donen=ara_ver(bas,son);//girilen ilk iki aralýk deðeri arasýnda yeni bir deðerin belirlenmesi
     while(hesap_fonk(derece,deger_dizi,donen)!=0)//f(x)'in sonucunun verilen yeni deðer sonucunda sýfýr olmasý durumu
     {
         if (hesap_fonk(derece,deger_dizi,donen)<0)//fonksiyonumuzun sýfýrý saðlayamamasý durumunda yeni aralýk deðerlerinin atanmasý
           {
               bas=donen;
           }
           else {
               son=donen;
     }
     donen=ara_ver(bas,son);//fonk.nun sýfýrý saðlamamasý durumunda yeni bir ara deðerin bulunmasý
     }
     return donen;//bulunan kök deðerin döndürülmesi
 }

main()
{
    int derece,i,m=0,p=0,s,k;
    float a,b;

     printf("Kacinci dereceden fonksiyon olusturacaksiniz?=",derece);
     scanf("%d",&derece);
     int deger_dizi[derece+1];
    for(i=derece+1;i>0;i--)
    {
        int f=i-1;
     printf("x uzeri %d. terimin katsayisini giriniz:",f);
     scanf("%d",&deger_dizi[p]);
     p=p+1;
    }
    printf("Deger araliklarini bosluk birakarak giriniz:",a,b);
    scanf("%f %f",&a,&b);

   printf("Toplam=%.5f",bisection(derece,deger_dizi,a,b));

   getch ();

}// coding by Mustafa UYSAL&Hüseyin KÜÇÜK





     Arkadaşlar bu benim şimdiye kadar yazdığım en ciddi programdır.Bunu Hüseyin KÜÇÜK ile birlikte yazdık.Bisection method pek kullanılmamasına rağmen yine de etkili bir yöntem olarak karşımıza çıkıyor. İnternette birçok anlatımı var ama ben anlayana kadar epey uğraştım.Ama sonuçta güzel bi program oldu.
     Fakat bu kodları çalıştırmadan önce kendiniz uğraşmalısınız.Çünkü önemli olan başkasının değil sizin neler yapabildiğinizdir.Ben eğer anlamasaydım yapmazdım bu ödevi.Çünkü yaptığınız şey sizi yansıtır.
    Rapor için bana mail adresimden ulaşabilirsiniz.

     uysalmstf@gmail.com

     

1 yorum:

epsilon değeri girmiyoruz ve bisectionda asla tam köke ulaşamadığımız anlar olabilir bu durumda sonsuza dek çalışmıyor mu?

Yorum Gönder

Twitter Delicious Facebook Digg Stumbleupon Favorites More