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

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