This commit is contained in:
nik
2025-10-01 22:55:09 +03:00
parent 4d0ece634b
commit 74e98c37c4
591 changed files with 20286 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

View File

@@ -0,0 +1,122 @@
import matplotlib.pyplot as plt
import numpy as np
# Параметры задачи
S = 40 # общее расстояние (км) для наглядности
v_walk = 4 # скорость пешехода (км/ч)
v_bike = 20 # скорость велосипедиста (км/ч)
# Оптимальное решение: x = S/2
x = S / 2 # расстояние, которое первый турист едет на велосипеде
# Времена для каждого этапа
t1_bike = x / v_bike # время первого туриста на велосипеде
t1_walk = (S - x) / v_walk # время первого туриста пешком
t_total = t1_bike + t1_walk # общее время
t2_walk = x / v_walk # время второго туриста пешком
t2_bike = (S - x) / v_bike # время второго туриста на велосипеде
print(f"Общее расстояние: {S} км")
print(f"Расстояние на велосипеде для каждого: {x} км")
print(f"Общее время: {t_total:.2f} ч")
print(f"Средняя скорость: {S/t_total:.2f} км/ч")
# Построение графика
fig, ax = plt.subplots(figsize=(12, 8))
# Турист A (красная линия)
# Этап 1: на велосипеде от 0 до x
time_A1 = np.linspace(0, t1_bike, 100)
pos_A1 = v_bike * time_A1
# Этап 2: пешком от x до S
time_A2 = np.linspace(t1_bike, t_total, 100)
pos_A2 = x + v_walk * (time_A2 - t1_bike)
# Турист B (синяя линия)
# Этап 1: пешком от 0 до x
time_B1 = np.linspace(0, t2_walk, 100)
pos_B1 = v_walk * time_B1
# Этап 2: на велосипеде от x до S
time_B2 = np.linspace(t2_walk, t_total, 100)
pos_B2 = x + v_bike * (time_B2 - t2_walk)
# Построение графиков
ax.plot(time_A1, pos_A1, "r-", linewidth=3, label="Турист A (велосипед)")
ax.plot(time_A2, pos_A2, "r--", linewidth=3, label="Турист A (пешком)")
ax.plot(time_B1, pos_B1, "b--", linewidth=3, label="Турист B (пешком)")
ax.plot(time_B2, pos_B2, "b-", linewidth=3, label="Турист B (велосипед)")
# Отметки важных точек
ax.plot(t1_bike, x, "ro", markersize=8, label="A оставляет велосипед")
ax.plot(t2_walk, x, "bo", markersize=8, label="B берет велосипед")
ax.plot(t_total, S, "go", markersize=10, label="Финиш (одновременно)")
# Вертикальная линия в точке передачи велосипеда
ax.axvline(
x=t2_walk,
color="gray",
linestyle=":",
alpha=0.7,
label=f"Передача велосипеда (t={t2_walk:.2f}ч)",
)
ax.axhline(
y=x, color="gray", linestyle=":", alpha=0.7, label=f"Точка передачи (x={x}км)"
)
# Настройка графика
ax.set_xlabel("Время (часы)", fontsize=12)
ax.set_ylabel("Расстояние (км)", fontsize=12)
ax.set_title(
"График движения двух туристов с одним велосипедом\n"
+ f"Средняя скорость: {S/t_total:.2f} км/ч",
fontsize=14,
fontweight="bold",
)
ax.grid(True, alpha=0.3)
ax.legend(fontsize=10, loc="center right")
# Добавление аннотаций
ax.annotate(
f"Скорость: {v_bike} км/ч",
xy=(t1_bike / 2, x / 2),
xytext=(0.5, 10),
arrowprops=dict(arrowstyle="->", color="red", alpha=0.7),
fontsize=10,
color="red",
)
ax.annotate(
f"Скорость: {v_walk} км/ч",
xy=(t1_bike + (t_total - t1_bike) / 2, x + (S - x) / 2),
xytext=(4, 35),
arrowprops=dict(arrowstyle="->", color="red", alpha=0.7),
fontsize=10,
color="red",
)
ax.annotate(
f"Скорость: {v_walk} км/ч",
xy=(t2_walk / 2, x / 2),
xytext=(1.5, 5),
arrowprops=dict(arrowstyle="->", color="blue", alpha=0.7),
fontsize=10,
color="blue",
)
ax.annotate(
f"Скорость: {v_bike} км/ч",
xy=(t2_walk + (t_total - t2_walk) / 2, x + (S - x) / 2),
xytext=(3.5, 25),
arrowprops=dict(arrowstyle="->", color="blue", alpha=0.7),
fontsize=10,
color="blue",
)
plt.tight_layout()
plt.show()
# Проверка правильности решения
print(f"\nПроверка:")
print(f"Время туриста A: {t1_bike:.2f} + {t1_walk:.2f} = {t_total:.2f} ч")
print(f"Время туриста B: {t2_walk:.2f} + {t2_bike:.2f} = {t2_walk + t2_bike:.2f} ч")
print(f"Разность времен: {abs(t_total - (t2_walk + t2_bike)):.6f} ч (должно быть ~0)")

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

View File

@@ -0,0 +1,233 @@
import numpy as np
import matplotlib.pyplot as plt
# Параметры задачи
h = 10 # высота падения (м)
alpha_deg = 30 # угол наклона плоскости (градусы)
alpha = np.radians(alpha_deg) # угол в радианах
g = 9.81 # ускорение свободного падения
print(f"Параметры задачи:")
print(f"Высота падения h = {h} м")
print(f"Угол наклона α = {alpha_deg}°")
print()
# Расчет характерных величин
v0 = np.sqrt(2 * g * h) # скорость при первом ударе
print(f"Скорость при первом ударе: v₀ = {v0:.2f} м/с")
# Компоненты скорости после первого отскока
v0x = v0 * np.sin(2 * alpha)
v0y = -v0 * np.cos(2 * alpha)
print(f"Компоненты скорости после отскока:")
print(f"v₀ₓ = {v0x:.2f} м/с")
print(f"v₀ᵧ = {v0y:.2f} м/с")
# Время полета между первым и вторым ударами
t1 = 2 * np.sqrt(2 * h / g) * (4 * np.sin(alpha) ** 2 - 1)
print(f"Время полета между ударами: t₁ = {t1:.3f} с")
# Расстояния между ударами
L1 = 8 * h * np.sin(alpha) * (4 * np.sin(alpha) ** 2 - 1)
k = np.cos(2 * alpha) ** 2 # коэффициент уменьшения
L2 = L1 * k
L3 = L1 * k**2
print(f"\nРасстояния между точками ударов:")
print(f"L₁ = {L1:.2f} м")
print(f"L₂ = {L2:.2f} м")
print(f"L₃ = {L3:.2f} м")
# Максимальное удаление от плоскости
l_max = h * np.sin(3 * alpha) ** 2 / (2 * np.sin(alpha) ** 2)
print(f"\nМаксимальное удаление от плоскости: l = {l_max:.2f} м")
# Максимальная вертикальная высота над плоскостью
h_max = h * np.sin(2 * alpha) ** 2 / (2 * np.cos(alpha) ** 2)
print(f"Максимальная вертикальная высота: h_max = {h_max:.2f} м")
# Построение графика
fig, ax = plt.subplots(figsize=(14, 10))
# Параметры для визуализации
x_range = 60
y_range = 25
# Построение наклонной плоскости
x_plane = np.linspace(-5, x_range, 100)
y_plane = -x_plane * np.tan(alpha)
ax.plot(
x_plane, y_plane, "k-", linewidth=3, label=f"Наклонная плоскость (α = {alpha_deg}°)"
)
# Первое падение (вертикально вниз)
x_fall = np.array([0, 0])
y_fall = np.array([h / np.cos(alpha), 0])
ax.plot(x_fall, y_fall, "r--", linewidth=2, label="Падение с высоты h")
# Функция для построения траектории между ударами
def plot_trajectory(x0, y0, vx, vy, t_flight, color, label, show_max=False):
t = np.linspace(0, t_flight, 200)
x = x0 + vx * t
y = y0 + vy * t - 0.5 * g * t**2
ax.plot(x, y, color=color, linewidth=2, label=label)
if show_max:
# Максимум траектории
t_max = vy / g
if t_max > 0 and t_max < t_flight:
x_max = x0 + vx * t_max
y_max = y0 + vy * t_max - 0.5 * g * t_max**2
ax.plot(
x_max,
y_max,
"o",
color=color,
markersize=8,
markerfacecolor="white",
markeredgecolor=color,
markeredgewidth=2,
)
# Расстояние от плоскости в точке максимума
dist_to_plane = (y_max + x_max * np.tan(alpha)) * np.cos(alpha)
return x_max, y_max, dist_to_plane
return None
# Траектория после первого удара
x1_end = v0x * t1
y1_end = v0y * t1 - 0.5 * g * t1**2
max_info = plot_trajectory(
0, 0, v0x, v0y, t1, "blue", "После 1-го удара", show_max=True
)
# Точки ударов
impact_points_x = [0]
impact_points_y = [0]
# Второй удар
impact_points_x.append(x1_end)
impact_points_y.append(y1_end)
# Скорость после второго удара (уменьшается)
v1x = v0x * np.cos(2 * alpha)
v1y = -v0y * np.cos(2 * alpha)
t2 = t1 * np.cos(2 * alpha)
# Траектория после второго удара
x2_end = x1_end + v1x * t2
y2_end = y1_end + v1y * t2 - 0.5 * g * t2**2
plot_trajectory(x1_end, y1_end, v1x, v1y, t2, "green", "После 2-го удара")
# Третий удар
impact_points_x.append(x2_end)
impact_points_y.append(y2_end)
# Скорость после третьего удара
v2x = v1x * np.cos(2 * alpha)
v2y = -v1y * np.cos(2 * alpha)
t3 = t2 * np.cos(2 * alpha)
# Траектория после третьего удара
x3_end = x2_end + v2x * t3
y3_end = y2_end + v2y * t3 - 0.5 * g * t3**2
plot_trajectory(x2_end, y2_end, v2x, v2y, t3, "orange", "После 3-го удара")
# Четвертый удар
impact_points_x.append(x3_end)
impact_points_y.append(y3_end)
# Отметка точек ударов
ax.plot(impact_points_x, impact_points_y, "ro", markersize=8, label="Точки ударов")
# Нумерация точек ударов
for i, (x, y) in enumerate(zip(impact_points_x, impact_points_y)):
ax.annotate(
f"{i+1}",
(x, y),
xytext=(5, 5),
textcoords="offset points",
fontsize=12,
fontweight="bold",
color="red",
)
# Отметка максимальных точек
if max_info:
x_max, y_max, dist_max = max_info
ax.annotate(
f"Максимум\n(l={dist_max:.1f}м)",
(x_max, y_max),
xytext=(10, 10),
textcoords="offset points",
fontsize=10,
ha="left",
bbox=dict(boxstyle="round,pad=0.3", facecolor="lightblue", alpha=0.7),
)
# Стрелки для показа расстояний
mid_x = impact_points_x[1] / 2
mid_y = impact_points_y[1] / 2
ax.annotate(
"",
xy=(impact_points_x[1], impact_points_y[1]),
xytext=(impact_points_x[0], impact_points_y[0]),
arrowprops=dict(arrowstyle="<->", color="purple", lw=2),
)
ax.text(
mid_x,
mid_y - 1,
f"L₁ = {L1:.1f}м",
ha="center",
bbox=dict(boxstyle="round,pad=0.3", facecolor="white", alpha=0.8),
)
# Настройка графика
ax.set_xlim(-2, x_range)
ax.set_ylim(-15, y_range)
ax.set_xlabel("x (м)", fontsize=12)
ax.set_ylabel("y (м)", fontsize=12)
ax.set_title(
"Траектория мячика при упругих отскоках от наклонной плоскости",
fontsize=14,
fontweight="bold",
)
ax.grid(True, alpha=0.3)
ax.legend(fontsize=10)
ax.set_aspect("equal")
# Добавление текстовой информации на график
info_text = f"""Результаты расчетов:
• L₁ = {L1:.1f} м
• L₂ = {L2:.1f} м
• L₃ = {L3:.1f} м
• l_max = {l_max:.1f} м
• h_max = {h_max:.1f} м
Параметры:
• h = {h} м
α = {alpha_deg}°"""
ax.text(
0.02,
0.98,
info_text,
transform=ax.transAxes,
fontsize=10,
verticalalignment="top",
bbox=dict(boxstyle="round,pad=0.5", facecolor="lightyellow", alpha=0.8),
)
plt.tight_layout()
plt.show()
# Проверка формул для частного случая α = 30°
print(f"\nПроверка формул для α = {alpha_deg}°:")
print(f"4sin²α - 1 = {4*np.sin(alpha)**2 - 1:.3f}")
print(f"cos(2α) = {np.cos(2*alpha):.3f}")
print(f"sin(3α) = {np.sin(3*alpha):.3f}")
print(f"sin(2α) = {np.sin(2*alpha):.3f}")

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

View File

@@ -0,0 +1,186 @@
import matplotlib.pyplot as plt
import numpy as np
# Параметры задачи
L = 20 # расстояние до стены (м)
H = 8 # высота стены (м)
g = 9.81 # ускорение свободного падения
print(f"Параметры задачи:")
print(f"Расстояние до стены L = {L} м")
print(f"Высота стены H = {H} м")
print()
# Расчет оптимальных параметров
R = np.sqrt(L**2 + H**2) # расстояние до верхнего края стены
tan_alpha_opt = (L + R) / H
alpha_opt_rad = np.arctan(tan_alpha_opt)
alpha_opt_deg = np.degrees(alpha_opt_rad)
# Минимальная скорость
v0_min = np.sqrt(g * (L**2 + H**2 + L * R) / L)
print(f"Результаты расчета:")
print(f"Расстояние до верхнего края стены R = {R:.2f} м")
print(f"Оптимальный угол α = {alpha_opt_deg:.1f}°")
print(f"Минимальная скорость v₀ = {v0_min:.2f} м/с")
print(f"tan(α) = {tan_alpha_opt:.3f}")
print()
# Функция для расчета траектории
def trajectory(v0, alpha_rad, t_max):
t = np.linspace(0, t_max, 1000)
x = v0 * np.cos(alpha_rad) * t
y = v0 * np.sin(alpha_rad) * t - 0.5 * g * t**2
return x, y, t
# Время полета для оптимальной траектории
t_optimal = 2 * v0_min * np.sin(alpha_opt_rad) / g
# Построение графика
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(14, 12))
# График 1: Сравнение траекторий
# Оптимальная траектория
x_opt, y_opt, t_opt = trajectory(v0_min, alpha_opt_rad, t_optimal)
# Проверим, что траектория проходит через точку (L, H)
t_at_wall = L / (v0_min * np.cos(alpha_opt_rad))
y_at_wall = v0_min * np.sin(alpha_opt_rad) * t_at_wall - 0.5 * g * t_at_wall**2
print(f"Проверка: высота в точке x=L составляет {y_at_wall:.3f} м (должно быть {H} м)")
ax1.plot(
x_opt,
y_opt,
"r-",
linewidth=3,
label=f"Оптимальная (α={alpha_opt_deg:.1f}°, v₀={v0_min:.1f}м/с)",
)
# Сравнение с другими углами (при больших скоростях)
angles_comp = [30, 45, 60, 75]
colors = ["blue", "green", "orange", "purple"]
for angle, color in zip(angles_comp, colors):
alpha_rad = np.radians(angle)
# Скорость, необходимая для данного угла
# Из условия: L*tan(α) - gL²/(2v²cos²α) = H
cos_alpha = np.cos(alpha_rad)
tan_alpha = np.tan(alpha_rad)
if L * tan_alpha > H: # Траектория может пройти над стеной
v_needed = np.sqrt(g * L**2 / (2 * cos_alpha**2 * (L * tan_alpha - H)))
t_flight = 2 * v_needed * np.sin(alpha_rad) / g
x_traj, y_traj, _ = trajectory(v_needed, alpha_rad, t_flight)
ax1.plot(
x_traj,
y_traj,
"--",
color=color,
linewidth=2,
label=f"{angle}° (v₀={v_needed:.1f}м/с)",
)
print(f"Для угла {angle}° требуется скорость {v_needed:.2f} м/с")
# Стена
ax1.plot([L, L], [0, H], "k-", linewidth=5, label="Стена")
ax1.plot([L - 0.5, L + 0.5], [H, H], "k-", linewidth=5)
# Точка броска
ax1.plot(0, 0, "ko", markersize=8, label="Точка броска")
# Критическая точка (L, H)
ax1.plot(L, H, "ro", markersize=8, label="Критическая точка")
ax1.set_xlim(-2, 50)
ax1.set_ylim(-2, 25)
ax1.set_xlabel("Расстояние (м)")
ax1.set_ylabel("Высота (м)")
ax1.set_title("Сравнение траекторий для перелета через стену")
ax1.grid(True, alpha=0.3)
ax1.legend()
# График 2: Зависимость скорости от угла
angles = np.linspace(15, 89, 100)
speeds = []
for angle in angles:
alpha_rad = np.radians(angle)
cos_alpha = np.cos(alpha_rad)
tan_alpha = np.tan(alpha_rad)
if L * tan_alpha > H:
v_req = np.sqrt(g * L**2 / (2 * cos_alpha**2 * (L * tan_alpha - H)))
speeds.append(v_req)
else:
speeds.append(np.inf) # Невозможно перелететь
# Убираем бесконечные значения для графика
angles_valid = []
speeds_valid = []
for angle, speed in zip(angles, speeds):
if speed < 100: # Ограничиваем для наглядности
angles_valid.append(angle)
speeds_valid.append(speed)
ax2.plot(angles_valid, speeds_valid, "b-", linewidth=2, label="Требуемая скорость")
ax2.axhline(
y=v0_min,
color="r",
linestyle="--",
linewidth=2,
label=f"Минимум = {v0_min:.2f} м/с",
)
ax2.axvline(
x=alpha_opt_deg,
color="r",
linestyle="--",
linewidth=2,
label=f"Оптимальный угол = {alpha_opt_deg:.1f}°",
)
ax2.plot(alpha_opt_deg, v0_min, "ro", markersize=10, label="Оптимум")
# Минимальный угол для возможности перелета
alpha_min = np.degrees(np.arctan(H / L))
ax2.axvline(
x=alpha_min,
color="gray",
linestyle=":",
alpha=0.7,
label=f"Мин. угол = {alpha_min:.1f}°",
)
ax2.set_xlim(15, 90)
ax2.set_ylim(15, 50)
ax2.set_xlabel("Угол броска (градусы)")
ax2.set_ylabel("Требуемая скорость (м/с)")
ax2.set_title("Зависимость требуемой скорости от угла броска")
ax2.grid(True, alpha=0.3)
ax2.legend()
plt.tight_layout()
plt.show()
# Дополнительные расчеты
print(f"\nДополнительная информация:")
print(f"Минимальный возможный угол: {alpha_min:.1f}° (arctan(H/L))")
print(f"Превышение оптимального угла над 45°: {alpha_opt_deg - 45:.1f}°")
# Сравнение с броском под 45° на максимальную дальность
v_45_max_range = np.sqrt(g * L) # Скорость для максимальной дальности L
print(f"Скорость для броска на дальность L под 45°: {v_45_max_range:.2f} м/с")
print(f"Увеличение скорости из-за стены: {(v0_min/v_45_max_range - 1)*100:.1f}%")
# Энергия
E_min = 0.5 * v0_min**2
E_45 = 0.5 * v_45_max_range**2
print(f"Минимальная кинетическая энергия (на единицу массы): {E_min:.1f} Дж/кг")
print(f"Увеличение энергии из-за стены: {(E_min/E_45 - 1)*100:.1f}%")
# Максимальная высота оптимальной траектории
h_max = v0_min**2 * np.sin(alpha_opt_rad) ** 2 / (2 * g)
print(f"Максимальная высота оптимальной траектории: {h_max:.2f} м")
print(f"Превышение над стеной: {h_max - H:.2f} м")

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

Binary file not shown.

File diff suppressed because it is too large Load Diff