能否使用Matplotlib绘制科学模型计算的卫星轨迹时间-高度曲线图
问题解答
不需要推导显式的曲线公式,直接使用数值模拟得到的离散点位就可以绘制t-h曲线图,你当前无法正常出图是代码存在两处逻辑错误:
- 数据存储逻辑错误:你将数据写入
data的代码放在了while循环外部,仅存储了模拟结束后最后一组高度、时间数据,没有收集整个模拟过程的所有点位 - 绘图入参错误:调用
ax.plot(t, h)时传入的是单个的时间、高度数值,matplotlib绘制折线图时单个点位无法生成连续曲线,也几乎不可见
修改后可正常运行的代码
from typing import Any, Union import matplotlib.pyplot as plt import numpy as np data = [] t = 0 dt = 10 A = 10 Cw = 2.7 h = 300000 h0 = h G = 6.67384 * 10 ** -11 M = 5.972 * 10 ** 24 m = 209.4 * A ** (3 / 2) r = 6371000 + h v: Union[float, Any] = (G * M / r) ** .5 vx = v vy = 0 Px = 0 Py = r while 0 < h < h0 + 100000: t = t + dt r = (Px ** 2 + Py ** 2) ** .5 Fg = G * M * m / r ** 2 Fgx = -Fg * Px / r Fgy = -Fg * Py / r h = r - 6371000 if h > 600000: z = 1.607 * 10 ** -11 * 0.991169 ** (h / 1000) else: if h > 139000: z = 3.848 * 10 ** -8 * 0.978294 ** (h / 1000) else: z = 1.225 * 0.863697 ** (h / 1000) v = (vx ** 2 + vy ** 2) ** .5 Fwl = 0.5 * z * Cw * A * v ** 2 Fwlx = -Fwl * vx / v Fwly = -Fwl * vy / v ax = (Fgx + Fwlx) / m ay = (Fgy + Fwly) / m vx = vx + ax * dt vy = vy + ay * dt Px = Px + vx * dt Py = Py + vy * dt # 每次循环都存储当前的时间、高度数据 data.append([t, h]) # 拆分时间序列和高度序列 t_list = [item[0] for item in data] h_list = [item[1] for item in data] fig, ax = plt.subplots() ax.plot(t_list, h_list) # 增加坐标轴标签提升可读性 ax.set_xlabel('时间 / s') ax.set_ylabel('高度 / m') plt.show()
内容的提问来源于stack exchange,提问作者TiemeVDS
相关产品推荐
相关产品推荐

