我是靠谱客的博主 俏皮背包,这篇文章主要介绍数学建模学习-插值法,现在分享给大家,希望可以做个参考。

插值:在平面上给定一组离散点列,要求一条曲线,把这些点按次序连接起来,成为插值。

Matlab插值工具:

1.一维插值函数

Matlab现成的一维插值函数为interp1。语法为

复制代码
1
y = interp1(x0,y0,x,'method')

x0和y0分别为离散的点的横坐标和纵坐标。x通常为坐标轴范围如x = 10 :10:100

methond为指定插值的方法,默认为线性插值。可以为

'nearest' 最近项插值

'linear' 线性插值

‘spline' 立方样条插值

'cubic' 立方插值

其中,所有的插值方法都要求x0是单调数列。

2.三次样条插值

Matlab中三次样条插值有如下函数

复制代码
1
2
3
4
y = interp1(x0,y0,x,'spline'); y = spline(x0,y0,x); pp = csape(x0,y0,conds); y = fnval(pp,x); pp = csape(x0,y0,conds,valconds);y = fnval(pp,x);

对于三次样条插值,通常使用csape函数。其返回值为pp形式,要获得插值点函数值,必须调用fnval函数。

pp = csape(x0,y0)使用默认的边界条件,即Lagrange边界条件。

pp = csape(x0,y0,conds,valconds)中的conds的指定插值的边界条件,其值可为:

'complete' 边界为一阶导数,一阶导数的值在valconds参数中给出,若忽略valconds参数视为默认情况。

'second' 边界为二阶导数,二阶导数的值在参数valconds中给出,不使用参数valconds,默认值为[0,0]。

例:

x035791112131415
y01.21.72.02.12.01.81.21.01.6

对以上数据进行插值处理:

分别使用最临近插值法,立方样条插值的不同边界得到的结果。

 从图中可以看出三次样条插值得到的曲线更平滑。

Matlab代码如下

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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; y6 = interp1(x0,y0,x,'nearest'); subplot(1,5,1) plot(x0,y0,'+',x,y6); title('nearest methond'); y1 = interp1(x0,y0,x); %x和y的坐标,坐标轴 y2 = interp1(x0,y0,x,'spline'); pp1 = csape(x0,y0); y3 = fnval(pp1,x); pp2 = csape(x0,y0,'second'); y4 = fnval(pp2,x); %使用fnval函数求插值点的函数值 subplot(1,5,2) plot(x0,y0,'+',x,y1); title('Piecewise linear'); subplot(1,5,3) plot(x0,y0,'+',x,y2) title('Splinel') subplot(1,5,4) plot(x0,y0,'+',x,y3) title('Spline2') subplot(1,5,5) plot(x0,y0,'+',x,y4); title('Spline3')

2.二维插值

1)插值节点为网格节点

Matlab中有计算二维插值的命令

复制代码
1
z = interp2(x0,y0,z0,x,y,'method')

x0,y0分别为m维和n维向量,表示节点;z0维mxn矩阵,表示节点值,x,y维一维数组,表示插值点。method和一维插值的参数相同。

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

复制代码
1
2
pp = csape({x0,y0},z0,conds,valconds); z = fnval(pp,{x,y});

2)插值点是散乱的点

Matlab提供了插值函数griddata

复制代码
1
ZI = griddata(x,y,z,XI,YI);

x,y,z均为n维向量,指出横坐标,纵坐标和竖坐标。XI YI是给定网格点的横坐标和纵坐标,返回值ZI是网格(XI,YI)处的函数值。XI,YI应是方向不同的向量。

应用示例:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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) %求最大最小值 ymm = minmax(y) xi = xmm(1):xmm(2); yi = ymm(1):ymm(2); zi1 = griddata(x,y,z,xi,yi','cubic'); %立方插值,y'使xi与yi方向不同 zi2 = griddata(x,y,z,xi,yi','nearest'); %最近点插值 zi = zi1; %采用混合插值的方式,先用zi1初始化结果 zi(isnan(zi1)) = zi2(isnan(zi1)) %把立方插值中不确定nan的值换成最近点插值的结果 subplot(1,2,1); plot(x,y,'*') subplot(1,2,2); mesh(xi,yi,zi) %绘图

结果如图:

 

最后

以上就是俏皮背包最近收集整理的关于数学建模学习-插值法的全部内容,更多相关数学建模学习-插值法内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(104)

评论列表共有 0 条评论

立即
投稿
返回
顶部