Python,平方根函数?
我在这方面做了多次尝试,但都失败了,如果能得到一些帮助,我将不胜感激 函数应该有一个参数,而不使用print语句。使用牛顿法,它必须返回估计的平方根作为其值。添加for循环以更新估计值20次,并使用return语句得出最终估计值 到目前为止我已经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)
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