Loading [MathJax]/jax/output/HTML-CSS/jax.js

熱門文章

2020年1月15日 星期三

利用反作用力後退

作者:王一哲
日期:2020/1/15




題目


假設有一個裝置本體的質量 M,裝置上載有一些即將被水平拋出的物體,物體的總質量為 m,且M>m。假設總共拋出 N 次,則每次拋出的物體質量 dm=m/N,被拋出的物體相對於拋出後本體的速度為 v。請問將所有物體拋出後本體的速度vt與拋出次數N的關係為何?



理論計算


第1次拋出物體後本體對地速度為 v1,被拋出的物體對地速度為 v+v1,由動量守恆可知

(M+mdm)v1+dm(v+v1)=0
v1=dmvM+m

第2次拋出物體後本體對地速度為 v2,被拋出的物體對地速度為 v+v2,由動量守恆可知

(M+m2dm)v2+dm(v+v2)=(M+mdm)v1

v2=dmv+(M+mdm)v1M+mdm=dmvM+mdm+v1=dmv(1M+mdm+1M+m)

第3次拋出物體後本體對地速度為 v3,被拋出的物體對地速度為 v+v3,由動量守恆可知

(M+m3dm)v3+dm(v+v3)=(M+m2dm)v2

v3=dmv+(M+m2dm)v2M+m2dm=dmvM+m2dm+v2=dmv(1M+m2dm+1M+mdm+1M+m)



N次拋出物體後本體對地速度為 vN,被拋出物體對地速度為 v+vN,依照以上的規律可以推測

(M+mNdm)vN+dm(v+vN)=[M+m(N1)dm]vN1

vN=dmv+[M+m(N1)dm]vN1M+m(N1)dm=dmvM+m(N1)dm+vN1=dmvNi=11M+m(i1)dm





程式1:指定N旳數值,計算每次拋出後本體的速度


import matplotlib.pyplot as plt

M, m, v, N = 2, 1, 3, 10
dm = m/N
vi, idx = [0], [0]

for i in range(1, N+1, 1):
    idx.append(i)
    vi.append((-dm*v + (M+m-(i-1)*dm)*vi[i-1]) / (M+m-(i-1)*dm))
 
plt.figure(figsize=(6, 4.5), dpi=100)
plt.subplots_adjust(left=0.2, right=0.95, top=0.9, bottom=0.15)
plt.xlabel('number', fontsize=16)
plt.ylabel(r'$v_i ~\mathrm{(m/s)}$', fontsize=16)
plt.xticks(fontsize=12)
plt.yticks(fontsize=12)
plt.grid(color='gray', linestyle='--', linewidth=1)
plt.plot(idx, vi, color='red', linestyle='', marker='o', markersize=5)
plt.savefig('ThrowBack'+str(N)+'.svg')
plt.savefig('ThrowBack'+str(N)+'.png')
plt.close



假設M=2 kgm=1 kgv=3 m/s,手動修改拋出次數N,計算每次拋出物體後本體的速度並作圖。從以下的關係圖可以看出,當N10時數據點分布的曲線大致上相同,本體的末速約為1.2 m/s

N=3時,每次拋出物體後本體的速度

N=5時,每次拋出物體後本體的速度

N=10時,每次拋出物體後本體的速度

N=20時,每次拋出物體後本體的速度

N=100時,每次拋出物體後本體的速度


程式2:計算本體最終速度vt與拋出次數N的關係


import numpy as np
import matplotlib.pyplot as plt

M, m, v = 2, 1, 3

def vN(N):
    dm = m/N
    vi, idx = [0], [0]
    for i in range(1, N+1, 1):
        idx.append(i)
        vi.append((-dm*v + (M+m-(i-1)*dm)*vi[i-1]) / (M+m-(i-1)*dm))
    return N, vi[-1]

num = 100
Ns, vs = np.zeros(num), np.zeros(num)

for j in range(1, num+1, 1):
    Ns[j-1], vs[j-1] = vN(j)

plt.figure(figsize=(6, 4.5), dpi=100)
plt.subplots_adjust(left=0.2, right=0.95, top=0.9, bottom=0.15)
plt.xlim(0, max(Ns)+1)
plt.xlabel('N', fontsize=16)
plt.ylabel(r'$v_t ~\mathrm{(m/s)}$', fontsize=16)
plt.xticks(fontsize=12)
plt.yticks(fontsize=12)
plt.grid(color='gray', linestyle='--', linewidth=1)
plt.plot(Ns, vs, color='red', linestyle='', marker='o', markersize=5)
plt.savefig('ThrowBackFor.svg')
plt.savefig('ThrowBackFor.png')
plt.close



將程式1稍微修改一下,使用 for 迴圈計算本體最終速度vt與拋出總次數N的關係並作圖。從以下的關係圖可以看出,當N越大時vt的量值也會變大,這表示將物體分成較多等份,每次拋出一小塊,這樣可以得到較快的最終速度,但即使分成再多等份,最終速度最快也只能達到大約1.2 m/s

本體最終速度與拋出總次數的關係圖

本體最終速度與拋出總次數的關係圖(只畫出N = 1 ~ 10)



結語


這是一個相當經典的高中物理題目,通常會放在高二下學期第6章動量守恆。由於我已經習慣寫 Python 程式,所以我很自然地選擇用程式碼處理這個問題,不想要看到程式碼的同學也可以用試算表軟體做到類似的效果,這是我用 Google 試算表製作的檔案連結


使用 Google 試算表繪製的本體最終速度與拋出總次數的關係圖(只畫出N = 1 ~ 10)





HackMD 版本連結:https://hackmd.io/@yizhewang/ByRIWtheL

沒有留言:

張貼留言