2

我正在尝试使用牛顿法返回 k 平方根的最小值。

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 的平方根?同样,错误需要反映这种变化。

4

1 回答 1

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
于 2012-11-06T22:50:44.500 回答