更新於 2024/07/22閱讀時間約 7 分鐘

The Nature of Code閱讀心得與Python實作:2.1 Forces and Newton's...

這一節的標題是
2.1 Forces and Newton's Laws of Motion
因為方格子標題字數限制,所以沒完整顯現

根據牛頓的三大運動定律,力可以定義成

力是會導致有質量的物體加速的向量

這個關於力的定義的重點,就在於「向量」這兩個字。既然力是向量,那第一章介紹的關於向量的觀念,以及寫程式時用到的工具、技巧,都可以拿來使用。

接下來,就來看看牛頓的三大運動定律,以及程式寫法。

Newton's First Law

牛頓第一運動定律說的是:

物體不受力或合力為零時,靜者恆靜;動者恆做等速直線運動

也就是說,物體如果沒有受到力的作用,或者作用在身上的力都互相抵銷了,那它的速度和運動方向就不會改變。從這裡可以看出來,根據第一運動定律,物體有維持原運動狀態的傾向,所以第一運動定律又叫「慣性定律」。

根據第一運動定律,在模擬的時候,如果作用在物體的合力為零,那物體的速度向量就會維持不變。換句話說,除非是在合力不為零的情況下,否則Mover類別的update()方法中,是不應該用任何數學運算來改變velocity這個向量的。

Newton's Third Law

接下來,先來看第三運動定律,然後再回過頭來看第二運動定律。

第三運動定律說的是:

對於每一個作用力,都會有一個大小相同方向相反的反作用力

根據第三運動定律,當你推一堵牆的時候,會有一股大小相同的反作用力作用在你身上。不過,這並不是說這堵牆因為不爽被你推,所以主動回擊,也推你一把;第三運動定律真正的意思是,當你出力推那堵牆時,你的力量包含了作用力及反作用力這兩股成對的力量。

第三運動定律原先的敘述容易引起誤解,改用下面的敘述方式應該會比較好一些:

作用力和反作用力總是成雙成對的出現,它們的大小相同,但方向相反。

看到「大小相同方向相反」,可別以為成對出現的力會互相抵銷,導致合力為零;這裡要注意的是,作用力和反作用力,它們的作用對象不同,所以不會互相抵銷。當你推牆的時候,一股力是作用在牆上,另一股力則是作用在你身上。

雖然作用力和反作用力的大小相同,但這並不代表它們對兩個物體在運動方面的影響是一樣的。例如,把一顆球丟向牆壁。雖然作用在牆壁和球的力量相等,但牆壁不動如山,而球則反彈回來。作用力和反作用力究竟會對物體的運動造成怎樣的影響,還得考慮物體的質量、摩擦力等等其他的因素才能知道。

因為作用力和反作用力的大小相同而方向相反,所以在寫程式時,如果物體A作用在物體B的力量是f時,那反作用力,也就是物體B作用在物體A的力量,就會是-f。所以,如果是要模擬兩個物體間的萬有引力,當其中一個物體受到萬有引力f的作用時,另一個物體就會受到-f的作用力。

雖然作用力和反作用力總是同時出現,不過,畢竟我們只是利用自然界的物理定律來建造虛擬的世界,而不是真的要鉅細靡遺精準地重現真實世界,所以有時候我們並不會去管反作用力的部分。例如,當我們在模擬環境中的風時,就不會去管當風吹在物體上時,施加在空氣上的反作用力,畢竟我們要模擬的是風對物體所造成的影響,而不是去模擬空氣受力之後的反應。

Newton's Second Law

牛頓第二運動定律說的是

力等於質量乘上加速度

寫成數學式就是

F = ma

其中F是力;m是物體的質量;a是加速度。

從牛頓第二運動定律的數學式可以看出來,加速度和作用力成正比,而和物體的質量成反比。所以,如果去推一顆籃球,用的力量越大,球滾動的加速度會越大;如果用相同的力量去推一顆比籃球重得多的鉛球,那鉛球滾動的加速度,將會比籃球小得多。

在上面那段敘述中提到:當用相同的力量去推一顆比籃球重得多的鉛球時,由牛頓第二運動定律可以知道,籃球的加速度會比鉛球大。這其實是一般通俗不精確,把「重量(weight)」和「質量(mass)」當成同一件事的說法。「重量」和「質量」其實是兩種不同的物理量,在牛頓第二運動定律中用的是「質量」,而不是「重量」。

重量和質量是不同的物理量,那它們之間有什麼不一樣呢?簡單來說,質量是用來衡量物體含有多少物質的量,單位是公斤(kg);而重量則是重力作用在物體上的力量,是一種力,單位是牛頓(N)。由牛頓第二運動定律,物體的重量w,等於物體的質量m,乘上重力加速度g,也就是

w = mg

在地球上,1公斤質量的物體,其重量也稱為1公斤重,記為1 kgw。因此,當一般在說某個東西有多重時,因為我們就在地球上,所以不管是把它理解為指的是重量或質量,並不會有什麼不同。然而,如果不是在地球上,那同一個物體的質量和重量,就不見得會一樣。一個物體的質量不會因地點不同而不同,但在不同的地點,因為重力不同的關係,重量可能會不一樣。例如,具一公斤質量的物體,不管是在地球還是月球,質量都是一公斤;但是在月球上,因為重力只有地球的六分之一,所以這個物體的重量,只有在地球時的六分之一。

前面提到質量在真實世界中的定義,那在模擬的世界中,質量是什麼呢?寫程式的時候,又該如何處理質量這個物理量呢?在這節中,我們先把問題簡化,假設在模擬世界中,所有物體的質量都是1,然後在之後的小節中再來看看,物體的質量不是1時該怎麼辦。

因為質量是1,所以由牛頓第二運動定律

a = F / m = F / 1 = F

也就是說,經過簡化之後的模擬世界,物體的加速度和施加於其上的力是相等的。

在第一章中,我們知道了物體的加速度、速度、位置間的關係,也就是

velocity += acceleration
position += velocity

現在再加上作用力和加速度間的關係,也就是

acceleration = force

所以,力可以說是讓物體得以運動的源頭。

既然物體的加速度和施加於其上的力是相等的,我們可以在Mover這個類別加入一個apply_force()方法,用來施加力量給物件。例如

mover.apply_force(wind)
mover.apply_force(gravity)

這裡的windgravity都是pygame.Vector2物件。這個施加力量給物件的方法,實作如下:

def apply_force(self, force):
self.acceleration = force

這樣子所實作出來的apply_force(),看起來挺不賴的,但卻會有個大問題。假設現在有windgravity兩股力量同時作用在mover這個Mover類別的物件上,程式很自然會這樣寫

mover.apply_force(wind)
mover.apply_force(gravity)
mover.update()
mover.show()

前兩二行程式所做的事情,就相當於是

mover.acceleration = wind
mover.acceleration = gravity

我們原本是希望windgravity同時都作用在mover上,但很不幸的,這樣子寫,最後卻只有gravity會作用在mover上;這是因為,本來一開始有作用的wind,在後來被gravity給取代掉了。

很顯然的,上述的寫法,沒辦法處理有許多個力同時作用的情況。那該怎麼辦呢?下一節見分曉。



分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.