Files
2025-10-01 22:55:09 +03:00

123 lines
4.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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