Python,平方根函数?

时间:2013-09-16 22:21:02

标签: python square-root

我已经在这方面进行了多次尝试并且惨遭失败,我们将非常感谢一些帮助。

该函数应该有一个参数而不使用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

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

6 个答案:

答案 0 :(得分: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)

请参阅here了解其工作原理。 derf是f的衍生物。

答案 1 :(得分:1)

我恳请您查看维基百科关于applying Newton's method to finding the square root of a number的部分。

这个过程一般都是这样的,我们的功能是

f(x) = x2 - a

f'(x) = 2x

其中a是我们想要找到平方根的数字。

因此,我们的估计将是

xn+1 = xn - (xn2 - a) / (2xn)

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

x1 = x0 - (x02 - x) / (2x0)

x2 = x1 - (x12 - x) / (2x1)

x3 = x2 - (x22 - x) / (2x2)

...

将此转换为代码,将我们的初始猜测作为函数参数本身,我们会有类似

的东西
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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分: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)。

答案 5 :(得分: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