# 利用反作用力後退 > 作者:王一哲 > 日期:2020/1/15 <br /> ## 題目 假設有一個裝置本體的質量 $M$,裝置上載有一些即將被水平拋出的物體,物體的總質量為 $m$,且$M>m$。假設總共拋出 $N$ 次,則每次拋出的物體質量 $dm = m/N$,被拋出的物體相對於拋出後本體的速度為 $v$。請問將所有物體拋出後本體的速度$v_t$與拋出次數$N$的關係為何? <br /> ## 理論計算 第1次拋出物體後本體對地速度為 $v_1$,被拋出的物體對地速度為 $v + v_1$,由動量守恆可知 $$(M+m-dm) v_1 + dm (v+v_1) = 0$$ $$v_1 = -\frac{dm \cdot v}{M+m}$$ 第2次拋出物體後本體對地速度為 $v_2$,被拋出的物體對地速度為 $v + v_2$,由動量守恆可知 $$(M+m-2dm) v_2 + dm (v+v_2) = (M+m-dm) v_1$$ $$\begin{align*} v_2 &= \frac{-dm \cdot v + (M+m-dm) v_1 }{M+m-dm} \\ &= -\frac{dm \cdot v}{M+m-dm} + v_1 \\ &= -dm \cdot v \left(\frac{1}{M+m-dm} + \frac{1}{M+m} \right) \end{align*}$$ 第3次拋出物體後本體對地速度為 $v_3$,被拋出的物體對地速度為 $v + v_3$,由動量守恆可知 $$(M+m-3dm) v_3 + dm (v+v_3) = (M+m-2dm) v_2$$ $$\begin{align*} v_3 &= \frac{-dm \cdot v + (M+m-2dm) v_2 }{M+m-2dm}\\ &= -\frac{dm \cdot v}{M+m-2dm} + v_2\\ &= -dm \cdot v \left(\frac{1}{M+m-2dm} + \frac{1}{M+m-dm} + \frac{1}{M+m} \right) \end{align*}$$ 第$N$次拋出物體後本體對地速度為 $v_N$,被拋出物體對地速度為 $v + v_N$,依照以上的規律可以推測 $$(M+m-N \cdot dm) v_N + dm (v+v_N) = [M+m-(N-1) \cdot dm] v_{N-1}$$ $$\begin{align*} v_N &= \frac{-dm \cdot v + [M+m-(N-1) \cdot dm] v_{N-1} }{M+m-(N-1) \cdot dm}\\ &= -\frac{dm \cdot v}{M+m-(N-1) \cdot dm} + v_{N-1}\\ &= -dm \cdot v \sum_{i=1}^N \frac{1}{M+m-(i-1) \cdot dm} \end{align*}$$ <br /> ## 程式1:指定$N$的數值,計算每次拋出後本體的速度 ```python= 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 ``` <br /> 假設$M=2~\mathrm{kg}$、$m=1~\mathrm{kg}$、$v=3~\mathrm{m/s}$,手動修改拋出次數$N$,計算每次拋出物體後本體的速度並作圖。從以下的關係圖可以看出,當$N \geq 10$時數據點分布的曲線大致上相同,本體的末速約為$1.2 ~\mathrm{m/s}$。 <img style="display: block; margin-left: auto; margin-right: auto" height="60%" width="60%" src="https://imgur.com/5uDUjko.png"> <div style="text-align:center">N=3時,每次拋出物體後本體的速度</div> <br /> <img style="display: block; margin-left: auto; margin-right: auto" height="60%" width="60%" src="https://imgur.com/uy6Soi3.png"> <div style="text-align:center">N=5時,每次拋出物體後本體的速度</div> <br /> <img style="display: block; margin-left: auto; margin-right: auto" height="60%" width="60%" src="https://imgur.com/3I68Xcy.png"> <div style="text-align:center">N=10時,每次拋出物體後本體的速度</div> <br /> <img style="display: block; margin-left: auto; margin-right: auto" height="60%" width="60%" src="https://imgur.com/P0v9dzQ.png"> <div style="text-align:center">N=20時,每次拋出物體後本體的速度</div> <br /> <img style="display: block; margin-left: auto; margin-right: auto" height="60%" width="60%" src="https://imgur.com/n7N1Slo.png"> <div style="text-align:center">N=100時,每次拋出物體後本體的速度</div> <br /> ## 程式2:計算本體最終速度$v_t$與拋出次數$N$的關係 ```python= 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 ``` <br /> 將程式1稍微修改一下,使用 for 迴圈計算本體最終速度$v_t$與拋出總次數$N$的關係並作圖。從以下的關係圖可以看出,當$N$越大時$v_t$的量值也會變大,這表示將物體分成較多等份,每次拋出一小塊,這樣可以得到較快的最終速度,但即使分成再多等份,最終速度最快也只能達到大約$1.2 ~\mathrm{m/s}$。 <img style="display: block; margin-left: auto; margin-right: auto" height="60%" width="60%" src="https://imgur.com/sq47WAB.png"> <div style="text-align:center">本體最終速度與拋出總次數的關係圖</div> <br /> <img style="display: block; margin-left: auto; margin-right: auto" height="60%" width="60%" src="https://imgur.com/tXyvFyR.png"> <div style="text-align:center">本體最終速度與拋出總次數的關係圖(只畫出N = 1 ~ 10)</div> <br /> ## 結語 這是一個相當經典的高中物理題目,通常會放在高二下學期第6章動量守恆。由於我已經習慣寫 Python 程式,所以我很自然地選擇用程式碼處理這個問題,不想要看到程式碼的同學也可以用試算表軟體做到類似的效果,這是我用 Google 試算表製作的[檔案連結](https://docs.google.com/spreadsheets/d/17yYjlYl0cqFE1JBQKVZPKb-ebN_IWfFtXuuIgEEPx6M/edit?usp=sharing)。 <img style="display: block; margin-left: auto; margin-right: auto" height="60%" width="60%" src="https://imgur.com/fbKQsBs.png"> <div style="text-align:center">使用 Google 試算表繪製的本體最終速度與拋出總次數的關係圖(只畫出N = 1 ~ 10)</div> <br /> --- ###### tags:`Physics`、`Python`