给定三个数进行牛顿插值法的计算
import matplotlib.pyplot as plt
from pylab import mpl
import numpy as np
import pandas as pd
import math
%matplotlib inline
def get_diff_table(X,Y):
"""
得到插商表
"""
n=len(X)
A=np.zeros([n,n])
for i in range(0,n):
A[i][0] = Y[i]#每行第一个元素不参与计算差商表
for j in range(1,n):
for i in range(j,n):
A[i][j] = (A[i][j-1] - A[i-1][j-1])/(X[i]-X[i-j])
#二次循环,进行差商表的计算
print(A)
return A
def niudun(X,Y,x):
"""
计算x点的插值
"""
sum=Y[0]
temp=np.zeros((len(X),len(X)))
#将第一行赋值
for i in range(0,len(X)):
temp[i,0]=Y[i]
temp_sum=1.0
for i in range(1,len(X)):
#x的多项式
temp_sum=temp_sum*(x-X[i-1])
#计算均差
for j in range(i,len(X)):
temp[j,i]=(temp[j,i-1]-temp[j-1,i-1])/(X[j]-X[j-i])
sum+=temp_sum*temp[i,i]
return sum
X = [11 ,12 ,13]
Y = [0.190809 ,0.207912 ,0.224951]
A = get_diff_table(X,Y)
df = pd.DataFrame(A)
xs=np.linspace(np.min(X),np.max(X),1000,endpoint=True)
ys=[]
x=11.5
print(niudun(X,Y,x))
for x in xs:
ys.append(niudun(X,Y,x))
plt.title("牛顿插值法")
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
plt.plot(X,Y,'s',label="原值")#蓝点表示原来的值
plt.plot(xs,ys,'r',label='插值曲线')#插值曲线
plt.xlabel('x')
plt.ylabel('y')
plt.legend(loc=2)#指定legend的位置右下角