当前位置:文档之家› 计算水塔水流量

计算水塔水流量

一、课程设计目的:1.训练学生灵活应用所学数值分析知识,独立完成问题分析,结合数值分析理论知识,编写程序求解指定问题。

2.初步掌握解决实际问题过程中的对问题的分析、系统设计、程序编码、测试等基本方法和技能;3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;4.训练用数值分析的思想方法和编程应用技能模拟解决实际问题,巩固、深化学生的理论知识,提高学生对数值分析的认知水平和编程水平,并在此过程中培养他们严谨的科学态度和良好的工作作风二、课程设计任务与要求:课程设计题目:计算水塔的水流量【问题描述】某居民区的民用自来水是由一个圆柱形的水塔提供,水塔高12.2米,直径17.4米。

水塔是由水泵根据水塔内水位高低自动加水,一般每天水泵工作两次,现在需要了解该居民区用水规律与水泵的工作功率。

按照设计,当水塔的水位降至最低水位,约8.2米时,水泵自动启动加水;当水位升高到一个最高水位,约10.8米时,水泵停止工作。

可以考虑采用用水率(单位时间的用水量)来反映用水规律,并通过间隔一段时间测量水塔里的水位来估算用水率,原始数据表是某一天的测量记录数据,测量了28个时刻,但是由于其中有3个时刻遇到水泵正在向水塔供水,而无水位记录。

试建立合适的数学模型,推算任意时刻的用水率、一天的总用水量。

进一步:可自己增加一些新的计算功能。

【问题假设】1.水塔中水流量是时间的连续光滑函数,与水泵工作与否无关,并忽略水位高度对水流速度的影响。

2.水泵工作与否完全取决于水塔内水位的高度。

3.水塔为标准的圆柱体。

体积V=PI*D*D*h/4 其中D为底面直径,h为水位高。

4.水泵第一次供水时间段为[8.967,10.954],第二次供水时间段为[20.839,22.958]。

【实验数据】原始数据(单位:时刻(小时),水塔中水位(米))【实现提示】由问题的要求,关键在于确定用水率函数,即单位时间内用水体积,记为f(t),又称水流速度。

如果能够通过测量数据,产生若干个时刻的用水率,也就是f(t)在若干个点的函数值,则f(t)的计算问题就可以转化为插值或拟合问题。

【实现要求】1、在处理每个题目时,要求分别从数据处理阶段和程序设计阶段两个主要阶段实现课程设计,详细的通过文字以及插图等形式,按需求分析、数据处理、算法设计、代码、计算结果和程序执行的截图等若干步骤完成题目,最终写出完整的分析报告。

前期准备工作完备与否直接影响到后序上机调试工作的效率。

在程序设计阶段应尽量利用已有的标准函数,加大代码的重用率。

2、设计的题目要求达到一定工作量,并具有一定的深度和难度。

3、程序设计语言推荐使用C/C++,程序书写规范,源程序需加必要的注释;4、每位同学需提交可独立运行的程序;5、每位同学需独立提交设计报告书(每人一份),要求编排格式统一、规范、内容充实;6、课程设计实践作为培养学生动手能力的一种手段,单独考核。

三、课程设计说明书【需求分析】根据一组关于若干个时刻的水塔内水位高度的数据,经过必要的处理,得到一组若干个时刻的用水率的数据,然后根据这一组数据提出假设,建立合适的数学模型,通过C语言程序将该模型的一些参数求出来,最后得到一条能够拟合这一组若干个时刻的用水率的光滑的函数,进而推算出任意一个时刻的用水率,并计算出一天的总用水量。

如果还有余力可以增加更多的实际计算要求。

【数据处理概要】1.关于原始数据中有三个时刻水泵是在泵水的处理:由问题假设可以知道水塔中水流量是时间的连续光滑函数,与水泵工作与否无关,如果将这三个时刻的数据忽略不计,是不影响设计结果的。

所以设计中忽略这三个时刻的数据。

2.关于确定求解哪些时刻的用水率问题:我采用每两个时刻的中间时刻和这两个时刻之间的时间段内的平均用水率作为最后的若干时刻的用水率。

3.关于数据处理过程中三个无数据时刻的处理:按照处理需要,适当的舍弃边缘的数据和错误的结尾数据(比如要计算两个值的差,最后一项后面已经没有数据了,系统会在该数据后产生一个零,所以是错误的数据)。

【详细设计】本设计报告按照我的设计步骤完成:1、将所给的数据中的时刻输入到Excel表格中,如下图所示:2、计算出每两个相邻的时刻之间的时间差(表格列B(n)= A(n+1)- A(n)),然后除以2(表格列C(n)=B(n)/2)得到相邻两个时刻的中间时刻:3、将原始数据中的水位数据输入到该表格中:4、根据公式:V=PI*D*D*h/4计算各个时刻水塔中水的体积(表格列E(n)=PI*D*D*表格列D(n)/4),然后求出各个时间段内用水的体积(表格列F(n)=D(n+1)-D(n)):5、求中间时刻的用水率,即求该时间段(时刻差)内的平均用水量(表格列G(n)=F(n)/B(n)):6、将中间时刻和中间时刻的用水率复制到另一张表中,以便处理(这时共产生22组数据):到这里所有的数据处理已经结束。

接下来是研究数据所包含的规律,根据数据提出适当的数学模型,拟合一条光滑的连续的曲线。

7、在Excel中有拟合曲线的工具,所以我先用Excel中的工具对这组数据进行了拟合*画出散点图:*确定横纵坐标的意义:*形成散点图:*通过添加趋势线,来拟合光滑曲线:*得到拟合的函数曲线,以及表达式在Excel中就可以很方便的拟合出比较符合要求的曲线,并且可以得到函数表达式。

然后开始尝试利用编程解决这个问题,也就是说用编程的方法得到相同的函数表达式!最小二乘法通常用于曲线拟合,所谓拟合是指已知某函数的若干离散函数值{f1,f2,…,fn},通过调整该函数中若干待定系数f(λ1, λ2,…,λ3), 使得该函数与已知点集的差别(最小二乘意义)最小。

如果待定函数是线性,就叫线性拟合或者线性回归(主要在统计中),否则叫作非线性拟合或者非线性回归。

表达式也可以是分段函数,这种情况下叫作样条拟合。

而插值是指已知某函数的在若干离散点上的函数值或者导数信息,通过求解该函数中待定形式的插值函数以及待定系数,使得该函数在给定离散点上满足约束。

插值函数又叫作基函数,如果该基函数定义在整个定义域上,叫作全域基,否则叫作分域基。

如果约束条件中只有函数值的约束,叫作Lagrange插值,否则叫作Hermite插值。

从几何意义上将,拟合是给定了空间中的一些点,找到一个已知形式未知参数的连续曲面来最大限度地逼近这些点而插值是找到一个(或几个分片光滑的)连续曲面来穿过这些点。

可以看出利用最小二乘法拟合比较方便,我采用的函数形式为多项式函数,最高次为5。

拟合部分代码执行结果如下:经过比较,可以发现在误差允许的范围内通过Excel拟合出来的函数和通过编程而拟合出来的多项式是相统一的。

然后再将该函数应用到Excel中,利用程序代码所求出来的多项式,画出一条光滑连续的曲线,如果这条曲线和最上面在Excel中,纯粹用Excel拟合出来的曲线相同的话表明拟合成功!1、按照递增的顺序,将从0-24的数据输入到Excel中,如下图所示。

并在第二列中输入公式:=-0.00015*A2*A2*A2*A2*A2+0.012193*A2*A2*A2*A2-0.366317*A2*A2*A2+4.760591 *A2*A2-22.665987*A2+66.02523,如下图所示。

将数据填充完毕:利用和上面的相同的方法,直接选择光滑的曲线图,而不是选择散点图:然后就画出了一条曲线:经过比较,可以知道在误差允许的范围内数学模型已经成功建立!到这里该问题的数学模型已经建立好了(采用编程所得的结果进行建模和进一步的计算):f(t)=-0.00015t5+0.012193t4-0.366317t3+4.760591t2-22.665987t+66.025230 最后再通过编程计算任意时刻的用水率、一天的总用水量和水泵的工作功率:任意时刻的用水率的算法简单,只要给出任意时间,根据上面的式子就可以求出;一天的总用水量为上式在0-24内的积分V=∫024f(t)dt=[-0.000025t6+0.0024386t5-0.09157925t4+1.58686367t3-11.3329935t2+6 6.02523t+C]024水泵的工作功率的计算方法是用一次的总泵水量除以泵水时间水泵泵一次水泵水量为:V=2*PI*D*D*(h2-h1)/4=2*3.1415926*17.4*17.4*(10.82-8.22)/4泵水时间为:T=t2-t1=(10.954-8.967)+(22.958-20.839)所以水泵的工作功率为:P=ρVg(h2-h1)/2T其中ρ为水的密度(kg/m3),V为上面的体积(m3),g为重力单位(9.8N/kg)。

然后将程序加以修改,将上述的三个求解功能加进去就完成了本次设计。

最终源代码:#include<stdio.h>#include<math.h>#include<iostream.h>void yongShuiLv();void yongShuiLiang();void gongLv();void Approx(float[],float[],int,int,float[]);void main(){int i;float a[6];//多项式的待定系数个数float x[22]={0.4605,1.382,2.396,3.41,4.4245,5.439,6.453,7.467,8.4475,11.493,12.493,13.4145,14.4285,15.4425,16.3645,17.3785,18.484,19.498,20.399,23.419,24.433,25.447};//22个时刻的值float y[22]={51.12036405,44.10152093,39.3445281,36.88021926,36.08693844,33.01166479,34.61458483,35.33279747,38.44874,70.58616637,74.79205304,70.74232197,60.78930702,62.99681227,58.99594462,55.73472518,55.68433211,59.05993154,57.55529831,59.05993154,50.95438885,44.87523183};//22个时刻所对应的用水率Approx(x,y,22,5,a);for(i=0;i<=5;i++)printf("a[%d]=%f\n",i,a[i]);printf("拟合多项式为:\nf(t)=(%f)*t*t*t*t*t+(%f)*t*t*t*t+(%f)*t*t*t+(%f)*t*t+(%f)*t+(%f)\n",a[5],a[4],a[3],a[2],a[1],a [0]);yongShuiLiang();gongLv();char s;while(1)//通过判断用户输入的字符是Y/N,来控制是否继续求某一时刻的用水率{cout<<"您是否还要查询某时刻的用水率(Y/N):"<<endl;cin>>s;switch(s){case 'Y':yongShuiLv();break;case 'N':break;}if(s=='N')break;}}void Approx(float x[],float y[],int m,int n,float a[]){int i,j,t;float *c=new float[(n+1)*(n+2)];float power(int,float);void ColPivot(float *,int,float[]);for(i=0;i<=n;i++){for(j=0;j<=n;j++){*(c+i*(n+2)+j)=0;for(t=0;t<=m-1;t++)*(c+i*(n+2)+j)+=power(i+j,x[t]);}*(c+i*(n+2)+n+1)=0;for(j=0;j<=m-1;j++)*(c+i*(n+2)+n+1)+=y[j]*power(i,x[j]);}ColPivot(c,n+1,a);delete c;}void ColPivot(float *c,int n,float x[]){int i,j,t,k;float p;for(i=0;i<=n-2;i++){k=i;for(j=i+1;j<=n-1;j++)if(fabs(*(c+j*(n+1)+i))>(fabs(*(c+k*(n+1)+i))))k=j;if(k!=i)for(j=i;j<=n;j++){p=*(c+i*(n+1)+j);*(c+i*(n+1)+j)=*(c+k*(n+1)+j);*(c+k*(n+1)+j)=p;}for(j=i+1;j<=n-1;j++){p=(*(c+j*(n+1)+i))/(*(c+i*(n+1)+i));for(t=i;t<=n;t++)*(c+j*(n+1)+t)-=p*(*(c+i*(n+1)+t));}}for(i=n-1;i>=0;i--){for(j=n-1;j>=i+1;j--)(*(c+i*(n+1)+n))-=x[j]*(*(c+i*(n+1)+j));x[i]=*(c+i*(n+1)+n)/(*(c+i*(n+1)+i));}}float power(int i,float v){float a=1;while(i--)a*=v;return a;}void yongShuiLv()//计算某时刻的用水率函数{float t;cout<<"请输入任意一个时刻,程序将就算出该时刻的用水率"<<endl;cin>>t;floatf=-0.00015*t*t*t*t*t+0.012193*t*t*t*t-0.366317*t*t*t+4.760591*t*t-22.665987*t+66.025230;cout<<t<<"时刻的用水率是:"<<f<<"立方米/小时"<<endl;}void yongShuiLiang()//计算一天居民总的用水量{float v;v=-0.000025*24*24*24*24*24*24+0.0024386*24*24*24*24*24-0.09157925*24*24*24*24 +1.58686367*24*24*24-11.3329935*24*24+66.02523*24;cout<<"这个居民区的居民一天的用水量约为:"<<v<<"立方米"<<endl;}void gongLv()//计算水泵工作功率{float v=3.1415926*17.4*8.7*(10.82-8.22);float t=2*(10.954-8.967)+(22.958-20.839);float p=v*9.8*(10.82-8.22)/t;cout<<"该水塔的水泵的工作功率为P="<<p<<"瓦"<<endl;}程序运行结果:四.课程设计心得这个课程设计很有趣!当然也很好的利用了我们所学的理论知识,更重要的是它将我们的理论知识和生活之极应用结合的很好!通过这次课程设计我不仅更深一层次的认识了理论知识的重要性和应用方法,并且学到了更多的分析问题解决问题的方法!同时学回了Excel 的一些操作技能,使我的知识技能得到了提高!在这次课程设计中我深刻的领悟到使用不同的算法,不同的工具,不同的技术所得到的结果会有很大的差别,比如在这次程序设计中,可以用很多方法来拟合这条函数曲线的!可以用Matlab来编程,也可以用C语言来编程,当然也可以用其他的编程语言来编程!在这些语言的选择方面要综合考虑到方便性、有效性、精确性等个性能指标!另外还可以用诸如Excel等这样的软件来更加方便的来工作,这样可以大大提高工作效率!我深刻的领悟到科技的发展,谁掌握了先进的科技水就会拥有领先地位!谁就有发言权!大家也都会服从!这样的课程设计很好!我可以学到很多,虽然不能一一的截图并列举出来,但在潜移默化中我进步了好多!我所获得的知识最多的就体现在这篇报告的每一步当中。

相关主题