实验名称
拉格朗日插值法以及牛顿插值法的实现
实验要求
实现拉格朗日插值
验证随着插值结点的增多插值曲线的变化情况
实现牛顿插值,显示差商结果
比较拉格朗日插值与牛顿插值的插值结果是否相同
Github仓库
GitHub - beihaidaoxingwan/numerical-analysis
算法介绍
拉格朗日插值法
牛顿插值法
算法实现代码
拉格朗日插值法
import matplotlib.pyplot as plt
def lagerange(x, point_X, point_Y, i, point_num):
denominator = 1.0
molecule = 1.0
res = 0.0
for j in range(0, point_num):
if (j != i):
denominator = denominator * (point_X[i] - point_X[j])
molecule = molecule * (x - point_X[j])
else:
continue
res = molecule / denominator
res = res * point_Y[i]
return res
point_X = list(eval(input("请输入所有横坐标:")))
point_Y = list(eval(input("请输入所有纵坐标:")))
fig_before = plt.figure()
before = fig_before.add_subplot(111)
before.set(xlim=[0.3, 1.5], ylim=[0.3, 1.5], title='Data_before_lagerange', ylabel='Y-Axis', xlabel='X-Axis')
before.plot(point_X, point_Y, color='lightblue', linewidth=1.5)
before.scatter(point_X, point_Y, s=25, c='r')
insert_X = list(eval(input("请输入预插入值的横坐标:")))
for x in insert_X:
result = 0
for i in range(0, len(point_X)):
result = result + lagerange(x, point_X, point_Y, i, len(point_X))
if (x > point_X[len(point_X) - 1]):
point_X.append(x)
point_Y.append(result)
else:
for mid in point_X:
if (mid > x):
position = point_X.index(mid)
point_X.insert(position, x)
point_Y.insert(position, result)
break
print(point_Y)
fig_after = plt.figure()
after = fig_after.add_subplot(111)
after.set(xlim=[0.3, 1.5], ylim=[0.3, 1.5], title='Data_after_lagerange', ylabel='Y-Axis', xlabel='X-Axis')
after.plot(point_X, point_Y, color='lightblue', linewidth=1.5)
after.scatter(point_X, point_Y, s=25, c='r')
plt.show()
牛顿插值法
import matplotlib.pyplot as plt
point_X = list(eval(input("请输入所有横坐标:")))
point_Y = list(eval(input("请输入所有纵坐标:")))
insert_X = list(eval(input("请输入预插入值的横坐标:")))
fig_before = plt.figure()
before = fig_before.add_subplot(111)
before.set(xlim=[0.3, 1.5], ylim=[0.3, 1.5], title='Data_before_Newton', ylabel='Y-Axis', xlabel='X-Axis')
before.plot(point_X, point_Y, color='lightblue', linewidth=1.5)
before.scatter(point_X, point_Y, s=25, c='r')
for x in insert_X:
print("-----------------------------------------------------")
res_1 = point_Y
time = 1
first_list = []
for i in range(0, len(point_X)-1):
list_demo = []
for j in range(i + 1, len(point_X)):
denominator = point_X[j] - point_X[j - time]
molecule = res_1[j-i] - res_1[j-i-1]
list_demo.append(molecule*1.0/denominator)
first_list.append(list_demo[0])
res_1 = list_demo
time = time + 1
flag = i + 1
print("第%d阶差商表" % flag)
print(res_1)
print("第%d阶差商" % flag)
print(res_1[0])
result = point_Y[0]
for i in range(0, len(first_list) - 1):
mid = 0
for j in range(0, i + 1):
if (j == 0):
mid = first_list[i]*(x - point_X[j])
else:
mid = mid * (x - point_X[j])
print("%f" % first_list[i])
print("(x - %f)" % point_X[j])
result = result + mid
if (x > point_X[len(point_X) - 1]):
point_X.append(x)
point_Y.append(result)
else:
for mid in point_X:
if (mid > x):
position = point_X.index(mid)
point_X.insert(position, x)
point_Y.insert(position, result)
break
print(point_X)
print(point_Y)
fig_after = plt.figure()
after = fig_after.add_subplot(111)
after.set(xlim=[0.3, 1.5], ylim=[0.3, 1.5], title='Data_after_Newton', ylabel='Y-Axis', xlabel='X-Axis')
after.plot(point_X, point_Y, color='lightblue', linewidth=1.5)
after.scatter(point_X, point_Y, s=25, c='r')
plt.show()
测试方法:
1、输入预测试函数的横坐标列表
2、输入预测试函数的纵坐标列表
3、输入预插入点的横坐标列表(注:如果只有一个点,需要在横坐标后加逗号(英文))