1. Limited time only! Sign up for a free 30min personal tutor trial with Chegg Tutors
    Dismiss Notice
Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

C++ Program Help (newtons method)

  1. Oct 24, 2011 #1
    I'm new to programming. my assignment wants me to create a program using c++ that can find the square root of any number using Newtons Method.

    The user has to enter a number (y) and the program has to calculate the root and has to show each iteration. the initial guess (x0) has to be y/4

    the iterations have to stop when the initial guess (x0) and the new guess (x1) are within 0.0001 of each other

    Newtons method equation: x1 = (x0 + (y/x0))/2

    the problem is that i keep getting a infinite loop showing the first x0 and x1 values
    I think the loop isn't updating the x1 and x0 values after each iteration
    how do i get the loop to update the x1 and x0 values
    any help would be appreciated


    here what i got for my code so far:

    # include <iostream>
    # include <math.h>

    using namespace std;

    int main ()
    {
    double y = 0, x1 = 0, x0 = 0;

    cout << "enter number" << endl;
    cin >> y;

    x0 = ( y/4);

    while (!( x1 - x0 <= 0.0001 && x1 - x0 >= -0.0001))
    {

    x1 = ((x0 + (y/x0))/2);
    x0 == x1;

    cout << "x0=" << x0 << "x1=" << x1 << endl;

    }

    return 0;
    }
     
  2. jcsd
  3. Oct 24, 2011 #2

    phinds

    User Avatar
    Gold Member
    2016 Award

    This would probably work a whole lot better if you were to replace x0 with x1 (x0 = x1) instead of asking if they are the same (x0 == x1) and then not doing anything with the answer.

    Once you fix THAT mistake, you'll find another.

    EDIT: by the way, if you plan on doing much programming at ALL, you really should learn to use whatever debugger facility you have available.
     
  4. Oct 24, 2011 #3
    phinds,

    I changed x0 == x1 to x0 = x1 instead

    This stopped the infinite loop, but it shows x1 and x0 as the same value.The loop still isn't updating x1 and x0. Is there something i'm missing, whats wrong with my source code.
     
  5. Oct 24, 2011 #4
    x1 = ((x0 + (y/x0))/2);
    x0 = x1;

    in normal terms:

    x1 = calculate a new value

    x0 = update me to that new calculated value

    Now x0 holds the same value as x1

    When you print them out, you confirm this.

    Which means your while loop is seeing X1-X0 (BOTH BEING EQUAL) = 0
    This breaks the while loop.



    edit:
    May I suggest you attempt to solve this on paper minus the coding part. It is solved like how a while loop is coded.
    I was curious how this worked so I looked it up.

    http://mitpress.mit.edu/sicp/chapter1/node9.html

    If you can solve it on paper you will see what you need to do to x0 in order to fix the error.
     
    Last edited: Oct 24, 2011
  6. Oct 24, 2011 #5

    phinds

    User Avatar
    Gold Member
    2016 Award

    and what does your loop test do when that's the case?
     
  7. Oct 24, 2011 #6
    the loop ends when x1 and x0 are equal, but i dont need them to be equal i need x1 to be equal to the root of the y value
     
  8. Oct 24, 2011 #7
    I suggest testing the first guess outside the while loop

    x0 = (y/4);
    x1 = (x0+(y/x0))/2;

    while (!( x1 - x0 <= 0.0001 && x1 - x0 >= -0.0001))

    It will enter the loop if it wasn't divisible by 4. Now you need a new guess to use. Update your guess x0 = something.

    Then you can try your formula again. If it fails, the while loop will update your guess again.
     
  9. Oct 25, 2011 #8
    thanks

    that last reply helped me figure out what i was doing wrong
    I put the equation, x1= (x0+(y/x0))/2 outside of the loop
    and put x0 = x1 inside the loop along with x1= (x0+(y/x0))/2 and it worked

    x0 = (y/4);
    x1 = ((x0 + (y/x0))/2);

    while (!( x1 - x0 <= 0.0001 && x1 - x0 >= -0.0001))
    {
    x0 = x1;
    x1 = ((x0 + (y/x0))/2);

    cout << "x0 =" << x0 << "x1 =" << x1 << endl;
    }

    cout << "The root is " << x1 << endl;



    thanks for all the help ducks and phinds
     
  10. Oct 25, 2011 #9

    Borek

    User Avatar

    Staff: Mentor

    Put your programs in [noparse]
    Code (Text):
     
    [/noparse] tags:

    Code (Text):
    while (!( x1 - x0 <= 0.0001 && x1 - x0 >= -0.0001))
    {
       x0 = x1;
       x1 = ((x0 + (y/x0))/2);

       cout << "x0 =" << x0 << "x1 =" << x1 << endl;
    }
    It doesn't break space and tab formatting.

    BTW: why not abs(x0-x1) < 0.0001?
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook




Similar Discussions: C++ Program Help (newtons method)
  1. C++ program help! (Replies: 1)

  2. C program help needed (Replies: 3)

Loading...