实验目的 | 熟悉MATLAB软件进行一维插值、二维插值运算,会进行多项式拟合、一般非线性拟合。 |
实验内容 | 1.通过实验收集了某材料在各种温度T和压力P下的导热系数K(见下表),试求T=100℃,P=10.3×10³KPa下的K。
2.下表给出某海域直角坐标系Oxy上的点(x,y)的水深z.若某船的吃水深度为5,则在矩形区域(75,200)×(-50,150)里哪些地方船要避免进入?
|
实 验 步 骤、过 程:
1、
>> p2=[9.0078,13.355];k2=[0.0762,0.0807];%T=87℃
>> p3=[9.7918,14.277];k3=[0.0696,0.0753];%T=106℃
>> a2=polyfit(p2,k2,1);a3=polyfit(p3,k3,1);
>> x1=polyval(a2,10.3);x2=polyval(a3,10.3);
>> %xl,x2分别是P=10.3(10³kPa)下87℃和106℃时的k值
>> x=[87,106];y=[x1,x2];
>> a=polyfit(x,y,1);%求解多项式的系数
>> z=polyval(a,100)%求解多项式z在x=100下对应的值
2、
>> x=[129 140 103.5 88 185.5 195 105.5 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];
>> [Xi,Yi] = meshgrid(75:0.5:200,-50:0.5:150);
>> Zi = griddata(x,y,z,Xi,Yi,'cubic');
>> mesh(Xi,Yi,Zi);
>> figure(2)
>> v = contour(Xi,Yi,Zi,[-5,-5],'r');
%等高线图红色区域为危险区域,船只要避免进入
>> clabel(v);
>> hold on
>> plot(x,y,'*')
>> xlabel('X'),ylabel('Y')
3、
>> x=1:0.5:10;
>> y=x.^3-5*x.^2+2*x+3;
>> y0=y+rand;
>> f1=polyfit(x,y0,1);%输出多项式系数
>> y1=polyval(f1,x);
>> plot(x,y,'+',x,y1)
>> grid on
>> title('一次拟合曲线')
>> figure(2);
>> f2=polyfit(x,y0,2);%2次多项式拟合
>> y2=polyval(f2,x);
>> plot(x,y,'+',x,y2);
>> grid on
>> title('二次拟合曲线');
>> figure(3);
>> f3=polyfit(x,y0,3);%3次多项式拟合
>> y3=polyval(f3,x);
>> plot(x,y,'+',x,y3);
>> grid on
>> title('三次拟合曲线');
>> figure(4);
>> f4=polyfit(x,y0,4);%4次多项式拟合
>> y4=polyval(f4,x);
>> plot(x,y,'+',x,y4);
>> grid on
>> title('四次拟合曲线');
运行后,比较拟合后多项式和原式的系数,发现四次多项式系数与原系数比较接近,四次多项式的四次项系数很小。作图后,发现一次和二次多项式的图形与原函数的差别比较大,属于欠拟合的情况,而四次多项式符合得比较好。
4、
方法一:用命令lsqcurvefit
程序代码:
M函数文件voltage1.m:
function V = voltage1(x,t)
V = 10 - (10 - x(1))*exp(-t/x(2))
在程序中调用此函数:
>> t = [0.5,1,2,3,4,5,7,9];
>> v = [6.36,6.48,7.26,8.22,8.66,8.99,9.43,9.63];
>> x0 = [0,0.1];
>> x = lsqcurvefit(‘voltage1’,x0,t,v)
>> v = voltage1(x,t)
方法二:用命令lsqnonlin
程序代码:
M函数文件voltage2.m:
function V = voltage2(x,t)
t = [0.5,1,2,3,4,5,7,9];
v = [6.36,6.48,7.26,8.22,8.66,8.99,9.43,9.63];
V = 10 - (10 - x(1))*exp(-t/x(2))
在程序中调用此函数:
>> x0 = [0,0.1];
>> x = lsqnonlin('voltage2',x0)
方法三:用命令polyfit
在程序中调用此函数:
>> V = 10;
>> t = [0.5,1,2,3,4,5,7,9];
>> v = [6.36,6.48,7.26,8.22,8.66,8.99,9.43,9.63];
>> y = log(V - v);
>> x = polyfit(t,y,1)
>> T = 1/x(1)
>> V0 = V - exp(x(2))
方法四:利用三次样条插值估计给定值
程序代码:
M函数文件chazhi.m:
t = [0.5,1,2,3,4,5,7,9];
v = [6.36,6.48,7.26,8.22,8.66,8.99,9.43,9.63];
T = interp1(t,v,[0.8,1.5,2.5,3.5,4.5,6.8],'spline')
5、
在程序中调用此函数:
>> f = inline('exp(-(x-t(1)).^2/2/t(2).^2)/(sqrt(2*pi)*t(2))','t','x');
>> 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.07015,0.05786,0.04687,0.03729,0.02914,0.02236];
>> t=lsqcurvefit(f,[1,1],x,y)
>> x0=-0.2:0.02:5;y0=f(t,x0);
>> plot(x0,y0,x,y,'o')
注意:x与y行数和列数要对应,不然会一直报错。比如我原先x分成两行写,y分成4行写(因为x数字短,y数字长,为了看起来工整且省空间),这样就一直报错Function value and YDATA sizes are not equal.
答案供参考,如有错误请自行改正,本人只是随意分享之前的作业,代码均来源于网络+个人稍微修改,认为有用可参考哈~