怎么用matlab做二维插值曲面,matlab学习——05插值和拟合(一维二维插值)

05插值和拟合

1.一维插值

(1) 机床加工零件,试用分段线性和三次样条两种插值方法计算。并求x=0处的曲线斜率和13<=x<=15范围内y的最小值。

x0=[0 3 5 7 9 11 12 13 14 15];

y0=[0 1.2 1.7 2 2.1 2.0 1.8 1.2 1.0 1.6];

x=0:0.1:15;

% interp1现有插值函数,要求x0单调,'method'有

% nearest 最近项插值 linear 线性插值

% spline 立方样条插值 cubic 立方插值

y1=interp1(x0,y0,x);

y2=interp1(x0,y0,x,'spline');

pp1=csape(x0,y0);

y3=fnval(pp1,x);

pp2=csape(x0,y0,'second');

y4=fnval(pp2,x);

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

subplot(1,4,1)

plot(x0,y0,'+',x,y1)

title('Piecewise linear 分段线性')

subplot(1,4,2)

plot(x0,y0,'+',x,y2)

title('spline1')

subplot(1,4,3)

plot(x0,y0,'+',x,y3)

title('spline2')

subplot(1,4,4)

plot(x0,y0,'+',x,y4)

title('second')

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]

(2)  已知速度的四个观测值,用三次样条求位移S=0.15到0.18上的vd(t)积分

t   0.15    0.16     0.17    0.18

vt   3.5    1.5       2.5       2.8

format compact;

% 已知速度的四个观测值,用三次样条求位移S=0.15到0.18上的vd(t)积分

% t 0.15 0.16 0.17 0.18

% vt 3.5 1.5 2.5 2.8

clc,clear

x0=0.15:0.01:0.18;

y0=[3.5 1.5 2.5 2.8];

% csape 三次样条插值,返回要求插值的的函数值

pp=csape(x0,y0) % 默认的边界条件,Lagrange边界条件

format long g

xishu = pp.coefs % 显示每个区间上三次多项式的系数

s=quadl(@(t)ppval(pp,t),0.15,0.18) % 求积分

format % 恢复短小数的显示格式

% 画图

t=0.15:0.001:0.18;

y=fnval(pp,t);

plot(x0,y0,'+',t,y)

pp =包含以下字段的 struct:

form:'pp'breaks: [0.1500 0.1600 0.1700 0.1800]

coefs: [3×4double]

pieces:3order:4dim:1xishu=

1 至 2列-616666.666666667 33500

-616666.666666667 15000

-616666.666666668 -3499.99999999999

3 至 4列-473.333333333334 3.5

11.6666666666671 1.5

126.666666666667 2.5s=

0.068625

2.二维插值

(1) 丘陵测量高度。试插值一曲面,确定合适的模型,并由此找出最高的和该点的最高程。

format compact;

% 丘陵,在x,y方向上每隔100m测个点

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}); % 得到插值后的z

[i,j]=find(cz==max(max(cz))) % 找最高点的地址

xm=xi(i),ym=yi(i),zmax=cz(i,j) % 求最高点的坐标

% 画图

[X,Y]=meshgrid(yi,xi);%构造1×1网格,20×20个

[X0,Y0]=meshgrid(y,x);%构造1×1网格,20×20个

plot3(X0,Y0,z,'p', 'MarkerEdgeColor','k','MarkerSize',15 ,'MarkerFaceColor',[.49 1 .63])

hold on

% mesh(X,Y,cz)

surf(X,Y,cz)

pp =包含以下字段的 struct:

form:'pp'breaks: {[100 200 300 400 500] [100 200 300 400]}

coefs: [1×16×12double]

pieces: [4 3]

order: [4 4]

dim:1i=

8j=

9xm=

170ym=

170zmax=

720.6252

(2) 海底水深

format compact;

% 二维海底水深数据

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