python - 是否可以使用 MatPlotLib 和来自科学模型的数据创建图形?
问题描述
作为序言,我对 Python 和 MatPlotLib 完全陌生,我正在做一个学校项目来计算卫星绕地球的轨迹。我想知道是否可以从模型计算的每个点获取数据并将其放入图表中,在 x 轴上绘制时间,在 y 轴上绘制高度。我试图直接绘制这两个值,但它似乎没有出现在图表上。是否可以将计算中的每个值都放在图表中,或者我需要一个直接的公式来让线条将其绘制在图表中。
空气阻力也会随着特定高度的变化而变化,因此更难制作直接公式。这是代码,我知道它的格式非常糟糕,但它是我的第一个项目,我所需要的只是获取 h-graph。在此先感谢您的帮助!
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:
# for _ in range(2592000):
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 += [[h, t]]
print(h)
print(t)
fig, ax = plt.subplots()
ax.plot(t, h)
plt.show()
解决方案
正如 Michael Szczesny 在评论中所建议的那样,您应该data += [[h, t]]
在while
循环内缩进。
然后我建议你用:
ax.plot(*zip(*data))
为了分离得到h
曲线。另一个建议是翻转您存储和存储的
顺序:t
h(t)
h
t
data
data += [[h, t]]
通过这种方式,您将获得高度相对于时间的图(而不是相反的图)。
完整代码
from typing import Any, Union
import matplotlib.pyplot as plt
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:
# for _ in range(2592000):
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 += [[h, t]]
fig, ax = plt.subplots()
ax.plot(*zip(*data))
plt.show()
推荐阅读
- assembly - nasm:错误:16 位模式不支持指令
- c - “pointer->register_next->value”是否与 C 中的“pointer->register_next.value”相同?
- javascript - 视频中的可组合箭头函数示例?
- c - __restrict 相对于流行编译器的函数优化行为
- ssl - IdHttp HTTPS 握手失败
- scala - AWS EMR 火花作业步骤不会执行
- algorithm - 计算大 O 表示法:2 个嵌套循环的 O(n^4) 和没有递归的 O(log n)
- javascript - 我可以控制 mousemove 事件的频率吗
- heroku - 如何让 Heroku 为 Flask 应用程序运行 webpack?
- angular - AspNetCore WebApi / Angular 与 Twitter 连接,然后创建 JWT 令牌