1 差商的定义
设有函数f (x)以及自变量的一系列互不相等的的值 f(xi),称
为f (x)在点处的一阶差商,并记作。又称
为f (x)在点处的二阶差商;称:
为f (x)在点处的n阶差商。
2 牛顿插值法的推导
有了差商的定义,就很容易推出牛顿插值的公式。
根据均差定义 , 把 x 看成[ a, b] 上一点 , 可得
,
把后一式代入前一式,得到:
3 牛顿插值法的代码实现
由牛顿插值法的公式知道,要实现牛顿插值,关键是要实现各阶差商的计算;而要计算差商,首先需要计算一阶差商,然后用一阶差商计算二阶差商,用二阶差商计算三阶差商...
"""
@brief: 获得牛顿插值函数(非递归实现)
@
"""
def get_Newton_inter_Ex(xi=[], fi=[]):
def Newton_inter(x):
ai = fi.copy()
#计算k阶系数,即计算k阶差商,从第一阶开始计算
for k in range(1, len(xi)-1):
for j in range(len(xi)-1,k-1,-1):
ai[j] = (ai[j]-ai[j-1]) /(xi[j]-xi[j-k])
result = ai[0]
h = 1.0
for j in range(1,len(xi)-1):
h *= (x-xi[j-1])
result += ai[j] * h
return result
return Newton_inter
然后看下完整的代码,通过牛顿插值拟合函数:
# -*- coding: utf-8 -*-
"""
Created on Thu Nov 17 18:34:21 2016
@author: idwtwt
@brief: 牛顿插值法
"""
import numpy as np
import matplotlib.pyplot as plt
"""
@brief: 获得牛顿插值函数(非递归实现)
@
"""
def get_Newton_inter_Ex(xi=[], fi=[]):
def Newton_inter(x):
ai = fi.copy()
#计算k阶系数,即计算k阶差商
for k in range(1, len(xi)-1):
for j in range(len(xi)-1,k-1,-1):
ai[j] = (ai[j]-ai[j-1]) /(xi[j]-xi[j-k])
result = ai[0]
h = 1.0
for j in range(1,len(xi)-1):
h *= (x-xi[j-1])
result += ai[j] * h
return result
return Newton_inter
"""
demo:
"""
if __name__ == '__main__':
''' 插值节点, 这里用二次函数生成插值节点,每两个节点x轴距离位10 '''
sr_x = np.linspace(-50, 50, 12)
sr_fx = [1/(1+i**2) for i in sr_x]
Nx = get_Newton_inter_Ex(sr_x, sr_fx) # 获得插值函数
tmp_x = [i for i in range(-50, 51)] # 测试用例
tmp_y = [Nx(i) for i in tmp_x] # 根据插值函数获得测试用例的纵坐标
''' 画图 '''
plt.figure("Newton")
ax1 = plt.subplot(111)
plt.sca(ax1)
plt.plot(sr_x, sr_fx, linestyle='', marker='o', color='b')
plt.plot(tmp_x, tmp_y, linestyle='--', color='r')
plt.show()
看下拟合效果