数学建模选修大作业精选文档.docx
《数学建模选修大作业精选文档.docx》由会员分享,可在线阅读,更多相关《数学建模选修大作业精选文档.docx(9页珍藏版)》请在冰豆网上搜索。
![数学建模选修大作业精选文档.docx](https://file1.bdocx.com/fileroot1/2023-1/26/997ea312-1964-4867-8916-6727e94103f9/997ea312-1964-4867-8916-6727e94103f91.gif)
数学建模选修大作业精选文档
TTMSsystemofficeroom【TTMS16H-TTMS2A-TTMS8Q8-TTMSHHJ8】
数学建模选修大作业精选文档
中华女子学院
2014—2015学年第二学期期末考试
(论文类)
论文题目数学建模算法之蒙特卡罗算法
课程代码01
课程名称数学建模
学号9
姓名陈可心
院系计算机系
专业计算机科学与技术
考试时间2015年5月27日
一、数学建模十大算法
1、蒙特卡罗算法
该算法又称随机性模拟算法,是通过计算机仿真来解决问题的算法,同时可以通过模拟可以来检验自己模型的正确性,是比赛时必用的方法。
接下来本文将着重介绍这一算法。
2、数据拟合、参数估计、插值等数据处理算法
比赛中通常会遇到大量的数据需要处理,而处理数据的关键就在于这些算法,通常使用Matlab作为工具。
3、线性规划、整数规划、多元规划、二次规划等规划类问题
建模竞赛大多数问题属于最优化问题,很多时候这些问题可以用数学规划算法来描述,通常使用Lindo、Lingo软件实现。
这个也是我们数学建模选修课时主要介绍的问题,所以对这方面比较熟悉,也了解了Lindo、Lingo软件的基本用法。
4、图论算法
这类算法可以分为很多种,包括最短路、网络流、二分图等算法,
涉及到图论的问题可以用这些方法解决,上学期数据结构课程以及离散数学课程中都有介绍。
它提供了对很多问题都很有效的一种简单而系统的建模方式。
5、动态规划、回溯搜索、分治算法、分支定界等计算机算法
这些算法是算法设计中比较常用的方法,很多场合可以用到竞赛中
6、最优化理论的三大非经典算法:
模拟退火法、神经网络、遗传算法
这些问题是用来解决一些较困难的最优化问题的算法,对于有些问题非常有帮助,但是算法的实现比较困难,需慎重使用。
7、网格算法和穷举法
网格算法和穷举法都是暴力搜索最优点的算法,在很多竞赛题中有应用,当重点讨论模型本身而轻视算法的时候,可以使用这种暴力方案,最好使用一些高级语言作为编程工具。
8、一些连续离散化方法
很多问题都是实际来的,数据可以是连续的,而计算机只认的是离散的数据,因此将其离散化后进行差分代替微分、求和代替积分等思想是非常重要的。
9、数值分析算法
如果在比赛中采用高级语言进行编程的话,那一些数值分析中常用的算法比如方程组求解、矩阵运算、函数积分等算法就需要额外编写库函数进行调用。
10、图象处理算法
赛题中有一类问题与图形有关,即使与图形无关,论文中也应该要不乏图片的,这些图形如何展示以及如何处理就是需要解决的问题,通常使用Matlab进行处理。
二、蒙特卡罗方法
算法简介
蒙特·卡罗方法(MonteCarlomethod),也称统计模拟方法,1946年,美国拉斯阿莫斯国家实验室的三位科学家JohnvonNeumann,StanUlam和NickMetropolis共同发明了,蒙特卡罗方法。
此算法被评为20世纪最伟大的十大算法之一。
是二十世纪四十年代中期由于科学技术的发展和电子计算机的发明,而被提出的一种以概率统计理论为指导的一类非常重要的数值计算方法。
是指使用来解决很多计算问题的方法。
由于传统的经验方法由于不能逼近真实的物理过程,很难得到满意的结果,而蒙特卡罗方法由于能够真实地模拟实际物理过程,故解决问题与实际非常符合,可以得到很圆满的结果。
与它对应的是确定性算法。
蒙特·卡罗方法在金融工程学,宏观经济学,计算物理学(如粒子输运计算、量子热力学计算、计算)等领域应用广泛。
蒙特卡罗方法的特点?
蒙特卡罗方法通过抓住事物运动的几何数量和几何特征,利用数学方法来加以模拟,即进行一种数字模拟实验。
它是以一个概率模型为基础,按照这个模型所描绘的过程,通过模拟实验的结果,作为问题的近似解。
蒙特卡罗方法与一般计算方法有很大区别,一般计算方法对于解决多维或因素复杂的问题非常困难,而蒙特卡罗方法对于解决这方面的问题却比较简单。
其特点如下:
1、直接追踪粒子,物理思路清晰,易于理解。
2、采用随机抽样的方法,较真切的模拟粒子输运的过程,反映了统计涨落的规律。
3、不受系统多维、多因素等复杂性的限制,是解决复杂系统粒子输运问题的好方法。
蒙特卡罗方法的基本原理及思想如下:
当所要求解的问题是某种事件出现的概率,或者是某个随机变量的期望值时,它们可以通过某种“试验”的方法,得到这种事件出现的频率,或者这个随机变数的平均值,并用它们作为问题的解。
这就是蒙特卡罗方法的基本思想。
蒙特卡罗方法通过抓住事物运动的几何数量和几何特征,利用数学方法来加以模拟,即进行一种数字模拟实验。
它是以一个概率模型为基础,按照这个模型所描绘的过程,通过模拟实验的结果,作为问题的近似解。
适用模型
假设我们要计算一个不规则图形的面积,那么图形的不规则程度和分析性计算(比如,积分)的复杂程度是成正比的。
蒙特卡洛方法是怎么计算的呢?
,我们可以想象把图形画在一块方形布上,然后找来一袋豆子,然后将所有豆子洒在布上,落在图形内豆子的重量比上那块布上所有豆子的重量再乘以布的面积就是他所要求的图形的面积。
这确实是一个求面积的好方法,将整个坐标轴看成一个固定的面积,然后均匀的这个分成N(N的大小取决于划分的步长)个点,然后找出N个点中有多少个点是属于阴影部分中,假设这个值为k,则阴影部分的面积就求出来了。
此方法是利用蒙特卡罗方法计算阴影部分面积,是把豆子均匀分布在布上;就计算结果的精度而言,取决点的分割是否够密,即N是否够大;
在数值积分法中,利用求单位圆的1/4的面积来求得Pi/4从而得到Pi。
单位圆的1/4面积是一个扇形,它是边长为1单位正方形的一部分。
只要能求出扇形面积S1在正方形面积S中占的比例K=S1/S就立即能得到S1,从而得到Pi的值。
怎样求出扇形面积在正方形面积中占的比例K呢?
一个办法是在正方形中随机投入很多点,使所投的点落在正方形中每一个位置的机会相等看其中有多少个点落在扇形内。
将落在扇形内的点数m与所投点的总数n的比m/n作为k的近似值。
P落在扇形内的充要条件是
。
已知:
K=
,K
,s=1,s1=
,求Pi。
由
,知s1
=
,
而s1=
,则Pi=
程序:
/*利用蒙特卡洛算法近似求圆周率Pi*/
#include<>
#include<>
#include<>
#defineCOUNT800/*循环取样次数,每次取样范围依次变大*/
voidmain()
{
doublex,y;
intnum=0;
inti;
for(i=0;i{
x=rand()*RAND_MAX;/*RAND_MAX=32767,包含在<>中*/
y=rand()*RAND_MAX;
if((x*x+y*y)<=1)
num++;/*统计落在四分之一圆之内的点数*/
}
printf("Pi值等于:
%f\n",num*COUNT);
printf("RAND_MAX=%d\n",RAND_MAX);
}
结果:
测试6次的结果显示:
循环取样次数
求得的Pi值
800
8000
80000
800000
8000000
(可以看出:
随着点数的增加,求得的Pi值渐渐接近真实值。
)
此外,蒙特·卡罗方法在金融工程学,宏观经济学,计算物理学(如粒子输运计算、量子热力学计算、空气动力学计算)等领域应用广泛。
算法应用实例
例:
在我方某前沿防守地域,敌人以一个炮排(含两门火炮)为单位对我方进行干扰和破坏.为躲避我方打击,敌方对其阵地进行了伪装并经常变换射击地点.经过长期观察发现,我方指挥所对敌方目标的指示有50%是准确的,而我方火力单位,在指示正确时,有1/3的概率能毁伤敌人一门火炮,有1/6的概率能全部消灭敌人.现在希望能用某种方式把我方将要对敌人实施的1次打击结果显现出来,利用频率稳定性,确定有效射击(毁伤一门炮或全部消灭)的概率.
分析:
这是一个复杂概率问题,可以通过理论计算得到相应的概率.为了直观地显示我方射击的过程,现采用模拟的方式。
1.问题分析
需要模拟出以下两件事:
[1]观察所对目标的指示正确与否模拟试验有两种结果,每一种结果出现的概率都是1/2。
因此,可用投掷一枚硬币的方式予以确定,当硬币出现正面时为指示正确,反之为不正确。
[2]当指示正确时,我方火力单位的射击结果情况。
模拟试验有三种结果:
毁伤一门火炮的可能性为1/3,毁伤两门的可能性为1/6,没能毁伤敌火炮的可能性为1/2。
这时可用投掷骰子的方法来确定:
如果出现的是1、2、3三个点:
则认为没能击中敌人;
如果出现的是4、5点:
则认为毁伤敌人一门火炮;
若出现的是6点:
则认为毁伤敌人两门火炮。
2.符号假设
i:
要模拟的打击次数;
k1:
没击中敌人火炮的射击总数;
k2:
击中敌人一门火炮的射击总数;
k3:
击中敌人两门火炮的射击总数;
E:
有效射击(毁伤一门炮或两门炮)的概率;
3.在Matlab中编辑:
functionliti6(p,mm)
efreq=zeros(1,mm);
randnum1=binornd(1,p,1,mm);
randnum2=unidrnd(6,1,mm);
k1=0;k2=0;k3=0;
fori=1:
mm
ifrandnum1(i)==0
k1=k1+1;
else
ifrandnum2(i)<=3
k1=k1+1;
elseifrandnum2(i)==6
k3=k3+1;
else
k2=k2+1;
end
end
efreq(i)=(k2+k3)/i;
end
num=1:
mm;
plot(num,efreq)
4.在Matlab命令行中输入以下命令:
liti6,2000)
liti6,20000)
5.理论计算
6.结果比较
模拟结果与理论计算近似一致,能更加真实地表达实际战斗动态过程.
三、思考和体会
它所教给我们的不单是一些数学方面的知识,更多的其实是综合能力的培养、锻炼与提高。
它培养了我们全面、多角度考虑问题的能力,使我们的逻辑推理能力和量化分析能力得到很好的锻炼和提高。
它还让我了解了多种数学软件,以及运用数学软件对模型进行求解。
其实,数学建模对我们来说并不陌生,在我们的日常生活和工作中,经常会用到有关建模的概念。
例如,我们平时出远门,会考虑一下出行的路线,以达到既快速又经济的目的;一些工厂为了获得更大的利润,往往会策划出一个合理安排生产和销售的最优方案……这些问题和建模都有着很大的联系。
数学建模所要解决的问题决不是单一学科问题,它除了要求我们有扎实的数学知识外,还需要我们不停地去学习和查阅资料,除了我们要学习许多数学分支问题外,还要了解工厂生产、经济投资、社会生活等方面的知识,这些知识决不是任何专业中都能涉猎得到的。
它能极大地拓宽和丰富我们的内涵,让我们感到了知识的重要性,这些知识必将为我们将来的学习工作打下坚实的基础。
从现在我们的学习来看,我们都是直接受益者。
在这过程中,对自己眼界的开阔,知识的扩展无疑大有好处,各学科的交叉渗透更有利于自己提高解决复杂问题的能力。
数学建模也培养了我们的概括力和想象力,也就是要一眼就能抓住问题的本质所在。
我们只有先对实际问题进行概括归纳,同时在允许的情况下尽量忽略各种次要因素,紧紧抓住问题的本质方面,使问题尽可能简单化,这样才能解决问题。
参考文献
[1]蒙特卡罗方法及其在粒子输运问题中的应用
[2]蒙特卡罗方法引论
[3]数学建模算法大全
[4]浅谈数学建模
[5]《数学建模》陈光亭