Young87

当前位置:首页 >个人收藏

牛顿插值法 [python]

   牛顿插值法是曲线拟合插值法中的一种,适合采用所有的数据都精确的情况下。

一、差商

   差商是牛顿插值法的基础,我们先来理解差商的概念,然后在了解牛顿插值法。下面是差商的定义


    我举一个例子来具体说明,差商的计算方法:

    根据下表来计算函数的差商表:

    

 x1x2x3x4
xi-2-112
f(xi)531721

     函数的差商表如下:

xif(xi)一阶差商二阶差商三阶差商
-25   
-13-2  
11773 
2214-1-1
     f[x1,x2]=-2

     f[x1,x2,x3]=3

    f[x1,x2,x3,x4]=-1

二、牛顿插值法


    三、python实现牛顿插值法

     下面是一个函数表:

    

 x1x2x3x4x5x6
xi0.400.550.650.800.901.05
f(xi)0.410750.578150.696750.888111.026521.25382

    计算四阶牛顿插值多项式,并求f(0.596)

    下面是函数的差商表:

xif(xi)一阶差商二阶差商三阶差商四阶差商五阶差商
0.400.41075     
0.550.578151.11600    
0.650.696751.186000.28000   
0.800.888111.275730.358930.19733  
0.901.026521.384100.433480.213000.03134 
1.051.253821.515330.324930.228630.03126-0.00012
   f(x)=0.41075+1.11600(x-0.4)+0.28000(x-0.4)(x-0.55)+0.19733(x-0.4)(x-0.55)(x-0.65)+0.03134(x-0.4)(x-0.55)(x-0.65)(x-0.8)

      把0.596代入上式,可求出预测值,下面是python实现。

import matplotlib.pyplot as plt
from pylab import mpl
import math
"""
牛顿插值法
插值的函数表为
xi      0.4,       0.55,     0.65,      0.80,       0.90,   1.05
f(xi)   0.41075,    0.57815,   0.69675,    0.88811,    1.02652,  1.25382
"""

x = [0.4, 0.55, 0.65, 0.80, 0.90, 1.05]
y = [0.41075, 0.57815, 0.69675, 0.88811, 1.02652, 1.25382]


"""计算五次差商的值"""
def five_order_difference_quotient(x, y):
    # i记录计算差商的次数,这里循环5次,计算5次差商。
    i = 0
    quotient = [0, 0, 0, 0, 0, 0]
    while i < 5:
        j = 5
        while j > i:
            if i == 0:
                quotient[j]=((y[j]-y[j-1])/(x[j]-x[j-1]))
            else:
                quotient[j] = (quotient[j]-quotient[j-1])/(x[j]-x[j-1-i])
            j -= 1
        i += 1
    return quotient;

def function(data):
    return x[0]+parameters[1]*(data-0.4)+parameters[2]*(data-0.4)*(data-0.55)+\
           parameters[3]*(data-0.4)*(data-0.55)*(data-0.65)\
           +parameters[4]*(data-0.4)*(data-0.55)*(data-0.80)

"""计算插值多项式的值和相应的误差"""
def calculate_data(x,parameters):
    returnData=[];
    for data in x:
        returnData.append(function(data))
    return returnData

"""画函数的图像
newData为曲线拟合后的曲线
"""

def draw(newData):
    plt.scatter(x,y,label="离散数据",color="red")
    plt.plot(x,newData,label="牛顿插值拟合曲线",color="black")
    plt.scatter(0.596,function(0.596),label="预测函数点",color="blue")
    plt.title("牛顿插值法")
    mpl.rcParams['font.sans-serif'] = ['SimHei']
    mpl.rcParams['axes.unicode_minus'] = False
    plt.legend(loc="upper left")
    plt.show()



parameters=five_order_difference_quotient(x,y)
yuanzu=calculate_data(x,parameters)
draw(yuanzu)

牛顿插值法的实现效果图:


除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog

上一篇: 高级数据库二十:并行JOIN算法(Sorting)

下一篇: 零基础入门深度学习(2) - 线性单元和梯度下降

精华推荐