计算航天器绕地球运动的轨迹和可视化
该示例将显示航天器在绕地球飞行期间的轨迹计算,以及在不同初始飞行速度下构建其运动的三维可视化的可能性。
连接必要的库:
In [ ]:
Pkg.add(["LinearAlgebra"])
In [ ]:
using Plots
using LinearAlgebra
航天器轨迹的计算
常数的定义和计算步骤:
In [ ]:
G = 6.67430e-11 # 引力常数
M = 5.972e24 # 地球的质量,公斤
R = 6371000.0 # 地球的半径,m
dt = 50; # 时间步长,与
定义一个计算卫星加速度、速度和坐标的函数:
In [ ]:
function calculate_trajectory(initial_velocity, initial_position, time)
# 初始化用于存储结果的数组
x = [initial_position[1]]
y = [initial_position[2]]
z = [initial_position[3]]
# 初始化数组以存储绝对速度
absolute_velocity = []
# 初始化数组以存储与地球中心的距离
absolute_altitude = []
# 初始化用于存储速度和加速度的数组
velocities = []
accelerations = []
# 使用速度公式计算新速度
v = initial_velocity
for t in 0:dt:time
# 根据重力定律计算加速度
r = norm([x[end], y[end], z[end]])
a = -G * M / r^3 * [x[end], y[end], z[end]]
# 使用速度公式计算新速度
v += a * dt
# 计算绝对速度
absolute_v = norm(v)
# 计算与地球表面的距离
absolute_a = norm(r) - R
# 使用公式计算新坐标
x_new = x[end] + v[1] * dt
y_new = y[end] + v[2] * dt
z_new = z[end] + v[3] * dt
# 向数组添加新坐标
push!(x, x_new)
push!(y, y_new)
push!(z, z_new)
# 向数组添加新的绝对速度
push!(absolute_velocity, absolute_v)
# 从地球中心到阵列增加一个新的距离
push!(absolute_altitude, absolute_a)
# 为阵列添加新的速度和加速度
push!(velocities, v)
push!(accelerations, a)
end
return x, y, z, velocities, accelerations, absolute_velocity, absolute_altitude
end
Out[0]:
确定初始条件:
In [ ]:
# 设置卫星的初始速度
initial_velocity = [0, 7660.0, 0] # 米/秒
initial_velocity1 = [0, 8660.0, 0] # 米/秒
initial_velocity2 = [0, 9660.0, 0] # 米/秒
# 设置卫星的初始坐标
initial_position = [R + 408000.0, 0, 0] # m
# 设置卫星的旅行时间
total_time = 11200.0; # sec
航天器运动参数的计算:
In [ ]:
times = 0:dt:total_time
x, y, z, velocities, accelerations, absolute_velocity, absolute_altitude = calculate_trajectory(initial_velocity, initial_position, total_time)
x1, y1, z1, velocities1, accelerations1, absolute_velocity1, absolute_altitude1 = calculate_trajectory(initial_velocity1, initial_position, total_time)
x2, y2, z2, velocities2, accelerations2, absolute_velocity2, absolute_altitude2 = calculate_trajectory(initial_velocity2, initial_position, total_time);
获取坐标以在图形上定义地球表面:
球坐标系中的点的计算:
In [ ]:
phi = range(0, stop=2*pi, length=100)
theta = range(0, stop=pi, length=50)
x_earth = zeros(length(phi), length(theta))
y_earth = zeros(length(phi), length(theta))
z_earth = zeros(length(phi), length(theta));
球坐标的参数化用于确定表征地球表面的点。
参数 phi 它表示x轴与点的半径矢量在x-y平面上的投影之间的角度。 它从0到2π变化,这对应于围绕z轴的完全旋转。
参数 theta 表示该点的半径矢量与z轴正方向的夹角。
对于每个值组合 phi 和 theta 使用从球面到笛卡尔坐标的变换计算点的坐标。
结果数组的每个元素 x_earth-y_earth-z_earth 对应于地球表面的一点。
定义从球面坐标系到笛卡尔坐标系的转换函数,以便在图形上显示:
In [ ]:
function spherical_to_cartesian(phi::Float64, theta::Float64)
x = R * sin(theta) * cos(phi)
y = R * sin(theta) * sin(phi)
z = R * cos(theta)
return (x, y, z)
end
Out[0]:
应用函数更改坐标系:
In [ ]:
for i in 1:length(phi)
for j in 1:length(theta)
result = spherical_to_cartesian(phi[i], theta[j])
x_earth[i,j] = result[1]
y_earth[i,j] = result[2]
z_earth[i,j] = result[3]
end
end
获得的结果的可视化:
宇宙飞船绕地球运动轨迹的可视化:
In [ ]:
plotlyjs() # 启用显示图形的后端方法
# 卫星轨迹的可视化
plot(x, y, z, zcolor=z, legend=false, labels="v0=7660米/秒", linewidth=5,
color=:red, title="卫星轨迹<br>在不同的初始速度",
titlefont=font(11)) # 航天器的初始速度为7660m/s
plot!(x1, y1, z1, zcolor=z, legend=false, labels="v0=8660米/秒", linewidth=5,
color=:green) # 航天器的初始速度为8660m/s
plot!(x2, y2, z2, zcolor=z, legend=false, labels="v0=9660米/秒", linewidth=5,
color=:purple) # 航天器的初始速度为9660m/s
# 地球表面的可视化
surface!(x_earth, y_earth, z_earth, color=:blue, labels="地球", alpha=0.9)
Out[0]:
速度计算结果的可视化:
In [ ]:
plot(times/60, absolute_velocity/1000, linewidth=3, color=:red, labels="v0=7660米/秒",
xlabel="时间,分钟", ylabel="速度,km/s", title="随着时间的推移改变卫星的速度")
plot!(times/60, absolute_velocity1/1000, linewidth=3, color=:green, labels="v0=8660米/秒")
plot!(times/60, absolute_velocity2/1000, linewidth=3, color=:purple, labels="v0=9660米/秒",
legend=:bottomleft )
Out[0]:
飞行高度计算结果的可视化:
In [ ]:
plot(times/60, absolute_altitude/1000000, linewidth=3, color=:red, labels="v0=7660米/秒",
xlabel="时间,分钟", ylabel="海拔高度,千公里", title="飞行高度随时间的变化")
plot!(times/60, absolute_altitude1/1000000, linewidth=3, color=:green, labels="v0=8660米/秒")
plot!(times/60, absolute_altitude2/1000000, linewidth=3, color=:purple, labels="v0=9660米/秒",
legend=:left )
Out[0]:
结论:
在本例中,考虑了航天器在不同初始飞行速度下绕地球运动的参数的简化计算,并演示了使用Plots库的三维图形可视化计算结果的示例。 图上获得了轨迹,以及距离地球表面的速度和距离。