数学建模社区-数学中国

标题: 数学建模参赛真实经验(强烈推荐) [打印本页]

作者: 厚积薄发    时间: 2016-4-2 17:28
标题: 数学建模参赛真实经验(强烈推荐)
数学建模参赛真实经验(强烈推荐)

6 w) r1 t! w( |7 v$ o( B
2 G* a- h- _/ m5 V% _! t5 \+ }5 N一、如何准备数学建模竞赛
1 B5 d! w: F  [* U2 t  y- A       一般,可以把参加数学建模竞赛的过程分成三个阶段:第一阶段,是个人的入门和积累阶段,这个阶段关键看个人的主观能动性;第二阶段,就是通常各学校都进行的集训阶段,通过模拟实战来提高参赛队员的水平;第三阶段是实际比赛阶段。这里讲的如何准备数学建模竞赛是针对第一阶段来讲的。 / ~& O# }/ j# w! S+ F2 J7 r
       回顾作者自己的参赛过程,认为这个阶段是真正的学习阶段,就像是修炼内功一样,如果在这个阶段打下深厚的基础,对后面的两个阶段非常有利,也是个人是否能在建模竞赛中占优势的关键阶段。下面就分几个方面谈一下如何准备数学建模竞赛。
5 ~$ {/ M$ ^8 c6 V& Q" z' Q       首先是要有一定的数学基础,尤其是良好的数学思维能力。并不是数学分数高就说明有很高的数学思维能力,但扎实的数学知识是数学思维的根基。对大学生来说,有高等数学、概率和线性代数就够了,当然其它数学知识知道的越多越好了,如图论、排队论、泛函等。我大一下学期开始接触数学建模,大学的数学课程只学习过高等数学。说这一点,主要想说明只要数学基础还可以,平时的数学考试都能在80分以上就可以参加数学建模竞赛了,数学方面的知识可以在以后的学习中逐渐去提高,不必刻意去补充单纯的数学理论。
( H6 b- b; x" T+ B- v  t6 X2 X; r       真正准备数学建模竞赛应该从看数学建模书籍开始,要知道什么是数学建模,有哪些常见的数学模型和建模方法,知道一些常见的数学建模案例,这些方面都要通过看建模方面的书籍而获得。现在数学建模的书籍也比较多,图书馆和互联网上都有丰富的数学建模资料。作者认为姜启源、谢金星、叶齐孝、朱道元等老师的建模书籍都非常的棒,可以先看二三本。刚开始看数学建模书籍时,一定会有很多地方看不懂,但要知道基本思路,时间长了就知道什么问题用什么建模方法求解了。这里面需要提的一点是,运筹学与数学建模息息相关,最好再看一二本运筹学著作,仍然可以采取诸葛亮的看书策略,只观其大略就可以了,等知道需要具体用哪块知识后,再集中精力将其消化,然后应用之。
' C  B2 r; D4 M! ^6 v6 M      大家都知道,参加数学建模竞赛一定要有些编程功底,当然现在有Matlab这种强大的工程软件,对编程的的要求就降低了,至少入门容易多了,因为很容易用1条Matlab命令解决以前要用20行C语言才能实现的功能。因为Matlab的强大功能,Matlab在数学建模中已经有了非常广泛的应用,在很多学校,数学建模队员必须学习Matlab。当然Matlab的入门也非常容易,只要有本Matlab参考书,照猫画虎可以很快实现一些基本的数学建模功能,如数据处理、绘图、计算等。我的一个队友,当年用一天时间把一本二百多页的Matlab教程操作完了,然后在经常运用中,慢慢地就变成了一名Matlab高手了。 % r* k8 u) P+ V4 \. ~& N
       对于有些编程基础的同学,最好再看一些算法方面的书籍,了解常见的数据结构和基本的遍历、二分等算法,然后再了解一些智能优化算法,如遗传算法、蚁群算法、模拟退火算法等。这样,在以后编程求解模型的过程中,就很容易寻找到合适的求解算法。 # U9 h2 Q( L! y( y" |* _
       对于参加数学建模的队员来说,我们都知道要具备一定的数学基础,一定的编程能力,还有就是论文写作能力和团队合作能力。对于后者,主要是看个人固有的能力,不需要去刻意准备,在以后的集训阶段再加以训练就可以了。
2 l. t$ }0 F0 D2 O二、数学建模队员应该如何学习Matlab
! e/ [  E1 d2 M' }  e       对理论的掌握并不代表对知识的真正理解。对于一些所谓高深的理论都可以自己编写程序来检验对其理解的程度。我的经验是:只有你把程序流畅地写出来,才是真正意义上对知识理解通透了。比如,我在大三学电力系统分析的时候,就自己用Matlab语言编写了牛—拉法求潮流的程序,计算暂态稳定的简单程序,计算发电机短路电流的程序等。自然地这些专业课程都学得不错。 ) X% M% [3 S% l" A
       Matlab是一门优秀的编程语言,在欧美非常普及。选择一门顺手的编程语言可以让你在学习和工作中事倍功半。Matlab是一种语言因为它可以用作编程,也是一种软件因为它自带的工具箱具有类似软件前台的GUI界面以及能够轻松实现人机通信功能。在学习Matlab编程之前,需要对其有一个基本的了解: & T4 O5 B( J- Q; o" W3 Z
(1) 数据处理 2 U. W& f' q  J: x0 n
能对数据进行计算、分析和挖掘,数据处理函数功能强大,命令简洁;$ J* Y" I1 w$ [+ }! ]$ o
(2) 软件工具箱 + u  H2 z* I+ m+ |$ b1 L( R
各式各样的工具箱,包括神经网络工具箱、Simulink工具箱(虽然Simulink从底层开发出来的,但是我们认为也是工具箱的一种)、模糊工具箱、数字图像处理工具箱和金融工具箱等;
! R4 k' r9 i8 j7 k3 a(3) 精致绘图
0 \8 X: W3 O: R! l2 f+ SMatlab通过“set”命令重设图形的句柄属性,可绘制精准而美观的图形; 9 t0 ^  r+ R) W) j, B2 [* [
(4) 动画实现 * [( o' j: s. g* T
Matlab可以进行实时动画、电影动画和AVI视频制作,并能在动画中添加*.WAVE格式的音频;
; M1 `# _: ~7 l% M3 t$ G1 M; L(5) 与软硬件通信
4 b& ~9 O( W6 {- N+ S4 `5 T( SMatlab接口函数可以实现与软件(比如C)和硬件(比如电子示波器)通信; ' s& |0 h% T  D- T* q9 I, w
(6) 平面设计
/ q1 S3 N( K9 E与全球最顶尖的平面设计软件Adobe Photoshop联袂使用,传达震撼的视觉设计效果;$ t# p7 \9 v, a, P1 C" o
(7) 游戏开发 * f3 z, W+ ~2 I8 h% C
利用Matlab语言可以开发一整套的游戏,比如开发32关的推箱子游戏。 8 J1 i) r" b9 K& x
根据我对Matlab将近6年的学习经验,学习Matlab编程就像读一本书,刚开始读时感觉这本书很薄,内容浅显,容易上手,似乎感觉Matlab语言是最容易学会最简单的一门编程语言;继续读下去感觉这本书其实很厚。初学Matlab编程过程中经常会遇到五大困惑:
3 b; ?% f, K- I( s       其一,函数指令掌握太少,写不出简洁的程序甚至正确有效的代码也写不出;初学者阅读一个Matlab编程高手写出的一个相对复杂的程序,会发现不但整篇程序的思路难以理解,而且会碰见很多陌生的命令,就像一篇英文阅读理解有很多单词都不认识。自己动手写程序想表达的意思表达不出来,力不从心。
: n4 b: R5 z. m+ ^8 h       其二,不能掌握Matlab函数复杂的语法格式;相比VB和C而言,Matlab语法格式比较复杂。语法格式不正确程序就不能运行,同一个命令有很多种语法格式。格式不同,程序输出的结果就大相迳庭。比如使用“streamribbon”命令创建三维流带图,其语法格式为streamribbon(x,y,z,u,v,w,sx,sy,sz);那么向量x,y,z,u,v,w,sx,sy,sz分别代表什么意义,各向量之间满足什么样的长度关系都必须真真切切地理解,否则因为不能键入正确的向量而不能画出三维流带图。
* N# L3 Z# u9 G% [       其三,能套用别人程序自己却丝毫没有程序开发能力;比如在神经网络工具箱中,各种创建、学习和训练网络的函数命令众多,语法格式复杂,套用别人已经编好的神经网络程序比较简单,但是如果自己对照各个函数的用法书写完整的神经网络程序却不是简单的事,因为你没有从本质上理解这些命令。这就是说,你只能模仿别人的程序,却不能触类旁通自己开发程序。
; z# L8 u* K) x7 r% G       其四,不能准确全面地理解指令实现的功能;比如在Matlab中实现排序功能的命令是“sort”,而在C语言中如果想实现排序,那就必须依据“冒泡法”原理编写一小段的程序实现排序;虽然Matlab命令用起来比C简便,但是如果对“sort”命令原理不了解,就不能知晓“sort”是实现升序排列还是降序排列,对于矩阵是按行排序还是按列排序。所以当我们使用将繁琐的原理封装在Matlab里的命令时,如果不熟悉该命令的原理,那么使用时至少要在命令窗口中键入该命令以便试探它的用法。
1 w3 o: I7 p$ [, z/ y0 \5 J        其五,函数的参数不知道如何调整。比如使用命令“imadjust”对轮廓不明晰的数字图像进行处理时,处理过的图像也许轮廓分明,但是很多都是伪轮廓,已经改变了原始图像的品质,所以在使用该命令时一定要注意拿捏好校正因子的大小。又如在编写BP网络源程序过程中,网络始终无法收敛且找不出原因,很多人都会怀疑是不是网络的拓扑结构设计有问题,其实很多情况下症结都是出在网络学习速率参数的大小上,只要将参数调小一点,网络也许就会立即收敛。当你不知道参数的具体取值时,不妨多调试几次。   
! @! o2 c9 N5 B* N8 ]# {       最后通过长时间扎实的学习,对Matlab主程序命令和常用的一二个工具箱已经基本掌握,写起程序来才会思路涌涌而至,得心应手,轻车熟路,感觉这本书其实还是比较薄。由于MATLAB函数命令丰富,完全掌握没有必要也很难,只要掌握经常用到的命令就可以了。科学研究表明,只要掌握知识的60%就可以运用了。对于碰见的一些生僻的函数用法时,可以查询Matlab help命令寻求帮助或者身边备用一本Matlab函数词典。 4 C, a6 Y; f+ t
        那么如何学好Matlab编程呢?我以为需要做到以下三点:
$ a, d( r4 |1 X* Y (1) 多看多记 ' d' T' m- c5 W& I
多阅读优质的程序,注意细细体会程序设计的思想,记下常用指令及其用法,准备一个笔记本,将看到好的程序段落摘抄下来或者复印,积累多了,装订成册。
$ a! z- H8 w9 U# J: @5 p(2) 多练多想 3 t4 k8 i% E: K. f# |) O. R" B% v0 x
模范别人的程序段,然后进行优化或改编。多多尝试开发小程序,多思考程序设计的流程,同时适当地借鉴一些程序设计艺术技巧。
5 F% q9 {: i) T" \8 z(3) 不要“偷懒” , w3 [% Q: v) b4 x/ n/ q1 k0 [) F
初学者往往喜欢将别人或者自己以前编好的程序段甚至某一个指令复制粘贴过来,而懒得动手去写,这个习惯不好,尽管表面上是节省了一点时间。虽然这些指令对于初学者来说都认识,而且印象中也会写,但是时间长了,很多命令就不是记得很准确了。比如,函数“linspace”经常会被写成“linespace”,属性名“markersize”会被错误地写成“markesize”了。等等。
- M( x# j" a& f1 J世界上没有100%的完美。Matlab这样优秀的软件也有缺陷:编译一直不顺畅和程序不能脱离Matlab环境运行。
- s* D. J: L/ C/ r+ Y" F
4 Z$ F' w1 ?+ p; A% z8 p7 J) k* D8 B- n( b  B* j
+ b+ P4 c9 r0 ~

作者: data-science    时间: 2016-4-5 20:40
( p7 X& }# I" F3 ?9 D

作者: 清风不是风    时间: 2016-4-22 19:41
吃惊,matlab还能写游戏。。。
/ {' e% A7 M, {) U0 M
作者: Cassiel    时间: 2016-6-23 18:05
感谢吧主。8 r8 |! I! ^9 ]$ F

作者: Cassiel    时间: 2016-6-23 18:05
感谢吧主。
2 L6 `% T4 X( m6 k  h, I8 s




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5