首页 > 解决方案 > 是否可以使用 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()

标签: pythonnumpymatplotlibmathplot

解决方案


正如 Michael Szczesny 在评论中所建议的那样,您应该data += [[h, t]]while循环内缩进。
然后我建议你用:

ax.plot(*zip(*data))

为了分离得到h曲线。另一个建议是翻转您存储和存储的 顺序:th(t)
htdata

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()

在此处输入图像描述


推荐阅读