wugui数学系段子写得最好的程序猿
2013-04-29 22:03
如果是从我认识到的数学建模和编程来讲,二者相比较而言,
数学建模更像是从现实世界到数学抽象的过程。要经历把现实问题理想化的步骤,其间必须要决定舍弃哪些影响甚微的多余因素,好简化问题;只有简化了问题才能提出模型。
比如在国内好多数学建模入门的教材中被用烂了的一个例子:考虑下雨天的风速和人的不同情况,求解是否要跑、跑得多快才能淋雨最少。
然后教材里给出的一般参考过程,先把人抽象成了一个长方体,而不管你具体是将军肚还是瓜子脸,风速也假定是固定方向固定速度的。然后在这个极端简化的情况下就可以分析出人应该以多大速度前进身上(长方体形状的身体!)淋的雨最少。
这当然是一个相当粗糙的结果,如果想让模型更好,可以对你简化掉的东西重新考虑,更加精细地建立模型。比如考虑人的头部比身子小,修正长方体身体为下部大长方体上方接一个小长方体之类的,当然你可以继续考虑脖子比头更细,脖子和头都更趋向于圆形,甚至考虑到不同人高矮肥瘦的不同体型。
对于风,也是一样,你可以进一步考虑旋风、风时快时慢等等因素......
做到这些当然会使你的模型更加精细,但是它是绝对精确的吗?不,这根本不可能。因为你一旦提出一个模型,你一定就舍弃了现实问题中的某些因素,否则复杂的现实性会让你根本设计不出任何东西。再精细的模型,只可能一步一步逼近这个现实,但它永远不可能等于现实。所以检验一个模型的精度是否达到我们可以接受的范围,是否是现阶段我们能合理使用的,最可靠的方法就是输入足够多的参数去检验得到的结果与现实情况差别有多大。
编程更像是在抽象空间本身提出问题,解决问题。这么说来,编程问题反而更像“纯粹”的数学问题。因为程序世界本身就是基于0、1建立起来的抽象世界,编程更像是在抽象世界里,解决抽象问题。所以它一般不需要考虑对哪些因素作取舍。
当然,上面这种区别不是截然分明的,在这二者分别发展的情况下,它们各自的触角越伸越广泛,相互的边界也是日渐模糊的。比如图像处理、图像识别等等,虽然是编程问题,但它距离现实已比“一步之遥”还要近了。或者从另一个角度说,像这种问题是数学建模和编程通力合作解决的。
我尚学浅,不知道在这种情况下说“数学建模负责前期抽象,编程负责后期实现”对错有几何。但就现阶段来说,的确是数学建模距离现实问题更近一些,编程更侧重如何实现一些。
孤狐无悔点NET工程士
今天 15:45
同意@wugui回复的“建模”部分,
但是对于“编程”部分有不同见解。
我认为本质上,“建模”是我们理解问题和分析问题的一个工具,通过这一工具,我们将实际问题简化,使其“可计算”。
“编程”是一个纯粹的计算工具,这一工具不会帮助我们我们理解和分析问题,只是用来“计算”。
特别需要强调的是,“编程”适合用来处理“重复性”的计算,附带也可以做一些其他重复性的工作(例如输入、输出、排版之类)。
例:等差数列求和。
题目:求1至1000的所有整数的和。
解1:通过编程,将数字1至1000逐项相加,输出结果。
这种傻瓜解法,完全不用建模。虽然说手算1000次加法比较累,但是用计算机编程就毫无问题。
解2:通过分析,推导出等差数列前n项和的公式(建模),之后将题目中的数字代入,一次计算出来。
因为只有一次计算,所以没有编程的必要。
扩展题目:等差数列,首项为1 ,差为1,求前1项的和,至前1,000,000项和(总计要一百万个结果)。
解法及分析:既然是求等差数列的和,那么我们自然可以建立在解法1或解法2的基础上。
如果建立在解法1的基础上,总计约5万亿此的计算,这对于计算机来说也是过大的数字。
因此我们必须先建模,即在解法2的基础上,再通过编程,重复计算并输出一百万次,来获得我们需要的结果。
罗多
今天 13:32
建模是提出算法,编程是实现算法。