25 轉(zhuǎn)矩(力矩)
在上一章中,我們模擬了一個(gè)角速度恒定的場(chǎng)景。在本章中,我們將使其變得更加復(fù)雜;我們將模擬一個(gè)茶壺,在轉(zhuǎn)臺(tái)上以恒定的角加速度和減速度旋轉(zhuǎn)。
25.1 角加速度
就像線加速度是速度的導(dǎo)數(shù)一樣,角加速度也是角速度的導(dǎo)數(shù)。另外,類比于線加速度是由力引起的,角加速度也是由力、力矩的轉(zhuǎn)動(dòng)引起的。如果您不熟悉力矩,可以閱讀http://modsimpy.com/torque進(jìn)行了解。
一般來(lái)說(shuō),力矩是一個(gè)向量,定義為和
的叉積,其中
是杠桿臂,表示從旋轉(zhuǎn)點(diǎn)到施力點(diǎn)的向量,
是表示力的大小和方向的向量。
然而,對(duì)于本章中的問(wèn)題,我們只關(guān)注力矩的大小,而不關(guān)心方向。在這種情況下,我們可以運(yùn)用公式:
其中,是力矩,
是杠桿臂的長(zhǎng)度,
是力的大小,
是
和
之間的夾角。
由于力矩是長(zhǎng)度和力的乘積,所以用牛米(N m)表示。
25.2
與線性加速度通過(guò)牛頓第二運(yùn)動(dòng)定律與力相關(guān)的方式相同,,角加速度通過(guò)另一種形式的牛頓定律與力矩相關(guān):
其中是角加速度,
是轉(zhuǎn)動(dòng)慣量。正如質(zhì)量使物體難以加速一樣[1],轉(zhuǎn)動(dòng)慣量也使得物體難以旋轉(zhuǎn)。
在最一般的情況下,三維物體繞任意軸旋轉(zhuǎn),轉(zhuǎn)動(dòng)慣量是張量,是一個(gè)以向量為參數(shù)并返回一個(gè)向量的函數(shù)。
幸運(yùn)的是,在一個(gè)系統(tǒng)中,所有的旋轉(zhuǎn)和力矩都發(fā)生在一個(gè)單軸上,我們不必處理最一般的情況,而可以把轉(zhuǎn)動(dòng)慣量看作標(biāo)量。
對(duì)于質(zhì)量為的小物體,在距離r處繞一點(diǎn)旋轉(zhuǎn),轉(zhuǎn)動(dòng)慣量為
。對(duì)于更復(fù)雜的物體,我們可以把物體分成多個(gè)小質(zhì)量,計(jì)算每個(gè)質(zhì)量的轉(zhuǎn)動(dòng)慣量,然后把它們相加。
然而,對(duì)于大多數(shù)簡(jiǎn)單的形狀,人們已經(jīng)做了計(jì)算,你可以直接查找結(jié)果。例如,可以參見(jiàn)http://modsimpy.com/moment。
25.3 茶壺和轉(zhuǎn)盤
中餐館的桌子通常有一個(gè)旋轉(zhuǎn)的托盤或轉(zhuǎn)盤,以方便顧客分享菜肴。這些轉(zhuǎn)盤由低摩擦軸承支撐,使它們能夠輕松轉(zhuǎn)動(dòng)和滑動(dòng)。然而,它們可能很重,特別是當(dāng)它們裝滿食物時(shí),因此它們有很大的轉(zhuǎn)動(dòng)慣量。
假設(shè)我坐在一張桌子前,轉(zhuǎn)盤上放著一壺茶,坐在我正對(duì)面的人讓我遞茶。我用1 N的力推轉(zhuǎn)臺(tái)的邊緣,直到它轉(zhuǎn)動(dòng)了0.5 rad,然后放開,轉(zhuǎn)盤滑動(dòng)到距離起始位置的1.5 rad處停止。那么我應(yīng)該施加多大的力才能使茶壺滑到我正對(duì)面的停止位置?
我們將按照以下步驟回答這個(gè)問(wèn)題:
我將使用第一次推動(dòng)的結(jié)果來(lái)估算轉(zhuǎn)盤的摩擦系數(shù)。
作為練習(xí),您將使用該摩擦系數(shù)來(lái)估計(jì)旋轉(zhuǎn)轉(zhuǎn)盤通過(guò)剩余角度所需的力。
我們的模擬將使用以下參數(shù):
轉(zhuǎn)臺(tái)半徑為0.5 m,重量為7 kg。
茶壺重0.3 kg,離轉(zhuǎn)盤中心0.4 m。
圖25.1顯示了這種情況,其中是施加在轉(zhuǎn)臺(tái)周邊的力
,垂直于力臂
,
是產(chǎn)生的力矩??拷撞康乃{(lán)色圓圈是茶壺。

圖25.1:帶茶壺的轉(zhuǎn)盤示意圖
下面是一個(gè)帶有場(chǎng)景參數(shù)的Params對(duì)象:
params = Params(radius_disk=0.5*m,
mass_disk=7*kg,
radius_pot=0.4*m,
mass_pot=0.3*kg,
force=1*N,
torque_friction=0.2*N*m,
theta_end=0.5*radian,
t_end=20*s)
make_system創(chuàng)建初始狀態(tài)init,并計(jì)算轉(zhuǎn)盤和茶壺的總轉(zhuǎn)動(dòng)慣量。
def make_system(params):
mass_disk, mass_pot = params.mass_disk, params.mass_pot
radius_disk, radius_pot = params.radius_disk, params.radius_pot
init = State(theta=0*radian, omega=0*radian/s)
I_disk = mass_disk * radius_disk**2 / 2
I_pot = mass_pot * radius_pot**2
return System(params, init=init, I=I_disk+I_pot)
在初始狀態(tài)下,theta代表桌子的角度,單位為rad;omega表示角速度,單位為rad/s。
I_disk是轉(zhuǎn)盤的轉(zhuǎn)動(dòng)慣量,它是基于水平圓盤繞一個(gè)通過(guò)其中心的垂直軸旋轉(zhuǎn)的轉(zhuǎn)動(dòng)慣量:
I_pot是將其視為一個(gè)點(diǎn)質(zhì)量的茶壺的轉(zhuǎn)動(dòng)慣量:
在國(guó)際單位制中,轉(zhuǎn)動(dòng)慣量用kg m2表示。
現(xiàn)在我們可以創(chuàng)建一個(gè) System對(duì)象了:
system1 = make_system(params)
這是一個(gè)采用當(dāng)前狀態(tài)的斜率,包含角度和角速度,并返回導(dǎo)數(shù),角速度和角加速度:
def slope_func(state, t, system):
theta, omega = state
radius_disk, force = system.radius_disk, system.force
torque_friction, I = system.torque_friction, system.I
torque = radius_disk * force - torque_friction
alpha = torque / I
return omega, alpha
在這種情況下,施加在轉(zhuǎn)臺(tái)上的力始終垂直于杠桿臂,因此,力產(chǎn)生的力矩為
。
torque_friction表示摩擦產(chǎn)生的力矩。因?yàn)檗D(zhuǎn)臺(tái)是在theta的正方向上旋轉(zhuǎn),所以摩擦力在theta的負(fù)方向上作用。
現(xiàn)在我們已經(jīng)準(zhǔn)備好了進(jìn)行模擬,但我們必須先解決一個(gè)問(wèn)題。
當(dāng)我停止推動(dòng)轉(zhuǎn)盤時(shí),角加速度突然改變。我們可以用if語(yǔ)句來(lái)實(shí)現(xiàn)斜率函數(shù),該語(yǔ)句檢查theta的值并相應(yīng)地設(shè)置力。對(duì)于這樣一個(gè)粗糙的模型,這可能是好的。但是,如果我們分兩個(gè)階段進(jìn)行系統(tǒng)模擬,我們將得到更準(zhǔn)確的結(jié)果:
在第一階段,力是恒定的,我們運(yùn)行到
theta為0.5 rad。在第二階段,力為0,我們一直運(yùn)行到
omega為0。
然后我們可以將兩個(gè)階段的結(jié)果合并到一個(gè)單一的時(shí)間框架中。
這是我將在第一階段中使用的事件函數(shù),它在theta到達(dá) theta_end端時(shí)停止模擬,也就是我停止推動(dòng)時(shí):
def event_func1(state, t, system):
theta, omega = state
return theta - system.theta_end
現(xiàn)在我們可以開始運(yùn)行第一階段了。
results1, details1 = run_ode_solver(system1, slope_func,
events=event_func1)
在運(yùn)行第二階段之前,我們必須提取第一階段的最終時(shí)間和狀態(tài)。
t_0 = get_last_label(results1) * s
init2 = results1.last_row()
現(xiàn)在我們可以為第二階段創(chuàng)建一個(gè)系統(tǒng)對(duì)象,初始狀態(tài)來(lái)自第一階段,力為0。
system2 = System(system1, t_0=t_0, init=init2, force=0*N)
對(duì)于第二階段,我們需要一個(gè)事件函數(shù),它在轉(zhuǎn)盤停止時(shí)停止;也就是說(shuō),當(dāng)角速度為0時(shí)。
def event_func2(state, t, system):
theta, omega = state
return omega
現(xiàn)在我們可以運(yùn)行第二階段了。
results2, details2 = run_ode_solver(system2, slope_func,
events=event_func2)
Pandas提供可以結(jié)合results1和results2的combine_first。
results = results1.combine_first(results2)

圖25.2:施加力和摩擦力時(shí)轉(zhuǎn)臺(tái)的角度和角速度
圖25.2顯示了結(jié)果。角速度omega在我推的時(shí)候線性增大,在我放開后線性減小。角theta是角速度的積分,所以它在每個(gè)相位形成一條拋物線。
在下一節(jié)中,我們將使用這個(gè)模型來(lái)估計(jì)由于摩擦而產(chǎn)生的力矩。
25.4 估算摩擦
讓我們從上一節(jié)中獲取代碼并將其包裝在一個(gè)函數(shù)中。
def run_two_phases(force, torque_friction, params):
# put the parameters into the Params object
params = Params(params, force=force,
torque_friction=torque_friction)
# run phase 1
system1 = make_system(params)
results1, details1 = run_ode_solver(system1, slope_func,
events=event_func1)
# get the final state from phase 1
t_0 = results1.last_label() * s
init2 = results1.last_row()
# run phase 2
system2 = System(system1, t_0=t_0, init=init2, force=0*N)
results2, details2 = run_ode_solver(system2, slope_func,
events=event_func2)
# combine and return the results
results = results1.combine_first(results2)
return TimeFrame(results)
我們可以用run_two_phases來(lái)寫一個(gè)誤差函數(shù),用root_bisect來(lái)求出由于摩擦產(chǎn)生的力矩,這個(gè)力矩產(chǎn)生了第一次推動(dòng)的觀察結(jié)果,總共旋轉(zhuǎn)了1.5 rad。
def error_func1(torque_friction, params):
force = 1 * N
results = run_two_phases(force, torque_friction, params)
theta_final = results.last_row().theta
print(torque_friction, theta_final)
return theta_final - 1.5 * radian
現(xiàn)在我們可以使用root_bisect來(lái)估計(jì)由于摩擦產(chǎn)生的力矩了。
res = root_bisect(error_func1, [0.5, 2], params)
force = res.root
結(jié)果是0.166 N m,比最初的猜測(cè)要小一些。
現(xiàn)在我們知道了由于摩擦產(chǎn)生的力矩,我們可以計(jì)算出旋轉(zhuǎn)轉(zhuǎn)盤通過(guò)剩余角度所需的力,即從1.5 rad到3.14 rad。
在本章的筆記本“chap25.ipynb”中,您將有機(jī)會(huì)完成練習(xí)。有關(guān)下載和運(yùn)行代碼的說(shuō)明,請(qǐng)參閱0.4節(jié)。
本書的中文翻譯由南開大學(xué)醫(yī)學(xué)院智能醫(yī)學(xué)工程專業(yè)2018級(jí)、2019級(jí)的師生完成,方便后續(xù)學(xué)生學(xué)習(xí)《Python仿真建?!氛n程。翻譯人員(排名不分前后):薛淏源、金鈺、張?chǎng)?、張瑩睿、趙子雨、李翀、慕振墺、許靖云、李文碩、尹瀛寰、沈紀(jì)辰、迪力木拉、樊旭波、商嘉文、趙旭、連煦、楊永新、樊一諾、劉志鑫、彭子豪、馬碧婷、吳曉玲、常智星、陳俊帆、高勝寒、韓志恒、劉天翔、張藝瀟、劉暢。
整理校訂由劉暢完成,如果您發(fā)現(xiàn)有翻譯不當(dāng)或者錯(cuò)誤,請(qǐng)郵件聯(lián)系changliu@nankai.edu.cn。
本書中文版不用于商業(yè)用途,供大家自由使用。
未經(jīng)允許,請(qǐng)勿轉(zhuǎn)載。