C Code
/*
---------------------------------------------------------------------------
Algo2-3.c C program for implementing Algorithm
2.3
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: in%"mathews@fullerton.edu"
Algorithm 2.3 (False position or Regula Falsi Method).
Section 2.2, Bracketing Methods for Locating a Root,
Page 62
---------------------------------------------------------------------------
*/
/*
---------------------------------------------------------------------------
Algorithm 2.3 (False Position or Regula Method). To find a
root of the equation f(x) = 0 in the interval
[a,b].
Proceed with the method only if f(x) is
continuous and f(a)
and f(b) have opposite signs.
---------------------------------------------------------------------------
*/
/* User has to supply a function named : ffunction
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);
/* EXAMPLE for "ffunction" */
double ffunction(double x)
{
return (x * sin(x) -
1);
}
/* -------------------------------------------------------- */
/* Main program for algorithm 2.3 */
void main()
{
double Delta =
1E-6; /* Closeness for
consecutive iterates */
double Epsilon =
1E-6; /* Tolerance for the size of
f(C) */
int Max =
199; /*
Maximum number of
iterations */
int Satisfied =
0; /* Condition
for loop termination */
double A,
B; /*
INPUT endpoints of the interval
[A,B] */
double YA,
YB; /* Function values
at the interval-borders */
int
K; /*
Loop
Counter */
double C,
YC; /* new
iterate and function value there */
double
DX; /*
change in
iterate */
printf("-----------------------------------------------------\n");
printf("Please enter endpoints A and B of the
interval [A,B]\n");
printf("EXAMPLE : A = 0 and B = 2.
Type: 0 2 \n");
scanf("%lf %lf", &A, &B);
printf("The interval ranges from %lf to
%lf\n", A,B);
YA = ffunction(A); /*
compute function values */
YB = ffunction(B);
/* Check to see if YA and YB have same SIGN
*/
if( ( (YA >= 0) && (YB >=0) )
|| ( (YA < 0) && (YB < 0) ) ) {
printf("The values ffunction(A)
and ffunction(B)\n");
printf("do not differ in
sign.\n");
exit(0); /*
exit program */
}
for(K = 1; K <= Max ; K++) {
if(Satisfied ==
1) break;
DX = YB * (B - A)/(YB
-YA); /* Change in iterate */
C = B -
DX; /*
New iterate */
YC =
ffunction(C); /* Function value of new iterate
*/
if( YC == 0)
{ /*
first
'if' */
Satisfied
= 1; /* Exact root is found */
}
else if( ( (YB >= 0) && (YC >=0) ) || ( (YB
< 0) && (YC < 0) ) ) {
B =
C; /* Squeeze from the right
*/
YB = YC;
}
else {
A =
C; /* Squeeze from the left */
YA = YC;
}
if( (fabs(DX) < Delta) && (fabs(YC) <
Epsilon) ) Satisfied = 1;
} /* end of 'for'-loop */
printf("----------------------------------------------\n");
printf("The number of performed iterations is
: %d\n",K - 1);
printf("----------------------------------------------\n");
printf("The computed root of f(x) = 0 is :
%lf \n",C);
printf("----------------------------------------------\n");
printf("Consecutive iterates differ by
%lf\n", DX);
printf("----------------------------------------------\n");
printf("The value of the function f(C) is
%lf\n",YC);
} /* End of main program */
(c) John H. Mathews 2004