C Code

/*
---------------------------------------------------------------------------
Algo2-5.c   C program for implementing Algorithm 2.5
Algorithm translated to  C  by: Dr. Norman Fahrer
IBM and Macintosh verification by: Daniel Mathews

NUMERICAL METHODS: C Programs, (c) John H. Mathews 1995
To accompany the text:
NUMERICAL METHODS for Mathematics, Science and Engineering, 2nd Ed, 1992
Prentice Hall, Englewood Cliffs, New Jersey, 07632, U.S.A.
Prentice Hall, Inc.; USA, Canada, Mexico ISBN 0-13-624990-6
Prentice Hall, International Editions:   ISBN 0-13-625047-5
This free software is compliments of the author.
E-mail address:       "mathews@fullerton.edu"

Algorithm 2.5 (Newton-Raphson Iteration).
Section   2.4, Newton-Raphson and Secant Methods, Page 84
---------------------------------------------------------------------------
*/
/*
---------------------------------------------------------------------------

Algorithm 2.5 (Newton-Raphson Iteration). To find a root
f(x) = 0 given one initial approximation  p_0  and using the iteration

                                                  f(p_(k-1))  
      p_k  =  p_(k-1)  -  -------------     for k = 1, 2, ...  
                                                 f'(p_(k-1))  

---------------------------------------------------------------------------
*/

/* User has to supply a function named :  ffunction
   and its first derivative :            dffunction

   An example is included in this program */

#include<stdio.h>
#include<stdlib.h>
#include<math.h>


/*  define prototype for USER-SUPPLIED function f(x)  */

    double ffunction(double x);
    double dffunction(double x);


/*  EXAMPLE for "ffunction"   */

    double ffunction(double x)

    {
        return ( pow(x,3) - 3 * x + 2 );
    }

/*  EXAMPLE for "dffunction" , first derivative of ffunction. */

    double dffunction(double x)

    {
        return ( 3 * pow(x,2) - 3 );
    }


/* -------------------------------------------------------- */

/*  Main program for algorithm 2.5  */

    void main()

{
    double Delta = 1E-6;       /* Tolerance  */
    double Epsilon = 1E-6;     /* Tolerance  */
    double Small = 1E-6;       /* Tolerance  */

    int Max = 99;  /* Maximum number of iterations  */
    int Cond = 0;  /* Condition fo loop termination */
    int K;         /* Counter for loop              */

    double P0;    /* INPUT : Must be close to the root */
    double P1;    /* New iterate    */
    double Y0;    /* Function value */
    double Y1;    /* Function value */
    double Df;    /* Derivative     */
    double Dp;
    double RelErr;


    printf("----------------------------------------------\n");
    printf("Please enter initial approximation of root !\n");
    scanf("%lf",&P0);
    printf("----------------------------------------------\n");
    printf("Initial value for root: %lf\n",P0);

    Y0 = dffunction(P0);

    for ( K = 1; K <= Max ; K++) {

        if(Cond) break;

        Df = dffunction(P0);      /* Compute the derivative  */

         if( Df == 0) {       /* Check division by zero */
             Cond = 1;
             Dp   = 0;
         }

         else Dp = Y0/Df;

        P1 = P0 - Dp;       /* New iterate */
        Y1 = ffunction(P1);   /* New function value */

        RelErr = 2 * fabs(Dp) / ( fabs(P1) + Small );  /* Relative error */

        if( (RelErr < Delta)  && (fabs(Y1) < Epsilon) ) { /* Check for   */

            if( Cond != 1) Cond = 2;                      /* convergence */

        }

        P0 = P1;
        Y0 = Y1;
    }

    printf("----------------------------------------------\n");
    printf("The current %d -th iterate is %lf\n",K-1, P1);
    printf("Consecutive iterates differ by %lf\n",Dp);
    printf("The value of f(x) is %lf\n",Y1);
    printf("----------------------------------------------\n");

if(Cond == 0) printf("The maximum number of iterations was exceeded !\n");

if(Cond == 1) printf("Division by zero was encountered !\n");

if(Cond == 2) printf("The root was found with the desired tolerance !\n");

    printf("----------------------------------------------\n");

}   /* End of main program */

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(c) John H. Mathews 2004