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


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

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

    • 样条插值
      • 在两个点之间确定一个函数,这个函数就是一个样条,然后把所有样条分段结合成一个函数(插值函数)
    • 在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()

  • 相关阅读:
    月薪2w的前端工程师,必盘的实战项目
    工业物联网解决方案:PLC数据上云
    【iOS】——分类、扩展和关联对象
    Gitee仓库介绍和项目纳入版本管理+ignore文件配置
    MyBatisPlus(七)等值查询
    对未知程序所创建的 PDF 文档的折叠书签层级全展开导致丢签的一种解决方法
    策略模式——设计模式
    【算法03】对数器
    [剑指 Offer 11]旋转数组的最小数字
    期末复习总结【MySQL】五种约束类型, 主键和外键的使用方式(重点)
  • 原文地址:https://blog.csdn.net/Chandler_river/article/details/126950894