插值(Python)

news2024/11/16 21:39:10

插值

        插值是数学和计算机科学领域中的一种技术,用于在给定一些离散数据点的情况下,估计在这些点之间的数值。插值的目标是通过某种函数(插值函数)来逼近或拟合这些离散数据,从而使得在原始数据点之间的数值也有合理的估计。

具体来说,插值可以用于以下情况:

  1. 数据平滑: 通过在原始数据点之间绘制平滑的曲线,可以去除数据中的噪声或波动,提供一个更加平滑的估计。

  2. 数据预测: 插值可以用于预测在原始数据点之外的位置的数值,从而对未知数据点进行估计。

  3. 数据重构: 在数字图像处理和计算机图形学中,插值用于在像素之间生成新的像素值,以便在缩放或旋转等操作时保持图像的平滑性。

  4. 曲线拟合: 插值方法可以用于逼近一组数据点,生成一个平滑的曲线,以便更好地理解数据的趋势。

常见的插值方法包括线性插值、多项式插值、样条插值等。        

        一维插值 

        一维插值是指在一维空间中进行的插值操作。

        在一维插值中,有一组离散的数据点,每个数据点都有一个唯一的自变量,以及一个对应的因变量。一维插值的目标是根据这些已知的数据点,推断出在自变量的连续范围内的其他位置的因变量值。

        一维插值通常涉及将数据点之间的间隙填充或者对原始数据进行平滑拟合,以便于预测、分析或可视化。

        插值方法的选择取决于数据的性质、所需的精度、计算资源等因素。

常见的一维插值方法:

  1. 线性插值: 这是一种简单的插值方法,假设在两个相邻数据点之间的因变量值之间存在线性关系。线性插值使用直线来连接相邻数据点,从而估计介于这些数据点之间的值。

  2. 多项式插值: 多项式插值使用一个多项式函数来逼近原始数据点,通过将多项式函数拟合到数据点上来实现插值。常见的多项式插值方法包括拉格朗日插值和牛顿插值。

  3. 样条插值: 样条插值将数据点之间的插值函数表示为一系列分段连续的低阶多项式(通常是三次多项式),这些多项式在数据点处相连接。这种方法可以产生平滑的曲线,并且可以控制曲线的导数,从而在拟合数据时具有更高的灵活性。

  4. 径向基函数插值: 这种方法使用径向基函数来拟合数据点,通过将数据点表示为这些基函数的线性组合来实现插值。径向基函数插值在某些情况下可以提供更好的逼近效果。

        Python代码

import numpy as np
from scipy import interpolate
import pylab as plt

original_x = np.linspace(0, 10, 11)
# 生成一个包含11个元素的数组,表示在0到10之间均匀间隔的数列。这将用作原始数据的横坐标。
original_y = np.sin(original_x)
# 计算数组x中每个元素的正弦值,这将用作原始数据的纵坐标。
new_x = np.linspace(0, 10, 101)
# 生成一个包含101个元素的数组,表示在0到10之间均匀间隔的更细密的数列。这将用作插值后的数据的横坐标。
plt.plot(original_x, original_y, "ro")
# 使用红色的圆点标记绘制原始数据。"ro"表示红色圆点。
for interpolation_method in ["nearest", "zero", "linear", "quadratic", "cubic"]:
    # 遍历插值方法的列表,包括"nearest"、"zero"、"linear"、"quadratic"和"cubic"。
    # "nearest","zero"为阶梯插值
    # linear 线性插值
    # "quadratic","cubic" 为2阶、3阶B样条曲线插值
    interpolation_function = interpolate.interp1d(original_x, original_y, kind=interpolation_method)
    # 使用当前遍历到的插值方法创建一个插值函数f,将原始数据original_x和original_y传入。
    new_y = interpolation_function(new_x)
    # 使用插值函数f对新的横坐标new_x进行插值,得到插值后的纵坐标new_y。
    plt.plot(new_x, new_y, label=str(interpolation_method))
    # 使用当前插值方法绘制插值后的曲线。
plt.legend(loc="lower right")
plt.show()

运行结果:

        二维插值 

        二维插值是指在二维空间中进行的插值操作。

  1. 双线性插值: 双线性插值假设在四个相邻的数据点之间存在平面,并使用这些平面来估计目标位置的值。这是一种简单而高效的插值方法,特别适用于规则的二维网格。

  2. 双三次插值: 双三次插值使用相邻的16个数据点,在目标位置周围形成一个3x3的矩形区域。然后,通过一个双三次多项式来拟合这些数据点,从而得到目标位置的插值结果。这种方法通常比双线性插值更精确,但也更计算密集。

  3. 二维多项式插值: 类似于一维情况,可以使用二维多项式来逼近原始数据点。这包括双变量的拉格朗日插值或者双变量的牛顿插值。

  4. 二维样条插值: 与一维样条插值类似,二维样条插值将数据点之间的插值函数表示为一系列分段连续的低阶多项式。这可以产生平滑的曲面,并且在拟合数据时提供更高的灵活性。

  5. 径向基函数插值: 类似于一维情况,径向基函数插值在二维情况下使用径向基函数来拟合数据点,从而实现插值。

        Python代码

import numpy as np
from scipy import interpolate
import pylab as plt
import matplotlib as mpl

# SciPy用于科学计算

def sample_function(x, y):
    return (x + y) * np.exp(-5.0 * (x ** 2 + y ** 2))

# 这定义了一个函数 sample_function(x, y),它接受两个参数 x 和 y,并返回使用数学表达式计算的值。

# 这里使用NumPy的 mgrid 创建了一个2D网格,其中 x 和 y 值在指定范围内有15个点。
grid_y, grid_x = np.mgrid[-1:1:15j, -1:1:15j]

function_values = sample_function(grid_x, grid_y)
# 计算每个网格点上的函数值  15*15的值
# 将函数 sample_function 应用于网格中的每个 x 和 y 对,
print(len(function_values[0]))
# 并将结果存储在 function_values 中。打印了 function_values 的第一行的长度。

# 三次样条二维插值
interpolated_function = interpolate.interp2d(grid_x, grid_y, function_values, kind='cubic')
# 这使用SciPy的 interp2d 使用三次样条插值进行了二维插值。
# 它创建了一个新函数 (interpolated_function) 来表示插值的值。
# 计算100*100的网格上的插值
new_x_values = np.linspace(-1, 1, 100)  # x
new_y_values = np.linspace(-1, 1, 100)  # y
interpolated_values = interpolated_function(new_x_values, new_y_values)  # 仅仅是y值   100*100的值
# 为一个100x100的网格生成新的 x 和 y 值,并使用 interpolated_function 计算插值的值。

# 为了更明显地比较插值前后的区别,使用关键字参数interpolation='nearest'
# 关闭imshow()内置的插值运算。
plt.subplot(121)
im1 = plt.imshow(function_values, extent=[-1, 1, -1, 1], cmap=mpl.cm.hot, interpolation='nearest', origin="lower")  # pl.cm.jet
# extent=[-1,1,-1,1]为x,y范围  favals为
plt.colorbar(im1)

plt.subplot(122)
im2 = plt.imshow(interpolated_values, extent=[-1, 1, -1, 1], cmap=mpl.cm.hot, interpolation='nearest', origin="lower")
plt.colorbar(im2)
plt.show()
# 使用Matplotlib创建了两个子图,每个子图显示插值的结果 (function_values 和 interpolated_values)。
# 使用 imshow 函数显示2D数据,并添加了 colorbar 作为参考。
# 使用 interpolation='nearest' 参数可视化地比较插值前后的差异,
# origin="lower" 指定了左下角为坐标轴的原点。使用 plt.show() 显示了这两个子图。

 运行结果:

        二维插值的三维表示的Python代码

         详见注释

import numpy as np
from scipy import interpolate
import matplotlib.cm as cm
import matplotlib.pyplot as plt

def target_function(x, y):
    return (x + y) * np.exp(-5.0 * (x ** 2 + y ** 2))
# 目标函数

# X-Y轴分为20*20的网格
x_values = np.linspace(-1, 1, 20)
# 在[-1, 1]之间生成20个等间隔的x值。
y_values = np.linspace(-1, 1, 20)
# 在[-1, 1]之间生成20个等间隔的y值。
x_grid, y_grid = np.meshgrid(x_values, y_values)
# 生成一个20x20的网格数据,x和y分别代表网格点的x、y坐标。
function_values = target_function(x_grid, y_grid)
# 计算每个网格点上函数func的值,形成一个15x15的函数值数组。

fig = plt.figure(figsize=(9, 6))
# 创建一个图形窗口,并设置大小为(9, 6)。
# Draw sub-graph1
ax1 = plt.subplot(1, 2, 1, projection='3d')
# 在图形窗口中创建一个1行2列的子图,当前操作的是第1个子图,使用3D坐标轴。
surf1 = ax1.plot_surface(x_grid, y_grid, function_values, rstride=2, cstride=2, cmap=cm.coolwarm, linewidth=0.5, antialiased=True)
# 绘制三维表面图,使用提供的x、y、fvals数组,
# rstride和cstride控制网格线的密度,cmap设置颜色映射,
# linewidth设置线宽,antialiased开启抗锯齿。
ax1.set_xlabel('x')
ax1.set_ylabel('y')
ax1.set_zlabel('f(x, y)')
plt.colorbar(surf1, shrink=0.5, aspect=5)
# 标注

# 使用二维插值方法cubic,生成新的插值函数newfunc。
interpolation_function = interpolate.interp2d(x_values, y_values, function_values, kind='cubic')  # newfunc为一个函数

# 计算100*100的网格上的插值
x_new_values = np.linspace(-1, 1, 100)  # 在[-1, 1]之间生成100个等间隔的新x值。
y_new_values = np.linspace(-1, 1, 100)  # 在[-1, 1]之间生成100个等间隔的新y值。
function_new_values = interpolation_function(x_new_values, y_new_values)  # 计算插值函数在新网格上的值,形成一个100x100的数组。
x_new_grid, y_new_grid = np.meshgrid(x_new_values, y_new_values)
#  生成新的100x100的网格数据,xnew和ynew分别代表新网格点的x、y坐标。
ax2 = plt.subplot(1, 2, 2, projection='3d')
#  在图形窗口中创建一个1行2列的子图,当前操作的是第2个子图,使用3D坐标轴。
surf2 = ax2.plot_surface(x_new_grid, y_new_grid, function_new_values, rstride=2, cstride=2, cmap=cm.coolwarm, linewidth=0.5, antialiased=True)
# 绘制三维表面图,使用新的xnew、ynew、fnew数组,其他参数同上。
ax2.set_xlabel('xnew')
ax2.set_ylabel('ynew')
ax2.set_zlabel('fnew(x, y)')
plt.colorbar(surf2, shrink=0.5, aspect=5)  # 标注

plt.show()

 运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1419978.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

物流信息网

技术架构: JSPMySQL 功能描述: 物流信息网主要用于实现网上自主物流,基本功能包括:登录、查询、时效查询、价格查询、注册等。本系统结构如下: (1)普通用户: 登录&#xff1a…

GIS毕业的那10000人,你们都在做什么?

根据阳光高考网(教育部指定高校招生平台)的数据显示,截止到2022年12月31日,全国高校GIS(地理信息科学)本科毕业生人数为:9000-10000人。 我们还可以看到,地信专业的男女比例为&#…

强化学习原理python篇06(拓展)——DQN拓展

强化学习原理python篇06(拓展)——DQN拓展 n-steps代码结果 Double-DQN代码结果 Dueling-DQN代码结果 Ref 拓展篇参考赵世钰老师的教材和Maxim Lapan 深度学习强化学习实践(第二版),请各位结合阅读,本合集只…

nginx负载均衡案例

大家好今天给大家带来nginx负载均衡实验案例,首大家先看一下我的各类版本信息。(还有两台设备信息相同就不展示了) 一,搭建nginx环境 ❶首先创建Nginx的目录并进入: [rootlocalhost]# mkdir /soft && mkdir /soft/nginx…

Python qt.qpa.xcb: could not connect to display解决办法

遇到问题:qt.qpa.xcb: could not connect to display 解决办法,在命令行输入: export DISPLAY:0 然后重新跑python程序,解决! 参考博客:qt.qpa.xcb: could not connect to displayqt.qpa.plugin: Could …

内核和进程的内存管理,内核从buddy到alloc到slab到kmalloc,内核的内核栈和中断处理程序栈,进程的虚拟内存到页表

内核中的内存管理 内核把物理页作为内存管理的基本单位,尽管处理器最小寻址单位为字,但是MMU(管理内存并且把虚拟地址转换为物理地址的硬件)通常以页为单位进行处理。 每个物理页面都由一个相应的 struct page 结构来表示&#…

打造高效经营:开发连锁餐饮管理系统的技术深度解析

为了适应市场的快速发展和提高经营效率,许多连锁餐饮企业纷纷投入开发连锁餐饮管理系统。 一、数字化转型的动力 传统的餐饮经营面临着诸多挑战,如订单管理、库存控制、人力资源等问题。在这样的背景下,连锁餐饮企业迫切需要一种全面而高效…

jenkins pipeline配置maven可选参数

1、在Manage Jenkins下的Global Tool Configuration下对应的maven项添加我们要用得到的不同版本的maven安装项 2、pipeline文件内容具体如下 我们maven是单一的,所以我们都是配置单选参数 pipeline {agent anyparameters {gitParameter(name: BRANCH_TAG, type: …

【智能家居入门之微信小程序控制下位机】(STM32、ONENET云平台、微信小程序、HTTP协议)

实现微信小程序控制单片机外设动作 一、使用ONENET可视化组件控制单片机外设动作二、使用微信小程序控制单片机外设动作三、总结 本篇博客话接上文: https://blog.csdn.net/m0_71523511/article/details/135892908 上一篇博客实现了微信小程序接收单片机上传的数据…

web wifi配网和模式切换-esp8266和esp32

web wifi配网和模式切换-esp8266和esp32 支持模式:1:tcp client() 2:tcp server 3:http server(POST/GET) 4:http client 5:udp,6:factory,7:mqtt 配网进入方式: 开机,指示灯亮起后(需要灯闪烁3下后),需在3s内(超过3s则会正常启动…

【网络】 WireShark实现TCP三次握手和四次挥手

目录 一、WireShark介绍 二、什么是TCP 三、TCP三次握手 四、TCP四次挥手 一、WireShark介绍 WireShark是一个开源的网络分析工具,用于捕获和分析网络数据包。它可以在多个操作系统上运行,包括Windows、Mac OS和Linux。 使用WireShark,…

获取鼠标点击图片时候的坐标,以及利用html 中的useMap 和area 实现图片固定位置的点击事件

一 编写原因 应项目要求,需要对图片的固定几个位置分别做一个点击事件,响应不同的操作,如下图,需要点击红色区域,弹出不同的提示框: 二 获取点击图片时候的坐标 1. 说明 实现这以上功能的前提是需要确定需…

Kubenetes Ingress 用法

Service的表现形式为IP地址端口号的方式,即工作在TCP/IP层,而对于基于HTTP的服务来说,Service机制很难实现,7层应用的复杂转发逻辑。kubenetes在1.1版本开始引入ingress资源对象,用于将集群外部的客户端请求路由到集群…

STM32与FPGA实现以太网功能--ping

方案: ①stm32与88E6320的一个RMII接口连接,实现网管功能。 ②FPGA与88E6320的另一个RMII接口连接,使用UDP实现业务数据传输。 ③stm32与FPGA中MAC地址不同,但是IP使用相同 结果: 1、在局域网点对点通信正常。 2…

最优化基础 - (最优化问题分类、凸集)

系统学习最优化理论 什么是最优化问题? 决策问题: (1)决策变量 (2)目标函数(一个或多个) (3)一个可由可行策略组成的集合(等式约束或者不等式约束…

Go语言中HTTP代理的请求和响应过程

在Go语言中,HTTP代理的实现涉及对请求和响应的拦截、转发和处理。下面将详细介绍这个过程。 请求过程: 客户端发起请求:客户端(例如浏览器或其他应用程序)发送HTTP请求到代理服务器。建立连接:代理服务器…

第九节HarmonyOS 常用基础组件14-DataPanel

1、描述 数据面板组件,用于将多个数据占比情况使用占比图进行展示。 2、接口 DataPanel(options:{values: number[], max?: numner, type?: DataPanelType}) 3、参数 参数名 参数类型 必填 描述 values number[] 是 数据值列表,最多含9条数…

vue3 el-pagination 将组件中英文‘goto’ 修改 为 中文到‘第几’

效果如图&#xff1a; 要求&#xff1a;将英文中Go to 改为到第几 操作如下&#xff1a; <template><div class"paging"><el-config-provider :locale"zhCn"> // 注意&#xff1a;这是重要部分<el-pagination //分页组件根据官…

需维护的钢对钢和钢对铜滑动接触表面组合的基本额定寿命计算

以下公式仅限用于计算初始润滑的基本额定寿命 Gh b1 b2 b3 b4 b5 330 / p2,5 v 当轴承在初次润滑后能够定期补充润滑&#xff0c;可以用下列公式计算寿命 GhN Gh fβ fH 或 GN 60 f GhN 补充润滑频率可用下列公式进行计算 H Gh / N 其中 Gh 只进行初次润滑条件下的…

Java中实例化的一般过程

在Java中&#xff0c;当你有几个类&#xff08;如 ManualTriggerStartNode, EndNode, TimerTriggerStartNode&#xff09;继承自一个基类&#xff08;如 BaseNode&#xff09;&#xff0c;实例化这些子类时的确定性主要依赖于你的具体需求和上下文。 实例化的一般过程&#xf…