I need to make use the Newton-Raphson function to solve for this.
Everything seems to be working perfectly, except I get "NaN" instead of numerical values after I compile. I figured out NaN stands for Not a Number, meaning my calculations had some weird divide-by-0-type stuff in it. I can't find a problem anywhere. The only place where I have a division sign is in my tolerances section, and I already tried erasing it from my code and I still got the same error.
My starting values:
f(x) = sin(x) +2x +1
d'f(x) = cos(x) +2
from x=-3 to x=3.
Any help? what's wrong with my code?
Code:
#include <stdio.h>
#include <math.h>
double Newton_Raphson(double x0);
double func1(double x);
double func1_d(double x);
int main(void)
{
double x_begin=-3.0, del_x=0.25;
double x, x_old, x0, root, f_x, f_x_old;
int k;
char sign_change;
/* If there's a sign change, I put "Y" next to that value of x. If not, I leave it blank*/
printf(" x f(x) sign change\n");
printf("--------------------------------...
x=x_begin;
f_x=func1(x);
printf("%8.2f %12.4f\n", x, f_x);
{
x_old=x;
f_x_old=f_x;
sign_change=' ';
x=x_begin + (double)k*del_x;
f_x=func1(x);
if(f_x*f_x_old <= 0.0){
sign_change = 'Y';
printf("%8.2f %12.4f %c\n", x, f_x,
sign_change);
x0 = 0.5*(x + x_old);
root = Newton_Raphson(x0);
printf(" A refined root is %-13.5e\n", root);
}
else printf("%8.2f %12.4f %c\n", x, f_x,
sign_change);
}
printf("\n");
exit(0);
return;
}
double func1(double x) //my f(x) function
{
double f_x;
f_x = sin(x)+2x+1;
return f_x;
}
double func1_d(double x) //my d'f(x) function
{
double fd_x;
fd_x = cos(x)+2;
return fd_x;
}
double Newton_Raphson(double x0)
{
/* my tolerances
I doubt this is where the problem lies as I erased this part from the coding and it came out with the same error */
int debug = 1;
double tolx, tolf, x1, del_x;
double f0, f1, f_d0;
f0 = func1(x0);
if(debug !=0) printf(" f(%g) = %e \n", x0, f0);
tolx = 1.e-8 * fabs(x0);
tolf = 1.e-6 * fabs(f0);
do{
f_d0 = func1_d(x0);
x1 = x0 - f0/f_d0;
f1 = func1(x1);
if(debug!=0) printf(" f(%g) = %e\n", x1, f1);
del_x = fabs(x1-x0);
x0 = x1;
f0 = f1;
} while(del_x > tolx && fabs(f1) > tolf);
return x1;
}
I followed an example problem almost to a tee to get this, and everything compiles fine. However, my output looks like this:
x f(x) sign change
--------------------------------------...
-3.00 0.0000
-3.00 0.0000 Y
f(-3) = 0.000000e+00
f(NaN) = 0.000000e+00
A refined root is NaN
-2.75 0.0000 Y
f(-2.875) = 0.000000e+00
f(NaN) = 0.000000e+00
A refined root is NaN
-2.50 0.0000 Y
f(-2.625) = 0.000000e+00
f(NaN) = 0.000000e+00
A refined root is NaN
-2.25 0.0000 Y
f(-2.375) = 0.000000e+00
f(NaN) = 0.000000e+00
A refined root is NaN
-2.00 0.0000 Y
f(-2.125) = 0.000000e+00
f(NaN) = 0.000000e+00
A refined root is NaN
-1.75 0.0000 Y
f(-1.875) = 0.000000e+00
f(NaN) = 0.000000e+00
A refined root is NaN
etc...etc...
Any help is greatly appreciated.
Thanks!
Add'l Info: This code piece is inside of a menu-style code, but it's meant to function as a standalone program. I doubt this is the problem, but it may very well be^^