2012-11-06 59 views
2

我试图用牛顿法返回k的平方根的最小值。Python 3.3,在while循环中返回最小值

k=float(input("Number? ")) 
x = k/2 

def newton(x): 
    while abs(x**(1/2)- k) >= 10**(-10): 
     if k >= 0: 
      x = (x+k/x)/(2) 
      return x 
     elif k < 0: 
      raise ValueError ("Cannot take the square root of a negative number") 


print ("The approximate square root of", k, "is", newton(k)) 
print ("The error is", abs(x**(1/2)- k)) 

但是,上面的代码只返回第一次迭代。例如,如果k是2,则牛顿法的精确平方根应该是1.41422,这是第三次迭代。但是,代码目前正在返回1.5,这是第一次迭代。我如何返回更精确的平方根1.41422而不是1.5?同样,错误也需要反映这种变化。

+1

究竟做什么你期望的时候会发生,在第一次迭代循环中,'return x'(用'x = 1.5')命中? – Ben

回答

9

您需要将您的return陈述你的循环之外,否则将总是在第一次迭代返回:

def newton(x): 
    while abs(x**(1/2)- k) >= 10**(-10): 
     if k >= 0: 
      x = (x+k/x)/(2) 
     elif k < 0: 
      raise ValueError ("Cannot take the square root of a negative number") 
    return x 

注意,使用的变量来自像全球范围内是一个灾难,但目前还不清楚并意味着你不能轻松使用你的功能。请将其作为参数传递。

这也是不可能的k到循环内改变,所以你可以在一开始做检查一次,而不是在每个迭代上:

def newton(x, k): 
    if k < 0: 
      raise ValueError ("Cannot take the square root of a negative number") 
    while abs(x ** (1/2) - k) >= 10 ** (-10): 
     x = (x + k/x)/2 
    return x