Search Posts

【物理】放物運動で物体を最も遠くに飛ばすことのできる発射角度は?【数値計算】

物理の基本的な問題の一つに、放物運動があります。今回、Pythonを使った数値計算の練習として、この放物運動を題材にしようと思います。
計算するのは、放物運動で物体を最も遠くに飛ばすことのできる発射角度です。よく45度で発射すると最もよく飛ぶと言われますが、どうでしょうか。計算して確かめてみましょう。

運動方程式を解く

数値計算を始める前にまず初めに運動方程式を解いて、物体の飛距離を計算します。

高さhから初速度v_{0}, 角度\thetaで質量mの物体を射出することを考えます。
座標を下図のように設定すると、時刻tのときの物体の座標は、次式のようにあらわされます。

 x = v_{0} \cos \theta (1)

\displaystyle y = -\frac{1}{2}gt^{2} + v_{0}\sin \theta + h (2)

gは重力加速度です。物体の飛距離Lは、y = 0のときの時刻におけるxである。式(2)から

\displaystyle -\frac{1}{2}gt^{2} + v_{0}\sin \theta + h = 0t = \displaystyle \frac{v_{0}+\sqrt{v^{2}_{0}+2gh}}{g}

この時刻を式(1)に代入して、整理すると

L(\theta) = \displaystyle v_{0} \cos \theta \frac{v_{0}+\sqrt{v^{2}_{0}+2gh}}{g} = \frac{v^{2}_{0}}{2g}\sin 2\theta \left( 1+\sqrt{1+\frac{2gh}{v^{2}_{0}\sin ^{2} \theta}}\right) (3)

この式をもとに飛距離を最大にできる角度を求めていきます。

検討①:高さが0のとき

飛距離を最大にできる角度を厳密に求める前に、ある程度の角度を予想しましょう。まず、高さが0の場合を考えます。このとき、式(3)は、

L(\theta) = \displaystyle \frac{v^{2}_{0}}{g}\sin 2\theta (4)

となります。式(4)が最大になるのは\sin 2\theta = 1になるとき、すなわち45度のときです。

世間で広く言われている45度で投げると一番遠くまで飛ぶというのはこの計算がもとになっています。物体を高い位置から投げることを想定しない場合であれば、確かに45度で投げるのが正しいです。

検討②:高さが十分に高いとき

次に高さが十分に高いときを考えてみます。高さが十分に高いときというのは、\displaystyle \frac{2gh}{v^{2}_{0}\sin^{2} \theta} >> 1のときです。このとき、式(3)は、

L(\theta) \simeq \frac{v^{2}_{0}}{2g}\sin 2\theta \left( 1+\sqrt{\frac{2gh}{v^{2}_{0}\sin ^{2} \theta}}\right) = \sqrt{\frac{2}{g}}\sqrt{h}v_{0}\cos \theta(5)

となる。式(5)から高さが十分に高いときには飛距離は\cos \theta で変化し、飛距離が最大になるのは水平に射出した時になります。

最大飛距離になる角度を計算

近似を使わずに最大飛距離になる角度を計算するには、式(3)を\thetaで微分し、導関数が0になるときの\thetaを計算することで、求められます。ですが、\thetaで微分するのは計算が煩雑になります。今、射出角度は0 ~ 90度を想定しています。このとき、\sin \theta は単調に増加することから、dL(\theta)/d\theta = 0のとき、dL(\theta)/d(\sin \theta) = 0が成り立ちます。そこで、\sin \theta = sとして、式(3)を整理すると、

L(s) = \displaystyle \frac{v^{2}_{0}}{g}\sqrt{1-s^{2}}\left( s+\sqrt{s^{2} + \frac{2gh}{v^{2}_{0}}}\right) (6)

となります。式(6)をsで微分し、dL(s)/ds = 0をもちいて整理すると、

\displaystyle \left( \frac{s}{1-s^{2}}\right) ^{2} = \frac{1}{s^{2} + \frac{2gh}{v^{2}_{0}}}

これは、二次式なので解くことができ、

 \sin \theta = \displaystyle \frac{1}{\sqrt{2}}\frac{1}{\sqrt{1+\frac{gh}{v^{2}_{0}}}}

を満たす\thetaのとき、飛距離が最大になるということが計算できました。ここまでくれば、\arcsin を使って計算することができます。

数値計算で求めてみる

今回は、運動方程式を解くことで解析的に飛距離が最大になる角度を求めることができました。ですが、必ず解析的に解くことができるとは限りません。今回は考慮していませんが、実際には空気抵抗や摩擦の影響も含めないと、現実の物体の動きを予測することはできません。そうなると、解析的に解ける場合はほとんどありません。解析的に解けない場合は、数値的に解を求めることになります。放物運動を題材にpythonで数値的に最大飛距離になる角度を求めてみたいと思います。

pythonの科学計算ライブラリのScipyを使って、計算します。Scipyには、最小値を求める関数optimize.brentが用意されています。
このoptimize.brentを使って次のようなプログラムを書きます。

from scipy import optimize
import numpy as np
import matplotlib.pyplot as plt

def L(theta):
v0 = 30.0 #m/sec
h = 10.0 #m
g = 9.8 #m/s^2
x = v0**2*np.cos(theta)*(np.sin(theta)+np.sqrt(np.sin(theta)**2+2.0*g*h/v0**2))/g
x2 = -1.0*x
#最小値を求める関数を使うので、-1倍して最大値が最小値になるようにしている
return x2

t = np.linspace(0.0, np.pi/2, 100)
plt.figure()
plt.plot(t, -1.0*L(t), 'r-')
#グラフのプロット 飛距離vs射出角度
theta0 = optimize.brent(L)
theta0_deg = 180.0*theta0/np.pi
print(theta0)
print(theta0_deg)
print(-1.0*L(theta0))

初速度と物体を発射する高さは適当な値を入れてあります。このプログラムで計算した結果では、最大飛距離は101.3 m, そのときの角度は42.2度と計算されました。45度よりもわずかに低い角度で投げるのが一番良いという結果が得られました。
ちなみに、先ほどのプログラムで高さを0 mにすると、45度という結果がちゃんと返ってきます。このように数値計算で解くと、簡単に解を求めることができます。

まとめ

物理の基本的な問題である放物運動について、運動方程式を解いて最大の飛距離がでる発射角度を解析的・数値的に求めました。数値的に解く方法は解析的に解くことのできない問題を解くためには必要な技術です。これを土台に数値計算について深く理解していきたいと考えています。

最後までお読みいただきありがとうございます。それでは、次回の記事でお会いしましょう。

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください