数值分析家乡温度.docx
- 文档编号:24865050
- 上传时间:2023-06-02
- 格式:DOCX
- 页数:26
- 大小:1.01MB
数值分析家乡温度.docx
《数值分析家乡温度.docx》由会员分享,可在线阅读,更多相关《数值分析家乡温度.docx(26页珍藏版)》请在冰豆网上搜索。
数值分析家乡温度
淮海工学院计算机工程学院
实验报告书
课程名:
《数值分析》
题目:
计算水塔水流量
数值拟合问题
班级:
软件112
学号:
姓名:
课程设计题目1
计算水塔的水流量
一.题目描述
某居民区的民用自来水是由一个圆柱形的水塔提供,水塔高12.2米,直径17.4米,水塔是由水泵根据水塔内水位高低自动加水,一般每天水泵工作两次,现在需要了解该居民区用水规律也水泵的工作功率。
按照设计,当水塔的水位降至最低水位,约为8.2米时,水泵自动启动加水;当水位升高到一个最高水位,约10.8米时,水泵停止工作。
可以考虑采用用水率(单位时间的用水量)来反映用水规律,并通过间隔一段时间测量水塔里的水位来估算用水率,原始数据表式某一天的测量记录数据,测量了28个时刻,但是由于其中有3个时刻遇到水泵正在向水塔供水,而无水位记录。
试建立合适的数学模型,推算任意时刻的用水率、一天的总用水量。
进一步:
可自己增加一些新的计算功能。
原始数据(单位:
时刻(小时),水塔中水位(米))
时刻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)水塔为标准圆柱体。
体积V=π/4*D^2*h,其中D为底面直径,h为水位高。
4)水泵第一次供水时间段为[8.967,10.954],第二次供水时间段为[20.839,22.958]。
2.在Excel中做表格
求出各时刻用水率
用Excel所做的曲线
三.程序代码
#include
#include
usingnamespacestd;
voidmain()
{
inti;
floata[6],t=0.0,s,S=0,p;
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};
floaty[22]={51.12,44.10,39.34,36.88,36.09,33.01,34.61,35.33,38.45,70.59,74.79,70.74,60.79,63.00,59.00,55.73,55.68,59.06,57.56,59.06,50.95,44.88};
voidApprox(float[],float[],int,int,float[]);
Approx(x,y,22,5,a);
printf("**********************计算水塔的水流量********************************\n");
printf("求得的各时刻用水率分别为:
\nf(t)=%ft^5+%ft^4%ft^3+%ft^2%ft+%f\n",a[5],a[4],a[3],a[2],a[1],a[0]);
printf("各时刻用水量如下表\n");
printf("时间(h)\t\t用水量(m^3)\n");
for(i=0;i<24;i++)
{
s=a[5]*t*t*t*t*t+a[4]*t*t*t*t+a[3]*t*t*t+a[2]*t*t+a[1]*t+a[0];
S=s+S;
printf("%f\t%f\n",t,s);
t=t+1.0;
}
printf("************************该程序其他功能*************************\n");
printf("1.请输入你要查询的时刻:
");
scanf("%f",&p);
s=a[5]*p*p*p*p*p+a[4]*p*p*p*p+a[3]*p*p*p+a[2]*p*p+a[1]*p+a[0];
printf("%f时的用水率为:
%f(m^3)\n",p,s);
printf("2.总用水量为:
%f(m^3)\n",S);
system("pause");
}
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-2;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;
}
4.运行结果截图
课程设计题目2
数值拟合问题
1.题目描述
在天气预报网站上获得你家乡所在城市当天24小时的气温变化的数据,认真观察分析其变化趋势,在此基础上运用样条方法求出温度变化的三次样条差值曲线。
然后将该曲线打印出来并与原来的温度变化数据形成的曲线进行比较,给出结论。
写出你研究设计中的心得体会。
2.数据
利用上面数据在Excel中作出如下表格
3.源程序
第一步代码
#include
#include
#include
usingnamespacestd;
constintMAX=50;
floatx[MAX],y[MAX],h[MAX];
floatc[MAX],a[MAX],fxym[MAX];
floatf(intx1,intx2,intx3){
floata=(y[x3]-y[x2])/(x[x3]-x[x2]);
floatb=(y[x2]-y[x1])/(x[x2]-x[x1]);
return(a-b)/(x[x3]-x[x1]);
}
voidcal_m(intn){
floatB[MAX];
B[0]=c[0]/2;
for(inti=1;i B[i]=c[i]/(2-a[i]*B[i-1]); fxym[0]=fxym[0]/2; for(i=1;i<=n;i++) fxym[i]=(fxym[i]-a[i]*fxym[i-1])/(2-a[i]*B[i-1]); for(i=n-1;i>=0;i--) fxym[i]=fxym[i]-B[i]*fxym[i+1]; } voidprintout(intn); intmain() { intn=23,i; cout<<"请输入各时刻温度: "< for(i=0;i<=n;i++) { cout< '; x[i]=i; cin>>y[i]; } for(i=0;i h[i]=x[i+1]-x[i]; floatf0=0,f1=0; c[0]=a[n]=0; fxym[0]=2*f0;fxym[n]=2*f1; for(i=1;i fxym[i]=6*f(i-1,i,i+1); for(i=1;i { a[i]=h[i-1]/(h[i]+h[i-1]); c[i]=1-a[i]; } a[n]=h[n-1]/(h[n-1]+h[n]); cal_m(n); cout<<"\n三次样条插值函数如下列所示: \n"; printout(n); return0; } voidprintout(intn) { ofstreamout("wxl.txt"); intRE=0; cout< for(inti=0;i { cout< ["< out< ["< floatt=fxym[i]/(6*h[i]); if(t>0) { cout< out< } else { cout<<-t<<"*(x-"< out<<-t<<"*(x-"< } t=fxym[i+1]/(6*h[i]); if(t>0) { cout<<"+"< out<<"+"< } else { cout<<"-"<<-t<<"*(x-"< out<<"-"<<-t<<"*(x-"< } cout<<"\n\t"; t=(y[i]-fxym[i]*h[i]*h[i]/6)/h[i]; if(t>0) { cout<<"+"< out<<"+"< } else { cout<<"-"<<-t<<"*("< out<<"-"<<-t<<"*("< } t=(y[i+1]-fxym[i+1]*h[i]*h[i]/6)/h[i]; if(t>0) { cout<<"+"< out<<"+"< } else { cout<<"-"<<-t<<"*(x-"< out<<"-"<<-t<<"*(x-"< } cout< } cout< } 第二步代码 #include #include #include #include usingnamespacestd; voidmain() { doubles=0; ofstreamout("wxl2.txt"); for(doublex=0;x<=23;x=x+0.1) { if(x>=0&&x<1) { s=pow(0.332964*(x-0),3)+22*(1-x)+20.667*(x-0); cout< out< } if(x>=1&&x<2) { s=pow(0.332964*(2-x),3)-pow(0.331855*(x-1),3)+20.667*(2-x)+21.3319*(x-1); cout< out< } if(x>=2&&x<3) { s=pow(0.331855*(x-3),3)-pow(0.00554533*(x-2),3)+21.3319*(3-x)+20.0055*(x-2); cout< out< } if(x>=3&&x<4) { s=pow(0.00554533*(x-4),3)+pow(0.354036*(x-3),3)+20.0055*(4-x)+18.646*(x-3); cout< out< } if(x>=4&&x<5) { s=pow(0.354036*(5-x),3)-pow(0.410598*(x-4),3)+18.646*(5-x)+19.4106*(x-4); cout< out< } if(x>=5&&x<6) { s=pow(0.410598*(x-6),3)+pow(0.288357*(x-5),3)+19.4106*(6-x)+17.7116*(x-5); cout< out< } if(x>=6&&x<7) { s=pow(0.288357*(7-x),3)+pow(0.257168*(x-6),3)+17.7116*(7-x)+17.7428*(x-6); cout< out< } if(x>=7&&x<8) { s=pow(0.257168*(8-x),3)-pow(0.317031*(x-7),3)+17.7428*(8-x)+19.317*(x-7); cout< out< } if(x>=8&&x<9) { s=pow(0.317031*(x-9),3)+pow(0.010957*(x-8),3)+19.317*(9-x)+18.989*(x-8); cout< out< } if(x>=9&&x<10) { s=pow(0.010957*(10-x),3)+pow(0.273203*(x-9),3)+18.989*(10-x)+18.7268*(x-9); cout< out< } if(x>=10&&x<11) { s=pow(0.273203*(11-x),3)-pow(0.10377*(x-10),3)+18.7268*(11-x)+20.1038*(x-10); cout< out< } if(x>=11&&x<12) { s=pow(0.10377*(x-12),3)+pow(0.141878*(x-11),3)+20.1038*(12-x)+20.8581*(x-11); cout< out< } if(x>=12&&x<13) { s=pow(0.141878*(13-x),3)-pow(0.463741*(x-12),3)+20.8581*(13-x)+22.4637*(x-12); cout< out< } if(x>=13&&x<14) { s=pow(0.463741*(x-14),3)-pow(0.286914*(x-13),3)+22.4637*(14-x)+21.2869*(x-13); cout< out< } if(x>=14&&x<15) { s=pow(0.286914*(x-15),3)+pow(0.611395*(x-14),3)+21.2869*(15-x)+18.3886*(x-14); cout< out< } if(x>=15&&x<16) { s=pow(0.611395*(16-x),3)-pow(0.158668*(x-15),3)+18.3886*(16-x)+19.1587*(x-15); cout< out< } if(x>=16&&x<17) { s=pow(0.158668*(x-17),3)+pow(0.0232766*(x-16),3)+19.1587*(17-x)+18.9767*(x-16); cout< out< } if(x>=17&&x<18) { s=pow(0.0232766*(18-x),3)+pow(0.0655617*(x-17),3)+18.9767*(18-x)+18.9344*(x-17); cout< out< } if(x>=18&&x<19) { s=pow(0.0655617*(19-x),3)-pow(0.285523*(x-18),3)+18.9344*(19-x)+19.2855*(x-18); cout< out< } if(x>=19&&x<20) { s=pow(0.285523*(x-20),3)+pow(0.0765321*(x-19),3)+19.2855*(20-x)+17.9235*(x-19); cout< out< } if(x>=20&&x<21) { s=pow(0.0765321*(21-x
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数值 分析 家乡 温度