MATLAB:插值函数之interp与griddata

2024-05-26 00:04

本文主要是介绍MATLAB:插值函数之interp与griddata,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

MATLAB 提供了多种插值函数来处理不同维度的数据。其中,interp1、interp2 和 griddata 是常用的插值函数,分别用于一维、二维和多维(不规则)数据的插值

之前有对interp1进行过详细介绍,如需详细了解,请查看另一篇博客。

一、函数介绍

下面是这三个函数的用法和实际例子:

1.interp1

功能:对一维数据进行插值。

语法

vq = interp1(x, v, xq)
vq = interp1(x, v, xq, method)
vq = interp1(x, v, xq, method, extrapolation)

参数

  • x: 原始数据的 x 坐标向量。
  • v: 原始数据的值向量。
  • xq: 需要插值的查询点向量。
  • method: 插值方法(可选,默认为 'linear'),如 'linear'(线性插值)、 'nearest'(最近邻插值)、 'spline'(样条插值)等。
  • extrapolation: 外推方法(可选)。
x = 0:10;          % 原始数据点 x
v = sin(x);        % 原始数据的值
xq = 0:0.5:10;     % 查询点
vq = interp1(x, v, xq, 'spline'); % 使用'spline'方法进行插值% 绘图
plot(x, v, 'o', xq, vq, '-');
legend('原始数据', '插值数据');

 

2.interp2

功能:对二维数据进行插值。

语法

Vq = interp2(X, Y, V, Xq, Yq)
Vq = interp2(V, Xq, Yq)
Vq = interp2(..., method)

参数

  • XY: 原始数据的网格坐标矩阵(由 meshgrid 生成)。
  • V: 原始数据值的矩阵。
  • XqYq: 查询点的坐标矩阵。
  • method: 插值方法(可选),如 'linear''nearest''spline''cubic' 等。
[X, Y] = meshgrid(1:5, 1:5);       % 原始数据网格
V = peaks(5);                      % 原始数据值
[Xq, Yq] = meshgrid(1:0.1:5, 1:0.1:5); % 查询点
Vq = interp2(X, Y, V, Xq, Yq, 'cubic'); % 使用“cubic”插值% 绘图
mesh(Xq, Yq, Vq); 
hold on;
plot3(X, Y, V, 'o');  % 添加原始数据点

 

3.griddata

功能:对不规则数据进行插值,并生成规则网格上的插值值。

语法

Vq = griddata(x, y, v, xq, yq)
Vq = griddata(x, y, v, xq, yq, method)
x = rand(10, 1) * 10;       % 随机 x 坐标
y = rand(10, 1) * 10;       % 随机 y 坐标
v = sin(x) + cos(y);        % 原始数据值
[xq, yq] = meshgrid(0:0.1:10, 0:0.1:10); % 查询点网格
vq = griddata(x, y, v, xq, yq, 'cubic'); % 使用“cubic”插值% 绘图
mesh(xq, yq, vq); 
hold on;
plot3(x, y, v, 'o');  % 添加原始数据点

 

二、实践

请绘制电机效率MAP二维图。

题目说是二维图,是应该使用interp1进行插值吗?实际上,电机效率MAP是指电机的效率与转矩和转速的关系,将三维平面投影到了二维图,具体代码如下:

%% 绘制电机效率MAP二维图
clc
clear
% 定义原始数据
n = [300 300 700 700 700 900 900 900 1500 1500 3000 3000 4000 4000 5000 5000 6000 6000 7000 7000];
T = [138 50 328 138 50 328 138 50 138 50 138 50 50 30 50 30 50 30 40 30];
nt = [0.748 0.844 0.749 0.922 0.925 0.794 0.927 0.926 0.922 0.921 0.952 0.941 0.939 0.915 0.898 0.886 0.882 0.879 0.846 0.841];% 创建插值网格
n1 = linspace(300, 7000, 1000);  % 在300到7000之间生成1000个点的数组
T1 = linspace(30, 350, 1000);    % 在30到350之间生成1000个点的数组
[n1, T1] = meshgrid(n1, T1);     % 生成网格矩阵% 对原始数据进行插值以生成网格点上的效率数据
nt1 = griddata(n, T, nt, n1, T1);% 绘制插值后的伪彩色图
pcolor(n1, T1, nt1)
shading interp  % 插值方式显示伪彩色图,让颜色在相邻单元之间平滑过渡hold on  % 保持当前图形,允许在上面添加更多图形% 添加颜色条(色条)
colorbar% 绘制等高线图并设置等高线的数量
[C, h] = contourf(n1, T1, nt1, 7);% 设置x轴和y轴标签
xlabel("转速/(r/min)")
ylabel("转矩/N.m")% 手动添加等高线标签
clabel(C, h, 'manual')

请绘制电机效率MAP三维图 

%% 绘制电机效率MAP三维图
clc
clear
% 定义原始数据
n = [300 300 700 700 700 900 900 900 1500 1500 3000 3000 4000 4000 5000 5000 6000 6000 7000 7000];
T = [138 50 328 138 50 328 138 50 138 50 138 50 50 30 50 30 50 30 40 30];
nt = [0.748 0.844 0.749 0.922 0.925 0.794 0.927 0.926 0.922 0.921 0.952 0.941 0.939 0.915 0.898 0.886 0.882 0.879 0.846 0.841];% 创建插值网格
n1 = linspace(300, 7000, 50);  % 在300到7000之间生成1000个点的数组
T1 = linspace(30, 350, 50);    % 在30到350之间生成1000个点的数组
[n1, T1] = meshgrid(n1, T1);     % 生成网格矩阵% 对原始数据进行插值以生成网格点上的效率数据
nt1 = griddata(n, T, nt, n1, T1);mesh(n1, T1, nt1)
xlabel('转速/(r/min)')
ylabel('转矩/N.m')
zlabel('效率')

 

参考资料:《Matlab编程与汽车仿真应用》 ——崔胜民

这篇关于MATLAB:插值函数之interp与griddata的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1002994

相关文章

Oracle的to_date()函数详解

《Oracle的to_date()函数详解》Oracle的to_date()函数用于日期格式转换,需要注意Oracle中不区分大小写的MM和mm格式代码,应使用mi代替分钟,此外,Oracle还支持毫... 目录oracle的to_date()函数一.在使用Oracle的to_date函数来做日期转换二.日

C++11的函数包装器std::function使用示例

《C++11的函数包装器std::function使用示例》C++11引入的std::function是最常用的函数包装器,它可以存储任何可调用对象并提供统一的调用接口,以下是关于函数包装器的详细讲解... 目录一、std::function 的基本用法1. 基本语法二、如何使用 std::function

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

函数式编程思想

我们经常会用到各种各样的编程思想,例如面向过程、面向对象。不过笔者在该博客简单介绍一下函数式编程思想. 如果对函数式编程思想进行概括,就是f(x) = na(x) , y=uf(x)…至于其他的编程思想,可能是y=a(x)+b(x)+c(x)…,也有可能是y=f(x)=f(x)/a + f(x)/b+f(x)/c… 面向过程的指令式编程 面向过程,简单理解就是y=a(x)+b(x)+c(x)

matlab读取NC文件(含group)

matlab读取NC文件(含group): NC文件数据结构: 代码: % 打开 NetCDF 文件filename = 'your_file.nc'; % 替换为你的文件名% 使用 netcdf.open 函数打开文件ncid = netcdf.open(filename, 'NC_NOWRITE');% 查看文件中的组% 假设我们想读取名为 "group1" 的组groupName

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

OpenCV结构分析与形状描述符(11)椭圆拟合函数fitEllipse()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 围绕一组2D点拟合一个椭圆。 该函数计算出一个椭圆,该椭圆在最小二乘意义上最好地拟合一组2D点。它返回一个内切椭圆的旋转矩形。使用了由[90]描述的第一个算法。开发者应该注意,由于数据点靠近包含的 Mat 元素的边界,返回的椭圆/旋转矩形数据

Unity3D 运动之Move函数和translate

CharacterController.Move 移动 function Move (motion : Vector3) : CollisionFlags Description描述 A more complex move function taking absolute movement deltas. 一个更加复杂的运动函数,每次都绝对运动。 Attempts to

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };