We're a community of 1.1M IT Pros here for help, advice, solutions, professional growth and fun. Join us!
1,080,578 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Start New Discussion Reply to this Discussion

Newton Function

i am in need of help with this homework. The instructions are as followed: Package Newton's method for approximating square roots in a function named newton. This function expects the input number as an argument and returns the estimate of its square root. The script should also include a main function that allows the user to compute the square roots of inputs until the user presses the enter/return key. This is what I have so far:

import math

#Initialize tolerance
tolerance = 0.000001

def newton(x):
    """ Returns the square root of x """
    #Performs the successive approximations
    estimate = 1.0
    while True:
        estimate = (estimate + x / estimate) / 2
        difference = abs(x - estimate ** 2)
        if difference <= tolerance:     # Break out of loop if difference is less than tolerance
            break           
        return estimate     # While the difference value is > TOLERANCE, the process continues



def main():
    """Allows the user to obtain square roots."""
    while True:
        #Receive the input number from the user
        x = input("Enter a positive number or enter/return to quit: ")
        if x == "":     #if user presses "Enter" then exit the program
            break       # Otherwise, continue the process of allowing new numbers
        x = float(x)
        #Output the result
        print("The programs estimate of the square root of ", x, "is ", round(newton(x),2))
        print("Python's estimate: ", math.sqrt(x))
main()

I tested it out, but it seems like the calculation is not accurate, can anyone help me?

4
Contributors
5
Replies
1 Day
Discussion Span
6 Months Ago
Last Updated
6
Views
Question
Answered
siaosituimoloaublood
Newbie Poster
12 posts since Dec 2012
Reputation Points: 0
Solved Threads: 0
Skill Endorsements: 0

return should be in place of break, I think. Also rounding to 2 decimals does not make sense after so small tolerance for error, generally you also do not round, you just format the printing.

pyTony
pyMod
Moderator
6,330 posts since Apr 2010
Reputation Points: 879
Solved Threads: 989
Skill Endorsements: 27

line 15
return estimate
should be outside the loop

sneekula
Nearly a Posting Maven
2,483 posts since Oct 2006
Reputation Points: 1,000
Solved Threads: 231
Skill Endorsements: 2

I would write the code like this ...

def newton_approx(x):
    """
    Newton's method to get the square root of x
    using successive approximations 
    """
    tolerance = 0.000001
    estimate = 1.0
    while True:
        estimate = (estimate + x / estimate) / 2
        difference = abs(x - estimate ** 2)
        if difference <= tolerance:
            break           
    return estimate

# test
x = 2
print("newton = %0.15f" % newton_approx(x))
print("x**0.5 = %0.15f" % (x**0.5))

'''
newton = 1.414213562374690
x**0.5 = 1.414213562373095
'''
vegaseat
DaniWeb's Hypocrite
Moderator
6,499 posts since Oct 2004
Reputation Points: 1,451
Solved Threads: 1,618
Skill Endorsements: 37

Thank you everyone for your helpful inputs in solving my problem. The code now works since I moved the return outside of the loop. Now for phase 2 of my homework converting the current function to a recursive function. Any suggestions?

siaosituimoloaublood
Newbie Poster
12 posts since Dec 2012
Reputation Points: 0
Solved Threads: 0
Skill Endorsements: 0
Question Answered as of 6 Months Ago by vegaseat, sneekula and pyTony

I would add parameter for current difference and return value from function which reaches the level of tolerance (which also could be a parameter).

pyTony
pyMod
Moderator
6,330 posts since Apr 2010
Reputation Points: 879
Solved Threads: 989
Skill Endorsements: 27

This question has already been solved: Start a new discussion instead

Post: Markdown Syntax: Formatting Help
 
You
 
© 2013 DaniWeb® LLC
Page generated in 0.0898 seconds using 2.67MB