Я пытаюсь построить N-Body Simulation. Координаты каждого тела (данные N тел) обновляются после каждого итерационного шага по времени. Например, позиционные координаты для каждого из 3
тел приведены ниже для 2
(из 10e4
) временных шагов; первый, второй и третий столбцы соответствуют координатам x, y и z соответственно, тогда как каждая строка представляет уникальное тело:
*- STEP #0:
INITIAL POSITIONS:
[[ 0. 0. 0.]
[10. 10. 10.]
[11. 11. 11.]]
FINAL POSITIONS:
[[2.34593746e-11 2.34593746e-11 2.34593746e-11]
[1.00000000e+01 1.00000000e+01 1.00000000e+01]
[1.10000000e+01 1.10000000e+01 1.10000000e+01]]
*- STEP #1:
INITIAL POSITIONS:
[[2.34593746e-11 2.34593746e-11 2.34593746e-11]
[1.00000000e+01 1.00000000e+01 1.00000000e+01]
[1.10000000e+01 1.10000000e+01 1.10000000e+01]]
FINAL POSITIONS:
[[7.03781237e-11 7.03781237e-11 7.03781237e-11]
[1.00000000e+01 1.00000000e+01 1.00000000e+01]
[1.10000000e+01 1.10000000e+01 1.10000000e+01]]
*- STEP #2:
INITIAL POSITIONS:
[[7.03781237e-11 7.03781237e-11 7.03781237e-11]
[1.00000000e+01 1.00000000e+01 1.00000000e+01]
[1.10000000e+01 1.10000000e+01 1.10000000e+01]]
FINAL POSITIONS:
[[1.40756247e-10 1.40756247e-10 1.40756247e-10]
[1.00000000e+01 1.00000000e+01 1.00000000e+01]
[1.10000000e+01 1.10000000e+01 1.10000000e+01]]
Я хотел бы увидеть графическое представление этих данных.
Методы для обновления этих координат предоставляются в определенном классе, который слишком длинный, чтобы включать его здесь. Но основная / соответствующая часть приведена ниже.
def propagate_in_time(self):
""" """
for ith_step in range(self.nsteps):
# print("\n*- STEP #{}:\n".format(ith_step))
# print("\nINITIAL POSITIONS:\n{}\n".format(self.position))
self.update_acceleration()
self.update_velocity()
self.update_displacement()
self.update_position()
# print("\nFINAL POSITIONS:\n{}\n".format(self.position))
Поэтому, пытаясь создать трехмерный график этих координат, я имею в виду создать экземпляр фигуры вне цикла for, построить график внутри цикла for и показать график вне цикла for как показано в этом примере . Моя попытка ниже:
def propagate_in_time(self, facecolors=('k', 'orange', 'yellow'):
""" """
fig, ax = plt.subplots()
for body, facecolor in zip(self.celestial_bodies, facecolors):
ax.plot(body.position, color=facecolor)
for ith_step in range(self.nsteps):
ax = fig.add_subplot(111)
self.update_acceleration()
self.update_velocity()
self.update_displacement()
self.update_position()
for pos, facecolor in zip(self.position, facecolors):
ax.plot(pos, color=facecolor)
plt.show()
Хотя каждый position
в self.position
является плоским массивом, состоящим из 3 элементов, полученный мной график выходных данных (из всех временных шагов) показан ниже.
Я нахожу это странным, потому что я обязательно включил следующий импорт.
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
Итак, главный вопрос:
Как я могу получить dim-3 график этих данных? Кроме того, есть ли лучшие способы визуализации этих данных?
Вторичный / менее важный вопрос:
Предположим, что z-компонент каждой позиции был 0
. Изменит ли это метод, который вы бы использовали для визуализации данных?