import numpy as np
import matplotlib.pyplot as plt
#牛顿插值defnewton_interpolation(X,Y,init):
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.0for i in range(1,len(X)):
#x的多项式
temp_sum=temp_sum*(init-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
#拉格朗日插值deflagrange_interpolation(X,Y,init):
sum=0.0for i in range(len(X)):
temp=Y[i]
for j in range(len(X)):
if(j!=i):
temp=temp*((init-X[j])/(X[i]-X[j]))
sum=sum+temp
return sum
defmain():
X=[float(i) for i in (input("请输入X的对应值:").split())]
Y=[float(i) for i in (input("请输入Y的对应值:").split())]
init=float(input("请输入要计算的x:"))
print("插值方法:\n\t1.拉格朗日插值\n\t2.牛顿插值")
choice=int(input("请选择一种方法:"))
#在最小值至最大值区间取1000点
X_temp=np.linspace(np.min(X),np.max(X),1000,endpoint=True)
Y_temp=[]
if(choice==1):
result=lagrange_interpolation(X,Y,init)
for x in X_temp:
Y_temp.append(lagrange_interpolation(X,Y,x))
plt.title("lagrange_interpolation")
else:
result=newton_interpolation(X,Y,init)
for x in X_temp:
Y_temp.append(newton_interpolation(X,Y,x))
plt.title("newton_interpolation")
print("f(%f)的近似值为%f"%(init,result))
#绘图
plt.plot(X,Y,'s',label="original values")#蓝点表示原来的值
plt.plot(X_temp,Y_temp,'r',label='interpolation values')#插值曲线
plt.xlabel('x')
plt.ylabel('y')
plt.legend(loc=4)#指定legend的位置右下角
plt.show()
if __name__=='__main__':
main()
一、实验内容二、代码(python)import numpy as npimport matplotlib.pyplot as plt#牛顿插值def newton_interpolation(X,Y,init): sum=Y[0] temp=np.zeros((len(X),len(X))) #将第一行赋值 for i in range(0,len(X)):