123 lines
4.5 KiB
Python
123 lines
4.5 KiB
Python
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)")
|