Matlab插值

您所在的位置:网站首页 数据插值matlab Matlab插值

Matlab插值

2024-02-14 19:06| 来源: 网络整理| 查看: 265

1.一维插值函数 matlab中有现成的一维插值函数interp1 语法为

y=interp1(x0,y0,x,'method')

其中method指定插值的方法,默认为线性插值。其值可为

插值方法解释nearest最近项插值linear线性插值spline立方样条插值cubic立方插值

所有的插值方法要求x0是单调的。

2.三次样条插值 在matlab中数据点称为断点。如果三次样条插值没有边界条件,最常用的方法就是采用非扭结(not-a-knot)条件 matlab中三次样条插值有如下函数

y=interp1(x0,y0,x,'spline'); y=spline(x0,y0,x); y=csape(x0,y0,conds); y=csape(x0,y0,conds,valconds);y=fnval(pp,x);

其中:x0,y0是已知数据点;x是插值点;y是插值点的函数值。

对于三次样条插值,提倡使用函数csage。csage的返回值是pp形式,要求插值点的函数值必须调用函数fnval。

pp=esape(x0,y0);%

式中:使用默认的边界条件,即Lagrange边界条件

pp=esape(x0,y0,conds,valconds);

式中:conds指定插值的边界条件,其值可为

conds解释complete边界为一阶导数,一阶导数的值在valconds参数中给出,若忽略valconds参数,则按照默认情况处理not-a-knot非扭结条件periodic周期条件second边界为二阶导数,二阶导数的值在valconds参数中给出,若忽略valconds参数,二阶导数的默认值为[0,0]variational设置边界的二阶导数为[0,0]

对于一些特殊的边界条件,可以通过conds的一个1*2的矩阵来表示,conds元素的取值为0、1、2.

插值举例

结果 在这里插入图片描述 结果分析:分段线性插值的光滑性较差(图1),建议选用三次样条插值。

matlab代码

clc;clear; x0=[0 3 5 7 9 11 12 13 14 15]; y0=[0,1.2 1.7 2.0 2.1 2.0 1.8 1.2 1.0 1.6]; x=0:0.1:15; y1=interp1(x0,y0,x);%一维插值,默认线性插值 y2=interp1(x0,y0,x,'spline');%立方样条插值 pp1=csape(x0,y0);%三次样条插值,默认使用Lagrange边界条件 y3=fnval(pp1,x); pp2=csape(x0,y0,'second');%三次样条插值,边界为2阶导数 y4=fnval(pp2,x); [x',y1',y2',y3',y4']%输出结果 %画图 subplot(1,3,1) plot(x0,y0,'+',x,y1); title("Piecewise linear"); subplot(1,3,2) plot(x0,y0,'+',x,y2); title("Spline1"); subplot(1,3,3) plot(x0,y0,'+',x,y3); title("Spline2");

3.二维插值 若节点是二维,插值函数就是二元函数,即曲面。 1)插值节点为网格节点 已知m*n个节点: ( x i , y j , z i j ) (x_i,y_j,z_{ij}) (xi​,yj​,zij​)求点(x,y)处的插值z。 matlab中有一些计算二维插值的命令

z=interp2(x0,y0,z0,x,y,'method');

其中:x0,y0分别为m维和n维向量,表示节点。z0为n*m矩阵,表示节点值;x,y为一维数组,表示插值点,x与y应是方向不同的向量,即一个是行向量,另一个是列向量;z为矩阵,它的行数为y的维数,列数为x的维数,表示得到的插值;

如果是三次样条插值,可以使用

pp=csape({x0,y0},z0,conds,valconds); z=fnval(pp,{x,y});

其中: x0,y0 分别为m 维和n维向量,z0 为m × n 维矩阵,z 为矩阵,它的行数为x的维 数,列数为y 的维数,表示得到的插值,具体使用方法同一维插值。 举例:在一丘陵地带测量高程,x 和y 方向每隔100米测一个点,得高程如2表,试插 值一曲面,确定合适的模型,并由此找出最高点和该点的高程。

在这里插入图片描述

clear,clc x=100:100:500; y=100:100:400; z=[636 697 624 478 450 698 712 630 478 420 680 674 598 412 400 662 626 552 334 310]; pp=csape({x,y},z') xi=100:10:500;yi=100:10:400; cz=fnval(pp,{xi,yi}); [i,j]=find(cz==max(max(cz))) %找最高点的地址 x=xi(i),y=yi(j),zmax=cz(i,j) %求最高点的坐标

运行结果

i = 8 j = 9 x = 170 y = 180 zmax = 720.6252

2)插值节点为散乱节点 已知n个节点 ( x i , y i , z i ) (x_i,y_i,z_i) (xi​,yi​,zi​),求点(x,y)处的插值z Matlab 中提供了插值函数griddata

ZI=griddata(x,y,z,XI,YI);

其中x,y,z 均为n 维向量,指明所给数据点的横坐标、纵坐标和竖坐标。向量XI、YI 是给定的网格点的横坐标和纵坐标,返回值ZI 为网格(XI,YI)处的函数值。XI与YI 应是方向不同的向量,即一个是行向量,另一个是列向量。

绘制海底曲面的形状 海底水深数据 在这里插入图片描述

在这里插入图片描述

clc, clear x=[129,140,103.5,88,185.5,195,105,157.5,107.5,77,81,162,162,117.5]; y=[7.5,141.5,23,147,22.5,137.5,85.5,-6.5,-81,3,56.5,-66.5,84,-33.5]; z=-[4,8,6,8,6,8,8,9,9,8,8,9,4,9]; xmm=minmax(x) %求x的最小值和最大值 ymm=minmax(y) %求y的最小值和最大值 xi=xmm(1):xmm(2); yi=ymm(1):ymm(2); zi1=griddata(x,y,z,xi,yi','cubic'); %立方插值 zi2=griddata(x,y,z,xi,yi','nearest'); %最近点插值 zi=zi1; %立方插值和最近点插值的混合插值的初始值 zi(isnan(zi1))=zi2(isnan(zi1)); %把立方插值中的不确定值换成最近点插值的结果 subplot(1,2,1), plot(x,y,'*') subplot(1,2,2), mesh(xi,yi,zi)

运行结果

xmm = 77 195 ymm = -81 147


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3