• 数学建模----插值的实现


    • 数据插值的方法
      • 代数多项式插值
      • 样条插值

    • 选取多项式函数的理由
      • 多项式构造简单
      • 性质良好,求导和积分简单
      • 代数多项式可一致逼近闭区间上的任意连续的函数

    • 样条插值
      • 在两个点之间确定一个函数,这个函数就是一个样条,然后把所有样条分段结合成一个函数(插值函数)
    • 在Scipy的样条内插的系数
      • 内插是在样本数据内进行预测
      • 外插是利用其他方法预测如微分方程
    • 两种插值方法
      • 待定系数插值法
        • 待定系数法插值在我们拥有n个插值节点时构造一个n次多项式
        • 构造一个非齐次线性方程组
        • 解线性方程组,得到数据
      • 拉格朗日插值法
        • 复杂的操作
          1. x = np.linspace(-10,10,100)
          2. y = np.sin(x) + np.cos(x)
          3. scipy.interpolate.lagrange(x,y)

              

    • 一维插值

      • 通过定义"kind"的类型来进行不同类别的插值

      • 三次插值 kind = "cubic"

      • 二次插值 kind = "quadratic"

      • 一次插值 kind = "inear"

      • 零阶插值 kind = "zero"

      • nearest 插值法

        1. from scipy import interpolate
        2. x = np.linsapce(-1,1,20)
        3. y = np.sin(x)
        4. f = interpolate.interp1d(x,y,kind="?")

    • 二维插值
      • 相关代码
        1. def z(x,y):
        2. return x+y
        3. x,y = np.mgrid[-1:1:20j,-1:1:20j]
        4. fun = interpolate.interp2d(x,y,z(x,y),kind="cubic")
        5. xnew = np.linspace(-1,1,200)
        6. ynew = np.linspace(-1,1,200)
        7. fnew = fun(xnew,ynew)
    • 实例  根据已有数据推测中间值
    • 导入相关包
    1. import matplotlib.pyplot as plt
    2. import scipy as sp
    3. import numpy as np
    4. from scipy.interpolate import interp1d
    5. from scipy.interpolate import CubicSpline
    6. import xlsxwriter as xls
    7. import random
    8. random.seed(666)

            

    导入相关数据

    1. water = [1800,1900,2100,2200,2300,2400,2500,2600,2650,
    2. 2700,2720]
    3. water2 = sorted([2650,2600,2500,2300,2200,2000,1850,
    4. 1820,1800,1755,1500,1000,900],reverse=False)
    5. sand = [32,60,75,85,90,98,100,102,108,
    6. 112,115,116,118,120,118,105,80,
    7. 60,50,30,26,20,8,5][:len(water)]
    8. sand2 = sorted([116,118,120,118,105,80,60,50,30,26,20,8,5],reverse=False)

    插值

    1. cubic_interp = interp1d(water,sand,kind='cubic')
    2. cs1 = CubicSpline(water,sand,bc_type="natural")
    3. cs2 = CubicSpline(water2,sand2,bc_type="natural")
    4. #两个数据点之间
    5. #f0 = a0 + b0*(x-x0) + c0*(x-x0)**2 + d0*(x-x0)**3
    6. #.
    7. #.
    8. #.
    9. #fn = an + bn*(x-x0) + cn*(x-x0)**2 + dn*(x-x0)**3

    写入文件

    1. workbook1 = xls.Workbook("上升期数据.xlsx")
    2. workbook2 = xls.Workbook("下降期数据.xlsx")
    3. worksheet1 = workbook1.add_worksheet("Sheet1")
    4. worksheet2 = workbook2.add_worksheet("Sheet2")
    5. #两个数据点之间
    6. #f0 = a0 + b0*(x-x0) + c0*(x-x0)**2 + d0*(x-x0)**3
    7. #.
    8. #.
    9. #.
    10. #fn = an + bn*(x-x0) + cn*(x-x0)**2 + dn*(x-x0)**3
    11. headings = ["a0","b0","c0","d0"]
    12. worksheet1.write_row("A1",headings)
    13. worksheet2.write_row("A1",headings)
    14. a1 = [cs1.c.item(3,i) for i in range(len(water)-1)]
    15. b1 = [cs1.c.item(2,i) for i in range(len(water)-1)]
    16. c1 = [cs1.c.item(1,i) for i in range(len(water)-1)]
    17. d1 = [cs1.c.item(0,i) for i in range(len(water)-1)]
    18. a2 = [cs2.c.item(3,i) for i in range(len(water2)-1)]
    19. b2 = [cs2.c.item(2,i) for i in range(len(water2)-1)]
    20. c2 = [cs2.c.item(1,i) for i in range(len(water2)-1)]
    21. d2 = [cs2.c.item(0,i) for i in range(len(water2)-1)]
    22. worksheet1.write_column("A2",a1)
    23. worksheet1.write_column("B2",b1)
    24. worksheet1.write_column("C2",c1)
    25. worksheet1.write_column("D2",d1)
    26. worksheet2.write_column("A2",a2)
    27. worksheet2.write_column("B2",b2)
    28. worksheet2.write_column("C2",c2)
    29. worksheet2.write_column("D2",d2)
    30. workbook1.close()
    31. workbook2.close()

  • 相关阅读:
    从零开始写 Docker(十二)---实现 mydocker stop 停止容器
    如何评价GPT-4o?
    【排序】桶排序(c++)
    代码泄漏无感知?代码安全审计构筑企业核心资产安全防线
    移远通信携手MIKROE推出搭载LC29H系列模组的Click boards开发板,为物联网应用带来高精定位服务
    C++:内存管理
    DP - OOD - SRP
    【计算机组成原理】海明校验码
    linux的查找命令
    基于Python实现的特征选择的遗传算法(GA)
  • 原文地址:https://blog.csdn.net/Chandler_river/article/details/126950894