数值分析:使用python实现数据插值法

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 总结

       当涉及到数据插值时,我们有许多方法可以使用,可以根据自己的需要选择合适的方法。它们也各自有着不同的特点和适用范围:
       拉格朗日插值法适用于任意给定的数据点,无需对数据进行分段处理。过构建拉格朗日插值多项式来对数据进行插值, 插值多项式通过通过每个数据点和插值点的函数值来构建, 计算复杂度较高,特别是在数据点较多时容易出现数值稳定性问题。拉格朗日插值法的公式结构整齐紧凑,在理论分析中十分方便,然而在计算中,当插值点增加或减少一个时,所对应的基本多项式就需要全部重新计算,于是整个公式都会变化,非常繁琐。
       逐次线性插值,虽然有承袭性,但其算式是递推型的,不便于进行理论上的分析,这时可以用重心拉格朗日插值法或牛顿插值法来代替。此外,当插值点比较多的时候,拉格朗日插值多项式的次数可能会很高,因此具有数值不稳定的特点,也就是说尽管在已知的几个点取到给定的数值,但在附近却会和“实际上”的值之间有很大的偏差。这类现象也被称为龙格现象,解决的办法是分段用较低次数的插值多项式。
       总之,如果数据点较少且集中在一个区间内,拉格朗日插值法是一个简单且准确的选择。而如果数据点分布在不同的区间或者数据点较多,根据具体的应用场景和数据特点,选择适合的插值方法可以提高插值的准确性和效率。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

茜茜西西CeCe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值