Bisection Metodu İle Kök Bulma

tarihinde yayınlandıMekatronik içinde yayınlandı

Teorem derki eğer sınır noktalarının değeri [f(a),f(b)] zıt işaretli ise arada en az bir kök vardır. İşlem bu iki noktanın ortasındaki noktanın değerine bakarak devam edilir. bu noktaya ‘c’ değerinede f(C) denir. f(C)’nin ikitane olasılığı vardır ya f(a) ile zıt işaterli olucak ve kökü aralarında bulundurucaklar yada f(b) ile zıt işaretli olucak ve kökü aralarında bulundurucaklar. Zıt işaterliler seçilerek bu işlem tekrarlanılır taki kabul edilen aralık degerine kadar. Her tekrarlamada aralık bir öncekinin %50 degeri kadar küçülür.

Bisection_method.svg

 

Bu kod aşşağıdaki başlıkların örneğini içermektedir;

 

  • Memory allocation (malloc)
  • For döngüsü
  • Do-while döngüsü
  • If döngüsü

Öncelikle fonksiyonumuzu oluşturuyoruz.

Sonrasında sınırları belirliyoruz. Bu aralıkda kök varsa program bunu bildiriyor. Eğer yok ise program sınırları tekrar soruyor.

code

 

g        g_closer

 

Fonksiyonun şekli “x^3-2x^2-0.5” gördüğünüz üzere kök programdakinin aynısı tabi e^-11 hata payı ile.

Kod;

//———————————————————————
//bisection method
//———————————————————————
//made by mehmet ali yurtsever
//———————————————————————
#include
#include
#include
#include
//———————————————————————
double poly(double x1,int degree_of_function,double *function );
//———————————————————————
int main(){
//———————————————————————
const double acc = 1.0e-11;
int degree_of_function,i,counter=0;
double *function,poli,x,x1,x2,fa,fb,fc, middle,temp,toplam=0;
//———————————————————————
printf(” Which value will be the degree of the function? : “); //taking the degree of the function
scanf(“%d”,°ree_of_function);

function=(double*)malloc(sizeof(double)*(degree_of_function+1)); //opening malloc
printf(“\n Enter the leading coefficiend.\n\n”);

for(i=0;i<=degree_of_function;i++) //taking coefficiend of function
{
printf(“x^%d : “,i);
scanf(“%lf”,&function[i]);
}
//———————————————————————
for(i=0;i<=degree_of_function;i++) //checking is the all leading coefficiends is zero
toplam=toplam+pow(function[i],2);

if(toplam==0)
{
printf(“\nYou did not enter reasonable numbers. You can not use this program anymore…\n\n”);
printf(“but I will give a gift for you, goodbye gift, a poem!\n\n\n “);
printf(” And my soul from out that shadow that lies floating on the floor\n Shall be lifted – nevermore! “);
printf(“\n\n\n Edgar Allen POE \n\n\n”);
system(“pause”);
free(function);
return 0;
}
//———————————————————————
printf(“\n Enter the intervall values.\n\n”);
scanf(“%lf %lf”,&x1,&x2);
//———————————————————————
do{
fa=poly(x1,degree_of_function,function);
fb=poly(x2,degree_of_function,function);

if(fa*fb>0)
{
while(fa*fb>0)
{
if(counter != 4){
printf(“\n There is no root at these intervals. \n please Enter another intervall values.\n\n”);
scanf(“%lf %lf”,&x1,&x2);
}
counter++;

switch (counter)
{
case 4:
fa=-99999999999999;
fb=99999999999999;
printf(“\nWe gave the intervals -99999999999999 and 99999999999999\n “);
break;
case 5:
printf(“\nThere is no root, we shut down the program.\n”);
free(function);

system(“pause”);

return 0;

break;

default:
break;
}

fa=poly(x1,degree_of_function,function);
fb=poly(x2,degree_of_function,function);
}
}
//———————————————————————

middle=(x1+x2)/2;
fc=poly(middle,degree_of_function,function);
if(fa*fc<0)
x2=middle;
else if(fa*fc>0)
x1=middle;
}while(fabs(x1-x2)>acc);

//———————————————————————
printf(“root : %lf”,middle);

free(function);
system(“pause”);
return 0;
}

double poly(double x,int degree_of_function,double *function ){
double poli=0;
int i;
for(i=0;i<=degree_of_function;i++) //creating function with f(function)
{
poli=poli+function[i]*pow(x,i); //making function adding one by one
}

return poli;
}

 

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir