数学建模数据之简单处理技巧Mathematica总结文档格式.docx
《数学建模数据之简单处理技巧Mathematica总结文档格式.docx》由会员分享,可在线阅读,更多相关《数学建模数据之简单处理技巧Mathematica总结文档格式.docx(20页珍藏版)》请在冰豆网上搜索。
![数学建模数据之简单处理技巧Mathematica总结文档格式.docx](https://file1.bdocx.com/fileroot1/2023-1/21/a000fb97-12ab-4de9-98cd-e8aac1d53cab/a000fb97-12ab-4de9-98cd-e8aac1d53cab1.gif)
400
800
1200
1600
2000
Y=0
37.0
4.70
5.50
6.00
6.70
6.90
5.10
6.20
7.30
8.00
8.50
8.70
6.50
7.60
8.80
9.70
10.20
10.50
7.40
10.80
11.30
12.50
12.80
8.30
9.80
11.80
13.20
14.50
14.20
10.60
12.30
13.90
15.00
要从(0,0)到(2000,2000)修一条公路,问:
如何选址?
当必须经过某一指定点时,又如何选址?
解:
假设测点选择合理,即山坡表面是充分光滑的曲面,测点之间无山沟与山谷。
第一步,将数据送到data,画图模拟:
Mathematica命令如下:
data={省略};
ListPlot3D[data,ViewPoint->
{*,*,*},AxesLabel->
{x,y,z}]。
例如,可以选视点ViewPoint->
{-1,-1,2}或{-1,1,2}画图做参考。
第二步,画三角剖分面构成的拟合曲面。
打开子程序包
<
DiscreteMath`ComputationalGeometry`
TriangularSurfacePlot[data]
表示为data画一个由三角剖分面构成的拟合曲面(图像略)。
第三步,拟合。
ff=Fit[data,{1,x,x^2,x^3,x^4,y,y^2,y^3,y^4,x*y,x*y^2,x*y^3,x*y^4,
x^2*y,x^2*y^2,x^2*y^3,x^2*y^4,x^3*y,x^3*y^2,x^3*y^3,x^3*y^4,
x^4*y,x^4*y^2,x^4*y^3,x^4*y^4},{x,y}]
程序执行后,得到一个拟合函数ff。
再画ff的图,效果更好。
Plot3D[ff,{x,0,2000},{y,0,2000}]
(图像略)。
例2估计水箱流量(美国大学生MCM1991-A题)
某些州的用水管理机构需估计公众用水速度(单位:
加仑/小时)和每日总用水量的数据。
许多地方没有测量流入或流出市政水箱流量的设备,而只能测量水箱中的水位(误差不超过0.5%)。
当水箱水位某最低水位L时,水泵抽水灌入水箱,直到水位达到最高水位H为止。
但是,也无法测量水泵的流量。
因此,在水泵开动时,无法立即将水箱中的水位和用水量联系起来。
这种情形一天发生一次或两次,每次约为2小时。
估计所有时刻,包括水泵抽水期间流出水箱的流量f(t),并估计一天总用水量。
下表给出某天某小镇的真实数据:
时间(秒)
3316
6635
10619
13937
17921
21240
25223
28543
水位
(英尺)
31.75
31.10
30.54
29.94
29.47
28.92
28.50
27.95
27.52
32284
35923
39332
39435
43118
46636
49953
53936
57754
60574
26.97
水泵开动
35.50
34.45
33.50
32.60
31.67
30.87
30.12
64554
68535
71854
75020
79254
82649
85948
89953
93270
29.27
28.42
27.67
34.75
33.97
33.40
表中给出距开始测量的时间及即时水位。
水箱是高40英尺、直径57英尺的正圆柱。
通常水位低于L=27英尺时,水泵开始抽水,高于H=35.5英尺时,水泵停止工作。
参考解答:
(1)由于水泵开动时,没有水位数据,所以,分段画图观察:
Clear[data]
data={{0,31.35},{3316,31.10},{6635,30.54},{10619,29.94},{13937,29.47},
{17921,28.92},{21240,28.50},{25223,27.95},{28543,27.52},{32284,26.97},
{39435,35.50},{43118,34.45},{46636,33.50},{49953,32.60},{53936,31.67},
{57754,30.87},{60574,30.12},{64554,29.27},{68535,28.42},{71854,27.67},
{75020,26.97},{85948,34.75},{89953,33.97},{93270,33.40}};
ListPlot[data]
图1-1-56
从图上看出,水位函数h(t)是分段线性函数。
分段拟合如下:
拟合后,得到结果:
图1-1-57
图1-1-58
图1-1-59
再画h(t)的图与数据点图比较,将所画4张图放在一起,可见,拟合的非常好。
图1-1-60
(2)水箱中的水量
英尺3,流量
英尺3/秒
于是:
得到:
f1=36.7628英尺3/秒;
f2=60.2972英尺3/秒;
f3=47.1388英尺3/秒;
一天的总用水量大约是:
V=36.7658*32284+60.2972*(85948–39435)
+47.1388*(93270–82649)
=
英尺3。
(3)再进一步就f1、f2、f3的数值,讨论管理机构应该如何操作(略)。
数据处理建模实验例题演示
例1.台湾灾难性地震的数学模型及预测
台湾处于地震多发地带,其大大小小的地震每年都要发生十几次,但由于大多数地震发生在台湾的外海地区,给台湾造成的损失不大,媒体报道,台湾地震专家认为“台湾中部、南部及北部在未来10年或数十年可能会相对平静,但花莲、台东地区发生大地震的可能性越来越高,已经进入地震警戒期”。
资料显示,1900年以来给台湾带来灾难性损失的地震主要有以下几次:
日期
震级
1904,11,6
6.5
1906,3,17
7.1
1935,4,11
1941,12,17
1964,1,18
1986,11,15
6.8
1999,9,21
7.6
2001,12,18
6.7
2002,3,30
7.5
我们很想知道下一次台湾发生灾难性地震的日期与震级。
特做以下数学模型给出预测,所有计算都用Mathematica软件包计算。
1.震级的预测
将震级看作是一个时间序列:
z={6.5,7.1,7.1,7.1,6.5,6.8,7.6,6.7,7.5}。
用Mathematica软件包画图观察,程序如下:
z={6.5,7.1,7.1,7.1,6.5,6.8,7.6,6.7,7.5};
g1=ListPlot[z,PlotJoined->
True]
得到图形:
可以看出图形有震荡,规律性不强。
对数据做累加处理再画图:
zz={6.5,6.5+7.1,6.5+7.1+7.1,6.5+7.1+7.1+7.1,6.5+7.1+7.1+7.1+6.5,
6.5+7.1+7.1+7.1+6.5+6.8,6.5+7.1+7.1+7.1+6.5+6.8+7.6,6.5+7.1+7.1+7.1+6.5+6.8+7.6+6.7,6.5+7.1+7.1+7.1+6.5+6.8+7.6+6.7+7.5};
g2=ListPlot[zz,PlotJoined->
图形具有很强的直线性。
于是,用线性函数模拟并画图如下:
zz={6.5,6.5+7.1,6.5+7.1+7.1,6.5+7.1+7.1+7.1,6.5+7.1+7.1+7.1+6.5,
6.5+7.1+7.1+7.1+6.5+6.8,6.5+7.1+7.1+7.1+6.5+6.8+7.6,
6.5+7.1+7.1+7.1+6.5+6.8+7.6+6.7,
6.5+7.1+7.1+7.1+6.5+6.8+7.6+6.7+7.5};
fz=Fit[zz,{1,x},x];
Print[“fz=”,fz]
g3=Plot[fz,{x,0,9},PlotStyle->
RGBColor[1,0,0]]
Show[g2,g3]
得到zz的图像:
得到拟合函数fz:
fz=-0.469444+7.005x。
拟合函数fz的图像:
把这两个图放在一起:
可见拟合得非常好。
求出预测震级如下:
u=fz/.x->
10;
u–(6.5+7.1+7.1+7.1+6.5+6.8+7.6+6.7+7.5)
6.68056
即,台湾下一次灾难性地震的震级大约为6.7级。
2.地震日期的预测
首先,求出地震日期之间的间隔天数作为时间序列。
打开Mathematica的日历子程序软件包:
<
Miscellaneous`Calendar`
然后计算:
a={DaysBetween[{1904,11,6},{1906,3,17}],
DaysBetween[{1906,3,17},{1935,4,11}],
DaysBetween[{1935,4,11},{1941,12,17}],
DaysBetween[{1941,12,17},{1964,1,18}],
DaysBetween[{1964,1,18},{1986,11,15}],
DaysBetween[{1986,11,15},{1999,9,21}],
DaysBetween[{1999,9,21},{2001,12,18}],
DaysBetween[{2001,12,18},{2002,3,30}]};
Print[“a=”,a]
ListPlot[a,PlotJoined->
a={496,10617,2442,8067,8337,4693,819,102}
图形显示数据的规律性也不强。
因为数据都是正的,对数据做累加处理:
a={496,10617,2442,8067,8337,4693,819,102};
b={496,496+10617,496+10617+2442,496+10617+2442+8067,
496+10617+2442+8067+8337,496+10617+2442+8067+8337+4693,
496+10617+2442+8067+8337+4693+819,
496+10617+2442+8067+8337+4693+819+102};
g1=ListPlot[b,PlotJoined->
图形较平缓的地方说明地震间隔较短,对应灾害地震频发期,图形较陡峭的地方说明地震间隔较长,对应灾害地震休眠期。
[模型1]数据一次累加模型
假设:
台湾已经进入灾害地震休眠期
在这种假设下,图形应该向陡峭发展。
于是做以下拟合:
得到如下结果:
58779.7
这说明拟合函数ff[x]在x=9的值等于58779.7。
再做计算
58779.7–(496+10617+2442+8067+8337+4693+819+102)=23207(天)
即:
在台湾已经进入灾害地震休眠期的假设下,2002年3月30日之后23207天,台湾有可能发生6.7级地震。
打开Mathematica软件包的日历功能:
DaysPlus[{2002,3,30},23207]
{2065,10,12}
结论1:
在台湾已经进入灾害地震休眠期的假设下,2002年3月30日之后23207天,也就是2065年10月12日左右,台湾有可能发生6.7级地震。
[模型2[数据3次累加模型
将数据做3次累加,然后用3次多项式做以下拟合。
程序如下:
得到结果如下:
(1)3次累加数据b3的图像:
(2)通过拟合得到的3次多项式及其图像:
(3)把两个图像合并起来:
可见,拟合的比较好。
(4)数据还原计算:
得到aa如下:
于是,打开Mathematica软件包的日历功能:
DaysPlus[{2002,3,30},4508]
{2014,8,2}
结论2:
在台湾已经进入灾害地震休眠期的假设下,2002年3月30日之后4508天,也就是2014年8月2日左右,台湾有可能发生6.7级地震。
[模型3]假设台湾任然是灾害地震频发期
在这种假设下,图形应该走向平缓。
Statistics`NonlinearFit`
35692.5
119.532
可以看出图形拟合得较好。
另外,求出拟合函数yy[x]在x=9的值等于35692.5。
而且,在台湾任然是灾害地震频发期的假设下,2002年3月30日之后大约120(35692.5–35573=119.5)天,台湾有可能发生6.7级地震。
DaysPlus[{2002,3,30},120]
{2002,7,28}
结论3:
在台湾任然是灾害地震频发期的假设下,2002年3月30日之后120天,也就是2002年7月28日左右,台湾有可能发生6.7级地震。
总结如下:
例2艾滋病患者人数及时间预测。
问题:
某城市新闻媒体报道:
医疗机构发现本城市有9人发作艾滋病,过了3个月,又报道发现11人发作艾滋病,再过3个月又报道有7人发作艾滋病。
请预测一下此城市一共有多少人将发作艾滋病,大约需要多长时间?
我们将尝试用不同的方法为这个问题建立模型。
[模型1]用微积分的方法建立模型。
假设
(1)以上每批病人都在同一天发病,且每月按30天计算;
(2)第t天发病人数为y(t),且y(t)是连续函数;
由上面假设,y(0)=9,y(90)=11,y(180)=7。
在Mathematica软件包中画图观察:
data={{0,9},{90,11},{180,7}};
ListPlot[data,PlotJoined->
True]
执行后得到图像如下:
通过观察图像,我们进一步假设
(3)函数y(t)是一个2次多项式函数。
于是,我们通过数据拟合求函数y(t)。
y=Fit[data,{1,t,t2},t];
Print[“y=”,y]
执行后得到:
y=9+0.0555556t–0.00037037t2
画一下y的图像:
Plot[y,{t,-200,300}]
得到图像如下:
把这个函数图像与数据图像放在一起观察:
求函数y(t)与坐标轴的两个交点,这两个交点分别代表有病人发作的最初时间和最后结束的时间。
Solve[y==0,t]
{{t->
-97.9884},{t->
247.988}}。
负的时间说明最初报道有9人发病之前就有人发病。
这两个时间相减就得到所有病人发病总的持续时间。
247.988–(-97.9884)=345.976(天),即,大约346天。
总的发病病人数=
=2556.38(人)
此城市大约有2557人将发病,发病持续时间大约346天,换句话说,最后一个病人发病距离最初报道9人发病大约248天。
评注:
这个模型简单易懂,但假设不一定合理,需要改进。
改进后的模型如下:
[模型2]仍然用微积分的方法建立模型。
(1)假设第t天发病人数为y(t),且y(t)是连续函数。
因为3个数据只能确定3个未知数,所以令函数y(t)是一个2次多项式函数:
y(t)=ax2+bx+c;
(2)假设报道的病人数都是在一段时间内发现的。
即,从第一个病人发作到第一次报道时间3个月,共有9人发作,后3个月共有11人发作,再3个月共有7人发作。
即
于是在Mathematica软件包中编程如下:
运行后得到结果:
。
求y与x轴的交点,再编程序如下:
a=-1/243000;
b=2/2025;
c=1/15;
y=at2+bt+c;
这两个根代表最初病人的发作时刻和最后病人的发作时刻,二者相减就是发病总时间:
(天)。
求发病的病人总数,编程如下:
29.3707(人)。
此城市大约有30人将发病,发病持续时间大约350天,换句话说,最后一个病人发病距离最初报道9人发病大约
天。
这个模型简单易懂,但假设与结果都不一定合理,需要改进。
进一步的模型如下:
[模型3]应用微分方程方法建立模型。
(1)假设t时刻发病人数为y(t),且y(t)是连续函数;
(2)假设此城市共有K个人感染艾滋病毒,则在t时刻已经感染病毒但没有发作的人数是K–y(t)。
(3)发病速度与y(t)和K–y(t)成正比,假设比例系数为a;
(4)以上每批病人都在同一天发病,且每月按30天计算;
依据假设建立模型如下:
应用分离变量法求解此微分方程。
令
,得到方程组如下:
从后两个方程解出x:
于是,我们得到:
解得:
c=-1,c=
将c=-1代入
得到x=1,
,推出aK=0,不合题意,舍去。
所以,c=
将c=
代入
得到
29.8089(人),即,此城市大约共有30人已经感染艾滋病毒。
将c=
得到x=
即,
,推出a=0.000577977。
于是,a=0.000577977,c=
,
在区间