Python,平方根函数?

Python,平方根函数?,python,square-root,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)

我在这方面做了多次尝试,但都失败了,如果能得到一些帮助,我将不胜感激

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

这不是作业,只是练习。我环顾了一下这个网站,发现了一些有用的方法,但没有足够的描述性

在您的代码中,您没有在循环时更新x(因此也没有更新srx)。

一个问题是,
x/1
不会有多大作用,另一个问题是,由于x从不更改,因此循环的所有迭代都会执行相同的操作。

您可能需要类似于:

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)。

这是牛顿方法的实现

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的派生词。

我敦促您查看维基百科中关于的部分

这个过程通常是这样的,我们的功能是

f(x) = x2 - a f'(x) = 2x 因此,如果您最初的猜测是
x0
,那么我们的估计是

x1 = x0 - (x02 - x) / (2x0) x2 = x1 - (x12 - x) / (2x1) x3 = x2 - (x22 - x) / (2x2) ... 下面是一个小演示:

>>> 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

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

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

你的基本问题似乎是你不知道如何使用牛顿的方法来计算平方根。我在你的函数中没有看到任何平方,你用相同的值重复了完全相同的计算二十次。我正在尝试学习如何编写这种类型的平方根函数。当我尝试时,解决方案是正确的。我粘贴了一个例子。(在我的第一个版本中,我忘了包括
srx-(…)
,也许你试过了吗?)是的,我没有做一个完整的实现,而是尝试做了与你在问题中使用的简化类似的数学运算。在这样做时,我最初犯了一个符号错误。(我想,如果你看到一个类似的答案,最容易看出你的方法哪里出了问题。)是的,我知道我很接近,但就是绕不开它。非常有帮助的回答。
>>> 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
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