FORTRAN 90 Lecturer : Rafel Hekmat Hameed University of Babylon Subject : Fortran 90 College of Engineering Year : Second B.Sc. Mechanical Engineering Dep. S SO OL LU UTTIIO ON N O OF F N NO ON N-L LIIN NE EA AR R E EQ QU UA ATTIIO ON N Bisection Method The bisection method in mathematics is a root-finding method which #_> #_> repeatedly bisects an interval and then selects a subinterval in which a root #_> #_> must lie for further processing. It is a very simple and robust method, but it is also relatively slow. Because of this, it is often used to obtain a rough approximation to a solution which is then used as a starting point for more rapidly converging methods. Consider a transcendental equation f (x) = 0 which has a zero in the interval [a,b] and f (a) f (b) < 0. We may refine our approximation to the root by dividing the interval into two: find the midpoint c = (a + b)/2. In any real world problem, it is very unlikely that f(c) = 0, however if we are that lucky, then we have found a root. More likely, if f(a) and f(c) have opposite signs, then a root must lie on the interval [a, c]. The only other possibility is that f(c) and f(b) have opposite signs, and therefore the root must lie on the interval [c, b]. We may repeat this process numerous times, each time halving the size of the interval. Numerical Example : Find a root of f (x) = 3x + sin(x) - exp(x)=0. The graph of this equation is given in the figure. ϭ It's clear from the graph that there are two roots, one lies between 0 and 0.5 and the other lies between 1.5 and 2.0. Consider the function f (x) in the interval [0, 0.5] since f (0) f (0.5) is less than zero. Then the bisection iterations are given by Iteration No. 1 2 3 4 5 6 a b c f(a) f(c) 0 0.25 0.25 0.34 0.34 0.354 0.5 0.5 0.393 0.393 0.367 0.367 0.25 0.393 0.34 0.367 0.354 0.3605 0.287 (+ve) -0.015 (-ve) 9.69 E-3 (+ve) -7.81 E-4 (-ve) 8.9 E-4 (+ve) -3.1 E-6 (-ve) So one of the roots of 3x + sin(x) - exp(x) = 0 is approximately 0.3605. program bisection implicit none real,parameter::error=1e-4 real::a,b,f,c 10 read(*,*) a,b 15 if (f(a)*f(b).lt.0)then c=(a+b)/2.0 else write(*,*)"try with another value of a & b " Ϯ goto 10 endif if(f(a)*f(c).lt.0)then b=c else a=c endif if(abs(b-a).gt.error)goto 15 write(*,*)"the root is=",c end real function f(x) implicit none real::x f=3*x + sin(x) - exp(x) end ϯ