エクセルでシミュレーション 3次元で衛星の軌道計算
ルンゲ=クッタ法(RK4法)を3次元へ適用 (2階微分方程式:3次元) スイングバイ あかつき
エクセルでどこまでできるか?
衛星の初速度を地球の公転速度程度に設定して軌道計算してみた。
'以下、計算部分を抜粋、(※別途、シート側にてx-y散布図作図が必要) ※データはR列〜Y列
及び、AJ列〜AQ列にて印字
'パブリック又はプライベイト変数の宣言 x,y,z,tほか共通化 Privateはプロシージャ内の共通化
Public x,
y, z,
t
As Double '衛星の位置
Public vx, vy,
vz
As Double '衛星の速度
Private x_e_sat,
y_e_sat, z_e_sat As
Double '地球に対する位置
Private vx_e_sat,
vy_e_sat, vz_e_sat As Double
'地球に対する速度
Private x_e, y_e,
z_e
As Double '地球の位置
Private vx_e, vy_e,
vz_e
As Double '地球の速度
Private
r_e2sat
As Double '地球−衛星の距離
Public RTvX, RTvY,
RTvZ
As Double '引数の共通化
Public RTgX,
RTgY,
RTgZ
As Double '引数の共通化
Public dt As Double ' 通常は1時間 = 3600 秒
'各種定数
Public Const
G As Double = 6.673 * 10 ^
(-11) ' 重力定数
Public Const
Msol As Double = 1.9891 * 10 ^
30 ' 太陽質量 kg
Public
Const M_e As Double = 5.9736 * 10 ^
24 ' 地球質量 kg
Public
Const R0 As Double = 1.4959787 * 10 ^
11
' 地球の公転半径 約1億5千万km
Public Const ω As
Double = 2 * 3.1415926535 / (365.256363 * 24 * 60 *
60)
' 2π/T T:地球の周期は365日
Public Const hill As Double = 150
* 10 ^
7
' HILL圏 150万km
Sub RK4_メインルーチン()
range("A1")="※データはR列〜Y列
及び、AJ列〜AQ列にて印字⇒"
'◆◆◆◆◆◆◆◆◆◆◆◆◆ ルンゲクッタ法で 軌道計算 ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
'----------------------------------------------------------------
x
= 1.4959787 * 10 ^ 11 '衛星位置 x成分初期値
y =
0
'衛星位置 y成分初期値
z =
0
'衛星位置 z成分初期値
vx =
0
'衛星速度 x成分初期値
vy = 29.78 * 10 ^ 3 '衛星速度 y成分初期値
vz =
0
'衛星速度 z成分初期値
dt =
43200
'分割数 3600×12秒(テスト用)
cal_time = 12000000 '計算時間
x_e
= 1.4959787 * 10 ^ 11 '地球の位置
y_e =
0
'地球の位置
z_e =
0
'地球の位置
vx_e =
0
'地球の速度
vy_e = 29.78 * 10 ^ 3
'地球の速度 m/sec
vz_e = 7 * 10 ^
3
'地球の速度 (テスト用)
'----------------------------------------------------------------
For
t = 0 To cal_time Step dt 't:時間経過
0〜365日 (=8760時間)
Call 衛星の位置
Call 衛星の速度
Call 地球の位置
Call 地球の速度
Call
ルンゲクッタ '衛星の軌道計算
Call
ルンゲクッタ_地球 '地球の軌道計算
Next t
End Sub
Sub 衛星の位置()
r = Sqr(x ^ 2 +
y ^ 2 + z ^ 2)
Cells(t / dt + 7, 18) = r
Cells(t / dt + 7, 19) = x
'x成分
Cells(t / dt + 7, 20) = y 'y成分
Cells(t / dt + 7, 21) = z 'z成分
End
Sub
Sub 衛星の速度()
v = Sqr(vx ^ 2 + vy ^ 2 + vz ^ 2)
Cells(t / dt + 7, 22)
= v
Cells(t / dt + 7, 23) = vx 'x成分
Cells(t / dt + 7, 24) = vy
'y成分
Cells(t / dt + 7, 25) = vz 'z成分
End Sub
Sub
衛星の地球に対する相対位置()
x_e_sat = x - x_e 'x成分
y_e_sat = y - y_e
'y成分
z_e_sat = z - z_e 'z成分
r_e2sat = Sqr(x_e_sat ^ 2 + y_e_sat ^ 2
+ z_e_sat ^ 2)
Cells(t / dt + 7, 26) = r_e2sat
Cells(t / dt + 7, 27) =
x_e_sat 'x成分
Cells(t / dt + 7, 28) = y_e_sat 'y成分
Cells(t / dt
+ 7, 29) = z_e_sat 'z成分
End Sub
Sub 地球の位置() ' 地球の位置
r_e =
Sqr(x_e ^ 2 + y_e ^ 2 + z_e ^ 2)
Cells(t / dt + 7, 36) = r_e
Cells(t / dt
+ 7, 37) = x_e
Cells(t / dt + 7, 38) = y_e
Cells(t / dt + 7, 39) =
z_e
End Sub
Sub 地球の速度()
v_e = Sqr(vx_e ^ 2 + vy_e ^ 2 + vz_e ^
2)
Cells(t / dt + 7, 40) = v_e
Cells(t / dt + 7, 41) =
vx_e 'x成分
Cells(t / dt + 7, 42) = vy_e
'y成分
Cells(t / dt + 7, 43) = vz_e 'z成分
End Sub
Sub
衛星の地球に対する相対速度()
vx_e_sat = vx - vx_e 'x成分
vy_e_sat = vy -
vy_e 'y成分
vz_e_sat = vz - vz_e 'z成分
v =
Sqr(vx_e_sat ^ 2 + vy_e_sat ^ 2 + vz_e_sat ^ 2)
Cells(t / dt + 7, 30) =
v
Cells(t / dt + 7, 31) = vx_e_sat 'x成分
Cells(t / dt + 7, 32) = vy_e_sat
'y成分
Cells(t / dt + 7, 33) = vz_e_sat 'z成分
End Sub
Sub
ルンゲクッタ()
'●●●●●●ルンゲ=クッタ法 エンジン部分●●●●●●
Call f1_ENG(t, x, y, z, vx, vy, vz, RTvX, RTvY,
RTvZ)
Call f2_ENG(Msol, t, x, y, z, vx, vy, vz, RTgX, RTgY, RTgZ)
k1r_x =
dt * RTvX
k1r_y = dt * RTvY
k1r_z = dt * RTvZ
k1v_x = dt *
RTgX
k1v_y = dt * RTgY
k1v_z = dt * RTgZ
Call f1_ENG(t + dt / 2, x + k1r_x / 2, y + k1r_y /
2, z + k1r_z / 2, vx + k1v_x / 2, vy + k1v_y / 2, vz + k1v_z / 2, RTvX, RTvY,
RTvZ)
Call f2_ENG(Msol, t + dt / 2, x + k1r_x / 2, y + k1r_y / 2, z + k1r_z /
2, vx + k1v_x / 2, vy + k1v_y / 2, vz + k1v_z / 2, RTgX, RTgY, RTgZ)
k2r_x =
dt * RTvX
k2r_y = dt * RTvY
k2r_z = dt * RTvZ
k2v_x = dt *
RTgX
k2v_y = dt * RTgY
k2v_z = dt * RTgZ
Call f1_ENG(t + dt / 2, x + k2r_x / 2, y + k2r_y /
2, z + k2r_z / 2, vx + k2v_x / 2, vy + k2v_y / 2, vz + k2v_z / 2, RTvX, RTvY,
RTvZ)
Call f2_ENG(Msol, t + dt / 2, x + k2r_x / 2, y + k2r_y / 2, z + k2r_z /
2, vx + k2v_x / 2, vy + k2v_y / 2, vz + k2v_z / 2, RTgX, RTgY, RTgZ)
k3r_x =
dt * RTvX
k3r_y = dt * RTvY
k3r_z = dt * RTvZ
k3v_x = dt *
RTgX
k3v_y = dt * RTgY
k3v_z = dt * RTgZ
Call f1_ENG(t + dt, x + k3r_x, y + k3r_y, z +
k3r_z, vx + k3v_x, vy + k3v_y, vz + k3v_z, RTvX, RTvY, RTvZ)
Call
f2_ENG(Msol, t + dt, x + k3r_x, y + k3r_y, z + k3r_z, vx + k3v_x, vy + k3v_y, vz
+ k3v_z, RTgX, RTgY, RTgZ)
k4r_x = dt * RTvX
k4r_y = dt * RTvY
k4r_z =
dt * RTvZ
k4v_x = dt * RTgX
k4v_y = dt * RTgY
k4v_z = dt *
RTgZ
x = x + 1 / 6 * (k1r_x + 2 * k2r_x + 2 * k3r_x +
k4r_x)
y = y + 1 / 6 * (k1r_y + 2 * k2r_y + 2 * k3r_y + k4r_y)
z = z + 1 /
6 * (k1r_z + 2 * k2r_z + 2 * k3r_z + k4r_z)
vx = vx + 1 / 6 * (k1v_x + 2 * k2v_x + 2 * k3v_x +
k4v_x)
vy = vy + 1 / 6 * (k1v_y + 2 * k2v_y + 2 * k3v_y + k4v_y)
vz = vz +
1 / 6 * (k1v_z + 2 * k2v_z + 2 * k3v_z + k4v_z)
End Sub
Sub
ルンゲクッタ_地球()
'●●●●●●ルンゲ=クッタ法 エンジン部分●●●●●●
Call f1_ENG(t, x_e, y_e, z_e, vx_e, vy_e, vz_e,
RTvX, RTvY, RTvZ)
Call f2_ENG(Msol, t, x_e, y_e, z_e, vx_e, vy_e, vz_e, RTgX,
RTgY, RTgZ)
k1r_x = dt * RTvX
k1r_y = dt * RTvY
k1r_z = dt *
RTvZ
k1v_x = dt * RTgX
k1v_y = dt * RTgY
k1v_z = dt * RTgZ
Call f1_ENG(t + dt / 2, x_e + k1r_x / 2, y_e +
k1r_y / 2, z_e + k1r_z / 2, vx_e + k1v_x / 2, vy_e + k1v_y / 2, vz_e + k1v_z /
2, RTvX, RTvY, RTvZ)
Call f2_ENG(Msol, t + dt / 2, x_e + k1r_x / 2, y_e +
k1r_y / 2, z_e + k1r_z / 2, vx_e + k1v_x / 2, vy_e + k1v_y / 2, vz_e + k1v_z /
2, RTgX, RTgY, RTgZ)
k2r_x = dt * RTvX
k2r_y = dt * RTvY
k2r_z = dt *
RTvZ
k2v_x = dt * RTgX
k2v_y = dt * RTgY
k2v_z = dt * RTgZ
Call f1_ENG(t + dt / 2, x_e + k2r_x / 2, y_e +
k2r_y / 2, z_e + k2r_z / 2, vx_e + k2v_x / 2, vy_e + k2v_y / 2, vz_e + k2v_z /
2, RTvX, RTvY, RTvZ)
Call f2_ENG(Msol, t + dt / 2, x_e + k2r_x / 2, y_e +
k2r_y / 2, z_e + k2r_z / 2, vx_e + k2v_x / 2, vy_e + k2v_y / 2, vz_e + k2v_z /
2, RTgX, RTgY, RTgZ)
k3r_x = dt * RTvX
k3r_y = dt * RTvY
k3r_z = dt *
RTvZ
k3v_x = dt * RTgX
k3v_y = dt * RTgY
k3v_z = dt * RTgZ
Call f1_ENG(t + dt, x_e + k3r_x, y_e + k3r_y, z_e +
k3r_z, vx_e + k3v_x, vy_e + k3v_y, vz_e + k3v_z, RTvX, RTvY, RTvZ)
Call
f2_ENG(Msol, t + dt, x_e + k3r_x, y_e + k3r_y, z_e + k3r_z, vx_e + k3v_x, vy_e +
k3v_y, vz_e + k3v_z, RTgX, RTgY, RTgZ)
k4r_x = dt * RTvX
k4r_y = dt *
RTvY
k4r_z = dt * RTvZ
k4v_x = dt * RTgX
k4v_y = dt * RTgY
k4v_z =
dt * RTgZ
x_e = x_e + 1 / 6 * (k1r_x + 2 * k2r_x + 2 * k3r_x
+ k4r_x)
y_e = y_e + 1 / 6 * (k1r_y + 2 * k2r_y + 2 * k3r_y + k4r_y)
z_e =
z_e + 1 / 6 * (k1r_z + 2 * k2r_z + 2 * k3r_z + k4r_z)
vx_e = vx_e + 1 / 6 * (k1v_x + 2 * k2v_x + 2 *
k3v_x + k4v_x)
vy_e = vy_e + 1 / 6 * (k1v_y + 2 * k2v_y + 2 * k3v_y +
k4v_y)
vz_e = vz_e + 1 / 6 * (k1v_z + 2 * k2v_z + 2 * k3v_z +
k4v_z)
End Sub
Sub f1_ENG(t, xx, yy, zz, vxx, vyy, vzz,
f1RTx, f1RTy, f1RTz) 'f1関数(t,位置ベクトル,速度ベクトル、戻り値速度ベクトル)
f1RTx = vxx
'単に速度ベクトルを返す
f1RTy = vyy '単に速度ベクトルを返す
f1RTz = vzz
'単に速度ベクトルを返す
End Sub
Sub f2_ENG(MM, t, xx, yy, zz, vxx, vyy, vzz, f2RTx,
f2RTy, f2RTz)
'f2関数(質量,t,位置ベクトル,速度ベクトル、戻り値加速度ベクトル)
'dv/dt=-G・M・(→r)/r^3 万有引力の法則
rr =
Sqr(xx ^ 2 + yy ^ 2 + zz ^ 2)
f2RTx = -G * MM / rr ^ 2 * (xx / rr)
'x成分 加速度ベクトル
f2RTy = -G * MM / rr ^ 2 * (yy / rr) 'y成分 加速度ベクトル
f2RTz
= -G * MM / rr ^ 2 * (zz / rr) 'z成分 加速度ベクトル
End Sub