MATLAB作业4参考答案

MATLAB 作业四参考答案

1、 用y?sin(10t2?3)在(0,3)区间内生成一组较稀疏的数据,并用一维数据插值的方法对给出的数据进行曲线拟合,并将结果与理论曲线相比较。

【求解】类似于上面的例子,可以用几乎一致的语句得出样本数据和插值效果。 >> t=0:0.2:3;

y=sin(10*t.^2+3); plot(t,y,'o')

ezplot('sin(10*t^2+3)',[0,3]); hold on x1=0:0.001:3; y1=interp1(t,y,x1,'spline'); plot(x1,y1)

由于曲线本身变换太大,所以在目前选定的样本点下是不可能得出理想插值效果的,因为样 本数据提供的信息量不够。为了得到好的插值效果,必须增大样本数据的信息量,对本例来 说,必须在快变化区域减小样本点的步长。 >> hold off

t=[0:0.1:1,1.1:0.04:3]; y=sin(10*t.^2+3); plot(t,y,'o') ezplot('sin(10*t^2+3)',[0,3]); hold on x1=0:0.001:3; y1=interp1(t,y,x1,'spline'); plot(x1,y1)

2、 用f(x,y)?1?x2?y422esin(xy?xy)原型函数生成一组网络数据或随机数据,分别拟合出曲33x?y面,并和原曲面进行比较。 【求解】由下面的语句可以直接生成一组网格数据,用下面语句还可以还绘制出给定样本点是三维表面图。

>> [x,y]=meshgrid(0.2:0.2:2);

z=exp(-x.^2-y.^4).*sin(x.*y.^2+x.^2.*y)./(3*x.^3+y); surf(x,y,z)

选择新的密集网格,则可以通过二元插值得出插值曲面。对比插值结果和新网格下的函数值精确解,则可以绘制出绝对插值误差曲面。由插值结果可见精度是令人满意的。 >> [x1,y1]=meshgrid(0.2:0.02:2); z1=interp2(x,y,z,x1,y1,'spline'); surf(x1,y1,z1)

>> z0=exp(-x1.^2-y1.^4).*sin(x1.*y1.^2+x1.^2.*y1)./(3*x1.^3+y1); surf(x1,y1,abs(z1-z0))

现在假设已知的样本点不是网格形式分布的,而是随机分布的,则可以用下面语句生成样本点,得出分布的二维、三维示意图。

>> x=0.2+1.8*rand(400,1); y=0.2+1.8*rand(400,1); % 仍生成(0.2,2) 区间的均匀分布随机数

z=exp(-x.^2-y.^4).*sin(x.*y.^2+x.^2.*y)./(3*x.^3+y); plot(x,y,'x')

figure, plot3(x,y,z,'x')

利用下面的语句可以得出三维插值结果,同时可以绘制出插值的绝对误差曲面,可见插值结果还是很好的,但由于边界样本点信息不能保证,所以不能像网格数据那样对(0.2,2) 区域,而只能选择(0.3,1.9) 区域进行插值。

>> [x1,y1]=meshgrid(0.3:0.02:1.9); z1=griddata(x,y,z,x1,y1,'v4'); surf(x1,y1,z1)

>> z0=exp(-x1.^2-y1.^4).*sin(x1.*y1.^2+x1.^2.*y1)./(3*x1.^3+y1); surf(x1,y1,abs(z1-z0))

3、 假设已知一组数据,试用插值方法绘制出x?(?2,4.9)区间内的光滑函数曲线,比较各种插值算法

的优劣。 xi yi xi yi -2 -1.7 -1.4 -1.1 -0.8 -0.5 -0.2 0.1 0.4 0.7 1 1.3 .10289 .11741 .13158 .14483 .15656 .16622 .17332 .1775 .17853 .17635 .17109 .16302 1.6 1.9 2.2 2.5 2.8 3.1 3.4 3.7 4 4.3 4.6 4.9 .15255 .1402 .12655 .11219 .09768 .08353 .07015 .05786 .04687 .03729 .02914 .02236 【求解】用下面的语句可以立即得出给定样本点数据的三次插值与样条插值,得出的结果如,可见,用两种插值方法对此例得出的结果几乎一致,效果均很理想。

>> x=[-2,-1.7,-1.4,-1.1,-0.8,-0.5,-0.2,0.1,0.4,0.7,1,1.3,... 1.6,1.9,2.2,2.5,2.8,3.1,3.4,3.7,4,4.3,4.6,4.9];

y=[0.10289,0.11741,0.13158,0.14483,0.15656,0.16622,0.17332,... 0.1775,0.17853,0.17635,0.17109,0.16302,0.15255,0.1402,... 0.12655,0.11219,0.09768,0.08353,0.07019,0.05786,0.04687,... 0.03729,0.02914,0.02236]; x0=-2:0.02:4.9;

y1=interp1(x,y,x0,'cubic'); y2=interp1(x,y,x0,'spline'); plot(x0,y1,':',x0,y2,x,y,'o')

4、 假设已知实测数据由下表给出,试对(x,y)在(0.1,0.1)~(1.1,1.1)区域内的点进行插值,并用三维曲面

的方式绘制出插值结果。 yi 0 0.1 0.2 0.3 0.4 x1 0.1 .83041 .83172 .83587 .84286 x2 0.2 .82727 .83249 .84345 .86013 x3 0.3 .82406 .83584 .85631 .88537 x4 0.4 .82098 .84201 .87466 .91865 x5 0.5 .81824 .85125 .89867 .95985 x6 0.6 .8161 .86376 .9284 1.0086 x7 0.7 .81481 .87975 .96377 1.0642 x8 0.8 .81463 .89935 1.0045 1.1253 x9 0.9 .81579 .92263 1.0502 1.1904 x10 1 .81853 .94959 1.1 1.257 x11 1.1 .82304 .9801 1.1529 1.3222 0.5 0.6 0.7 0.8 0.9 1 1.1 .85268 .86532 .88078 .89904 .92006 .94381 .97023 .88251 .91049 .94396 .98276 1.0266 1.0752 1.1279 .92286 .96847 1.0217 1.082 1.1482 1.2191 1.2929 .97346 1.0383 1.1118 1.1922 1.2768 1.3624 1.4448 1.0336 1.118 1.2102 1.3061 1.4005 1.4866 1.5564 1.1019 1.2046 1.311 1.4138 1.5034 1.5684 1.5964 1.1764 1.2937 1.4063 1.5021 1.5661 1.5821 1.5341 1.254 1.3793 1.4859 1.5555 1.5678 1.5032 1.3473 1.3308 1.4539 1.5377 1.5573 1.4889 1.315 1.0321 1.4017 1.5086 1.5484 1.4915 1.3156 1.0155 .61268 1.4605 1.5335 1.5052 1.346 1.0454 .62477 .14763 【求解】直接采用插值方法可以解决该问题,得出的插值曲面。 >> [x,y]=meshgrid(0.1:0.1:1.1);

z=[0.83041,0.82727,0.82406,0.82098,0.81824,0.8161,0.81481,0.81463,0.81579,0.81853,0.82304;

0.83172,0.83249,0.83584,0.84201,0.85125,0.86376,0.87975,0.89935,0.92263,0.94959,0.9801; 0.83587,0.84345,0.85631,0.87466,0.89867,0.9284,0.96377,1.0045,1.0502,1.1,1.1529; 0.84286,0.86013,0.88537,0.91865,0.95985,1.0086,1.0642,1.1253,1.1904,1.257,1.3222; 0.85268,0.88251,0.92286,0.97346,1.0336,1.1019,1.1764,1.254,1.3308,1.4017,1.4605; 0.86532,0.91049,0.96847,1.0383,1.118,1.2046,1.2937,1.3793,1.4539,1.5086,1.5335; 0.88078,0.94396,1.0217,1.1118,1.2102,1.311,1.4063,1.4859,1.5377,1.5484,1.5052; 0.89904,0.98276,1.082,1.1922,1.3061,1.4138,1.5021,1.5555,1.5573,1.4915,1.346; 0.92006,1.0266,1.1482,1.2768,1.4005,1.5034,1.5661,1.5678,1.4889,1.3156,1.0454; 0.94381,1.0752,1.2191,1.3624,1.4866,1.5684,1.5821,1.5032,1.315,1.0155,0.62477; 0.97023,1.1279,1.2929,1.4448,1.5564,1.5964,1.5341,1.3473,1.0321,0.61268,0.14763]; [x1,y1]=meshgrid(0.1:0.02:1.1); z1=interp2(x,y,z,x1,y1,'spline'); surf(x1,y1,z1)

axis([0.1,1.1,0.1,1.1,min(z1(:)),max(z1(:))])

其实,若光需要插值曲面而不追求插值数值的话,完全可以直接采用MATLAB 下的shading interp 命令来实现。可见,这样的插值方法更好,得出的插值曲面更光滑。 >> surf(x,y,z); shading interp

5、 习题3和4给出的数据分别为一元数据和二元数据,试用分段三次样条函数和B样条函数对其进行

拟合。

【求解】先考虑习题4,相应的三次样条插值和B-样条插值原函数与导数函数分别为: >> x=[-2,-1.7,-1.4,-1.1,-0.8,-0.5,-0.2,0.1,0.4,0.7,1,1.3,... 1.6,1.9,2.2,2.5,2.8,3.1,3.4,3.7,4,4.3,4.6,4.9];

y=[0.10289,0.11741,0.13158,0.14483,0.15656,0.16622,0.17332,... 0.1775,0.17853,0.17635,0.17109,0.16302,0.15255,0.1402,... 0.12655,0.11219,0.09768,0.08353,0.07019,0.05786,0.04687,... 0.03729,0.02914,0.02236];

S=csapi(x,y); S1=spapi(6,x,y); fnplt(S); hold on; fnplt(S1) >> Sd=fnder(S); Sd1=fnder(S1); fnplt(Sd), hold on; fnplt(Sd1)

再考虑习题5 中的数据,原始数据不能直接用于样条处理,因为meshgrid() 函数产生的数据格式与要求的ndgrid() 函数不一致,所以需要对数据进行处理,其中需要的x 和y 均应该是向量,而z 是原来z

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4