2010 年上数学建模期末考试试卷
题目:居民区供水问题
姓名:
学号:
班级:
联系方式: (伍)
(周)
(曹)
分工:
摘要、问题分析、模型假设:
编 MATLAB 程序部分,符号说明:
结果分析,检验及改进:
模型的优缺点及文字录入:
完善阶段:
摘 要:
居民供水问题是贴近生活的实际问题。为了有效的利用和节约水资源,我们应该采取
积极有效的办法,用所采集数据信息通过建立数学模型,来切实的解决居民的用水率、总用
水量以及水泵工作的效率等问题。例如:某居民区的民用自来水是由圆柱形水塔提供,已知
水塔高 12.2 米,直径 17.4 米.水塔是由水泵根据水塔内水位高低自动加水,一般每天水泵工
作两次..按照设计,当水塔的水位降至最低水位,约 8.2 米,水泵自动启动加水;当水位升高
到一个最高水位, 约 10.8 米,水泵停止工作。
现在需要了解居民区用水规律与水泵的工作功率。
可以考虑采用用水率(单位时间的用水量)来反映用水规律,并通过间隔一段时间测量水
塔里的水位来估算用水率。
为了解决此类问题,我们主要采用 matlab 中的数据插值以及数据拟合等方法。
因此我们在生产实践和科学研究中,如果遇到这样的问题:由实验或测量得到的一批离
散样点,需要确定满足特定要求的曲线或曲面(即变量之间的函数关系或预测样点之外的数
据)。如果要求曲线(面)通过所给的所有数据点(即确定一个初等函数通过已知各数据,
一般用多项式或分段多项式),这就是数据插值。在数据较少的情况下,这样做能够取得好
的效果。
但是,如果数据较多,那么插值函数是一个次数很高的函数,比较复杂。如果不要求曲
线(面)通过所有的数据点,而是要求它反映对象整体的变化趋势,可得到更简单实用的近
似函数,这就是数据拟合。
函数插值和曲线拟合都是要根据一组数据构造一个函数作为近似,由于近似的要求不
同,二者在数学方法上是完全不同的。
获得的基本结果:(1)任意时刻的用水率;
第 一 段 时 间 :0.2211
0.1467
第 二 段 时 间 :0.3311
0.2392
0.1437
0.1426
0.2508
0.2435
0.1547
0.2377
0.1977
0.1784
0.1607
0.1505
0.1686
0.3092
0.2902
0.2742
0.2610
0.2392
(2)一天的用水总量;
1.2578e+003
(3)水泵的工作功率(m³/h)
第一段:1.5614
第二段:1.1851
关键字:插值、拟合、用水率、总用水量、工作功率。
(一)、问题分析
居民区的民用自来水是由圆柱形水塔提供,水塔高 12.2 米,直径 17.4 米.水塔是由水泵
根据水塔内水位高低自动加水,一般每天水泵工作两次.现在需要了解居民区用水规律与水
泵的工作功率.按照设计,当水塔的水位降至最低水位,约 8.2 米,水泵自动启动加水;当水位
升高到一个最高水位, 约 10.8 米,水泵停止工作。
可以考虑采用用水率(单位时间的用水量)来反映用水规律,并通过间隔一段时间测量水
塔里的水位来估算用水率,表 1 是某一天的测量记录数据,测量了 28 个时刻,但是由于其中有
3 个时刻遇到水泵正在向水塔供水,而无水位记录(表 1 中用//表示)。
表 1 原始数据(单位:时刻(小时),水塔中水位(米))
时刻 t
水位
时刻 t
水位
时刻 t
水位
时刻 t
水位
0
9.677
7.006
8.525
12.954
10.210
19.959
8.433
0.921
9.479
7.928
8.388
1.843
9.308
8.967
8.220
2.949
9.125
3.871
8.982
9.9811
10.925
//
//
13.875
14.982
15.903
16.826
9.936
9.653
20.839
22.015
8.220
//
9.409
22.958
10.820
9.180
23.880
10.597
4.978
8.814
10.954
10.820
17.931
8.921
24.986
10.354
5.900
8.686
12.032
10.500
19.037
8.662
25.908
10.180
流量是时间的连续函数,只取决于水位差,与水位本身无关,与水泵是否工作无关。按
照 Torricelli 定律从小孔流出的液体的速度正比于水面高度的平方根,题目给出水塔的最高
和最低水位分别为 10.8 米和 8.2 米(设出水口的水位为 0),因为
2.8/8.10
=1.15,可以
忽略水位对流速的影响。
要推算任意时刻的用水率,只要推算出任意时刻的水流量即可。而流量只要知道水流出
来的体积与时间即可,水塔是圆柱形,横截面积是常数,在不供水阶段很容易求出。因此关
键是如何估计供水时段的流量。在水泵工作时段的流量我们只能用不供水时段的拟合得出,
首先用表中数据拟合水位~时间函数,然后对之求导即可得到任意时段的流量。
求出了任意时段的用水率,一天的总用水量也迎刃而解。水泵的工作效率在供水时段
求出,而居民每天的总供水都是由水泵供水,所以水泵工作效率就是一天总供水量与水泵工
作时间的商。
(二)、模型假设
1.假设忽略水位对流速的影响;
2.假设每次水泵供水时水流量都是均匀的;
3.假设忽略采集数据元素的误差;
4.假设水泵工作的时候对居民的供水流量无影响。
(三)、符号说明
t1——第一阶段水流量的时间段;
t2——第二阶段水流量的时间段;
t3——第三阶段水流量的时间段;
t4——第二时段 19.959,20.839 两点和第 3 时段 23.880,24.986 两点;
h1——第一阶段水位高度变化段;
h2——第二阶段水位高度变化段;
h3——第三阶段水位高度变化段;
a1——第一时段的流量;
x1——第一时刻各时刻的流量;
x12——第一供水时段各时刻的流量;
x3——第二供水时段各时刻的流量;
xx3——第 2 时段 20,20.8 两点和第 3 时段 23.88,24.99 两点的流量;
y1——第一时段用水量;
y2——第二时段用水量;
y12——第一水泵供水时段用水量;
y3——第二水泵供水时段用水量;
y——总用水量;
p1——第一时段水泵功率;
p2——第二时段水泵功率;
dt3——两点时刻差分值;
dh3——两点水位差分值;
(四)、相关知识
1.数据插值的基本方法
拉格朗日插值
若知道函数 y = )(xf 在互异的两个点 0x 和 1x 处的函数值 0y 和 1y ,而想估计该函数在
)(1 xL
另一点处的函数值,最自然的想法是作过点( 0x , 0y )和点( 1x , 1y )的直线 y =
,
作为准确值的近似值,如果得到的结果误差太大,还可增加一点 )(xf 的函数值,
用
即已知 y = )(xf 在互异的三个点 0x , 1x 和 2x 处的函数值 0y , 1y 和 2y ,可以构造过这三
点的二次曲线 y =
)(f 的近似值。
作为准确值
)(1 L
,用
)(2 L
)(2 xL
一般的,若已知 y = )(xf 在互异的 n +1 个点 0x , 1x ,…, nx 处的函数值 0y , 1y ,…,
ny ,则可以考虑构造一个过这 n +1 个点的次数不超过 n 的多项式
am 1 + ma
)(xLn = mxa0 +
1
mxa
1
+…+
x
通过所有 n +1 个点,即满足
( k
n xL
)(f 的近似值。这样构造出来的多项式
= ky ,k =0,1,…,n
作为准确值
然后用
)
)(nL
)(xLn
(1)
(2)
)(xLn 称为 )(xf 的 n 次
拉格朗日插值多项式或插值函数。
分段插值
多项式历来都被认为是最好的逼近工具之一,它插值光滑,但不具有收敛性,会随着节
点数目增多而次数升高,一般不宜采用高次多项式(如 m >7)插值,否则逼近的效果往往
)(xLn 在区间中部趋于 )(xf ,
是不理想的,甚至发生龙格振荡(当节点数目 n 不断增大时,
但对于区间两端的 x ,
)(xLn 并不趋于 )(xf ,也称龙格现象)。
在插值范围较小,用低次插值往往就能奏效。最直观的办法就是将各数据点用折线连接
起来,这种增加节点,用分段低次多项式插值的化整为零的处理方法称作分段插值法,即不
去寻求整个插值区间上的一个高次多项式,而是把区间划分为若干个小区间。如果
a = 0x < 1x <…< nx =b
(3)
那么分段线性插值公式为
)(xP =
x
x
1
i
i
x
i
x
y
i
1
+
x
x
i
x
i
x
1
i
1
y
i
, 1ix < x ≤ ix ,i =0,1,…, n
(4)
分段线性插值通常有较好的收敛性和稳定性,算法简单,克服了龙格现象,其缺点是不如拉
格朗日插值多项式光滑。
样条插值
分段线性插值函数在节点的一阶导数一般不存在,且不光滑,这就导致了样条插值函数
的提出。在机械制造、航海、航空工业中,经常需要解决下列问题:已知一些数据点( 0x ,
0y ),( 1x , 1y ),( nx , ny ),如何全部通过这些数据点作一条比较光滑的曲线呢?
绘图员解决了这一问题,首先把数据描绘在平面上,再把一根富有弹性的细直条(称为
样条)弯曲,使其一边通过这些数据点,用压铁固定其形状,沿样条边绘出一条光滑的曲线,
往往要用几根样条,分段完成上述工作,同时也应让连接点处保持光滑。对绘图员用样条画
出的曲线,进行数学模拟,就导出了样条函数的概念。如今已经成为了一个应用极为广泛的
数学分支。现在数学上所说的样条,实质上指分段多项式的光滑连接。
设有区间[ a ,b ]的一个划分如(3)式,称分段函数 )(xS 为 k 次样条函数,若它有:
(1) )(xS 在每个小区间上的次数不超过 k 多项式;
(2)
(3) )(xS 在区间[ a ,b ]上有 k -1 阶连续的导数;
)(xS i = iy
用样条函数作出的插值称为样条插值,工程上广泛采用三次样条插值。
2.曲线拟合的基本方法
曲线拟合问题是指:已知平面上 n 个点( ix , iy ),i =0,1,…, n , ix 互不相同,
寻求函数 y = )(xf ,使 )(xf 在某种准则下与所有数据点最为接近,即曲线拟合得最好。
线性最小二乘法是解决曲线拟合最常用的方法,其基本思路是,令
(5)
)(xrk 是事先选定的一组函数,系数 ka ( k =0,1,…, m , m < n )待定。寻求 ka ,
+…+
+
)(22
xra
ra mm
)(x
)(xf =
)(11
xra
其中
使得残差平方和
n
Q =
i
1
(
(
ixf
)
2
i )y
(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 为可选参数,
对应四种插值方法:
线性插值:'linear';(是缺省值)
分段三次插值:'cubic'
最近邻点插值:'nearest';
三次样条插值:'spline';
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 测量记录看,一天有两个供水时段(以下称第 1
供水时段和第 2 供水时段),和三个水泵不工作时段(简称第 1 时段t =0 到t =8.967,第 2
时段 t =10.954 到t =20.839,第 3 时段 t =22.958 以后)。对第 1、2 时段的测量数据可直接
分别作多项式拟合,得到水位函数。为使拟合曲线比较光滑,多项式次数不要太高,一般在
3~6 次。由于第 3 时段只有 3 个测量记录,无法对这一时段的水位作出较好的拟合。
接着确定流量~时间函数,对于第 1、2 时段只需将水位函数求导数即可,对于两个供
水时段的流量,则用供水时段前后(水泵不工作时段)的流量拟合得到,并将拟合得到的第
2 供水时段流量外推,将第 3 时段流量包含在第 2 供水时段内。
最后一天总用水量等于两个水泵不工作时段和两个供水时段(将第 3 时段包含在第 2
供水时段内)用水量之和,它们都可以由流量对时间的积分再乘以水塔截面积得到。
利用 MATLAB 命令求解如下:
拟合第 1、2 时段的水位,并导出流量,t,h 为时刻和水位测量记录(水泵启动的 4 个
时刻不输入),程度代码如下:
>> t1=[0 0.921 1.843 2.949 3.871 4.978 5.900 7.006 7.928 8.967];
>> h1=[9.677 9.479 9.308 9.125 8.982 8.814 8.686 8.525 8.388 8.220];
>> c1=polyfit(t1,h1,3);
% 用 3 次多项式拟合第 1 时段的水位
>> a1=polyder(c1);
% 对拟合的多项式求导数得到第 1 时段流量
>> t1=0:0.1:9;
% 对第 1 时段的时刻进行划分
>> x1=abs(polyval(a1,t1));
% 计算第 1 时段各时刻的流量
类似地,可计算第 2 时段各时刻的流量。
>> t2=[10.954 12.032 12.954 13.875 14.982 15.903 16.826 17.931 19.037 19.959
20.839];
>> h2=[10.820 10.500 10.210 9.936 9.653 9.409 9.180 8.921 8.662 8.433 8.220];
>> c2=polyfit(t2,h2,3);
>> a2=polyder(c2);
>> t2=11:1:20.8;
>> x2=abs(polyval(a2,t2));
在第 1 供水时段(t=8~9)之前(即第 1 时段)和之后(即第 2 时段)各取几点,其
流量已经得到,用它们拟合水泵第 1 供水时段的流量。为使流量函数在 t=8 和 t=9 连续,
我们简单地只取 4 个点,拟合 3 次多项式(即曲线必过这 4 个点),实现如下:
>> xx1=abs(polyval(a1,[8 9]));
>> xx2=abs(polyval(a2,[1 2]));
>> xx12=[xx1,xx2];
>> c12=polyfit([8 9 1 2],xx12,3);
% 拟合水泵供水时段的流量函数
>> t12=9:0.1:11;
>> x12=polyval(c12,t12);
% 计算第 1 供水时段各时刻的流量
在第 2 供水时段之前取 t=20,20.8 两点的流水量,第 3 时段仅有 4 个水位记录,我们
用差分得到流量,然后用这 4 个数值拟合第 2 供水时段的流量:
>>t3=[22.958 23.880 24.986 25.908];
>> h3=[10.820 10.597 10.354 10.180];
>> dt3=diff(t3(1:4));
% 最后 3 个时刻的两两之差
>> dh3=diff(h3(1:4));
% 最后 3 个水位的两两之差
>> dht3=-dh3./dt3;
% 用差分计算 t3(1)和 t3(2)的流量
>> t4=[19.959 20.839 23.880 24.986];
% 取第 2 时段 19.959,20.839 两点和第 3 时段 23.880,24.986 两点
>> xx3=[abs(polyval(a2,t4(1:2))),dht3];
% 取第 2 时段 20,20.8 两点和第 3 时段 23.88,24.99 两点的流量
>> [X Y]=meshgrid(t4,xx3);
>> c3=polyfit(X,Y,3);
% 拟合出第 2 水泵供水时段的流量函数
>> t3=20.8:0.1:24;
>> x3=polyval(c3,tp3);
% 输出第 2 供水时段(外推到 t=24)各时刻的流量
求第 1、2 时段和第 1、2 供水时段流量的积分之和,就是一天总用水量。虽然诸时段的
流量已表示为多项式函数,积分可以解析地算出,这里仍可用数值积分计算:
水塔截面积是常数: S =(17.4/2)2=237.8(m2))
>> y1=0.1*trapz(x1)
% 第 1 时段用水量,0.1 为积分步长
y1 =
1.4606
>> y2=0.1*trapz(x2)
% 第 2 时段用水量
y2 =
2.5815
>> y12=0.1*trapz(x12)
% 第 1 水泵供水时段用水量
y12 =
0.5228
>> y3=0.1*trapz(x3)
% 第 2 水泵供水时段用水量
y3 =
0.7246
>> y=(y1+y2+y12+y3)*237.8
% 总用水量为水位差乘以水塔截面积
y =
1.2578e+003
p1=(y12+2.6)/2
>>
% p1 为第一时段水泵的功率
p1 =
1.5614
>> t2=20.8:0.1:23;
>>x2=polyval(c3,t2);
>>p2=(0.1*trapz(x3)+2.6)/2.2
%为第二时段水泵的功率
p2 =
1.185
(五)、结果分析、检验及改进
某一时段水位下降量乘以水塔的截面积(水塔截面积是常数 S =(17.4/2)2=237.8
(m2))就得到这一时段的用水量。这个数值可以还可以用来检验拟合效果。
计算出来的各时段用水量可以用测量记录来检验,y1 可用第 1 时段水位测量下降高度
为 9.68-8.220=1.46 来检验,类似地,y2 用 10.820-8.22=2.6 来检验。
依据第一、第二两段时间内的流量情况绘出流量与时间的点关系图(流量曲线图):