插值方法有很多,对应到MATLAB里面也有很多函数,和参数选择。
对应的原理分析,嘻嘻,我毕竟不是数学专业的学生,有时间能弄懂就弄懂吧,^_^
分段线性插值,拉格朗如插值,样条插值(B样条插值好熟悉的名字啊,图形学里面有哦)。
MATLAB实现:
插值函数
语法:y = interp1(x0,y0,x,‘method‘);
参数method方法:
‘nearest‘ :最近项插值
‘linear‘ :线性插值
‘spline‘ :立方样条插值(三次样条插值)
‘cubic‘ :立方插值
三次样条插值
栗子:机床加工(P88)
给出x,y数据,位于机翼断面的下轮廓线。完成插值操作。
线性插值(linear)
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); % 线性插值
三次样条插值(spline)
y2 = interp1(x0,y0,x,‘spline‘); % 立方样条插值
对于三次样条插值,提倡使用函数csape,返回函数是pp类型。
默认的边界条件,即拉格朗日条件。
pp1 = csape(x0,y0); y3 = fnval(pp1,x);
plot(x0,y0,‘+‘,x,y3)
参数‘second‘表示,边界为二阶导数。
pp2 = csape(x0,y0,‘second‘); y4 = fnval(pp2,x);
栗子:给定曲线v(t)上的四个点,三次样条插值求位移:
x0 = 0.15:0.01:0.18; y0 = [3.5 1.5 2.5 2.8]; pp = csape(x0,y0); %format long g XiShu = pp.coefs; s = quadl( @ (t)ppval(pp,t),0.15,0.18);
求出三次样条插值系数,不需要求出那个对应的速度值,也就是不需要使用fnval函数,只需要求积分。
s =
0.0686
二维插值
二维插值,还是这些函数,只不过是加了一维。分为两类:1、插值节点为网格节点 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}); mesh(xi,yi,cz‘);
离散点:griddate函数。
clc,clear x = [129 140 103.5 88 185.5 195 105 157 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‘); zi2 = griddata(x,y,z,xi,yi‘,‘nearest‘); % mesh(xi,yi,zi1); % zi = zi1; % zi(isnan(zi1)) = zi2(isnan(zi1));