也来谈那个数学题的解法 (作者: 数学)
数学题就是:一个没有盖的长方体,在表面积给定为80(当然是不包括上盖)的情况下,选择怎样的长宽高使得其体积最大呢?如果有盖,答案当然是正方体。而现在是没有盖,答案原本应当是半个正方体的。但是,要证明这样的事情很费劲。不想费这样的脑子。如果要我来解决这个办法,我会做如下的事情。
假设这个长方体的底是一个正方形。这个假设是合理的,是因为正方形的边长和面积之比在各种矩形中是最小的。因此假设这个长方体的底边的长和宽为b和c,当然b=c。假设长方体的高为a。
现在已经限制住了表面积是80。因此,我把这个80除以10000,就是说分成一万份,当然,同样的理由也可以分成一百万份,一亿份,等等。我令d=80/10000,作为一个表面积的基本单位。
然后,首先我假设底边的表面积为s,并让s=d。当然,在这种情况下,底边的边长b和c也就能够计算出来,就是s的开平方。而高a当然也能够计算出来,就是长方体的周边的面积,即2乘a再乘b+c,而它等于80-s,因此算出a等于(80-s)除以4倍的b(或者c)。然后我计算这样得到的长方体的体积,就是a乘b乘c。
当然,这是一种表面积为80的这样的长方体的体积。一共有多少种呢?我每次让底边的表面积s增加一个d,再重新算出相应的a,b,c,这样,我让s从d一直变化到80-d,也就是说,算出近一万种长方体的体积,从中间找出体积最大的一种。
当然,这要是让人来算,那就累死了,不说别的,光说每一个方案要计算一次开平方,如果不是有计算器,如果我们正处于六十年代,开平方用纸来算就是特别累的事情。
但是现在我们有计算机来帮助我们做这件事情,计算机可是不怕麻烦的。如果你的计算机不是光用来玩游戏的,那么应当装有一个OFFICE软件。因此你就启动其中的WORD程序,首先你从“工具”菜单中找到“宏”这一项,选择“录制新宏”,给新宏起一个名字,比如说叫test,然后在键盘上随便敲一个键,比如说敲一个字符“a”,然后单击停止录入,一个名字叫test的宏就生成了。当然,你必须设置word的安全性使之为低,不怕任何病毒来犯才行。
然后你再从工具菜单中找到“宏”这一项,用运行宏来试试test这个宏,当然是每运行一次,你的文件中就多键入了一个a。再选择“编辑宏”,对test这个宏进行编辑。这个时候你就进入到了VISALBASIC(简称VB)的编程状态了。你会发现test这个宏里有一个语句:
Selection.TypeText Text:="a"
哦,原来用VB编程就是这样往一个文件里键字符的。
你现在修改这个程序,把上面的这一句话改成一段程序如下:
d = 80 / 10000
vmax = 0
For s = d To 80 - d Step d
b = Sqr(s)
c = b
a = (80 - s) / (4 * b)
v = a * b * c
If v > vmax Then
vmax = v
amax = a
bmax = b
cmax = c
End If
Next s
Selection.TypeText Text:=amax
Selection.TypeText Text:=","
Selection.TypeText Text:=bmax
Selection.TypeText Text:=","
Selection.TypeText Text:=cmax
Selection.TypeText Text:=","
Selection.TypeText Text:=vmax
Selection.TypeText Text:=","
Selection.TypeText Text:=(b * c + 2 * a * (b + c))
这段程序中有一个For循环语句,让s从d一直变化到80-d每次增加d,d被设为80除以10000,当然,你轻而易举地能够把这个程序改成步长为80除以一亿什么的,反正计算机不怕累。
在循环体内,就是从For的那一行直到下一个next s语句之间,就是计算机不怕麻烦反复要做的事情,先算出底边长b是s的开平方,当然c和b是一样的,底边是正方形嘛。然后算出高a=(80-s)/(4*b),在程序语言中*就代表乘。然后算出体积v=a*b*c。用一个变量vmax来存放已经发现的最大的体积,如果v比它还要大,则把这个v存入vmax,这是语句vmax=v完成的,同时也要把相应的a,b,c存放到amax,bmax,cmax中。
在循环完了之后,就把计算出来的高amax,长bmax,宽cmax,及最大的体积vmax还有不妨再计算一下表面积当然还是80统统用上次测试的办法打印出来。最后你发现,每运行一次宏,你的文件中多了这么一排字:
2.58224711250028,5.16371958959798,5.16371958959798,68.8530370077021,80
也就是说,答案是底是边长为5.16的正方形,而高为低边的一半,是2.58。这时的体积是68.9,表面积嘛,当然还是80。
运行这个宏要多长时间?一贬眼功夫,计算机做起事情来可是很快的。
好了,讲过我的这个用计算机来解决问题的笨办法之后,相信会受到不少网友的嘲笑,因为本来有那么一个花巧的非常巧妙的思考办法,结果我这里却用了这么一种笨呆傻的办法。其实,还可以搞得更加笨呆傻一些,比如我都不肯定正方形是底边最好的,因此再搞一个循环套循环,在每一个底面积给定时尝试各种长宽,这都是可以的。
我的观点正在这里,我认为,让小孩去学习那种精巧办法的数学,实际上是在摧残儿童,而且学到的知识没有什么屁用,根本不适应当代科学技术发展的潮流。一些个小学教师中学教师仍然呆在五六十年代的水平,为他们的各种机巧自鸣得意,并用这些机巧来作为惩罚儿童表示自己有多么了不起的手段。
那么,我这里做的示范是什么意思呢?我这个人其实是一个科学家,所以知道当代世界的发展潮流,就是解决数学问题要越来越多地靠计算机。因此,如果你真的想要训练你的孩子成为科学家,最好现在就训练他编这样的程序来用笨呆傻的办法解决问题。
我的这个解决办法,看上去笨,却是前途无量的。比如说,如果把问题中的长方体,改成一个圆柱体,或者底边是三角形?五角形?或者干脆是一个正态分布函数包括的图形?或者是一个艺术家画的抽象图形?(不许你用牛顿莱布尼兹公式求解定积分,只许用矩形法或者梯形法!)这一类问题,只要按同样的思路改一改程序,都能够算出来。
当然还会有人批评我的编程技术不够精炼,有一些变量根本没有必要设,应当在程序中怎样寻求花巧等。但这都是扯淡。有了计算机就不要沉浸在那种花巧之中。
微软是靠什么取胜的?美国的软件是靠什么取胜的?当我国的程序员处于小农经济的想法一遍遍地沉浸在一个两个算法的精巧这样的喜悦中时,微软可不怕使用大量的笨呆傻办法,因此当年你编一个程序在屏幕上显示一个"hello!"产生的代码只有几十个字节的时候,现在的微软编译出来的程序干同样的事情要用几十个千字节以上,够笨呆傻的吧?但是笨呆傻就是战胜了机巧与聪明。
计算机是人脑的延伸,计算机正是在近二十年大规模地被使用。因此,当代的教育,应当从小就培养小孩子构思能够让计算机解决问题的笨呆傻办法,能够组织大规模的数据运算,从而尽量少用自己的脑子来做事。正如机械是人手的延伸,因此要尽量用机械来使自己的手得到轻松一样。如果我国不能够在数学教育方面在这方面有所改进,我们在国际竞争中就会不断落伍。
但是,我们的小学的数学教师,中学的数学教师,仍然是师承五六十年代的那些老的中小学教师,那些人就津津乐道于各种各样的花巧,以获得所谓的奥数竞赛的各种奖为荣,他们沉浸在各种机巧算法的喜悦之中,以为这些个狗屁东西就对现代化有所作用,其实是屁用没有的。他们用各种各样的难题来折磨学生,照我看,去做这么道题,还不如去野外跑一跑,跳一跳呢,或者去农村锻炼一下。
而教育部要想进行数学改革,就征询这些中小学教师,甚至是所谓特级教师的建议,当然就越搞越糟。这些所谓的特级教师们就更神气活现地以为自己了不起了。
但是我要说,这些中小学数学教师,其实都是大脑非常懒的,不然就问一下他们,有谁会编写一个程序来解决问题?这些年编写过一行程序吗?没有。为什么?脑子懒,不愿意学新东西。
这个是香香解四人过河的类似版 |