1. 程式人生 > 其它 >馮·諾伊曼可以,你也可以!

馮·諾伊曼可以,你也可以!

技術標籤:數學Python數學

在關於頂級數學家如何牛B的各種段子裡,一定少不了這個:

一次,馮·諾伊曼在晚會上,女主人勇敢地向他提出一個謎題:

兩列火車在同一軌道上以每小時30英里的速度相對而行,且相距1英里,這時棲在一列火車前面的一隻蒼蠅以每小時60英里的速度朝著另一列火車飛去。當它飛到另一列火車時,它又迅速地飛回來。它一直這樣飛過去飛回來,直到兩列火車不可避免地發生碰撞。問這隻蒼蠅共飛了多少英里?

幾乎在女主人剛解釋完問題的同時,馮·諾伊曼就答道:“1英里。”

“太讓我驚訝了,你這麼快就算出來了。”她說道。“大多數數學家都沒能看出這裡面的技巧,而是用無窮級數去計算,這花費了他們很長時間。”“什麼技巧?我也是用無窮級數算的。”馮·諾伊曼回答道。

長期以來,我一直以為是個江湖段子,沒想到居然是真有其事。感謝B乎作者ZHANGZaikun的考證:在1966年美國關於馮·諾伊曼的紀錄片中,尤金·維格納(EugeneWigner,理論物理學家及數學家,馮·諾伊曼的合作者,1963年諾貝爾物理學獎得主)接受採訪時講述了這個故事。據維格納所說,向馮·諾伊曼提問者向馮·諾伊曼提問者為馬克斯·玻恩(MaxBorn,量子力學創始人之一,1954年諾貝爾物理學獎得主);當馮·諾伊曼給出答案時,“Bornwasastoundedandhesaid:‘Youarethefirstoneofmyscientistfriendswhosawthesolutionatonce.’Johnnysaid:‘Ican'tunderstandthat.It'sasimpleinfinitegeometricalseries.’”

在NormanMacrae所著的《馮·諾伊曼傳記》提到,當別人說起這個段子時,諾伊曼同學會補充:thefiguresactuallyputtomewerenotsosimple.估計當時的數字對計算挺不友好的。不過對於從小能心算9位數四則運算的諾伊曼同學來說估計也算不上什麼。

單純從難度來說,這道題即使放在小學奧數也是入門級的。兩列火車相遇需要1/60分鐘,蒼蠅在這段時間裡不停的來回飛,飛了多少來回不重要,關鍵是飛的時間確定了,所以飛過的距離是60英里/分鐘*1/60分鐘=1英里。

但人家大佬可是直接用無窮級數心算的,這怎麼可能?其實一點也不復雜,你也可以做到。為了計算方便,我們把題目簡化一下:

火車的距離是100公里,速度是20公里/小時,兩列火車的出發點分別命名A,B。蒼蠅的速度是30公里/小時,先從A點出發向B點飛。

每次蒼蠅遇到對面方向的火車就掉頭,我們可以計算出每次飛過的距離,然後全部加起來就可以了。根據題目條件,蒼蠅與火車相對飛行的速度是50公里/小時,計算步驟如下:

  1. 與B點出發的火車距離100公里,2小時後相遇,飛行了60公里,折返點距離A點60公里。A點出發的火車行駛了40公里,與蒼蠅距離20公里。B點出發的火車也行駛了40公里,與A點距離60公里。
  2. 與A點出發的火車距離20公里,2/5小時後相遇,飛行了12公里。折返點巨離A點48公里。B點出發的火車行駛了8公里,之前距離A點60公里,現在距離52公里。
  3. 與B點出發的火車距離4公里,4/50小時後相遇,飛行了12/5公里。折返點距離A點48+5/12公里。A點出發的火車行駛了8/5公里,位置距離A點48+8/5公里,與蒼蠅的距離4/5公里。
  4. ...

經過幾次推算,我們發現每一輪蒼蠅飛過的距離是上一輪的1/5,顯然構成了一個等比數列:初始值為60,比例係數1/5,我們就可以套用等比數列求和公式:Sn=a*(1-q^n)/(1-q),其中a是初始值,q是等比係數,n代表數列的前n項。因為q<1,所以當n無窮大時,q^n我們可以認為是0,這樣計算結果蒼蠅總共飛過了75公里。和我們用小學數學方法計算得到的結果一致。

有同學可能會問,到底在第幾次兩列火車才會相遇,答案是無窮次之後。所以我們在求和時n取無窮大。這個問題涉及到古希臘數學家,哲學家芝諾的一個著名悖論:一個人從A點走到B點,要先走完路程的1/2,再走完剩下總路程的1/2,再走完剩下的1/2……如此迴圈下去,永遠不能到終點。中國古代經典《莊子·天下篇》中也提過類似的問題:一尺之棰,日取其半,萬世不竭。第1次60公里,第2次12公里,第3次12/5公里,第4次12/25公里,我們可以寫一段小程式累加前20項試試:

a = 60
q = 0.2
s = 0
for i in range(20):
    s += a
    a *= q
print(s)

結果是74.99999999999923,非常非常接近75,但總是差那麼一點點,迴圈次數越多越接近。但為什麼無窮項加起來就等於75?這個問題的解決要到牛頓萊布尼茲發明微積分才得以解決,不過微積分剛發明的時候理論還不完備,更多隻是用於解決工程問題。有興趣的同學可以去了解一下引爆第二次數學危機的貝克萊悖論,後續經過柯西,康託等一系列數學家的不斷努力,才使得微積分的理論體系得到完備,解決了第二次數學危機。我們也得以放心的使用等比數列求和公式,當比例係數q<1時,無窮項求和直接簡化為S=a /(1-q)。

聰明的同學可以推匯出這道題目的更一般狀態:火車的速度分別為v1,蒼蠅的速度是v2,初始距離是k。我們可以得出:

  1. a =v2*k/(v1+v2)
  2. q=(v2-v1)/(v1+v2)

假設初始距離是80,火車的速度是15,蒼蠅的速度是25。套用上述公式:

  1. a =25*80/(15+25)=50
  2. q=(25-15)/(25+15)=1/4

利用求和公式S=50/(1-1/4)=50*4/3=200/3。記熟這個公式,多訓練幾次,當別人問你這個問題,就可以象諾伊曼同學一樣裝B了。不但能直接報出結果,還能說出每次折返蒼蠅飛了多少距離。

如果有更聰明的同學可以推算一下更更普通的狀態:火車的速度分別是v1,v2,蒼蠅的速度是v3,初始距離是k。