График статичного и динамичного движения шара по осям 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 шт):
Считай за бесплатный дизайнерский проект. С анимацией сам разберёшься
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