基于递归数列的湖水污染浓度与时间函数关系的建模与求解概述.docx
《基于递归数列的湖水污染浓度与时间函数关系的建模与求解概述.docx》由会员分享,可在线阅读,更多相关《基于递归数列的湖水污染浓度与时间函数关系的建模与求解概述.docx(19页珍藏版)》请在冰豆网上搜索。
基于递归数列的湖水污染浓度与时间函数关系的建模与求解概述
基于递归数列的湖水污染浓度与时间函数关系的建模与求解
材料成型及其控制工程孟园园
材料成型及其控制工程邢裕杰
材料成型及其控制工程缪聪
摘要
随着工业的不断发展,人们的生活水平不断提高,日益恶化环境质量引起了人们的广泛关注,越来越多的人意识到居住环境对健康生活的重要性!
一个地区被污染的程度往往由其被污染的时间的长短来直接体现。
在本模型中,我们通过递归数列的知识,建立一个数学模型来刻画湖水中污染浓度c的随污染时间n的变化关系,并通过Mathematic软件绘画出湖水污染浓度c与污染时间n二维函数图象。
在模型的基础上,我们通过VC++语言编写程序,根据测得的湖水污染浓度c的数据,通过VC++可视化软件推测湖水被污染的时间。
关键词:
湖水污染浓度递归数列污染时间程序设计
问题重述
一个淡水湖受到上游化工厂污染影响。
化工厂的污水以一定流量a(立方米/天)进入湖中且污染物质迅速均匀混合于湖水中,湖水以同样流量a流出从而湖水体积b(立方米)一直保持不变。
湖水污染程度用每立方米湖水所含污染物质的克数描述,称为污染浓度c(克/立方米)。
设化工厂的污水浓度为k(克/立方米),试建立一个数学模型来刻画湖中污染浓度c的变化。
要求写出解的表达式并说明怎样利用模型推测湖水受到了多长时间的污染。
问题分析
由题意可知,目的是建立一个模型来解决湖中湖水污染浓度c随污染时间n的变化关系,并根据建立的模型,通过测得的湖水的污染浓度c来推测湖水被污染的时间n。
所以我们可以将此问题拆分成两个问题:
问题一:
湖水污染浓度c与污染时间n的函数变化关系;
问题二:
利用建立的模型推测湖水被污染的时间;
问题一中,我们可以从分别计算第一天、第二天、第三天的湖水污染浓度
、
、
中,递归出一半的湖水污染浓度c随污染时间n的函数变化关系,在这个问题中,我们顺理成章的想到了通过利用递归数列的原理去寻找湖水污水浓度c与污染时间n的一般函数关系。
问题二中,通过测得的湖水污染浓度c,让人工去缩小区间、一一对应地寻找湖水被污染的时间是比较困难,也不太现实,所以我们采用VC++编程的方法,利用VC++语言编写程序,通过编写好的程序,按要求输入数据,VC++可视化软件就会输出湖水被污染的时间。
最后,我们根据网上提供的资料以及自己的生活经验,寻找模型的缺点,完善我们的模型。
问题假设
1、化工厂排放的污水每天以一定的流量a立方米流入湖中且每天各个时段流入湖中的速率相同。
2、湖中湖水每天以一定的流量a立方米流出湖且每天各个时段流出湖的速率相同,从而湖水每天的体积b立方米保持不变。
3、化工厂排放的污水浓度每天都为k(克/立方米),保持不变。
4、污染物质进入湖水后能迅速均匀和湖水混合。
符号说明
a:
流量,
b:
湖水体积,
c:
湖水的污染浓度,
k:
污水浓度,
n:
污染的时间,
:
第n天流入a立方米的污水后的污染浓度。
:
第n天湖水的污染浓度。
模型的建立与求解
问题一
湖水污染浓度c与污染时间n的函数模型,我们可以根据递归数列的知识进行求解。
第一天,化工厂排放的a立方米的污水流入湖中,污水中含污染物为a*k克,此时湖水的污染浓度为
(克/立方米),而此时又有a立方米的湖水从湖中流出,流出的湖水中含有的污染物为
克,此时湖中剩余的污染物为
克,从而可以得出第一天湖水的污染浓度
(克/立方米).
第二天,流入湖水的化工厂污水也为a立方米,污水中含污染物为a*k克,湖中污染物变为
克,从而湖水的污染浓度为
(克/立方米),而此时湖中又有a立方米的湖水流出,流出的湖水中所含有的污染物为
克,湖中此时剩余的污染物为
克,从而可以得出第二天湖水的污染浓度
(克/立方米).
第三天,又有a立方米化工厂污水排入湖中,污水中含污染物为a*k克,从而湖中污染物为
克,此时湖水的污染浓度为
(克/立方米),与此同时又有a立方米的湖水流出湖中,流出的湖水中含有的污染物为
克,湖中剩余的污染物变为
克,从而可以得出第三天湖水的污染浓度
(克/立方米).
从已建立的第一、第二、第三天的污染浓度
、
、
,通过数列的递归原理,我们归纳出两个一般表达式:
·····················
(1)
·····················
(2)
将
(2)式代入
(1)式整理可得:
······(3)
将(3)式变形得:
·············(4)
所以数列{
}在(n>1)时是首项为
,公比为
的等比数列,根据等比数列通项求法,我们可以得出:
,所以湖水污染浓度c与污染时间n的函数变化关系为:
。
现在我们将变量定量化,通过Mathematic软件对抽象模型具体化,建立湖水污染浓度c和污染时间n的二维图和表格。
我们不妨假设污水流量a为500立方米,湖水的体积为100000立方米,化工厂的污水浓度k为0.5克/立方米,建立的二维函数图象如下:
图1:
天数n从0到100
图2:
天数n从0到500
图3:
天数n从0到1000
图4:
天数n从0到1500
图5:
天数n从0到2000
表1:
天数n从0到100
天数
0
10
20
30
40
50
浓度
0
0.024326
0.0474685
0.0694851
0.0904306
0.110357
天数
60
70
80
90
100
浓度
0.129314
0.147349
0.164506
0.180828
0.196357
表2:
天数n从0到500
天数
0
50
100
150
200
250
浓度
0
0.110357
0.196357
0.263375
0.315601
0.356301
天数
300
350
400
450
500
浓度
0.388017
0.412733
0.431994
0.447004
0.458701
表3:
天数n从0到1000
天数
0
100
200
300
400
500
浓度
0
0.196357
0.315601
0.388017
0.431994
0.458701
天数
600
700
800
900
1000
浓度
0.47492
0.484769
0.49075
0.494383
0.496589
表4:
天数n从0到1500
天数
0
150
300
450
600
750
浓度
0
0.263375
0.388017
0.447004
0.47492
0.488131
天数
900
1050
1200
1350
1500
浓度
0.494383
0.497342
0.497342
0.499405
0.499718
表5:
天数n从0到2000
天数
0
200
400
600
800
1000
浓度
0
0.315601
0.431994
0.47492
0.49075
0.496589
天数
1200
1400
1600
1800
2000
浓度
0.498742
0.499536
0.499829
0.499937
0.499977
问题二
通过已建立的模型,我们利用VC++可视化编程编写了一套程序,通过输入化工厂每天的污水流量a立方米、湖水的体积b立方米、污水的浓度k克/立方米和通过测量得到的湖水污染浓度c克/立方米,电脑可以迅速输出湖水被污染的时间。
程序如下:
#include
#include
classA
{
doublea,b,c,k,n;//a:
流量,b:
湖水体积,c:
污染浓度,k:
污水浓度
intyear;
public:
A(doublex,doubley,doublez,doublew)
{
a=x;
b=y;
c=z;
k=w;
n=0;
}
intfun()//
{
n=(log(1-c/k))/(log(b/(a+b)));
n=n*10+0.5;
year=n/10;
returnyear;
}
};
voidmain()
{
doubleo,p,q,r;
intyear;
cout<<"请输入"<cout<<"流量a"<<''<<"湖水体积b"<<''<<"污染浓度"<<''<<"污水浓度”<cin>>o>>p>>q>>r;
Aa(o,p,q,r);
cout<<"year="<}
模型的评价
本模型运用了基本的数列递归的思想,能够很好地反映出湖水污染浓度c与污染时间n函数变化关系,通俗易懂,能为大多数人所接受。
为本模型设计的一个VC++程序可以很好地解决当知道污水流量a、湖水体积b、污水浓度k和湖水污染浓度c后推测湖水被污染的时间,程序中加入了类的编程,扩大了其应用范围,适用程度高。
但本模型也存在许多缺点,首先它建立在一个相对理想的环境下,对生活中事件发生的变化性却不能很好地把握。
其次,它破坏了时间的连续性和事件发生的连续性,将污水流入与流出的连续状态破坏,割裂了流入和流出的同时性。
为了解决这个问题,我们参考了网上微分的思想改进我们的模型。
我们取一个很小的时间段
,此时间段里增加的湖水污染浓度为
,湖水中增加的污染物为
,因为所取的时间段很小,湖水中增加的污染物也可以表示为
,所以整理可得微分方程为:
·······································(5)
根据微分方程求解的方法将可以(5)式解得
,从而我们可以建立湖水污染浓度c与污染时间n的函数关系:
。
我们利用原模型设置的定量和Mathematic软件导出函数图形和表格如图;
表6:
天数n从0到100
图7:
天数n从0到500
图8:
天数n从0到1000
图9:
天数n从0到1500
图10:
天数n从0到2000
表6:
天数n从0到100
天数
0
10
20
30
40
50
浓度
0
0.0243853
0.0475813
0.069646
0.0906346
0.1106
天数
60
70
80
90
100
浓度
0.129591
0.147656
0.16484
0.181186
0.196735
表7:
天数n从0到500
天数
0
50
100
150
200
250
浓度
0
0.1106
0.196735
0.263817
0.31606
0.356748
天数
300
350
400
450
500
浓度
0.388435
0.413113
0.432332
0.4473
0.458958
表8:
天数n从0到1000
天数
0
100
200
300
400
500
浓度
0
0.196735
0.31606
0.388435
0.432332
0.458958
天数
600
700
800
900
1000
浓度
0.475106
0.484901
0.490842
0.494446
0.496631
表9:
天数n从0到1500
天数
0
150
300
450
600
750
浓度
0
0.263817
0.388435
0.4473
0.475106
0.488241
天数
900
1050
1200
1350
1500
浓度
0.494446
0.497376
0.498761
0.499415
0.499723
表10:
天数n从0到2000
天数
0
200
400
600
800
1000
浓度
0
0.31606
0.432332
0.475106
0.490842
0.496631
天数
1200
1400
1600
1800
2000
浓度
0.498761
0.499544
0.499832
0.499938
0.499977
将原程序稍作修改,我们的程序可以适应于改进的模型
程序如下:
#include
#include
classA
{
doublea,b,c,k,n;//a:
流量,b:
湖水体积,c:
污染浓度,k:
污水浓度
intyear;
public:
A(doublex,doubley,doublez,doublew)
{
a=x;
b=y;
c=z;
k=w;
n=0;
}
intfun()
{
n=b*log(k/(k-c))/a;
n=n*10+0.5;
year=n/10;
returnyear;
}
};
voidmain()
{
doubleo,p,q,r;
intyear;
cout<<"请输入"<cout<<"流量a"<<''<<"湖水体积b"<<''<<"污染浓度"<<''<<"污水浓度"<cin>>o>>p>>q>>r;
Aa(o,p,q,r);
cout<<"year="<}
通过原模型与改进后的模型向比较,二维的函数图象几乎一样,从图像的变化趋势上看,湖水污染浓度c与污染时间n的函数是一条类似于幂函数的单调递增的凸函数,当污染时间n=1300天左右时,湖水的污染浓度几乎达到了化工厂排放的污水浓度,由此可以看出不到4年的时间,一家化工厂可以将一条清澈的湖变成一条与其排放污水浓度一样的污水河。
从二维数据表中对应数据的比较,我们可以发现其数据之间含有很小的偏差,通过理论分析,利用微分的思想对时间连续性的影响较小,所以其精确度更高。
通过本模型的建立,递归数列的思想应该重点掌握,并能够很好地应用与实际生活中,微元的思想值得推广。
参考文献
东华大学数学建模试题A
附录
原模型与改进后的模型都适用的程序代码:
#include
#include
classA
{
doublea,b,c,k,n;//a:
流量,b:
湖水体积,c:
污染浓度,k:
污水浓度
intyear;
public:
A(doublex,doubley,doublez,doublew)
{
a=x;
b=y;
c=z;
k=w;
n=0;
}
intfun1()//原模型的求污染时间的函数
{
n=(log(1-c/k))/(log(b/(a+b)));
n=n*10+0.5;
year=n/10;
returnyear;
}
intfun2()//改进后模型求污染时间的函数
{
n=b*log(k/(k-c))/a;
n=n*10+0.5;
year=n/10;
returnyear;
}
};
voidmain()
{
doubleo,p,q,r;
intyear;
cout<<"请输入"<cout<<"流量a"<<''<<"湖水体积b"<<''<<"污染浓度"<<''<<"污水浓度"<cin>>o>>p>>q>>r;
Aa(o,p,q,r);
cout<<"year="<cout<<"year="<}