График статичного и динамичного движения шара по осям y и x

Мне нужна помощь в написании кода, в котором должен выводиться либо один либо 2 графика. В случае 1 должен быть динамический график, у которого после анимации самой траектории производится пауза, во время которой можно увидеть значения, показанные на фото ниже. Во втором случае когда 2 графика, можно в ответ вывести динамический график только его траектории и статический график где показанные все конечные данные как на фото. Использовать можно только matplotlib и numpy, пытался сделать сам (код ниже), но на моем маке не запускается, пишет что есть ошибки где-то в файлах matplotlib, не знаю что делать, вроде бы код запускался на другом ПК с виндой.

пример того, что должно получиться

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

# Начальные параметры для первого графика
v0_1 = 10.0 # м/с
alpha_1 = 50.0 * np.pi / 180.0 # радианы
g = 9.81 # м/с^2

# Время полёта (можно вычислить, но здесь дано)
t_flight_1 = 2.016

# Создание массива времени для первого графика
t_1 = np.linspace(0, t_flight_1, 100)

# Вычисление координат x и y для первого графика
x_1 = v0_1 * np.cos(alpha_1) * t_1
y_1 = v0_1 * np.sin(alpha_1) * t_1 - 0.5 * g * t_1**2

# Начальные параметры для второго графика
v0_2 = 10.0
alpha_2 = 80.0
alpha_rad_2 = np.radians(alpha_2)
t_flight_2 = 2 * v0_2 * np.sin(alpha_rad_2) / g
t_2 = np.linspace(0, t_flight_2, 100)
x_2 = v0_2 * np.cos(alpha_rad_2) * t_2
y_2 = v0_2 * np.sin(alpha_rad_2) * t_2 - 0.5 * g * t_2**2

# Построение графика с помощью subplot
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5)) # 1 строка, 2 столбца

# График 1: Статический график
ax1.plot(x_1, y_1)
ax1.set_xlabel("Расстояние, м")
ax1.set_ylabel("Высота, м")
ax1.set_title("Траектория тела, брошенного под углом к горизонту")

# Вычисляем максимальную высоту и дальность полета для первого графика
ymax_1 = max(y_1)
xmax_1 = max(x_1)

# Добавление информации о параметрах на график (опционально)
ax1.text(0.1, 4, f"v0 = {v0_1:.1f} м/с")
ax1.text(0.1, 3.5, f"α = {50.0:.1f}°")
ax1.text(xmax_1 * 0.7, ymax_1 * 0.8, f"h_max ≈ {ymax_1:.2f} м")
ax1.text(xmax_1 * 0.7, ymax_1 * 0.6, f"L ≈ {xmax_1:.2f} м")
ax1.grid(True)

# График 2: Анимированный график
line, = ax2.plot([], [], lw=2)
point, = ax2.plot([], [], 'go')
text = ax2.text(0, 1, '')

def init2():
    ax2.set_xlim(0, np.max(x_2))
    ax2.set_ylim(0, np.max(y_2))
    ax2.set_xlabel('Distance (m)')
    ax2.set_ylabel('Height (m)')
    ax2.set_title('Projectile Motion')
    return line, point, text

def animate2(i):
    line.set_data(x_2[:i], y_2[:i])
    point.set_data(x_2[i], y_2[i])
    text.set_text(f't={t_2[i]:.2f} s')
    return line, point, text

ani = animation.FuncAnimation(fig, animate2, frames=len(t_2), init_func=init2, interval=50, blit=True)

plt.tight_layout() # Отрегулировать разметку для лучшего отображения
plt.show()

Ответы (1 шт):

Автор решения: Egor

Считай за бесплатный дизайнерский проект. С анимацией сам разберёшься

import numpy as np
import matplotlib.pyplot as plt

g = 9.8  # Ускорение свободного падения, м/с^2
v0 = 10  # Начальная скорость, м/с
angle = 80  # Угол броска, градусы

angle_rad = np.radians(angle)

v0_x = v0 * np.cos(angle_rad)
v0_y = v0 * np.sin(angle_rad)

T = 2 * v0_y / g

H_max = (v0_y ** 2) / (2 * g)

R = v0_x * T

num_points = 500
t = np.linspace(0, T, num_points)

x = v0_x * t
y = v0_y * t - 0.5 * g * t**2

x = x[y >= 0]
y = y[y >= 0]

# Построение графика
plt.figure(figsize=(12, 8))
plt.plot(x, y, color='red', linestyle='--')


plt.axvline(R, color='black', linestyle='-.')
plt.axvline(0, color='black', linestyle='-.')

plt.annotate('', xy=(0, 7), xytext=(R, 7),
         arrowprops=dict(arrowstyle='<->', color='black'))

plt.text(R / 2, 7.05, f'L={R:.2f} м', color='black', ha='left', style='italic')

plt.text(-0.05, 7.05, 
         f'$v_0={v0:.1f} \, \\frac{{м}}{{с}}$\n$\\alpha={angle:.1f}^\\circ$', 
         color='black', va='center', ha='right', style='italic')

plt.text(R+0.05, 7.05, f't={T:.2f}с', color='black', ha='left', style='italic')


plt.annotate('', xy=(R/2, 0), xytext=(R/2, H_max),
          arrowprops=dict(arrowstyle='<->', color='black'))
plt.text(R / 2 + 0.05, H_max / 2, f'$h_{{max}}={H_max:.2f}$ м', 
          color='black', ha='left', style='italic')



# Настройка графика

plt.xlim(-2, R + 2)
plt.ylim(0, 9)

plt.xticks(np.arange(0, 4, 1))
plt.yticks(np.arange(0, 6, 1))

plt.title('Траектория тела,\n брошенного под углом к горизонту')
plt.xlabel('Расстояние, м')
plt.ylabel('Высота, м')
#plt.grid()
plt.legend()
plt.show()

введите сюда описание изображения

Upd. Совсем уж заняться было нечем.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from matplotlib.patches import Circle

# Исходные данные
fig, ax = plt.subplots()
fig.set_size_inches(12,12)
g = 9.8
v0 = 10
theta = np.radians(80)

# Компоненты начальной скорости
v_x = v0 * np.cos(theta)
v_y = v0 * np.sin(theta)

T = 2 * v_y / g

H_max = (v_y ** 2) / (2 * g)

R = v_x * T

num_points = 100
t = np.linspace(0, T, num_points)

x = v_x * t
z = v_y * t - 0.5 * g * t**2

x = x[z >= 0]
z = z[z >= 0]

rl = ax.axvline(0, color='black', linestyle='-.')
ax.axvline(0, color='black', linestyle='-.')

rls = ax.annotate('', xy=(0, 7), xytext=(R, 7),
         arrowprops=dict(arrowstyle='<->', color='black'))

lenght = ax.text(R / 2, 7.05, f'L=0 м', color='black', ha='left', style='italic')

ax.text(-0.05, 7.05, 
         f'$v_0={v0:.1f} \, \\frac{{м}}{{с}}$\n$\\alpha_0={np.rad2deg(theta):.1f}^\\circ$', 
         color='black', va='center', ha='right', style='italic')
vxt = ax.text(-1.05, 2.55, f'1', color='black',)
vyt = ax.text(-1.05, 2.05, f'2', color='black',)
at  = ax.text(-1.05, 1.55, f'3', color='black',)

time = ax.text(R+0.05, 7.05, f't=0.0с', color='black', ha='left', style='italic')


high = ax.annotate('', xy=(R/2, 0), xytext=(R/2, H_max),
          arrowprops=dict(arrowstyle='<->', color='black'))
high_t = ax.text(R / 2 + 0.05, H_max / 2, f'$h_{{max}}={0:.2f}$ м', 
          color='black', ha='left', style='italic')

# Инициализация графика
line = ax.plot(x[0], z[0], color='red', linestyle='--')[0]
circle = Circle((x[0], z[0]), 0.1, color='green', fill=True)

ax.set_aspect('equal')
ax.add_patch(circle)

plt.xlim(-2, R + 2)
plt.ylim(0, 9)

plt.xticks(np.arange(0, 4, 1))
plt.yticks(np.arange(0, 6, 1))

plt.title('Траектория тела,\n брошенного под углом к горизонту')
plt.xlabel('Расстояние, м')
plt.ylabel('Высота, м')
#plt.grid()
plt.legend()



# Функция обновления для анимации
def update(frame):
    global mh 
    t_current = t[frame]
    v_y_current = v_y - g * t_current
    v_current = np.sqrt(v_x**2 + v_y_current**2)
    angle_current = np.degrees(np.arctan2(v_y_current, v_x))

    mh = max(mh, z[frame]) if z[frame] > 0 else mh
    line.set_xdata(x[:frame])
    line.set_ydata(z[:frame])
    circle.set_center((x[frame], z[frame]))

    time.set_text(f"t={T*(frame/num_points):.2f}с")

    lenght.set_text(f"L={x[frame]:.2f} м")
    lenght.set_x(x[frame]/2)
    rl.set_xdata([x[frame],x[frame]])
    rls.set_x(x[frame])


    vxt.set_text(f'$v_x={"+"+str(v_x)[:4]} \, \\frac{{м}}{{с}}$')
    vyt.set_text(f"$v_y={v_y_current:+.2f} \, \\frac{{м}}{{с}}$")
    at.set_text(f"$\\alpha_0={str('{:+.3f}'.format(angle_current)[:5])}^\\circ$")

    high.set_y(mh)
    high_t.set_text(f'$h_{{max}}={mh:.2f}$ м')
    return (line, circle)

ani = animation.FuncAnimation(fig=fig, func=update, frames=len(t), interval=1000*T/num_points, blit=False, repeat=False)


tt = 0
mh = 0
plt.show()

введите сюда описание изображения

лучше не получается загрузить на SO

→ Ссылка