天文学をプログラミングで解析する② (万有引力の大きさを求める)
みなさんこんにちは。ベクトルビクトルです。先日の物理の授業で万有引力の法則について学びました。
$$
F = G \frac{m_1 m_2}{r^2} (G=6.67×10^{-11} [Nm^2/kg^2] )
$$
Gは重力定数という名前がついており、rは距離、m1,m2はそれぞれ質量を意味しています。
この式は何を意味するかというと、万有引力は距離の2乗に反比例し、質量に比例すると言う事です。
この式は天文学を学んでいく時に最初にお目にかかるほど有名な式で、自分の体重を式に代入すると万有引力の大きさを求めることができます。そこで、今回のプログラムを作成致しました。
万有引力について詳しく知りたい方はこちらへ↑
計算
地球の重力を求める
地球の質量は$${6.0×10^{24}[kg]}$$で、地球の重力に引っ張られている物体を$${1.0[kg]}$$とします。さらに地球の中心と物体の間の距離は$${6400[km]}$$(地球の半径)とします。すると、
$$
F = (6.67×10^{-11}[Nm^2/kg^2])・\frac{6.0×10^{24}[kg]・1.0[kg]}{(6.4×10^{6}[m])^2} \fallingdotseq 9.8[N]
$$
となります。
人間同士に働く万有引力の大きさを求める
人間の体重を$${60[kg]}$$とし、2人の間の距離を$${1[m]}$$とすると、2人の間に働く万有引力の大きさは、
$$
F = (6.67×10^{-11}[Nm^2/kg^2])・\frac{60[kg]・60[kg]}{(1.0[m])^2} \fallingdotseq 2.4×10^{-7}[N]
$$
となります。
プログラム
今回はPythonでTkinterとMatplotlibという二つのライブラリを使用します。Tkinterは具体的にGUI(グラフィカルユーザーインターフェース)を構成するためのライブラリで、Matplotlibはグラフ描画のためのライブラリです。
こちらのウェブサイトにTkinterの基礎的な内容が学べますので、ご確認ください。
Matplotlibのホームページ↓
この二つを使って、「体重を入力したら地球からの距離と重力の大きさを表すグラフを出力するプログラム」を作成していきます。
Tkクラスを生成
#Tkクラス生成
root = tk.Tk()
#画面サイズ、タイトル
root.geometry('300x200')
root.title('サンプル')
#ラベル
lbl = tk.Label(text='体重[kg]を入力して下さい')
lbl.place(x=5, y=50)
#テキストボックス
txt = tk.Entry(root)
txt.place(x=60, y=80)
#ボタン
btn = tk.Button(root, text='計算', command=btn_click)
btn.pack()
btn.place(x=140, y=170)
ボタンをクリックしてテキストボックスの値を取得する
def btn_click():
num = txt.get()
try:
value = int(num) # テキストボックスの値をint型に変換
calculate_F(value) # int型の値を引数としてcalculate_F関数を呼び出す
except ValueError:
print("入力された値は整数ではありません。")
コード
import matplotlib.pyplot as plt
import tkinter as tk
#Tkクラス生成
root = tk.Tk()
#画面サイズ、タイトル
root.geometry('300x200')
root.title('サンプル')
#ラベル
lbl = tk.Label(text='体重[kg]を入力して下さい')
lbl.place(x=5, y=50)
#テキストボックス
txt = tk.Entry(root)
txt.place(x=60, y=80)
#ボタンをクリックしてテキストボックスの値を取得
def btn_click():
num = txt.get()
try:
value = int(num) # テキストボックスの値をint型に変換
calculate_F(value) # int型の値を引数としてcalculate_F関数を呼び出す
except ValueError:
print("入力された値は整数ではありません。")
btn = tk.Button(root, text='計算', command=btn_click)
btn.pack()
btn.place(x=140, y=170)
# グラフを描くための関数
def draw_graph(x, y):
plt.plot(x, y, marker="o")
plt.title("Gravity force")
plt.xlabel("Distance(km)")
plt.ylabel("Gravitational force(N)")
plt.show()
# 万有引力の計算
def calculate_F(weight):
r = range(6400, 64001)
F = [] # 空リスト
G = 6.672 * (10 ** -11) # 重力定数
m1 = 5.972 * (10 ** 24) # 地球の重さ
# 先ほどrangeで作成した距離のリストrを一つずつ取り出して、forceとして万有引力を計算
for distance in r:
force = G * (m1 * weight) / ((distance * 1000) ** 2)
F.append(force) # 作成しておいたリストFにひとつずつ追加(append)していく
# グラフを描画
draw_graph(r, F)
# 表示
root.mainloop()
↓こちらからプログラムの実行結果が見れます。
https://twitter.com/victorryoma/status/1660252836679270400
いかがでしたでしょうか?他に物理法則をプログラムで適用すると同じようにグラフを出力することが出来るので、是非試してみてください!
この記事が参加している募集
この記事が気に入ったらサポートをしてみませんか?