WangYu::Space

Study, think, create, and grow. Teach yourself and teach others.

牛顿迭代法求解平方根

分类:算法创建时间:2017-06-09 00:00:00

牛顿迭代法

对于一元 N 次方程,当 N 大于 2 时没有固定的求根公式,为了求方程的根,可以使用牛顿迭代法。

牛顿迭代法的思想是在曲线上任意取一个点,然后求这一点的切线,使用切线的解来逼近多项式的解。

然后在 xn+1x_{n+1} 处继续做切线:

不断的逼近,可以看到上图中切线在 x 轴上的交点 xn+1x_{n+1} 已与真实的解 xnx_n 更近了一些。

这个过切点的直线的方程为:

yf(xn)=f(xn)(xxn)y-f(x_n)=f^\prime(x_n)(x-x_n)

y=0y=0 可以求得 xx,这里 xn+1x_{n+1}xnx_n 的关系如下:

xn+1=xnf(xn)f(xn)x_{n+1}=x_{n}-\frac{f(x_n)}{f^\prime(x_n)}

其中 f(xn)f^\prime(x_n) 表示 f(x)f(x)xnx_n 处的斜率。

使用牛顿迭代法求平方根

NN 的平方根,可以理解为求如下函数的解:

f(x)=x2Nf(x)=x^2-N

其中 f(x)f(x) 的导数为:

f(x)=2xf^\prime(x)=2*x

牛顿迭代式为:

xn+1=xnxn2N2xn=12(xn+Nxn)x_{n+1}=x_n-\frac{x_{n}^2-N}{2*x_n}=\frac{1}{2}*(x_n+\frac{N}{x_n})

利用以上原理可以写出下面代码:

def sqrt(n):
    if n < 0:
        return float('nan')
    
    # 因为牛顿迭代法只是逼近真实值,所以需要设置一个误差范围
    e = 1e-15
    
    x = n
    x_next = (x + n / x) / 2
    
    # 两次迭代得到的解之间相差小于误差允许范围后跳出
    while abs(x_next - x) > e:
        x = x_next
        # 计算下一个近似解
        x_next = (x + n / x) / 2
    
    return x

评论 (评论内容仅博主可见,不会公开显示)