资源描述
实验十四 水塔流量问题
【实验目得】
1.了解有关数据处理得基本概念与原理。
2。初步了解处理数据插值与拟合得基本方法,如样条插值、分段插值等。
3。学习掌握用MATLAB命令处理数据插值与拟合问题。
【实验内容】
某居民区有一供居民用水得圆形水塔,一般可以通过测量其水位来估计水得流量.但面临得困难就是,当水塔水位下降到设定得最低水位时,水泵自动启动向水塔供水,到设定得最高水位时停止供水,这段时间就是无法测量水塔得水位与水泵得供水量。通常水泵每天供水一两次,每次约两小时。水塔就是一个高12、2米、直径17、4米得正圆柱。按照设计,水塔水位降到约8、2米时,水泵自动启动,水位升到约10、8米时水泵停止工作.
某一天得水位测量记录如表1所示,试估计任何时刻(包括水泵正供水时)从水塔流出得水流量,及一天得总用水量。
表1 水位测量启示录(//表示水泵启动)
时刻(h)
水位(cm)
0
968
0、92
948
1、84
931
2、95
913
3、87
898
4、98
881
5、90
869
7、01
852
7、93
839
8、97
822
时刻(h)
水位(cm)
9、98
//
10、92
//
10、95
1082
12、03
1050
12、95
1021
13、88
994
14、98
965
15、90
941
16、83
918
17、93
892
时刻(h)
水位(cm)
19、04
866
19、96
843
20、84
822
22、01
//
22、96
//
23、88
1059
24、99
1035
25、91
1018
【实验准备】
在生产实践与科学研究中,常常遇到这样得问题:由实验或测量得到得一批离散样点,需要确定满足特定要求得曲线或曲面(即变量之间得函数关系或预测样点之外得数据)。如果要求曲线(面)通过所给得所有数据点(即确定一个初等函数通过已知各数据,一般用多项式或分段多项式),这就就是数据插值。在数据较少得情况下,这样做能够取得好得效果.但就是,如果数据较多,那么插值函数就是一个次数很高得函数,比较复杂。如果不要求曲线(面)通过所有得数据点,而就是要求它反映对象整体得变化趋势,可得到更简单实用得近似函数,这就就是数据拟合.函数插值与曲线拟合都就是要根据一组数据构造一个函数作为近似,由于近似得要求不同,二者在数学方法上就是完全不同得.
1。数据插值得基本方法
拉格朗日插值
若知道函数=在互异得两个点与处得函数值与,而想估计该函数在另一点处得函数值,最自然得想法就是作过点(,)与点(,)得直线=,用作为准确值得近似值,如果得到得结果误差太大,还可增加一点得函数值,即已知=在互异得三个点,与处得函数值,与,可以构造过这三点得二次曲线=,用作为准确值得近似值。
一般得,若已知=在互异得+1个点,,…,处得函数值,,…,,则可以考虑构造一个过这+1个点得次数不超过得多项式
=++…++ (1)
通过所有+1个点,即满足
=,=0,1,…, (2)
然后用作为准确值得近似值。这样构造出来得多项式称为得次拉格朗日插值多项式或插值函数。
分段插值
多项式历来都被认为就是最好得逼近工具之一,它插值光滑,但不具有收敛性,会随着节点数目增多而次数升高,一般不宜采用高次多项式(如>7)插值,否则逼近得效果往往就是不理想得,甚至发生龙格振荡(当节点数目不断增大时,在区间中部趋于,但对于区间两端得,并不趋于,也称龙格现象)。
在插值范围较小,用低次插值往往就能奏效。最直观得办法就就是将各数据点用折线连接起来,这种增加节点,用分段低次多项式插值得化整为零得处理方法称作分段插值法,即不去寻求整个插值区间上得一个高次多项式,而就是把区间划分为若干个小区间。如果
=<<…<= (3)
那么分段线性插值公式为
=+,〈≤,=0,1,…, (4)
分段线性插值通常有较好得收敛性与稳定性,算法简单,克服了龙格现象,其缺点就是不如拉格朗日插值多项式光滑。
样条插值
分段线性插值函数在节点得一阶导数一般不存在,且不光滑,这就导致了样条插值函数得提出。在机械制造、航海、航空工业中,经常需要解决下列问题:已知一些数据点(,),(,),(,),如何全部通过这些数据点作一条比较光滑得曲线呢?
绘图员解决了这一问题,首先把数据描绘在平面上,再把一根富有弹性得细直条(称为样条)弯曲,使其一边通过这些数据点,用压铁固定其形状,沿样条边绘出一条光滑得曲线,往往要用几根样条,分段完成上述工作,同时也应让连接点处保持光滑.对绘图员用样条画出得曲线,进行数学模拟,就导出了样条函数得概念。如今已经成为了一个应用极为广泛得数学分支。现在数学上所说得样条,实质上指分段多项式得光滑连接。
设有区间[,]得一个划分如(3)式,称分段函数为次样条函数,若它有:
(1)在每个小区间上得次数不超过多项式;
(2)=
(3)在区间[,]上有—1阶连续得导数;
用样条函数作出得插值称为样条插值,工程上广泛采用三次样条插值。
2.曲线拟合得基本方法
曲线拟合问题就是指:已知平面上个点(,),=0,1,…,,互不相同,寻求函数=,使在某种准则下与所有数据点最为接近,即曲线拟合得最好。
线性最小二乘法就是解决曲线拟合最常用得方法,其基本思路就是,令
=++…+ (5)
其中就是事先选定得一组函数,系数(=0,1,…,,<)待定。寻求,使得残差平方与 = (6)
达到最小。这里得建模原理实质上与实验七中得回归分析就是一致得。
3。数据插值与拟合得MATLAB命令
对于多项式插值与拟合,有一个方便得方法
p = polyfit( x , y , m ) 用m次多项式拟合向量数据(x,y),返回多项式(1)得降冥系数.当m≥n-1时,polyfit实现多项式插值,p返回多项式得系数向量;
y = polyval( p , x ) 求polyfit所得得多项式在x处得插值y,它就是准确值f(x)得近似值;
对于一维与二维插值,其命令格式如下
yi = interp1( x , y , xi , method ) 求解一维插值问题,x,y分别表示数据点得横、纵坐标向量,且x要单调。xi为插值点,它不能走出x得范围.method为可选参数,对应四种插值方法:
最近邻点插值:'nearest’; 线性插值:'linear’;(就是缺省值)
三次样条插值:'spline'; 分段三次插值:'cubic'
ZI = interp2( X , Y , Z , XI , YI , method ) 求解二维插值,X ,Y分别就是m、n维族自变量,均单调递增;Z就是m×n维矩阵,标明相应于所给数据得函数值.向量XI , YI给定网格点得横、纵坐标,ZI返回函数在网格坐标(XI,YI)处得函数值。XI,YI应就是方向不同得向量,即一个就是行向量,一个就是列向量。method得定义与interp1命令中得定义就是一致得;
ZI = griddata( x , y , z , XI , YI , method ) 插值基点为散乱得节点,各参数定义与二维插值中一致,只不过向量x,y散乱无序,同时method方法中多了一种MATLAB提供得网格插值方法V4;
有关上述命令得详细内容可在MATLAB帮助文件中查阅.
对于线性最小二乘拟合,用得较多得就是多项式拟合,使用前面所讲得polyfit命令;若要寻求f(x)任意得非线性函数,则称为非线性最小二乘拟合,MATLAB提供了两个求解命令:curfit与leastsq。二者都要事先定义M-函数文件,但定义方式稍有不同:
c = curvefit( 'fun’ , c0 , xdata , ydata,options) 求含参量非线性函数fun中得参变量c,使残差平方与(6)最小,xdata,ydata为数据点得横、纵坐标向量,c0为参变量得迭代初始值,options见实验一表1(它可以缺省);非线性函数fun得M-函数文件定义方式为:fun( c , xdata);
c = leastsq( ’fun' , c0 , options) 求含参量非线性函数fun中得参变量c,使得各数据点函数值fun得平方与最小,命令中各参数定义与curvefit命令中一致,非线性函数fun得M—函数文件定义方式为:fun( c , xdata , ydata),这里得fun已经与数据点得函数值向量ydata作差;
【实验方法与步骤】
1.引例问题得分析
流量就是单位时间流出得水得体积,由于水塔就是圆柱形,横截面积就是常数,在水泵不工作时段,流量很容易从水位对时间得变化率算出,问题就是如何估计水泵供水时段得流量。
水泵供水时段得流量只能靠供水时段前后得流量拟合得到,作为拟合得原始数据,我们希望水泵不工作时段得流量越准确越好。我们可以考虑先用表中数据拟合水位~时间函数,然后对之求导即可得到各时段得流量。有了任意时刻得流量,就不难计算一天得总用水量.其实,水泵不工作时段得用水量可以由测量记录直接得到,如由某一时段水位下降量乘以水塔得截面积(水塔截面积就是常数=(17、4/2)2=237、8(m2))就得到这一时段得用水量。这个数值可以还可以用来检验拟合效果。
流量就是时间得连续函数,只取决于水位差,与水位本身无关,与水泵就是否工作无关。按照Torricelli定律从小孔流出得液体得速度正比于水面高度得平方根,题目给出水塔得最高与最低水位分别为10、8米与8、2米(设出水口得水位为0),因为=1、15,可以忽略水位对流速得影响。简单起见,计算中将流量定义为单位时间流出得水得高度,即水位对时间变化率得绝对值(水位就是下降得)。
水泵第1次供水时段为=9、0到=11、0(小时),第2次供水时段为=20、8到=23、0(小时)。这就是根据最高与最低水位分别为10、8米与8、2米,及表1得水位测量记录作出得假设,其中前3个时刻直接取自实测数据(精确到0、1小时),最后1个时刻来自每次供水约两小时得已知条件(从记录瞧,第2次供水时段应在记录得22、96小时之后不久结束)。水泵工作时单位时间得供水量大致为常数,这个常数应该大于单位时间得平均流量。
首先考虑拟合水位~时间函数,从表1测量记录瞧,一天有两个供水时段(以下称第1供水时段与第2供水时段),与三个水泵不工作时段(简称第1时段=0到=8、97,第2时段=10、95到=20、84,第3时段=23以后)。对第1、2时段得测量数据可直接分别作多项式拟合,得到水位函数。为使拟合曲线比较光滑,多项式次数不要太高,一般在3~6次。由于第3时段只有3个测量记录,无法对这一时段得水位作出较好得拟合.
接着确定流量~时间函数,对于第1、2时段只需将水位函数求导数即可,对于两个供水时段得流量,则用供水时段前后(水泵不工作时段)得流量拟合得到,并将拟合得到得第2供水时段流量外推,将第3时段流量包含在第2供水时段内。
最后一天总用水量等于两个水泵不工作时段与两个供水时段(将第3时段包含在第2供水时段内)用水量之与,它们都可以由流量对时间得积分再乘以水塔截面积得到.
2.MATLAB命令求解
拟合第1、2时段得水位,并导出流量,t,h为时刻与水位测量记录(水泵启动得4个时刻不输入),程度代码如下:
>> t=[0 0、92 1、84 2、95 3、87 4、98 5、90 7、01 7、93 8、97 10、95 12、03 12、95 13、88 14、98 15、90 16、83 17、93 19、04 19、96 20、84 23、88 24、99 25、91];
>〉 h=[968 948 931 913 898 881 869 852 839 822 1082 1050 1021 994 965 941 918 892 866 843 822 1059 1035 1018];
〉〉 c1=polyfit(t(1:10),h(1:10),3);% 用3次多项式拟合第1时段得水位
〉〉 a1=polyder(c1);% 对拟合得多项式求导数得到第1时段流量
〉> tp1=0:0、1:9;% 对第1时段得时刻进行划分
>> x1=abs(polyval(a1,tp1));% 计算第1时段各时刻得流量
类似地,可计算第2时段各时刻得流量.
>> c2=polyfit(t(11:21),h(11:21),3);
〉> a2=polyder(c2);
〉> tp2=11:0、1:20、8;
>> x2=abs(polyval(a2,tp2));
在第1供水时段(t=9~11)之前(即第1时段)与之后(即第2时段)各取几点,其流量已经得到,用它们拟合水泵第1供水时段得流量。为使流量函数在t=9与t=11连续,我们简单地只取4个点,拟合3次多项式(即曲线必过这4个点),实现如下:
>> xx1=abs(polyval(a1,[8 9]));
〉〉 xx2=abs(polyval(a2,[11 12]));
〉〉 xx12=[xx1,xx2];
〉> c12=polyfit([8 9 11 12],xx12,3);% 拟合水泵供水时段得流量函数
>> tp12=9:0、1:11;
>〉 x12=polyval(c12,tp12); % 计算第1供水时段各时刻得流量
在第2供水时段之前取t=20,20、8两点得流水量,第3时段仅有3个水位记录,我们用差分得到流量,然后用这4个数值拟合第2供水时段得流量:
〉〉 dt3=diff(t(22:24));% 最后3个时刻得两两之差
>〉 dh3=diff(h(22:24));% 最后3个水位得两两之差
>> dht3=-dh3、/dt3;%% 用差分计算t(22)与t(23)得流量
>> t3=[20 20、8 t(22) t(23)];% 取第2时段20,20、8两点与第3时段23、88,24、99两点
>〉 xx3=[abs(polyval(a2,t3(1:2))),dht3]; 取第2时段20,20、8两点与第3时段23、88,24、99两点得流量
>> c3=polyfit(t3,xx3,3)% 拟合出第2水泵供水时段得流量函数
>〉 tp3=20、8:0、1:24;
>> x3=polyval(c3,tp3);% 输出第2供水时段(外推到t=24)各时刻得流量
求第1、2时段与第1、2供水时段流量得积分之与,就就是一天总用水量.虽然诸时段得流量已表示为多项式函数,积分可以解析地算出,这里仍可用数值积分计算:
〉> y1=0、1*trapz(x1)% 第1时段用水量,0、1为积分步长
y1 =
146、1815
>〉 y2=0、1*trapz(x2) % 第2时段用水量
y2 =
258、0441
〉> y12=0、1*trapz(x12) % 第1水泵供水时段用水量
y12 =
50、3990
>〉 y3=0、1*trapz(x3) % 第2水泵供水时段用水量
y3 =
74、9138
>> y=(y1+y2+y12+y3)*237、8*0、01% 总用水量为水位差乘以水塔截面积,0、01就是因为流量单位为厘米
y =
1、2592e+003
【结果分析】
计算出来得各时段用水量可以用测量记录来检验,y1可用第1时段水位测量下降高度为968-822=146来检验,类似地,y2用1082-822=260来检验.
供水时段流量得一种检验方法如下:供水时段用水量加上水位上升值260就是该时段泵入得水量,除以时间长度得到水泵得功率(单位时间泵入水量),而两个供水时段得功率应大致相等。第1、2时段水泵得功率计算如下:
>〉 p1=(y12+260)/2
p1 =
155、1995
>〉 tp2=20、8:0、1:23;
〉> xp2=polyval(c3,tp2);
>〉 p2=(0、1*trapz(x3)+260)/2、2
p2 =
152、2335
可以瞧到,两次水泵泵水得功率差别不大。下面就是水塔一天得流量曲线图:
图14、1 当取三次多项式拟合得流量曲线图
由图14、1我们可以瞧到,流量曲线与原始记录基本上相吻合,但在第1时段与第1泵水时段得交接处曲线不太光滑,这说明我们采用3次曲线通过4点得做法不够好,应该多取几点进行拟合。0点到10点很流量很低,10点到下午3点即中午时间段就是用水高峰期.
【练习与思考】
1.假定某天得气温变化见下表,试找出这一天得气温变化规律:
时刻(h)
0
11
12
温度℃(t)
5
16
8
时刻(h)
8
19
20
21
22
23
24
温度℃(t)
3
24
22
20
18
17
16
2.在化工生产中常常需要知道丙烷在各种温度与压力下得导热系数。下面就是实验得到得一组数据:
(℃)
68
68
87
87
1
(103)
9、7981
13、324
9、0078
13、355
9、7918
14、277
9、6563
12、463
0、0848
0、0897
0、0762
0、0807
0、0696
0、0753
0、0611
0、0651
试求=99(℃)与=10、3(103)下得导热系数。
3.下表给出了某一海域以码为单位得直角坐标为、得水面一点处以英尺为单位得水深,水深数据就是在低潮时测得得。船得吃水深度为5英尺,问在矩形区域(85200)×(-40150)里,哪些地方船要避免进入。
水道测量数据——在低潮测得得水深
129
140
103、5
88
185、5
195
105、5
157、5
107、5
77
81
162
162
117、5
7、5
141、5
23
147
22、5
137、5
85、5
-6、5
-81
3
56、5
-66、5
84
-33、5
4
8
6
8
6
8
8
9
9
8
8
9
4
9
展开阅读全文