1 实验目的
理解数据插值应用场景,能够根据数据特点,正确选择算法,并且能够编程实验相关算法。
2 实验任务
3 实验相关知识
4 实验流程图
5 实验代码
from pip._internal.cli.cmdoptions import python
import matplotlib.pyplot as plt
from pylab import mpl
def ParametersOfLagrange(data_x, data_y, size):
parameters = []
i = 0
while i < size:
j = 0
temp = 1
while j < size:
if i != j:
temp *= data_x[i] - data_x[j]
j += 1
parameters.append(data_y[i] / temp)
i += 1
return parameters
def ValueOfLagrange(data_x, parameters, x):
returnValue = 0
i = 0
while i < len(parameters):
temp = 1
j = 0
while j < len(parameters):
if i != j:
temp *= x - data_x[j]
j += 1
returnValue += temp * parameters[i]
i += 1
return returnValue
def Draw(data_x, data_y, new_data_x, new_data_y):
plt.plot(new_data_x, new_data_y, label="拟合曲线", color="black")
plt.scatter(data_x, data_y, label="离散数据", color="red")
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
plt.title("拉格朗日插值拟合数据")
plt.legend(loc="upper left")
plt.show()
if __name__ == '__main__':
x = [0, 3, 5, 7, 9, 11, 12, 13]
y = [0, 1.2, 1.7, 2.0, 2.1, 2.0, 1.8, 1.2]
print("输入数据为:", x, '\n', y)
parameters = ParametersOfLagrange(x, y, 8)
datax = []
indx = 0.0
while indx <= 13:
datax.append(indx)
indx += 0.1
datay1 = []
for temp in datax:
datay1.append(ValueOfLagrange(x, parameters, temp))
Draw(x, y, datax, datay1)
x = [12, 13, 14, 15]
y = [1.8, 1.2, 1.0, 1.6]
print("输入数据为:", x, '\n', y)
parameters = ParametersOfLagrange(x, y, 4)
datax = []
indx = 12.0
while indx <= 15:
datax.append(indx)
indx += 0.1
datay2 = []
for temp in datax:
datay2.append(ValueOfLagrange(x, parameters, temp))
Draw(x, y, datax, datay2)
result = datay1[-11::1] + datay2
print(result)
6 实验结果
7 总结
当涉及到数据插值时,我们有许多方法可以使用,可以根据自己的需要选择合适的方法。它们也各自有着不同的特点和适用范围:
拉格朗日插值法适用于任意给定的数据点,无需对数据进行分段处理。过构建拉格朗日插值多项式来对数据进行插值, 插值多项式通过通过每个数据点和插值点的函数值来构建, 计算复杂度较高,特别是在数据点较多时容易出现数值稳定性问题。拉格朗日插值法的公式结构整齐紧凑,在理论分析中十分方便,然而在计算中,当插值点增加或减少一个时,所对应的基本多项式就需要全部重新计算,于是整个公式都会变化,非常繁琐。
逐次线性插值,虽然有承袭性,但其算式是递推型的,不便于进行理论上的分析,这时可以用重心拉格朗日插值法或牛顿插值法来代替。此外,当插值点比较多的时候,拉格朗日插值多项式的次数可能会很高,因此具有数值不稳定的特点,也就是说尽管在已知的几个点取到给定的数值,但在附近却会和“实际上”的值之间有很大的偏差。这类现象也被称为龙格现象,解决的办法是分段用较低次数的插值多项式。
总之,如果数据点较少且集中在一个区间内,拉格朗日插值法是一个简单且准确的选择。而如果数据点分布在不同的区间或者数据点较多,根据具体的应用场景和数据特点,选择适合的插值方法可以提高插值的准确性和效率。