从“狗拿耗子”问题想到的话题-数学和程序

长久以来,一直有一道物理题目困扰着我,数学不是太好,所以不知道怎么解答。

有一只老鼠,离洞口的距离为X米,有一条狗,在老鼠的下方Y米。洞口和老鼠,以及狗形成一个直角三角形的关系。如果狗的速度是VY(这里是指速度的大小),老鼠的速度是VX(这里是指速度的大小)。老鼠的速度方向很直接,就是指向洞口;狗的速度方向一直在变化,狗一直朝老鼠的方向追赶,(如果狗聪明的话,就应该算好地方,预先跑过去,而不是一直追着老鼠跑了)。 在X,Y,VX,VY满足什么条件的时候,在老鼠进洞前,狗追得上老鼠。

 

这道题目,其实可以看做一个微分方程,在时间dt里面,狗的速度dv需要分解为水平速度和垂直速度。换句话说,应该吧这个追赶的过程,分成很多很多个微小的步骤,在这个微小的步骤里面,狗的速度可以近似看做不变化的。然后将这些微小步骤累加起来,得到结果。

OK,如果要写程序来做,怎么做呢:我们假设每个微小的时间为 0.1秒。

DO While Not(老鼠跑到了洞口 OR 狗和老鼠相遇了)

   老鼠的位置 = 老鼠的位置 + 0.1 * 老鼠的速度

       狗的水平位置 += Sin(老鼠和狗的夹角 ) * 狗的速度

 

       狗的垂直位置 += Cos(老鼠和狗的夹角 ) * 狗的速度

LOOP

 

上面的代码应该就是大体的计算方法了。在每个循环里面,我们看似狗的速度的方向是不变的。每个循环之间速度是变化的。

这里的结果是否准确,微小时间间隔0.1秒是个关键。 在极端情况下,例如 狗和老鼠,老鼠和洞口都很接近的时候,就可能因为0.1秒这个时间间隔不够精确而产生误差。在0.1秒的时候,老鼠逃脱了,但是,如果时间间隔精确到0.01秒的时候,老鼠可能逃脱不掉。

但是在数学里面,微积分是不会产生这样的问题的。【有人知道具体的数学方法吗,贴出来,我现在都不知道怎么做】

同样的问题,还有求球的体积。我们可以把球的体积,看成多个微小的圆形薄片的累加(一个西瓜,不要从中间一切为2,而是用刀均匀的切开,从一头到另一头,这样就会有很多小的圆形西瓜薄片了)

ForEach 薄片 In 西瓜薄片

   西瓜体积 += 圆周率 * 半径 *半径 * 薄片厚度

Next

这样求出来的西瓜体积必然比原来的真实体积小一点点或者大一点点。但是数学的微积分却不会有这个问题。

 

 

     产生误差的根本原因是,数轴的密度是无限的,数学可以做到真正的无限分割,完全无损失,程序不行。

     数学没有最小单位这个概念,0.001不是最小单位,0.000001不是,数轴的密度无限,所有不存在最小单位,最小间隔这些东西,它可以完全精确。

      我们程序的话,如果要做到绝对精确,可能计较困难了,很多拟合算法,都是一个近似值。如果不使用数学现成的公式来计算体积的话,程序永远不可能获得标准答案。(当然,由于数值存储的问题,浮点等不可能保存一个无限不循环小数,所以最后还是会有误差的)

      关于数轴的无限密度,再说一个和本文没有关系的话题。如果人类的测量技术可以做到无限的话,我们可以用一根金属棒记录一部书的信息。一根棒子的长度是 3.14159267........当然这个基本上不可能实现。

      当然人类是聪明的,人类有很多对于程序方法的补正。( 例如四舍五入的算法,银行家法则就是对四舍五入的修正,四舍六入五单双。) 同样也有很多对于微积分的计算的修正,使得计算结果接近于实际结果。

      计算园的体积,不会有人用这个方法来计算,这里只是做个例子罢了。(还有一个例子是通过大量随机数字来计算圆周率的,那个也很有趣,大概可以算到3.14这样的精度)

      程序是建立在数学基础上的,程序代替不了数学。

posted @ 2011-06-28 16:07  灰毛毛  阅读(1844)  评论(10编辑  收藏  举报