基于MATLAB的二维与三维插值拟合运算(附完整代码)
·
一. 一维插值
interp1函数在上个博客中(如下链接)已经更新了,此处再补充两个相关例题。
基于MATLAB的数据插值运算:Lagrange与Hermite算法(附完整代码)_唠嗑!的博客-CSDN博客
例题1
自行选择来自函数f(x)的数据点:
根据选择的数据进行插值处理,得出曲线。
解:
MATLAB代码如下:
clc;clear;x=0:0.12:1;
y=(x.^2-3*x+5).*exp(-5*x).*sin(x);%调用interp1()函数
x1=0:.02:1;
y0=(x1.^2-3*x1+5).*exp(-5*x1).*sin(x1);
y1=interp1(x,y,x1);
y2=interp1(x,y,x1,'pchip'); %分段三次Hermite插值
y3=interp1(x,y,x1,'spline'); %三次样条函数插值
y4=interp1(x,y,x1,'nearest'); %最近邻点插值plot(x1,[y1',y2',y3',y4'],':',x,y,'o',x1,y0) %五条曲线,一个描点%误差分析
[max(abs(y0(1:49)-y2(1:49))),max(abs(y0-y3)),max(abs(y0-y4))]
运行结果:
ans =
0.017651383860966 0.008613955066235 0.159826013541615
例题2
对f(x)进行Lagrange插值,并画图与标准图像对比。
解:
MATLAB代码如下:
clc;clear;x0=-1+2*[0:10]/10;
y0=1./(1+25*x0.^2); %x0与y0生成数据点x=-1:.01:1;
y=lagrange(x0,y0,x); %Lagrange插值ya=1./(1+25*x.^2); %标准值plot(x,ya,x,y,':') %虚线代表Lagrange插值运算后的图像function y=lagrange(x0,y0,x)
ii=1:length(x0);
y=zeros(size(x));
for i=iiij=find(ii~=i);y1=1;for j=1:length(ij),y1=y1.*(x-x0(ij(j)));endy=y+y1*y0(i)/prod(x0(i)-x0(ij));
end
end
运行结果:
二.二维插值
interp2命令作为二维数据内的插值运算,一共有三种常用的调用格式
格式1
ZI=interp2(X,Y,Z,XI,YI)
返回矩阵ZI,参量X和Y必须是单调的,且具有相同的划分格式,类似由命令meshgrid生成的一样。如果XI和YI中有在X与Y范围之外的点,那么就会返回NaN。
格式2
ZI=interp2(Z,XI,YI)
缺省的表示形式,X=1:n,Y=1:m,且[m,n]=size(Z)。具体计算类似格式1
格式3
ZI=interp2(X,Y,Z,XI,YI,method)
method表明用指定的算法计算二维插值。常用的算法有以下四种:
- 'linear':双线性插值算法,一种缺省算法
- 'nearest':最临近插值
- 'spline':三次样条插值
- 'cubic':双三次插值
例题3
由z=f(x,y)可计算出一些较稀疏的网格数据,尝试对整个函数曲面进行插值拟合,并比较拟合结果。
解:
MATLAB代码如下:
clc;clear;%绘制已知数据的网格图
[x,y]=meshgrid(-3:.6:3,-2:.4:2);
z=(x.^2-2*x).*exp(-x.^2-y.^2-x.*y);
surf(x,y,z), axis([-3,3,-2,2,-0.7,1.5])
title('初始网格图');%选择较密的插值点,用默认的线性插值算法进行插值
[x1,y1]=meshgrid(-3:.2:3,-2:.2:2);
z1=interp2(x,y,z,x1,y1);
figure;
surf(x1,y1,z1),axis([-3,3,-2,2,-0.7,1.5])
title('默认线性插值算法画图');%立方和样条插值
z2=interp2(x,y,z,x1,y1,'cubic');
z3=interp2(x,y,z,x1,y1,'spline');
figure;
surf(x1,y1,z2),axis([-3,3,-2,2,-0.7,1.5])
title('立方插值图');
figure;
surf(x1,y1,z3),axis([-3,3,-2,2,-0.7,1.5])
title('样条插值图');%比较立方和样条插值算法误差
z_normal=(x1.^2-2*x1).*exp(-x1.^2-y1.^2-x1.*y1);
figure;
surf(x1,y1,abs(z_normal-z2)),axis([-3,3,-2,2,0,0.08]);
title('立方算法误差');
figure;
surf(x1,y1,abs(z_normal-z3)),axis([-3,3,-2,2,0,0.025])
title('样条算法误差');
运行结果:
三. 二维一般分布数据的插值
MATLAB中含有可对非网格数据进行插值的函数,调用的函数如下:
z=griddata(x0,y0,z0,x,y,'method')
上述中的method算法主要有五种,如下:
- 'v4':MATLAB内含的插值算法,公认效果比较好
- 'linear':双线性插值算法,属于缺省算法
- 'nearest':最临近插值
- 'spline':三次样条插值
- 'cubic':双三次插值
例题4
在x为[-3,3],y为[-2,2]的矩形区域内随机选择一组坐标,用'v4'和'cubic'插值法进行处理,并对误差进行比较。
解:
MATLAB代码如下:
clc;clear;x=-3+6*rand(200,1);
y=-2+4*rand(200,1); %产生随机数
z=(x.^2-2*x).*exp(-x.^2-y.^2-x.*y);
[x1,y1]=meshgrid(-3:.2:3,-2:.2:2);%cubic方法
z1=griddata(x,y,z,x1,y1,'cubic');
surf(x1,y1,z1),axis([-3,3,-2,2,-0.7,1.5])
title('cubic方法');%v4方法
z2=griddata(x,y,z,x1,y1,'v4');
figure;
surf(x1,y1,z2),axis([-3,3,-2,2,-0.7,1.5])
title('v4方法');%误差分析
z0=(x1.^2-2*x1).*exp(-x1.^2-y1.^2-x1.*y1);
figure;
surf(x1,y1,abs(z0-z1)),axis([-3,3,-2,2,0,0.25])
title('cubic方法的误差');
figure;
surf(x1,y1,abs(z0-z2)),axis([-3,3,-2,2,0,0.15])
title('v4方法的误差');
运行结果:
例题5
在x为[-3,3],y为[-2,2]的矩形区域随机选择一组坐标中,对分布不均匀的数据,进行插值分析。
解:
本题我将MATLAB代码分成两部分。
(1)样本点数据处理的MATLAB代码如下:
clc;clear;x=-3+6*rand(200,1);
y=-2+4*rand(200,1);
z=(x.^2-2*x).*exp(-x.^2-y.^2-x.*y); %生成已知数据
plot(x,y,'x') %样本点的二维分布
title('样本点的二维分布');
figure;
plot3(x,y,z,'x'),axis([-3,3,-2,2,-0.7,1.5]),grid %三维图
title('三维样本图');%去除在(-1,-1/2)点为圆心,以0.5为半径的圆内的点
ii=find((x+1).^2+(y+0.5).^2>0.5^2); %找出满足条件的点坐标
x=x(ii);y=y(ii);z=z(ii);
figure;
plot(x,y,'x')
t=[0:.1:2*pi,2*pi];
x0=-1+0.5*cos(t);
y0=-0.5+0.5*sin(t);
line(x0,y0) %在图形上叠加该圆,观察圆内样本点是否被去除
title('去除圆内点');
运行结果:
(2)插值与误差分析
MATLAB代码如下:
clc;clear;x=-3+6*rand(200,1);
y=-2+4*rand(200,1);
z=(x.^2-2*x).*exp(-x.^2-y.^2-x.*y); %生成已知数据
t=[0:.1:2*pi,2*pi];
x0=-1+0.5*cos(t);
y0=-0.5+0.5*sin(t);%用新样本拟合出曲面
[x1,y1]=meshgrid(-3:.2:3,-2:.2:2);
z1=griddata(x,y,z,x1,y1,'v4');
surf(x1,y1,z1),axis([-3,3,-2,2,-0.7,1.5])
title('拟合插值图');%误差分析
z0=(x1.^2-2*x1).*exp(-x1.^2-y1.^2-x1.*y1);
figure;
surf(x1,y1,abs(z0-z1)),axis([-3,3,-2,2,0,0.15])
title('误差图');figure;
contour(x1,y1,abs(z0-z1),30);
hold on,plot(x,y,'x');
line(x0,y0) %误差的二维等高线图
title('误差的二维等高线图');
运行结果:
基于MATLAB的二维与三维插值拟合运算(附完整代码)相关推荐
- 基于MATLAB的无线信道的传播与衰落(附完整代码与分析)
目录 一. 一般路径损耗模型 1. 1自由环境下路径损耗 1. 2 考虑实际情况 1.3 考虑阴影衰落 二. 代码仿真与理解 (1)函数文件 (2)函数文件 (3)主运行文件 三. 运行结果及理解 3 ...
- matlab中的delaunay,基于MATLAB 实现二维delaunay 三角剖分
基于MATLAB 实现二维delaunay 三角剖分 刘锋涛凡友华 (哈尔滨工业大学深圳研究生院深圳518055) [摘要]在已知凸多边形的顶点坐标的前提情况下,利用MATLAB 中的meshgrid ...
- Matlab绘制二维(三维)图形时设置对数坐标轴
问题 matlab有semilogx,semilogy和loglog三种针对一维数据的双对数坐标显示.对于二维数据应该任何操作呢? 代码 subplot(121) contourf(peaks,30, ...
- 基于MATLAB实现二维图像叠加进行三维重建
三维重建主要过程概述 绘制圆心位置相同,内外半径相同的系列圆 ,图片尺寸为128*128,类似于血管的圆管柱图像: 绘制圆心位置不同,内外半径相同的系列圆,图片尺寸为128*128,类似于血管的圆管柱 ...
- 【光学】基于Matlab实现二维光子晶体的能带图和场
1 内容介绍 为了了解电磁波在光子晶体中的传输特性,用MATLAB与时域有限差分法把电磁波在真空与光子晶体中的传播实时可视化,并给出了场的空间静态分布.数值模拟的结果表明,禁带中的波被光子晶体控制,其 ...
- 【二维码图像矫正增强】基于MATLAB的二维码图像矫正增强处理仿真
1.软件版本 matlab2013b 2.算法流程概述 通过形态学处理获得二维码部分的图像区域及边界: 采用凸包算法来计算边界上的点集: 然后根据点集来寻找二维码的四个顶点, 然后透视变换矫正,二维码 ...
- 基于深度学习的二维码检测和识别(含完整代码和数据)
最近尝试着将深度学习技术引入到二维码检测和识别中,期望能够提升传统二维码的识读性能,能够适用更多复杂背景,并且最终应用到工业生产中,方便生产线上对产品的ID管理. 项目最终实现效果如下所示: 相对来说 ...
- python基于百度智能云实现批量身份证信息识别(附完整代码,可直接使用)
百度智能云配置 一.登录 登录百度智能云,找到卡证文字识别,点击立即使用 地址: https://cloud.baidu.com/product/ocr_cards 二.创建应用 创建一个应用,过程不 ...
- 实验2 用MATLAB 绘制二维、三维图形
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210521094144790.png) clear;close all;clc; hold on; grid; ...
最新文章
- 如果往错误的NEO地址转账会发生什么
- 练习5.1更新——四则运算 测试与封装
- kafka和mqtt的区别是什么?
- [学习笔记]树上莫队
- stm32_can错误中断 清除重点
- sed 手册阅读笔记转
- 怎么学好python leetcode的题目太难了_为什么leetcode中的python解法过于pythonic,而忽略了算法题主要关注的复杂度问题?...
- Representation Flow for Action Recognition论文解读
- 兄弟7895dw粉盒清零_兄弟打印机2260D粉盒怎么清零?
- VB如何自动保存_VB编程——菜单栏设计教程
- 点到线段的距离 计算几何
- 我是个骄傲的intj
- 2018引汉济渭计算机监控系统,基于数字水网的引汉济渭受水区水资源调配业务化研究与应用...
- FP6296升压QC和PD协议充电器
- 语音特征:mfcc、fbank和语谱图概述
- 深度学习小白入门教程(一):以英雄联盟为例,爬取你感兴趣图片,构建你自己的数据集
- log4j2 日期换天后,今天的日志打印到了昨天的日志文件里面,rollover混乱
- 企业转型升级,务必抓住“企业上云”政策红利
- 汽车鸿蒙音响怎么调,汽车音响怎么调试 汽车音响调试步骤方法【详细介绍】...
- 多看Android版本WIFI传书的实现
热门文章
- 富士康电商平台富连网正式上线:想3年内超京东
- dedecms 只需要几个步骤快速实现独立的手机版功能
- spring-mongoDB mongoTemplate排序分组|分页|统计
- 信息学奥赛一本通:1407:笨小猴
- 【源码+图片素材】Java开发经典游戏飞翔的小鸟_Java游戏项目Flappy Bird像素鸟游戏_Java小游戏_Java初级项目_Java课程设计项目
- 十进制转化为十六进制怎么算
- 1137 - 【入门】纯粹素数
- Linux服务器安全策略实战免费送给运维工程师
- Burpsuite安装
- 输入URL后浏览器的渲染过程