文章目录

  • 基于Python的数学建模
  • 空间插值
    • 基本概念
    • Scipy一维插值
    • Scipy多维插值方法
    • 反距离权重插值(IDW)
    • 克里金插值(Kriging)

基于Python的数学建模

  • Github仓库:Mathematical-modeling

空间插值

基本概念

  1. 定义:空间插值常用于将离散的测量数据转换为连续的数据曲面,以便与其它空间现象的分布模式进行比较,它包括了空间内插和外推两种算法。

    • 空间内插算法:通过已知点的数据推求同一区域未知点数据
    • 空间外推算法:通过已知区域的数据,推求其它区域数据
    • 区别:
      • 是处理方法不同、职责不同、工作内容不同
      • 内插法在样本数据的范围内预测,比外插法要准。
      • 用回归方程预测范围以外的数值称为外插法,而内插法是对数据范围内的点进行预测。
  2. 插值分类
    • 整体插值、局部插值和边界内插法
    • 确定性插值和地统计插值
    • 精确插值和近似插值
  3. 插值工具
    • scipy.interpolate 模块有一维插值函数(interp1d)、二位插值函数(interp2d)、多纬插值函数(interpninterpnd),可以进行使用常见的方法进行插值。例如线性插值,最近邻插值和样条插值
    • PyKrige包可以提供各种类型的kriging插值

Scipy一维插值

  1. 生成已知数据点集(x,y)和需要插值的新数据集xnew
# 生成已知的数据点集 (x,y)
np.random.seed(666)
x = np.linspace(0, 10, 20) # 生成已知数据点x
y = np.cos(x) * 2 + np.sin(x) / 2 # 生成已知数据点y
xnew = np.linspace(0, 10, 50) # 设定需进行插值的数据点集xnew
  1. 通过不同插值方法,根据给定数据点集(x,y)来计算插值函数f(x)f(x)f(x)
f1 = interp1d(x, y, kind="linear") # 线性插值
########################################
f2 = interp1d(x, y, kind="nearest") # 最近临插值,向下取舍
f3 = interp1d(x, y, kind="nearest-up") # 最近临插值,向上取舍
########################################
f4 = interp1d(x, y, kind="zero") # 零阶样条插值
f5 = interp1d(x, y, kind="slinear") # 一次样条插值
f6 = interp1d(x, y, kind="quadratic") # 二次样条插值
f7 = interp1d(x, y, kind="cubic") # 三次样条插值
########################################
f8 = interp1d(x, y, kind="previous")  # 前点插值
f9 = interp1d(x, y, kind="next") # 后点插值
  1. 不同空间插值方法对比
fig, [[ax1,ax2],[ax3,ax4]] = plt.subplots(2,2,figsize=(12,8))
ax1.plot(x,y,'o',label='已知数据点')
ax1.plot(xnew,f1(xnew),'r',label='线性插值')
ax1.legend()ax2.plot(x,y,'o',label='已知数据点')
ax2.plot(xnew,f2(xnew),label='最临近点插值-向下取舍')
ax2.plot(xnew,f3(xnew),label='最临近点插值-向上取舍')
ax2.legend()ax3.plot(x,y,'o',label='已知数据点')
ax3.plot(xnew,f4(xnew),label='零阶样条插值')
ax3.plot(xnew,f5(xnew),label='一次样条插值')
ax3.plot(xnew,f6(xnew),label='二次样条插值')
ax3.plot(xnew,f7(xnew),label='三次样条插值')
ax3.legend()ax4.plot(x,y,'o',label='已知数据点')
ax4.plot(xnew,f8(xnew),label='前点插值')
ax4.plot(xnew,f9(xnew),label='后点插值')
ax4.legend()

Scipy多维插值方法

  1. 生成已知数据点集(x,y,z)和需要插值的新数据集xnew,ynew
def func(x, y):return x*(1-x)*np.cos(4*np.pi*x) * np.sin(4*np.pi*y**2)**2rng = np.random.default_rng() # 随机数生成器
points = rng.random((1000, 2)) # 生成1000个随机点(x,y)
values = func(points[:,0], points[:,1]) # 计算已知随机点的值, z# 生成插值网格
xnew, ynew = np.linspace(0,1,200), np.linspace(0,1,200)
xnew_grid, ynew_grid = np.meshgrid(xnew, ynew)
  1. 通过不同插值方法,根据给定数据点集(x,y,z)来计算插值函数f(x,y)f(x,y)f(x,y)
from scipy.interpolate import griddata
# 使用不同插值方法,由已知数据(x,y,z),计算插值网格的z值
xi = (xnew_grid, ynew_grid)
z1 = griddata(points, values, xi, method="nearest")  # 最近邻插值
z2 = griddata(points, values, xi, method="linear")  # 线性插值
z3 = griddata(points, values, xi, method="cubic")  # 三次样条插值
  1. 不同空间插值方法对比
fig, [[ax1, ax2], [ax3, ax4]] = plt.subplots(2,2,subplot_kw=dict(projection='3d'),figsize=(12, 10))
# 原始数据
ax1.scatter3D(points[:, 0], points[:, 1], values)
ax1.set_title('原始数据')
# 最近邻插值
ax2.scatter3D(xnew_grid, ynew_grid, z1)
ax2.set_title('最近邻插值')
# 线性插值
ax3.scatter3D(xnew_grid, ynew_grid, z2)
ax3.set_title('线性插值')
# 三次样条插值
ax4.scatter3D(xnew_grid, ynew_grid, z3)
ax4.set_title('三次样条插值')

反距离权重插值(IDW)

  1. IDW算法的Python实现
def IDW(xnewgrid,ynewgrid,x, y, z, b=2):""":param xnew: 网格化的插值点x:param ynew: 网格化的插值点y:param x: 已知数据点x:param y: 已知数据点y:param z: 已知数据点z:return: 插值结果"""xnewgrid_, ynewgrid_ = xnewgrid.ravel(), ynewgrid.ravel()znew = []# 计算每个插值点的插值结果for i in range(len(xnewgrid_)):   # 遍历计算所有离散数据点与该插值点的距离d = np.sqrt((xnewgrid_[i]-x)**2 + (ynewgrid_[i]-y)**2) # 计算两点间的距离if 0 in d:znew.append(z[np.where(d == 0)[0][0]]) # 如果插值点为离散数据点中的一个,则直接返回该点的值else:distance = 1 / (d**b) # 计算距离权重函数, b为距离倒数的幂,常数,一般b越大,内插结果越平滑distance_sum = np.sum(distance)distance_weight = distance / distance_sumznew.append(np.sum(distance_weight * z))znew = np.array(znew)znew = znew.reshape(xnewgrid.shape)return znew
  1. 生成已知数据点集(x,y,z)和需要插值的新数据集xnew,ynew
def func(x, y):return x*(1-x)*np.cos(4*np.pi*x) * np.sin(4*np.pi*y**2)**2x = np.linspace(-10, 10, 20)  # 生成已知数据点x
y = np.linspace(-10, 10, 20)  # 生成已知数据点y
z = func(x, y) # 生成已知数据点z# 生成插值网格
xnew = np.linspace(-10, 10, 50)
ynew = np.linspace(-10, 10, 50)
xnew_grid, ynew_grid = np.meshgrid(xnew, ynew)
  1. 计算插值结果
znew = IDW(xnew_grid,ynew_grid,x, y, z, b=2)
fig, [ax1, ax2] = plt.subplots(1,2,subplot_kw=dict(projection='3d'),figsize=(10, 8))
# 原始数据
ax1.scatter3D(x,y,z)
ax1.set_title('原始数据')
# IDW插值
ax2.scatter3D(xnew_grid, ynew_grid, znew)
ax2.set_title('IDW插值')

克里金插值(Kriging)

  1. 生成已知数据点集(x,y,z)和需要插值的新数据集xnew,ynew
def func(x, y):return x*(1-x)*np.cos(4*np.pi*x) * np.sin(4*np.pi*y**2)**2x = np.linspace(-10, 10, 20)  # 生成已知数据点x
y = np.linspace(-10, 10, 20)  # 生成已知数据点y
z = func(x, y) # 生成已知数据点z# 生成插值网格
xnew = np.linspace(-10, 10, 50)
ynew = np.linspace(-10, 10, 50)
xnew_grid, ynew_grid = np.meshgrid(xnew, ynew)
  1. 克里金插值(Kriging)插值
from pykrige.ok import OrdinaryKriging
# 创建克里金网格和方差网格
OK = OrdinaryKriging(x, # 已知数据点xy, # 已知数据点yz, # 已知数据点zvariogram_model="linear",
)
znew, ss = OK.execute("grid", xnew, ynew) # 计算插值网格z和方差网格ss
# 绘图
fig, [ax1, ax2] = plt.subplots(1,2,subplot_kw=dict(projection='3d'),figsize=(10, 8))
# 原始数据
ax1.scatter3D(x,y,z)
ax1.set_title('原始数据')
# 克里金插值
ax2.scatter3D(xnew_grid, ynew_grid, znew)
ax2.set_title('克里金插值')

Python数学建模 空间插值相关推荐

  1. Python数学建模系列(四):数值逼近

    文章目录 前言 往期文章 1. 一维插值 ​1.1 线性插值与样条插值(B-spline) 1.2 高阶样条插值 2. 二维插值 2.1 图像模糊处理--样条插值 2.2 二维插值的三维图 3. 最小 ...

  2. python可以用来数学建模吗_怎么用Python数学建模:python数据建模工具

    怎么用Python数学建模 djcjfhfhhjdvjfhvfghhfgbdthhgdchfjfuivvh DSI方法在几何建模上的应用 本节叙述如何应用DSI方法来与曲面S相联系的二维图形图3.1) ...

  3. 【Python数学建模】SEIR传染病模型模型延伸-SEIDR模型(一),加入疫苗接种、政府管控、病毒变异等因素的影响

    目录 一. SEIR传染病模型 二. SEIR模型的延伸--SEIDR模型 三. 模型延伸--影响因素1:疫苗接种 四. 模型延伸--影响因素2:政府管控 五. 模型延伸--影响因素3:病毒变异 写在 ...

  4. python数学建模(二)线性规划2.实战(思路清晰\过程完整、详细)

    文章目录 (一)简单陈述本文章的内容 (二)线性规划例题(实战) 2.1 实战题目 2.2 符号规定和基本假设 2.3 模型的分析 2.4 模型的建立 2.5 模型一的求解和分析 2.5.1 (代码) ...

  5. Python数学建模系列(五):微分方程

    文章目录 前言 往期文章 1.微分方程分类 2.微分方程解析解 3.微分方程数值解 3.1 场线图与数值解 3.2 洛伦兹曲线与数值解 4.传染病模型 模型一:SI-Model 模型二:SIS mod ...

  6. python数学建模--绘图动态可视化图表

    目录 写在本博客的开篇 关于matplotlib绘图的两种模式 阻塞模式 交互模式 总结 绘制动态图的例子 二维折线图 结果演示 代码 三维折线图 结果演示 代码 三维散点图 结果演示 代码 写在本博 ...

  7. Python数学建模系列(六):蒙特卡洛算法

    文章目录 前言 往期文章 1.蒙特卡洛算法 样例1 样例2 样例3 2.三门问题 3.M*M豆问题 结语 前言 Hello!小伙伴! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出-   ...

  8. matlab已知飞机下轮廓线,数学建模matlab插值及拟合.ppt

    数学建模matlab插值及拟合 2013数学建模培训 插值与拟合 插值与拟合属数值分析中函数逼近内容.在数学建模竞赛中,插值与拟合是一种常用的数据分析手段,被公认为建模中的十大算法之一. 本节首先通过 ...

  9. 【Python数学建模常用算法代码(二)之BP神经网络】

    Python数学建模常用算法代码(二) BP神经网络模型Python代码 import numpy as np import math import random import string impo ...

  10. Python数学建模系列(八):图论

    文章目录 前言 往期文章 1 图论模型 - Dijkstra 样例1 2 图论模型-Floyd 样例2 3 机场航线设计 0.Airlines.csv数据 1.数据导入.观察变量 2.数据清洗 3.时 ...

最新文章

  1. java并发读取相同的文件_高效读取大文件,再也不用担心 OOM 了!
  2. 残缺的完美 送给飘
  3. yield( )函数的使用
  4. c# WinForm开发 DataGridView控件的各种操作
  5. ASP.NET MVC编程——控制器
  6. Substitution控件MethodName无法取到Session的解决办法
  7. JavaScript算法(实例九)整数的置换 / 求s=a+aa+aaa+aaaa+aa...a的值 / 自守数
  8. WebService学习总结(三)——使用JDK开发WebService
  9. 华为百度美团驰援抗击疫情;自由软件基金会建议开源 Windows 7;印度超越美国成第二大智能手机市场 | 极客头条...
  10. python selenium firefox使用
  11. iOS HTML5的JS交互
  12. 百度地图SDK集成定位,卫星地图
  13. 学会这几点,你会成为一名月薪过万的Java程序员
  14. Bluefish编辑成果即时预览
  15. 使用GitLab CI/CD进行自动测试和部署
  16. 开机时自动启动的AutoHotkey脚本 2019年07月08日19时06分
  17. ubuntu下回收站无法清空
  18. 火影忍者之~静音 (优先队列)
  19. 送礼品的禁忌和注意事项
  20. 工程职业伦理(2018年秋)学堂在线习题

热门文章

  1. 安全龙网络安全攻防实验1.2 全新功能正式上线
  2. 网络信息安全攻防实验室 脚本关第二关
  3. html语言制作静态网页,html+css制作的漂亮静态网页
  4. android 读取图片字节流,Android屏幕截图直接读取screencap流来实现
  5. 不择手段背单词、新东方词根词缀词典、超级新华字典、英语词根词缀记忆大全词典
  6. 国家多部委发布13份“十四五”规划,115项重大工程​
  7. wordpress 中 erphpdown 短代码
  8. ThinkpadX220 windows10 博通bcm94352hmb的蓝牙连接音箱播放声音断断续续的解决方案
  9. 什么是DOI和PMID
  10. GET 和 POST 的区别