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);
subplot(2,2,1);
plot(x0,y0,'+',x,y1);
title('Piecewise linear')
%立方样条插值01
y2 = interp1(x0,y0,x,'spline');
subplot(2,2,2)
plot(x0,y0,'+',x,y2)
title('Spline1')
%立方样条插值02
pp1 = csape(x0,y0);
y3 = fnval(pp1,x);
subplot(2,2,3)
plot(x0,y0,'+',x,y3)
title('Spline2')
%立方样条插值03
pp2 = csape(x0,y0,'second');
y4 = fnval(pp2,x);
subplot(2,2,4)
plot(x0,y0,'+',x,y4)
title('Spline3')

[x',y1',y2',y3',y4']

% dx = diff(x);
% dy = diff(y3);
% dy_dx = dy./dx;
% dy_dx0 = dy_dx(1);
% ytemp = y3(131:151);
% ymin = min(ytemp);
% index = find(y3==ymin);
% xmin = x(index);
% [xmin,ymin]

插值求积分

clc,clear
x0 = 0.15:0.01:0.18;
y0 = [3.5 1.5 2.5 2.8];
pp = csape(x0,y0);
%求积分
s = quadl(@(t)ppval(pp,t),0.15,0.18)

二维插值

插值节点为散乱节点

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');
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);

插值节点为网格节点

clc,clear
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];
%插值前的三维图
%surf(x,y,z);
pp = csape({x,y},z');
xi = 100:10:500;yi = 100:10:400;
cz = fnval(pp,{xi,yi});
%插值后的二维图
surf(xi,yi,cz);
[i,j] = find(cz==max(max(cz)))%找最高点地址
x = xi(i),y = yi(i),zmax = cz(i,j);%求最高点坐标
posted @ 2022-04-28 16:37  又一岁荣枯  阅读(180)  评论(0编辑  收藏  举报