Bisection method in fortran 90

by jhosamelly
Tags: bisection, fortran, method
 P: 126 Bisection method for the equation x3−2x−2 = 0 which has a single root between x=−4 and x = 2. here's the code I have  program bisection2 implicit none real :: fxa, xnew, xu, xl, fxb, fnew xu=4 xl=2 1 xnew=(xu+xl)/2 fxa=(xnew**3-(2*xnew)-2) fxb=(xl**3-(2*xl)-2) fnew=fxa*fxb if fxnew<0 then xl=xl xnew=xu go to 1 if fxnew>0 then xnew=xl xu=xu go to 1 print *, "fx(a) = ", fxa print *, "fx(b) = ", fxb end program bisection2 I know there's something wrong with my code. Can somebody help me please? Here are the Bisection Method formulas xm = (xl+xu)/2
 Sci Advisor P: 2,751 The code at the line starting: "if fxnew>0 then" can never execute. Take a close look and see if you can tell me why? A couple of other points. 1. Even if you fix the above problem, your code may never terminate. Requiring exact (FP) equality with zero is a bad idea. 2. There's no real reason to use to goto in this code. You should look at alternative methods of program flow control. 3. It will really help you keep track of your code if you start making use of indentation.
 P: 126 I'm guessing coz there is no "end if"? I don't know. sorry.. How can I do the iteration here? Thanks for the help
P: 2,751

Bisection method in fortran 90

 Quote by jhosamelly I'm guessing coz there is no "end if"?
Yes, unless you use "end if" then the statement "if fxnew>0 then" is still under the control if the previous "if".

I'm surprised that the program even compiled without the "end if" statements. (BTW. does it actually compile?)
P: 2,751
Yes there's still quite a few thing wrong with code, but you know we can't write your program for you. :)

I'll look at one section:
if fxnew<0 then
xl=xl
xnew=xu
You're kind of got the right idea. This section is executed if xnew is opposite sign to xlow, so you now know the zero crossing is between xlow and xnew. Now you want to let xnew become the new xhigh, and keep xlow as is. Can you see that of your two assignment statements, one is redundant and the other is the wrong way around.
 P: 181 ... and don't forget to correct your inital conditions.
 P: 126 Ow. So it should be xl=xl xu=xnew Correct? Then? What should I do?
P: 2,751
 Quote by jhosamelly O Correct? Then? What should I do?
Take all the advice and hints you've been given so far then sit down and write a new iteration of your program.
 HW Helper Thanks P: 5,556 xl = xl is redundant
P: 126
 Quote by SteamKing xl = xl is redundant
hmmm.. yes. But how can I put that xl=xl and use it on the equation again in program?

just give me one example and i'll do it for the rest of the statements. Thanks. I really don't have any idea.
Mentor
P: 21,036
 Quote by jhosamelly hmmm.. yes. But how can I put that xl=xl and use it on the equation again in program?
It's silly and a waste of time to set a variable to its own value.

You're doing the same thing later in your program where you set xu = xu.

What is your purpose in doing this?
 Quote by jhosamelly just give me one example and i'll do it for the rest of the statements. Thanks. I really don't have any idea.
 P: 126 I need to put in codes the conditions given.
Mentor
P: 21,036
 Quote by jhosamelly Here are the Bisection Method formulas xm = (xl+xu)/2
I'm not convinced that you understand what the above means.

xL - Lower (left) endpoint of an interval
xM - Midpoint of an interval
xU - Upper (right) endpoint of an interval

a) If f(xL)*f(xM) < 0, the graph of the function crosses the x-axis somewhere between xL and xM, so the root you're looking for must be in the left half of the original interval. If so, USE THE SAME VALUE FOR xL (i.e., don't change xL) but reset xU to xM. Your code should NOT include xL = xL.

b) If f(xL)*f(xM) > 0, the graph of the function does not cross the x-axis between xL and xM, so we should look in the other half of the interval - in [xM, xU]. If so, USE THE SAME VALUE FOR xU (i.e., don't change xU), but reset xL to xM. Your code should NOT include xU = xU.

At each step for a) or b), we are shortening the interval by half its length, so that we eventually find the root.

c) If f(xL)*f(xM) = 0 then either f(xL) = 0 or f(xM). There's probably an assumption that f(xL) ≠ 0 and f(xU) ≠ 0, but you didn't show it in the attachment you posted.
 P: 126 Yes, I understand that,, I just dont know how to put it in codes. i'll work on all your hints now. Thanks :)
 Mentor P: 7,292 Perhaps you could work through several iterations by hand. Once you get an understanding of how the algorithm works you can then write the code. Step 1. Is there a root on the interval? Step 2. Find the midpoint. step 3. Find the half that has a root. Step 4. Repeat.
 P: 126 I did that already. Im not getting the same answer with the the program so I know there's something wrong. Thanks for the help guys. Appreciate it.