《数值分析》水塔问题解析.docx

上传人:b****7 文档编号:9215217 上传时间:2023-02-03 格式:DOCX 页数:19 大小:310.31KB
下载 相关 举报
《数值分析》水塔问题解析.docx_第1页
第1页 / 共19页
《数值分析》水塔问题解析.docx_第2页
第2页 / 共19页
《数值分析》水塔问题解析.docx_第3页
第3页 / 共19页
《数值分析》水塔问题解析.docx_第4页
第4页 / 共19页
《数值分析》水塔问题解析.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

《数值分析》水塔问题解析.docx

《《数值分析》水塔问题解析.docx》由会员分享,可在线阅读,更多相关《《数值分析》水塔问题解析.docx(19页珍藏版)》请在冰豆网上搜索。

《数值分析》水塔问题解析.docx

《数值分析》水塔问题解析

淮海工学院计算机工程学院

实验报告书

课程名:

《数值分析》

题目:

水塔问题

班级:

学号:

姓名:

 

一、课程设计目的:

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]。

【实验数据】

原始数据(单位:

时刻(小时),水塔中水位(米))

时刻t

0

0.921

1.843

2.949

3.871

4.978

5.900

水位h

9.677

9.479

9.308

9.125

8.982

8.814

8.686

时刻t

7.006

7.928

8.967

9.9811

10.925

10.954

12.032

水位h

8.525

8.388

8.220

泵水

泵水

10.820

10.500

时刻t

12.954

13.875

14.982

15.903

16.826

17.931

19.037

水位h

10.210

9.936

9.653

9.409

9.180

8.921

8.662

时刻t

19.959

20.839

22.015

22.958

23.880

24.986

25.908

水位h

8.433

8.220

泵水

10.820

10.591

10.354

10.180

【实现提示】

由问题的要求,关键在于确定用水率函数,即单位时间内用水体积,记为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)=A(n)+B(n)/2)得到相邻两个时刻的中间时刻:

3、将原始数据中的水位数据输入到该表格中:

4、根据公式:

V=PI*D*D*h/4计算各个时刻水塔中水的体积(表格列E(n)=PI*D*D*D(n)/4),然后求出各个时间段内用水的体积(表格列F(n)=D(n)-D(n+1)):

5、求中间时刻的用水率,即求该时间段(时刻差)内的平均用水量(表格列G(n)=F(n)/B(n)):

6、将中间时刻和中间时刻的用水率复制到另一张表中,以便处理(这时共产生22组数据):

到这里所有的数据处理已经结束。

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

 

7、在Excel中有拟合曲线的工具,所以我先用Excel中的工具对这组数据进行了拟合

画出散点图:

通过添加趋势线,来拟合光滑曲线:

对数据拟合如图像上图,使用多项式趋势线可以较合理的描述出数据的走向,用Excel很容易得出单位时间内用水体积的表达式为

y=-0.0001x5+0.0104x4-0.3254x3+4.3588x2-21.169x+64.71

用Excel对该系列数据拟合之后,尝试用程序对该数据进行计算,通过最小二乘法,最高次为5次,得出的各项系数如下

经过比较,发现通过程序算得的数据与excel所得的表达式在可接受的误差范围之内。

将该系数替换原先表达式的系数,即:

y=-0.00015x5+0.012193x4-0.366317x3+4.760591x2–22.665987x+66.025230

并在excel中生成相应图像:

与之前的图像进行对比,发现两张图的趋势相差无几,如此可以得到任意时刻的用水率的表达式为

f(x)=-0.00015x5+0.012193x4-0.366317x3+4.760591x2–22.665987x+66.025230,

要求一天的用水量,则对f(x)进行积分:

V=∫024f(t)dt

=[-0.000025t6+0.0024386t5-0.09157925t4+1.58686367t3-11.3329935t2+66.02523t+C]|024即可求的一天的用水总量.

 

程序源代码:

#include

#include

#include

voidyongShuiLv();

voidyongShuiLiang();

voidgongLv();

voidApprox(float[],float[],int,int,float[]);

voidmain()

{

inti;

floata[6];//多项式的待定系数个数

floatx[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个时刻的值

floaty[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();

chars;

while

(1)//通过判断用户输入的字符是Y/N,来控制是否继续求某一时刻的用水率

{

cout<<"您是否还要查询某时刻的用水率(Y/N):

"<

cin>>s;

switch(s)

{

case'Y':

yongShuiLv();

break;

case'N':

break;

}

if(s=='N')

break;

}

}

voidApprox(floatx[],floaty[],intm,intn,floata[])

{

inti,j,t;

float*c=newfloat[(n+1)*(n+2)];

floatpower(int,float);

voidColPivot(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);

deletec;

}

voidColPivot(float*c,intn,floatx[])

{

inti,j,t,k;

floatp;

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));

}

}

floatpower(inti,floatv)

{

floata=1;

while(i--)a*=v;

returna;

}

voidyongShuiLv()//计算某时刻的用水率函数

{

floatt;

cout<<"请输入任意一个时刻,程序将就算出该时刻的用水率"<

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<

"<

}

voidyongShuiLiang()//计算一天居民总的用水量

{

floatv;

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<<"这个居民区的居民一天的用水量约为:

"<

}

voidgongLv()//计算水泵工作功率

{

floatv=3.1415926*17.4*8.7*(10.82-8.22);

floatt=2*(10.954-8.967)+(22.958-20.839);

floatp=v*9.8*(10.82-8.22)/t;

cout<<"该水塔的水泵的工作功率为P="<

}

程序运行结果:

实验心得

Excel工具很好很强大,通过代码编程数值分析上的算法辅助处理数据再结合excel来绘图可以得到很多有用的数据图像。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 行政公文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1