matlab 插值出错,MATLAB插值问题

matlab 插值出错,MATLAB插值问题一、一元函数插值已知函数y=f(x)在区间[a,b]上的n+1个不同点的函数值为,若存在一个简单函数F(x),使,称F(x)为f(x)在区间[a,b]上的插值函数,称(xi,yi)为插值节点。若F(x)为多项式,称为多项式插值(或代数插值);常用的代数插值方法有:拉格朗日插值,牛顿插值。n次代数插值:已知f(x)在n+1个点x0,x1,…,xn处的函数值为y0,y1,…,yn,求一个n…

大家好,又见面了,我是你们的朋友全栈君。

一、一元函数插值

已知函数y=f(x)在区间[a,b]上的n+1个不同点

608d936eff8e2077396dba92c258988c.png的函数值为

243d24cba510a5c8e3a3cf306503cd8f.png,若存在一个简单函数F(x), 使

feb4a07ddf90e1cdff4ca4ba9b0b2289.png,称F(x)为f(x)在区间[a,b]上的插值函数,称(xi, yi)为插值节点。若F(x)为多项式,称为多项式插值(或代数插值) ;常用的代数插值方法有:拉格朗日插值,牛顿插值。

n次代数插值:已知f(x)在n+1个点x0,x1,…,xn处的函数值为 y0,y1,…,yn , 求一个n次多项式函数Pn(x),使其满足: Pn(xi)=yi, (i=0,1,…,n). 若Pn(x)按下述方式构造,称为拉格朗日插值

776f1ad2d486beb25a0453e5ebdc7b76.png

其中Li(x) 为n次多项式:

173f8f3c1417b3ab9a93700600fbd7b7.png

称为拉格朗日插值基函数.

特别地:

(1)已知两个节点时,得线性插值多项式:

5ee93a7efd037ed85185133455ec0270.png

(2)已知三个节点时,得抛物插值多项式:

12158c399182d9ca585a6244112b5652.png

(3)已知n+1个节点时,可得n次拉格朗日插值多项式。

关于代数插值:

可以看出,当节点较多时,多项式的次数增高,插值函数出现振荡,精度变低。因此,为了保证精度,在节点较多时,一般采用分段插值,但这样在分段点光滑性较差。Matlab采用的多项式插值都是分段插值法。从图形还可以看出,对解析函数,插值精度高;对有奇点的函数,插值精度低。多项式插值对靠近插值区间中点的部分插值精度高,远离中点部分精度低。

规则网点的插值

y=interp1(x0,y0,x,’method’),y是对应x插值后获得的因变量,x0和y0为初始数据的自变量和因变量

Method 的选项有 ‘nearest’, ‘next’, ‘previous’, ‘linear’,‘spline’,‘pchip’, 和 ‘cubic’. 缺省的机器设置为’linear’.

插值效果:

27a5ec68edaa981dd6bd8a6d19816dd2.png

参考程序:

xdata=0:pi/6:2*pi;

ydata=sin(xdata);

x=0:pi/20:2*pi;

subplot(2,2,1)

y=interp1(xdata,ydata,x,’nearest’);

plot(xdata,ydata,’p’,x,y,’k-‘)

title(‘nearest’)

subplot(2,2,2)

y=interp1(xdata,ydata,x,’linear’);

plot(xdata,ydata,’p’,x,y,’k-‘)

title(‘linear’)

subplot(2,2,3)

y=interp1(xdata,ydata,x,’cubic’);

plot(xdata,ydata,’p’,x,y,’k-‘)

title(‘cubic’)

subplot(2,2,4)

y=interp1(xdata,ydata,x,’spline’);

plot(xdata,ydata,’p’,x,y,’k-‘)

title(‘spline’)

插值误差:

dccbe9d3393e6e699ab91d334d62550e.png

参考程序:

xdata=0:pi/6:2*pi;

ydata=sin(xdata);

x=0:pi/20:2*pi;

yy=sin(x);

subplot(2,2,1)

y=interp1(xdata,ydata,x,’nearest’);

plot(x,y-yy,’k-‘)

title(‘nearest’)

subplot(2,2,2)

y=interp1(xdata,ydata,x,’linear’);

plot(x,y-yy,’k-‘)

title(‘linear’)

subplot(2,2,3)

y=interp1(xdata,ydata,x,’curve’);

plot(x,y-yy,’k-‘)

title(‘curve’)

subplot(2,2,4)

y=interp1(xdata,ydata,x,’spline’);

plot(x,y-yy,’k-‘)

title(‘spline’)

小tips:插值中使用较多的是分段线性插值和三次样条插值。

三次样条插值是解决一维插值问题最常用的方法, Matlab中实现三次样条插值的方法有:

yi=interp1(x,y,xi,’spline’)

使用spline函数:

yi=spline(x, y, xi) ,效果同 1

pp=spline(x, y),获得三次样条插值的分段多项式pp,可使用ppval计算插值

使用csape函数:pp=csape(x, y),可以添加参数选择边界条件

例1:通过实验测得某函数的一组数据如下,试作出其插值函数的图形。

解法一:

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

y=[0,1.2,1.65,2.1,2.15,2.0,1.85,1.65,1.55,1.25];

xi=0:0.1:15;

yi=interp1(x,y,xi, ‘spline’);

yi1=interp1(x,y,xi, ‘linear’);

yi2=interp1(x,y,xi, ‘cubic’);

plot(x,y,’*’,xi,yi,’r-‘,xi,yi1,’b-‘,xi,yi2,’g-‘)

legend(‘节点’,’三次样条插值’,’线性插值’,’立方插值’)

解法二:

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

y=[0,1.2,1.65,2.1,2.15,2.0,1.85,1.65,1.55,1.25];

xx=0: 0.1: 15;

S=csape(x, y);

%Sa=spline(x, y) ;

P=S.coefs;

%Pa=Sa.coefs;

yy=ppval(S,xx);

plot(x,y,’o’,xx,yy,’r’);

关于pp形式:

pp就是分段多项式,百语句形如:

breaks = -5:-1;

coefs = -22:-11;

pp = ppmak(breaks,coefs)

其中:breaks就是各度段的端点值,-5,-4,-3,-2,-1,有问4个区间

coefs就是每段多项式的系数,答共有12个值,12/4=3,则有回4个多项式,每个多项式的最高次答数是3

二、 二元函数插值

网格节点数据插值

函数:interp2

格式:z=interp2(x0, y0, z0, x, y, ’method’)

x0,y0,z0:插值节点坐标,要求x0, y0单调;

x, y是被插值点的横坐标与纵坐标( x, y不能超过x0,y0的范围),z是被插值点的函数值。

Method:(1)nearest 最邻近插值,(2)linear  双线性插值,(3)cubic双三次插值,默认为双线性插值。

例2:要在一山区修建公路,首先测得一些点的高程(见附件,表中数据为坐标点的高程,单位:米,y轴正向为北)绘制该地地貌图。

4800

1350

1370

1390

1400

1410

960

940

880

800

690

570

430

290

210

150

4400

1370

1390

1410

1430

1440

1140

1110

1050

950

820

690

540

380

300

210

4000

1380

1410

1430

1450

1470

1320

1280

1200

1080

940

780

620

450

370

350

3600

1420

1430

1450

1480

1500

1550

1510

1430

1300

1200

980

850

750

550

500

3200

1430

1450

1460

1500

1550

1600

1550

1600

1600

1600

1550

1500

1500

1550

1500

2800

950

1190

1370

1500

1200

1100

1550

1600

1550

1380

1070

900

1050

1150

1200

2400

910

1090

1270

1500

1200

1100

1350

1450

1200

1150

1010

880

1000

1050

1100

2000

880

1060

1230

1390

1500

1500

1400

900

1100

1060

950

870

900

930

950

1600

830

980

1180

1320

1450

1420

1400

1300

700

900

850

840

380

780

750

1200

740

880

1080

1130

1250

1280

1230

1040

900

500

700

780

750

650

550

800

650

760

880

970

1020

1050

1200

830

800

700

300

500

550

480

350

400

510

620

730

800

850

870

850

780

720

650

500

200

300

350

320

0

370

470

550

600

670

690

670

620

580

450

400

300

100

150

250

y/x

0

400

800

1200

1600

2000

2400

2800

3200

3600

4000

4400

4800

5200

5600

解:

A = xlsread(‘新建 XLSX 工作表.xlsx’);

[xx,yy]=size(A);

Z=A([1:xx-1],[2:yy]);

x=0:400:5600;

y=4800:-400:0;

[X,Y]=meshgrid(x,y);

surf(X,Y,Z); %离散图

figure(2);

xi=linspace(0, 5600, 80);

yi=linspace(0, 4800, 80);

[Xi,Yi]=meshgrid(xi, yi);

%%——————————-

Zi=interp2(X,Y,Z,Xi,Yi,’linear’); %二元插值 linear

surf(Xi,Yi,Zi);

%%——————————-

figure(3)

Zi=interp2(X,Y,Z,Xi,Yi,’spline’); %二元插值 spline

surf(Xi,Yi,Zi);

%%——————————-

figure(4)

t=0:100:1600;

[c,h]= contourf(Xi,Yi,Zi,t); %等高线

clabel(c, h)

colormap cool

colorbar

散点数据插值函数

已知n个插值节点(xi, yi, zi), (i=1,2,…,n), 求在点(x,y)处的插值z, matlab提供函数griddata。

格式:cz=griddata(x,y,z,cx,cy,’method’)

其中x,y,z 均为n 维向量,指明所给数据点(插值节点)的横坐标、纵坐标和竖坐标。cx, cy是给定被插值点的横坐标和纵坐标,cz为相应点的竖坐标。

若cx,cy是向量,则给定以它们所确定网格点的横坐标和纵坐标,这时要求cx,cy一个为行向量一个为列向量。 编程时也可先用meshgrid将cx,cy定义成网格矩阵。

例3:在某海域测得一些点(x,y)处的水深z(英尺)如下表,船的吃水深度为5英尺,在矩形区域(75,200)×(-50,150)里那些地方船要避免进入。

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

解:

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

[x1,y1]=meshgrid(75:5:200,150:-5:-50);

z1=griddata(x,y,z,x1,y1,’v4′);

surf(x1,y1,z1)

figure(2)

[c,h]=contourf(x1,y1,z1);

clabel(c,h)

三、 三元函数插值

函数:interp3

格式:v = interp3(x0, y0, z0, v0 , x, y, z ,’method’)

x0,y0,z0,v0为插值数据,x,y,z为被插值的范围,v代表val

虽然三元图像不能直观的画图观察,但是可以通过切割观察剖面,配合slice函数观察切片情况

格式:slice(X,Y,Z,V,sx,sy,sz)

X,Y,Z,V为数据,sx,sy,sz可决定切片形式和位置

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/135963.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • navicat的注册码_navicat密钥注册

    navicat的注册码_navicat密钥注册Navicat相关注册码用户名和组织随便起。注册码如下 –NavicatforSQLServerV10.0.10NAVD-3CG2-6KRN-IEPMNAVL-NIGY-6MYY-XWQENAVI-C3UU-AAGI-57FW -NavicatPremium注册码NAVJ-E6YF-JULL-KKIGNAVE-BOCL-CE3X-TAGYNAVC-KAIA-NU5I-SPOXNAVL-…

    2022年10月13日
    0
  • windows系统如何cmd查看端口被占用、杀进程「建议收藏」

    windows系统如何cmd查看端口被占用、杀进程「建议收藏」首先是启动windows的命令窗口,按键盘上的windows+R,然后在输入框中输入cmd,既可以启动命令窗口 进入windows命令窗口之后,输入命令,输入netstat-ano然后回车,就可以看到系统当前所有的端口使用情况。 通过命令查找某一特定端口,在命令窗口中输入命令中输入netstat-ano|findstr”端口号”,然后回车就可以看到这个端口被哪个应用占用。 查看到对应的进程id之后,就可以通过id查找对应的进程名称,使用命令tasklist|findstr”进程id..

    2022年5月18日
    46
  • Protel99SE教程(一)——原理图封装

    Protel99SE教程(一)——原理图封装  今天我要讲解的是“如何在protel99se中创建一个原理图封装”,下面开始我们的操作:  第一步:新建“Schlib1.Lib”文件。  点击“File”下的“New”,弹出protel99se所能支持的所有文件格式,选中“SchematicLibraryDecument”,点击“OK”,新建“Schlib1.Lib”文件,如图1所示。图1 创建原理图…

    2022年5月30日
    32
  • 微型计算机课设电梯控制8255,东南大学吴健雄学微机课程设计电梯控制器.doc[通俗易懂]

    微型计算机课设电梯控制8255,东南大学吴健雄学微机课程设计电梯控制器.doc[通俗易懂]东南大学吴健雄学微机课程设计电梯控制器东南大学吴健雄学院《微机实验及课程设计》课程设计报告FBIWarning:汇编代码是好几届之前的一个学姐的只是修改了一下后完美运行是我自己写的不需要注明出处,就说是你写的专业:吴健雄学院实验室:计算机硬件实验室组别:同组人员:设计时间:2012年5月17日…

    2022年5月4日
    38
  • linux发邮件2种常见客户端命令[通俗易懂]

    linux发邮件2种常见客户端命令[通俗易懂]mail命令格式:mail-s”标题”邮件地址<文件echo”正文”|mail-s”标题”邮件地址例如:mail-s”liwen”1935845114@qq.com<hostsmutt命令mutt-s”标题”邮件地址<文件命令发邮件需要邮件服务的支持mail默认是调用本机MTA发送邮件的,这意味着需要在本机上安装sendmail或postfixCentos5默认使用Sendmail邮件服务,开启方式/etc/init.d…

    2022年10月20日
    0
  • hdfs的命令_hbase shell命令

    hdfs的命令_hbase shell命令hdfs命令InthislessononApacheHadoopHDFScommands,wewillgothroughthemostcommoncommandswhichareusedforHadoopadministrationandtomanagefilespresentonaHadoopcluster.在本课程中,有关Apach…

    2022年10月4日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号