我已经在这方面进行了多次尝试并且惨遭失败,我们将非常感谢一些帮助。
该函数应该有一个参数而不使用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
这不仅仅是练习。我在这个网站上环顾四周,找到了有用的方法,但没有足够的描述性。
答案 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