Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Bisection method in fortran 90

  1. Dec 14, 2012 #1
    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

    Code (Text):

    program bisection2
    implicit none
    real :: fxa, xnew, xu, xl, fxb, fnew


    1 xnew=(xu+xl)/2


    if fxnew<0 then
    go to 1

    if fxnew>0 then
    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

  2. jcsd
  3. Dec 14, 2012 #2


    User Avatar
    Science Advisor

    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.
    Last edited: Dec 14, 2012
  4. Dec 14, 2012 #3
    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
  5. Dec 14, 2012 #4


    User Avatar
    Science Advisor

    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?)
  6. Dec 14, 2012 #5
    Can you please please help me? How can I put the conditions above and do the iteration? Please? thanks.

    Yes it did compile.
  7. Dec 14, 2012 #6


    User Avatar
    Science Advisor

    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:
    Code (Text):
    if fxnew<0 then
    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.
    Last edited: Dec 14, 2012
  8. Dec 14, 2012 #7
    ... and don't forget to correct your inital conditions.
  9. Dec 14, 2012 #8
    Ow. So it should be


    Correct? Then? What should I do?
  10. Dec 14, 2012 #9


    User Avatar
    Science Advisor

    Take all the advice and hints you've been given so far then sit down and write a new iteration of your program.
  11. Dec 14, 2012 #10


    User Avatar
    Staff Emeritus
    Science Advisor
    Homework Helper

    xl = xl is redundant
  12. Dec 14, 2012 #11
    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.
  13. Dec 15, 2012 #12


    Staff: Mentor

    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?
  14. Dec 15, 2012 #13
    I need to put in codes the conditions given.
  15. Dec 15, 2012 #14


    Staff: Mentor

    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.
  16. Dec 15, 2012 #15
    Yes, I understand that,, I just dont know how to put it in codes. i'll work on all your hints now. Thanks :)
  17. Dec 15, 2012 #16


    User Avatar
    Staff Emeritus
    Science Advisor
    Gold Member

    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.
  18. Dec 15, 2012 #17
    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.
  19. Dec 15, 2012 #18


    User Avatar
    Science Advisor

    What answer are you getting. Is you program even terminating? As it's written, I wouldn't have though it would do.
Share this great discussion with others via Reddit, Google+, Twitter, or Facebook