1

我对此进行了多次尝试,但都失败了,我们将不胜感激。

该函数应该有一个参数而不使用 print 语句。使用牛顿法,它必须返回估计的平方根作为它的值。添加一个 for 循环来更新估计值 20 次,并使用 return 语句得出最终估计值。

到目前为止,我...

    from math import *

    def newton_sqrt(x):    
        for i in range(1, 21)
            srx = 0.5 * (1 + x / 1)
        return srx

这不是一个任务,只是练习。我在这个网站上环顾四周,找到了有用的方法,但没有足够的描述性。

4

6 回答 6

2

这是牛顿方法的一个实现,

def newton_sqrt(val):
    def f(x):
        return x**2-val
    def derf(x):
        return 2*x
    guess =val
    for i in range(1, 21):
        guess = guess-f(guess)/derf(guess)
        #print guess
    return guess

newton_sqrt(2)

请参阅此处了解其工作原理。derf 是 f 的导数。

于 2013-09-16T22:29:34.477 回答
1

我敦促您查看 Wikipedia 上有关应用牛顿法求数的平方根的部分

流程一般是这样工作的,我们的功能是

f(x) = x 2 - a

f'(x) = 2x

a我们想要求平方根的数字在哪里。

因此,我们的估计将是

x n+1 = x n - (x n 2 - a) / (2x n )

因此,如果您最初的猜测是x<sub>0</sub>,那么我们的估计是

x 1 = x 0 - (x 0 2 - x) / (2x 0 )

x 2 = x 1 - (x 1 2 - x) / (2x 1 )

x 3 = x 2 - (x 2 2 - x) / (2x 2 )

...

将其转换为代码,将我们最初的猜测作为函数参数本身,我们会得到类似

def newton_sqrt(a):
    x = a  # initial guess 
    for i in range(20):
        x -= (x*x - a) / (2.0*x)  # apply the iterative process once
    return x  # return 20th estimate

这是一个小演示:

>>> def newton_sqrt(a):
...     x = a
...     for i in range(20):
...         x -= (x*x - a) / (2.0*x)
...     return x
... 
>>> newton_sqrt(2)
1.414213562373095
>>> 2**0.5
1.4142135623730951
>>>
>>> newton_sqrt(3)
1.7320508075688774
>>> 3**0.5
1.7320508075688772
于 2013-09-16T22:32:28.253 回答
0

您可能想要更多类似的东西:

def newton_sqrt(x):    
    srx = 1
    for i in range(1, 21):
        srx = 0.5 * (srx + x/srx)
    return srx

newton_sqrt(2.)
# 1.4142135623730949

这两个:1)在每次迭代时更新答案,2)使用更接近正确公式的东西(即,没有无用的除以 1)。

于 2013-09-16T22:27:40.547 回答
0

在您的代码中,您不会在循环时更新 x(以及因此 srx)。

于 2013-09-16T22:24:09.110 回答
0

一个问题是它x/1不会做太多,另一个是因为 x 永远不会改变循环的所有迭代都会做同样的事情。

于 2013-09-16T22:25:16.587 回答
0

稍微扩展您的代码,您可以添加猜测作为参数

from math import *

def newton_sqrt(x, guess):
    val = x

    for i in range(1, 21):
        guess = (0.5 * (guess + val / guess));
    return guess

print newton_sqrt(4, 3) # Returns 2.0
于 2013-09-16T22:36:01.800 回答