物理法則の基本とされる「万有引力」や「重力加速度」は、Pythonで容易に計算することができます。
本記事では、Pythonを使用した万有引力と重力加速度の計算方法について、詳しくご説明します。
万有引力
万有引力(universal gravitation)とは、2つの物体の質量を\(M\),\(m\)、物体間の距離を\(r\)として、下式で表される引力のことです。
\(F=G\dfrac{Mm}{r^{2}}\)
\(G\)は万有引力定数と呼ばれる比例定数です。
\(G=6.67430\times 10^{-11}m^{3}\cdot s^{2}\cdot kg^{-1}\)
scipy.constants.G
SciPyのscipy.constants.Gを使用すると、万有引力定数を呼び出すことができます。
#input
import scipy.constants as const
print(const.G)
#output
6.6743e-11
SciPyのscipy.constants.physical_constantsを使用すると、単位や測定精度も呼び出すことができます。
#input
from scipy.constants import physical_constants as pconst
print(pconst["Newtonian constant of gravitation"])
#output
(6.6743e-11, 'm^3 kg^-1 s^-2', 1.5e-15)
地球と太陽の万有引力
任意の点を原点に持ち、2つの物体までの距離をそれぞれ\(r0\)、\(r\)とすると、ベクトルを使用して万有引力は下式で表されます。
\(F=GMm\dfrac{r_{0}-r}{\left| r_{0}-r\right| ^{3}}\)
上式を関数として実装した例を以下に載せます。
#input
def gravitation(M, r0, m, r):
vec = np.array(r0) - np.array(r)
return const.G * M * m * vec / norm(vec)**3
この関数を使用して、太陽と地球の万有引力を計算してみます。
太陽の質量を\(1.989\times 10^{30}kg\)、地球の質量を\(5.972\times 10^{24}kg、地球と太陽の距離を\(1.5\times 10^{11}m\)とします。
#input
import numpy as np
import scipy.constants as const
from scipy.linalg import norm
def gravitation_vector(m0, r0, m, r):
vec = np.array(r0) - np.array(r)
return const.G * m0 * m * vec / norm(vec)**3
ms = 1.989e30
me = 5.972e24
r0 = [0, 0, 0]
r = [1.5e11, 0, 0]
F = gravitation_vector(ms, r0, me, r)
print(F)
#output
[-3.52352849e+22 0.00000000e+00 0.00000000e+00]
重力加速度
重力加速度(gravitational acceleration)とは、万有引力定数\(G\)、天体質量\(M\)、半径を\(R\)として、下式で表されます。
\(g=\dfrac{GM}{R^{2}}\)
scipy.constants.g
SciPyのscipy.constants.gを使用すると、重力加速度を呼び出すことができます。
#input
import scipy.constants as const
print(const.g)
#output
9.80665
SciPyのscipy.constants.physical_constantsを使用して、単位と測定精度を確認してみます。
#input
from scipy.constants import physical_constants as pconst
print(pconst["standard acceleration of gravity"])
#output
(9.80665, 'm s^-2', 0.0)
任意の緯度での重力加速度
標準重力加速度は上値で定義されていますが、実際には緯度、地形等の影響を受けて、場所によって値が異なります。
本節では、任意の緯度における重力加速度を計算する関数を実装してみます。
#input
import numpy as np
import scipy.constants as const
def surface_acceleration(m, r, rp, phi, degrees=True):
if degrees == True:
phi = np.deg2rad(phi)
w = 2 * np.pi / rp
g = const.G * m / r**2
f = r * w**2 * np.cos(phi)
gf = np.sqrt(g**2 + f**2 - 2 * g * f * np.cos(phi))
return gf
me = 5.972e24
re = 6.378e6
rp = 86164
g_0 = surface_acceleration(me, re, rp, 0)
g_30 = surface_acceleration(me, re, rp, 30)
g_60 = surface_acceleration(me, re, rp, 60)
g_90 = surface_acceleration(me, re, rp, 90)
print("赤道の重力加速度 :{:.3f}".format(g_0))
print("北緯30°の重力加速度:{:.3f}".format(g_30))
print("北緯60°の重力加速度:{:.3f}".format(g_60))
print("北緯90°の重力加速度:{:.3f}".format(g_90))
#output
赤道の重力加速度 :9.765
北緯30°の重力加速度:9.773
北緯60°の重力加速度:9.790
北緯90°の重力加速度:9.798
まとめ
この記事では、Pythonを使用した万有引力と重力加速度の計算方法について、ご説明しました。
本記事を参考に、ぜひ試してみて下さい。
参考
Python学習用おすすめ教材
Pythonの基本を学びたい方向け
統計学基礎を学びたい方向け
Pythonの統計解析を学びたい方向け
おすすめプログラミングスクール
Pythonをはじめ、プログラミングを学ぶなら、TechAcademy(テックアカデミー)がおすすめです。
私も入っていますが、好きな時間に気軽にオンラインで学べますので、何より楽しいです。
現役エンジニアからマンツーマンで学べるので、一人では中々続かない人にも、向いていると思います。
無料体験ができますので、まずは試してみてください!