Newton Raphson Formülü İle Kök Bulma

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

Bu teorem bir başlanğıç(tahmini kök ) noktası belirlemek kaydı ile çalışmaktadır. Önemli olan şu ki seçtiğimiz noktadan çıkan dik doğrultu fonksiyonu kesmelidir yanı fonksiyon o noktada tanımlı olmalıdır. Yoksa kökü bulamayız. Belirlenen noktadan başlayarak tanjant doğrultusu ile gerçek köke yaklaşmaya başlarız taki kabul edilen töleransa kadar. Örnegin;

newtonaproximation

“sosmath’den alıntıdır”

Formül;

formula

formula2

 

“Wikipedia the free encylopedia’dan alıntıdır.”

NewtonIteration_Ani[1]

“Wikipedia the free encylopedia’dan alıntıdır.”

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

 

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

Öncelikle fonksiyonumuzu oluşturuyoruz.

Tam ekran yakalama 8.2.2013 014145.bmp

Sonrasında tanjant doğrultudu ile gerçek köke yaklaşmaya başlıyoruz. Newton – Raphson formülünün güzel yanı ise sonuca çok hızlı varabilmenizdir. En fazla 20 tekrarlamada sonuca ulaşılabiliniyor. tabi kök var ve sizin ilk tahmini degeriniz fonksiyonu kesiyorsa. Eğer program 1000 tekrarlamada kök bulamassa duruyor.

Tam ekran yakalama 8.2.2013 013943.bmp

Tam ekran yakalama 8.2.2013 014255.bmp

 

Fonksiyonumuzun şekli; x^5+5x^4+53x^3+4x^2+5x+32

Tam ekran yakalama 8.2.2013 014418.bmp

Gördügünüz üzere kökün degeri programdaki ile aynı.

Kod;

//———————————————————————
//newton raphson algorithm
//CMPE2013 lab – week 11
//———————————————————————
//made by mehmet ali yurtsever – 0999296
//———————-LIBRARIES————————————–

#include
#include
#include
#include
//——————–MAKING FUNCTION———————————-

double f(double xold,int degree_of_function,double function[]) {

int i=0;
double in=0;

for(i=0;i<=degree_of_function;i++)
{
in=in+function[i]*pow(xold,i);
}

return in;
}
double g(double xold,int degree_of_function,double function[]) {
int i;
double in=0;

for(i=1;i<=degree_of_function;i++)
{
in=in+function[i]*i*pow(xold,i-1);
}

return in;
}
//———————————————————————
int main()
{
const double acc = 1.0e-11;   // requested accuracy
double xnew=0.0,xold=0.0,startx=0.0,*function,in,toplam=0;   // starting value; iteration starts from xnew
double ff,gg;   // function f and its derivative
int count = 0,max_iter=999,i=0,degree_of_function=0;   // count keeps track of number of iterations
// max iteration limit
char isaret;
int devam=0,dogruGiris=0;
//———————————————————————
do
{
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!\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 Decide the starting point. : “);
scanf(“%lf”,&startx);   //taking the stating point
printf(“\n”);

xnew=startx;   //equalizetion of starting point to xnew point
//———————————————————————
do
{

xold = xnew;
ff=f(xold,degree_of_function,function);   //creating function with f(function)
gg=g(xold,degree_of_function,function);   //creating derivative of function with g(function)
xnew = xold – ff/gg;
count++;   //clocking
printf(“%d:\t f=%18.11f ; root=%15.12lf \n”,count,ff,xnew);
if (count>max_iter) {   //when the iteration number pass 1000 this massage show that program finish
printf(“\nSolution not found after %d iteration.\n”, count);   //the massage say that the root could not find
printf(“No root found. Consider changing starting value\n”);

system(“pause”);
return 0;
}
}
while(fabs(xnew – xold) > acc);   //if difference of xold and xnew smaller than accuracy

printf(“\nRoot is %g in %d iterations\n\n”,xnew,count);   //than this massage show and program finish this means the root find

free(function);
system(“pause”);
//———————————————————————
dogruGiris=0;
while(dogruGiris ==0)   //restart panel
{
system(“CLS”);
printf(“Do you want to calculate again? (y/n) : “);
fflush(stdin);
scanf(“%c”,&isaret);
if(isaret == ‘y’ || isaret == ‘Y’)
{
devam = 0;
dogruGiris = 1;
count=0;
}
else if(isaret == ‘n’ || isaret == ‘N’)
{
devam = 1;
dogruGiris = 1;
}
else
{
printf(“you enter a wrong character\n\n”);
system(“pause”);
devam = 0;
dogruGiris = 0;
}
}
}while(devam!=1);
//———————————————————————
return 0;
}

 

Bir Cevap Yazın

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