这是牛顿法计算平方根的典型应用n
。您正在计算序列的限制:
x_0 = n
x_{i+1} = (x_i + n / x_i) / 2
您的变量x
是当前术语x_i
,您的变量y
是n / x_i
.
要了解为什么必须计算此限制,您需要考虑以下函数:
f(x) = x^2 - n
你想找到这个函数的根。它的导数是
f'(x) = 2 * x
和牛顿的方法给你公式:
x_{i+1} = x_i - f(x_i) / f'(x_1) = ... = (x_i + n / x_i) / 2
为了完整起见,我在这里复制了@rodrigo 回答的基本原理,并结合了我对它的评论。如果您想忘记牛顿法并尝试单独理解此算法,这将很有帮助。
诀窍是,如果x
不是 的平方根n
,那么它是一个近似值,位于实根之上或之下,并且y = n/x
总是在另一边。因此,如果您计算 的中点(x+y)/2
,它将比这两个近似值(x
或y
)中最差的一个更接近实根。当x
和y
足够接近时,你就完成了。
这也将帮助您找到算法的复杂性。假设这d
是两个近似值中最差的一个到真实根的距离r
。然后中点之间的距离(x+y)/2
最多r
为d/2
(如果你画一条线来可视化它会帮助你)。这意味着,每次迭代,距离减半。因此,最坏情况的复杂度与初始近似的距离和所寻求的精度成对数。对于给定的程序,它是
log(|n-sqrt(n)|/epsilon)