簡體   English   中英

Python,平方根函數?

[英]Python, square root function?

我為此進行了多次嘗試,但都以慘敗告終,我們將不勝感激。

該函數應具有一個參數,而不使用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

這不是一項作業,只是一種練習。 我瀏覽了該站點,發現了有用的方法,但沒有足夠的描述性。

這是牛頓方法的實現,

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的導數。

我敦促您查看Wikipedia上有關應用牛頓方法來找到數字平方根的部分

這個過程通常是這樣的,我們的功能是

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

在您的代碼中,您不會在循環時更新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)。

稍微擴展一下代碼,您可以添加一個猜測作為參數

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM