《数值分析》水塔问题解析Word文档下载推荐.docx
- 文档编号:22351309
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:19
- 大小:310.31KB
《数值分析》水塔问题解析Word文档下载推荐.docx
《《数值分析》水塔问题解析Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《《数值分析》水塔问题解析Word文档下载推荐.docx(19页珍藏版)》请在冰豆网上搜索。
进一步:
可自己增加一些新的计算功能。
【问题假设】
1.水塔中水流量是时间的连续光滑函数,与水泵工作与否无关,并忽略水位高度对水流速度的影响。
2.水泵工作与否完全取决于水塔内水位的高度。
3.水塔为标准的圆柱体。
体积V=PI*D*D*h/4其中D为底面直径,h为水位高。
4.水泵第一次供水时间段为[8.967,10.954],第二次供水时间段为[20.839,22.958]。
【实验数据】
原始数据(单位:
时刻(小时),水塔中水位(米))
时刻t
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
7.006
7.928
8.967
9.9811
10.925
10.954
12.032
8.525
8.388
8.220
泵水
10.820
10.500
12.954
13.875
14.982
15.903
16.826
17.931
19.037
10.210
9.936
9.653
9.409
9.180
8.921
8.662
19.959
20.839
22.015
22.958
23.880
24.986
25.908
8.433
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<
stdio.h>
math.h>
iostream.h>
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):
endl;
cin>
>
s;
switch(s)
{
case'
Y'
:
yongShuiLv();
break;
N'
}
if(s=='
)
}
}
voidApprox(floatx[],floaty[],intm,intn,floata[])
inti,j,t;
float*c=newfloat[(n+1)*(n+2)];
floatpower(int,float);
voidColPivot(float*,int,float[]);
=n;
for(j=0;
j<
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;
*(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;
=n-2;
k=i;
for(j=i+1;
=n-1;
if(fabs(*(c+j*(n+1)+i))>
(fabs(*(c+k*(n+1)+i))))k=j;
if(k!
=i)
for(j=i;
{
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;
p=(*(c+j*(n+1)+i))/(*(c+i*(n+1)+i));
for(t=i;
*(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;
时刻的用水率是:
f<
立方米/小时"
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;
这个居民区的居民一天的用水量约为:
v<
立方米"
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;
该水塔的水泵的工作功率为P="
p<
瓦"
程序运行结果:
实验心得
Excel工具很好很强大,通过代码编程数值分析上的算法辅助处理数据再结合excel来绘图可以得到很多有用的数据图像。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数值分析 数值 分析 水塔 问题 解析