牛顿法计算平方根-Python

其实牛顿开方法是牛顿迭代法在开平方上的应用,牛顿迭代法同时也能快速逼近很多方程的解,自然可以用来开任意平方。

(a) ,即求 x2a=0 的正根。

更一般地,求 ak ,即求 xka=0 的正根。

注意牛顿迭代法只能逼近解,不能计算精确解。不过实际应用中,我们都不要求绝对精确的解,例如计算器得出结果也不需要给出无限位,只需要给出十几位小数就足够了,所以牛顿迭代法被广泛用在各种科学计算中。

【牛顿迭代法】

假设方程 f(x)=0 x0 附近有一个根,那么用以下迭代式子:
xn+1=xnf(xn)f(xn)
依次计算 x1x2x3 、……,那么序列将无限逼近方程的根。

牛顿迭代法的原理很简单,其实是根据f(x)在x0附近的值和斜率,估计f(x)和x轴的交点,看下面的动态图:
牛顿法计算平方根-Python_第1张图片
【用牛顿迭代法开平方】

令:
f(x)=x2a
所以f(x)的一次导是:
f(x)=2x
牛顿迭代式:
xn+1=xnx2na2xn=12(xn+axn)

随便一个迭代的初始值,例如 x0=1 ,代入上面的式子迭代。

例如计算,即 2 ,即 a=2
x0=1
x1=12(1+21)=1.5
x2=12(1.5+21.5)=1.4166....
……

计算器上可给出 2=1.4121356

【用牛顿迭代法开任意次方】

ak 的递推式是:

xn+1=xnxknakxk1n=k1kxn+akxk1n

用Python模拟牛顿法求平方根:

# __*__ coding:utf8 __*__

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import math

def func(a):
    if a < 1e-6:
        return 0
    last = a
    c = a / 2
    while math.fabs(c-last) > 1e-6:
        last = c
        c = (c + a / 2) / 2
    return c

if __name__ == '__main__':
    mpl.rcParams['font.sans-serif'] = [u'SimHei']  #指定默认字体
    mpl.rcParams['axes.unicode_minus'] = False 
    #解决保存图像是负号'-'显示为方块的问题 
    x = np.linspace(0, 30, num=50) #x轴取值为0-30,等间隔的取50个点
    func_ = np.frompyfunc(func, 1, 1) #1个输入1个输出
    y = func_(x)
    # y = np.sqrt(x)
    plt.figure(figsize=(10, 5), facecolor='w')
    plt.plot(x, y, 'ro-', lw=2, markersize=6)
    plt.grid(b=True, ls=':')
    plt.xlabel(u'X', fontsize=16)
    plt.ylabel(u'Y', fontsize=16)
    plt.title(u'牛顿法计算平方根', fontsize=18)
    plt.show()

牛顿法计算平方根-Python_第2张图片

你可能感兴趣的:(利用Python进行数据分析)