【问题标题】:Python, square root function?Python,平方根函数?
【发布时间】:2013-09-16 22:21:02
【问题描述】:

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

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

目前为止……

    from math import *

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

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

【问题讨论】:

  • 您的基本问题似乎是您不了解如何使用牛顿法计算平方根。我在您的函数中看不到任何平方,并且您使用相同的值重复完全相同的计算二十次。
  • 我正在尝试学习如何编写这种类型的平方根函数。

标签: python square-root


【解决方案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)

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

【讨论】:

    【解决方案2】:

    我敦促您查看 Wikipedia 上有关 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
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          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
          

          【讨论】:

            【解决方案6】:

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

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

            【讨论】:

            • 当我尝试时,解决方案是正确的。我粘贴了一个例子。 (在我的第一个版本中,我忘记包含srx - (...),也许你试过那个?)
            • 是的,我没有进行完整的实现,而是尝试进行类似于您在问题中使用的缩减的数学运算。在这样做时,我最初犯了一个符号错误。 (我认为如果您看到类似的答案,最容易看出您的方法出了什么问题。)
            • 是的,我知道我已经很接近了,但就是无法绕过它。非常有帮助的回应。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-03-04
            • 1970-01-01
            • 1970-01-01
            • 2015-12-23
            • 1970-01-01
            • 1970-01-01
            • 2018-02-21
            相关资源
            最近更新 更多