Сообщество Engee

Анализ коэффициента трения на льду

作者
avatar-yurevyurev
Notebook

Анализ коэффициента трения на льду

Статья представляет собой комплексный пример обработки и анализа экспериментальных данных в среде Engee. На конкретном примере исследования зависимости коэффициента трения от температуры мы демонстрируем полный цикл работы с данными: от их статистического описания до построения интерактивных визуализаций и формулирования практических рекомендаций.

Центральной темой исследования является анализ поведения коэффициента трения для двух принципиально разных случаев: трения льда для пешеходов и трения автомобильной шины о лёд. Рассматривается температурный диапазон от +5°C до -80°C, что охватывает большинство климатических условий, встречающихся на практике.

Через этот анализ мы демонстрируем, как современные инструменты обработки данных позволяют не только констатировать факты, но и прогнозировать поведение системы в различных условиях, что является ключевым навыком в любой научно-технической деятельности.

Теперь перейдём к самому примеру и рассмотрим применяемые в нём библиотеки.

StatsBase — библиотека для базовой статистической обработки данных. В нашем примере она используется для вычисления статистических показателей (среднее значение, стандартное отклонение, медиана, квантили) коэффициентов трения, а также для расчёта корреляции между данными для пешеходов и водителей.

Interpolations — библиотека для интерполяции данных. Мы применяем её для создания гладких кривых на основе дискретных экспериментальных точек, что позволяет лучше визуализировать тенденции и проводить анализ производных (скорости изменения коэффициента трения).

LaTeXStrings — библиотека для работы с LaTeX-форматированием в графиках. С её помощью мы добавляем профессиональные математические обозначения в подписи осей, такие как μ (коэффициент трения) с индексами для разных типов поверхностей, что повышает читаемость и научную строгость визуализаций.

In [ ]:
Pkg.add("Interpolations")
using StatsBase, Interpolations, LaTeXStrings
   Resolving package versions...
  No Changes to `~/.project/Project.toml`
  No Changes to `~/.project/Manifest.toml`

В качестве исходных данных используется температурный диапазон от -80°C до +5°C с дискретностью 5°C.

Массивы μ_ice и μ_tire содержат экспериментальные значения коэффициентов трения для двух случаев: трения льда о лёд (модель пешехода) и трения автомобильной шины о лёд.

Пороговые константы HIGH_RISK_PEDESTRIAN, LOW_RISK_PEDESTRIAN, HIGH_RISK_DRIVER и LOW_RISK_DRIVER определяют границы между высоким, средним и низким уровнями риска для соответствующих категорий участников движения.

In [ ]:
temperatures = collect(-80.0:5.0:5.0)
μ_ice = [
    0.091, 0.09, 0.089, 0.087, 0.085, 0.082, 0.08, 0.075, 0.07,
    0.065, 0.06, 0.055, 0.05, 0.04, 0.035, 0.03, 0.02, 0.005
]
μ_tire = [
    0.264, 0.263, 0.262, 0.261, 0.26, 0.258, 0.256, 0.253, 0.25,
    0.245, 0.24, 0.235, 0.23, 0.21, 0.19, 0.17, 0.15, 0.08
]

HIGH_RISK_PEDESTRIAN = 0.03
LOW_RISK_PEDESTRIAN  = 0.06
HIGH_RISK_DRIVER = 0.18
LOW_RISK_DRIVER  = 0.25;

Код ниже выполняет статистический анализ и определяет критические температуры безопасности. Сначала вычисляются основные статистические показатели для обоих типов трения: среднее значение, стандартное отклонение, минимум, максимум, медиана и квартили. Затем применяется линейная интерполяция для создания гладких кривых на основе экспериментальных точек. Функция find_critical_temp определяет пороговые температуры, при которых коэффициент трения пересекает заданные уровни риска. Результатом являются конкретные температурные границы, разделяющие условия высокой и низкой опасности для пешеходов и водителей.

In [ ]:
println("="^50)
println("СТАТИСТИЧЕСКИЙ АНАЛИЗ КОЭФФИЦИЕНТОВ ТРЕНИЯ")
println("="^50)

stats_ice = [
    mean(μ_ice), std(μ_ice), minimum(μ_ice), maximum(μ_ice),
    median(μ_ice), quantile(μ_ice, 0.25), quantile(μ_ice, 0.75)
]

stats_tire = [
    mean(μ_tire), std(μ_tire), minimum(μ_tire), maximum(μ_tire),
    median(μ_tire), quantile(μ_tire, 0.25), quantile(μ_tire, 0.75)
]

println("\nПешеходы (лёд):")
println("Среднее: $(round(stats_ice[1], digits=4))")
println("Станд. отклонение: $(round(stats_ice[2], digits=4))")
println("Минимум: $(stats_ice[3]) при $(temperatures[argmin(μ_ice)])°C")
println("Максимум: $(stats_ice[4]) при $(temperatures[argmax(μ_ice)])°C")

println("\nВодители (шина-лёд):")
println("Среднее: $(round(stats_tire[1], digits=4))")
println("Станд. отклонение: $(round(stats_tire[2], digits=4))")
println("Минимум: $(stats_tire[3]) при $(temperatures[argmin(μ_tire)])°C")
println("Максимум: $(stats_tire[4]) при $(temperatures[argmax(μ_tire)])°C")

itp_ice = linear_interpolation(temperatures, μ_ice)
itp_tire = linear_interpolation(temperatures, μ_tire)
temp_smooth = range(minimum(temperatures), maximum(temperatures), length=200)
μ_ice_smooth = itp_ice.(temp_smooth)
μ_tire_smooth = itp_tire.(temp_smooth)

function find_critical_temp(temps, μ_vals, threshold)
    for i in 1:length(μ_vals)-1
        if (μ_vals[i] - threshold) * (μ_vals[i+1] - threshold) <= 0
            t1, t2 = temps[i], temps[i+1]
            μ1, μ2 = μ_vals[i], μ_vals[i+1]
            return t1 + (threshold - μ1) * (t2 - t1) / (μ2 - μ1)
        end
    end
    return NaN
end

crit_ped_high = find_critical_temp(temperatures, μ_ice, HIGH_RISK_PEDESTRIAN)
crit_ped_low = find_critical_temp(temperatures, μ_ice, LOW_RISK_PEDESTRIAN)
crit_drv_high = find_critical_temp(temperatures, μ_tire, HIGH_RISK_DRIVER)
crit_drv_low = find_critical_temp(temperatures, μ_tire, LOW_RISK_DRIVER)

println("\n" * "="^50)
println("КРИТИЧЕСКИЕ ТЕМПЕРАТУРЫ БЕЗОПАСНОСТИ")
println("="^50)
println("Пешеходы:")
println("  Высокий риск (<$HIGH_RISK_PEDESTRIAN): T < $(round(!isnan(crit_ped_high) ? crit_ped_high : minimum(temperatures), digits=1))°C")
println("  Низкий риск (>$LOW_RISK_PEDESTRIAN): T > $(round(!isnan(crit_ped_low) ? crit_ped_low : maximum(temperatures), digits=1))°C")
println("\nВодители:")
println("  Высокий риск (<$HIGH_RISK_DRIVER): T < $(round(!isnan(crit_drv_high) ? crit_drv_high : minimum(temperatures), digits=1))°C")
println("  Низкий риск (>$LOW_RISK_DRIVER): T > $(round(!isnan(crit_drv_low) ? crit_drv_low : maximum(temperatures), digits=1))°C")
==================================================
СТАТИСТИЧЕСКИЙ АНАЛИЗ КОЭФФИЦИЕНТОВ ТРЕНИЯ
==================================================

Пешеходы (лёд):
Среднее: 0.0616
Станд. отклонение: 0.0265
Минимум: 0.005 при 5.0°C
Максимум: 0.091 при -80.0°C

Водители (шина-лёд):
Среднее: 0.2265
Станд. отклонение: 0.0498
Минимум: 0.08 при 5.0°C
Максимум: 0.264 при -80.0°C

==================================================
КРИТИЧЕСКИЕ ТЕМПЕРАТУРЫ БЕЗОПАСНОСТИ
==================================================
Пешеходы:
  Высокий риск (<0.03): T < -5.0°C
  Низкий риск (>0.06): T > -30.0°C

Водители:
  Высокий риск (<0.18): T < -7.5°C
  Низкий риск (>0.25): T > -40.0°C

График 1 отображает зависимость коэффициента трения льда по льду от температуры. На диаграмме представлены экспериментальные точки в виде кружков и проведённая через них линейная интерполяция в виде пунктирной кривой. Горизонтальные линии красного и зелёного цвета показывают пороговые значения для высокого и низкого риска соответственно, а вертикальные линии отмечают критические температуры, при которых коэффициент трения пересекает эти пороги. Сетка на фоне облегчает чтение значений.

In [ ]:
p1 = plot(size=(800, 500), dpi=150, grid=true, gridalpha=0.3)
scatter!(p1, temperatures, μ_ice,
    label="Экспериментальные данные",
    markersize=8, markercolor=:blue, markerstrokewidth=2,
    marker=:circle)
plot!(p1, temp_smooth, μ_ice_smooth,
    label="Интерполяция (линейная)",
    linewidth=3, linecolor=:blue, alpha=0.7, linestyle=:dash)
hline!(p1, [HIGH_RISK_PEDESTRIAN, LOW_RISK_PEDESTRIAN],
    label=["Высокий риск (μ < $HIGH_RISK_PEDESTRIAN)" "Низкий риск (μ > $LOW_RISK_PEDESTRIAN)"],
    linestyle=:dot, linewidth=2, linecolor=[:red :green])
if !isnan(crit_ped_high)
    vline!(p1, [crit_ped_high],
        label="Граница высокого риска: $(round(crit_ped_high, digits=1))°C",
        linestyle=:dashdot, linewidth=2, linecolor=:red, alpha=0.7)
end
if !isnan(crit_ped_low)
    vline!(p1, [crit_ped_low],
        label="Граница низкого риска: $(round(crit_ped_low, digits=1))°C",
        linestyle=:dashdot, linewidth=2, linecolor=:green, alpha=0.7)
end
title!(p1, "График 1: Пешеходы - коэффициент трения льда")
xlabel!(p1, "Температура, °C")
ylabel!(p1, L"\mu_{лед-лед}")
display(p1)

Анализ графика позволяет сделать важные выводы о безопасности пешеходов. Наблюдается чёткая тенденция увеличения коэффициента трения с понижением температуры. При температурах выше примерно -5°C коэффициент трения опускается ниже порога высокого риска, создавая опасные условия для перемещения. Безопасные условия (низкий риск) достигаются только при значительном похолодании ниже -30°C, что указывает на существенную уязвимость пешеходов в типичных зимних условиях.

График 2 демонстрирует поведение коэффициента трения автомобильной шины по ледяной поверхности в зависимости от температуры. Экспериментальные данные показаны квадратными маркерами, через которые проведена плавная интерполирующая кривая. Как и на предыдущем графике, горизонтальные линии обозначают зоны высокого и низкого риска для водителей, а вертикальные линии соответствуют критическим температурам перехода между этими зонами.

In [ ]:
p2 = plot(size=(800, 500), dpi=150, grid=true, gridalpha=0.3)
scatter!(p2, temperatures, μ_tire,
    label="Экспериментальные данные",
    markersize=8, markercolor=:orange, markerstrokewidth=2,
    marker=:square)
plot!(p2, temp_smooth, μ_tire_smooth,
    label="Интерполяция (линейная)",
    linewidth=3, linecolor=:orange, alpha=0.7, linestyle=:dash)
hline!(p2, [HIGH_RISK_DRIVER, LOW_RISK_DRIVER],
    label=["Высокий риск (μ < $HIGH_RISK_DRIVER)" "Низкий риск (μ > $LOW_RISK_DRIVER)"],
    linestyle=:dot, linewidth=2, linecolor=[:red :green])
if !isnan(crit_drv_high)
    vline!(p2, [crit_drv_high],
        label="Граница высокого риска: $(round(crit_drv_high, digits=1))°C",
        linestyle=:dashdot, linewidth=2, linecolor=:red, alpha=0.7)
end
if !isnan(crit_drv_low)
    vline!(p2, [crit_drv_low],
        label="Граница низкого риска: $(round(crit_drv_low, digits=1))°C",
        linestyle=:dashdot, linewidth=2, linecolor=:green, alpha=0.7)
end
title!(p2, "График 2: Водители - коэффициент трения шины по льду")
xlabel!(p2, "Температура, °C")
ylabel!(p2, L"\mu_{шина-лед}")
display(p2)

Из графика следует, что автомобильные шины обеспечивают значительно лучшее сцепление со льдом по сравнению с подошвами**.** Даже в самых неблагоприятных условиях (при положительных температурах) коэффициент трения шин остаётся существенно выше, чем у пешеходов. Это указывает на относительную безопасность автомобильного движения в умеренные морозы, в то время как пешеходы в тех же условиях подвергаются высокому риску.

График 3 представляет сравнительную визуализацию коэффициентов трения для пешеходов и водителей в единой системе координат. Синяя линия с кружками отображает зависимость коэффициента трения для пешиходов, оранжевая линия с квадратами показывает аналогичную зависимость для шины по льду. Обе кривые построены на одних и тех же температурных значениях, что позволяет непосредственно сопоставить их поведение.

In [ ]:
p3 = plot(size=(800, 500), dpi=150, grid=true, gridalpha=0.3)
plot!(p3, temperatures, μ_ice,
    label="Пешеходы",
    linewidth=3, color=:blue,
    marker=:circle, markersize=6)
plot!(p3, temperatures, μ_tire,
    label="Водители",
    linewidth=3, color=:orange,
    marker=:square, markersize=6)
title!(p3, "График 3: Сравнение коэффициентов трения")
xlabel!(p3, "Температура, °C")
ylabel!(p3, "Коэффициент трения, μ")
display(p3)

График 4 отображает отношение коэффициента трения шины по льду к коэффициенту трения льда для пешиходов как функцию температуры. Фиолетовая линия с ромбовидными маркерами показывает, во сколько раз сцепление автомобильных шин превосходит сцепление подошвы обуви при каждой конкретной температуре. Чёрная пунктирная линия на уровне 1.0 обозначает условную границу, где оба типа сцепления были бы равны.

In [ ]:
p4 = plot(size=(800, 500), dpi=150, grid=true, gridalpha=0.3)
ratio = μ_tire ./ μ_ice
plot!(p4, temperatures, ratio,
    label="Отношение μ_водитель/μ_пешеход",
    linewidth=3, color=:purple,
    marker=:diamond, markersize=7)
hline!(p4, [1.0],
    label="Равное сцепление (отношение = 1)",
    linestyle=:dash, linewidth=2, linecolor=:black, alpha=0.5)
mean_ratio = mean(ratio)
max_ratio = maximum(ratio)
min_ratio = minimum(ratio)
temp_max_ratio = temperatures[argmax(ratio)]
temp_min_ratio = temperatures[argmin(ratio)]
title!(p4, "График 4: Преимущество шин над подошвой")
xlabel!(p4, "Температура, °C")
ylabel!(p4, "Отношение коэффициентов трения")
display(p4)

Анализ отношения коэффициентов трения выявляет интересную нелинейную зависимость. Максимальное преимущество шин наблюдается при температурах около +5°C, где они превосходят подошву более чем в 15 раз. По мере дальнейшего понижения температуры это преимущество постепенно снижается, но всё равно остаётся значительным (около 3 раз при -80°C). Это свидетельствует о том, что автомобильные шины не просто имеют лучшее абсолютное сцепление, но и демонстрируют различную температурную чувствительность по сравнению с подошвой.

График 5 отображает скорость изменения коэффициента трения по температуре — первую производную зависимости μ(T). Синяя и оранжевая линии показывают, насколько быстро меняется коэффициент трения для пешеходов и водителей соответственно при изменении температуры на один градус. Значения умножены на 100 для улучшения читаемости графика. Нулевая горизонтальная линия помогает визуально определить области роста и спада производной.

In [ ]:
p5 = plot(size=(800, 500), dpi=150, grid=true, gridalpha=0.3)
derivative_ice = diff(μ_ice_smooth) ./ diff(temp_smooth)
derivative_tire = diff(μ_tire_smooth) ./ diff(temp_smooth)
temp_mid = (temp_smooth[1:end-1] .+ temp_smooth[2:end]) ./ 2
plot!(p5, temp_mid, derivative_ice * 100,
    label="Пешеходы (лёд) ×100",
    linewidth=2, color=:blue)
plot!(p5, temp_mid, derivative_tire * 100,
    label="Водители (шина-лёд) ×100",
    linewidth=2, color=:orange)
hline!(p5, [0.0],
    label="Нулевое изменение",
    linestyle=:dash, linewidth=1, linecolor=:black, alpha=0.3)
max_rate_ice = maximum(derivative_ice) * 100
max_rate_tire = maximum(derivative_tire) * 100
temp_max_rate_ice = temp_mid[argmax(derivative_ice)]
temp_max_rate_tire = temp_mid[argmax(derivative_tire)]
title!(p5, "График 5: Темп изменения коэффициента трения")
xlabel!(p5, "Температура, °C")
ylabel!(p5, "Скорость изменения (dμ/dT × 100)")
display(p5)

Дополнительная статистика предоставляет количественную оценку динамики и взаимосвязей в данных. Рассчитывается процентное изменение коэффициентов трения во всём температурном диапазоне, вычисляется корреляция между показателями для пешеходов и водителей, определяются безопасные температурные интервалы и сравниваются средние значения в тёплых и холодных условиях. Эти метрики дополняют визуальный анализ численными характеристиками.

In [ ]:
println("\n" * "="^50)
println("ДОПОЛНИТЕЛЬНАЯ СТАТИСТИКА")
println("="^50)

ice_change_pct = (μ_ice[end] - μ_ice[1]) / μ_ice[1] * 100
tire_change_pct = (μ_tire[end] - μ_tire[1]) / μ_tire[1] * 100

println("Изменение от -80°C до 5°C:")
println("  Пешеходы: $(round(ice_change_pct, digits=1))% (с $(μ_ice[1]) до $(μ_ice[end]))")
println("  Водители: $(round(tire_change_pct, digits=1))% (с $(μ_tire[1]) до $(μ_tire[end]))")

correlation = cor(μ_ice, μ_tire)
println("\nКорреляция между коэффициентами:")
println("  Коэффициент корреляции Пирсона: $(round(correlation, digits=4))")
println("  Интерпретация: $(abs(correlation) > 0.8 ? "Очень сильная" : 
        abs(correlation) > 0.6 ? "Сильная" : 
        abs(correlation) > 0.4 ? "Умеренная" : "Слабая") связь")

safe_temp_ped = temperatures[μ_ice .>= LOW_RISK_PEDESTRIAN]
safe_temp_drv = temperatures[μ_tire .>= LOW_RISK_DRIVER]

println("\nБезопасные температурные диапазоны:")
if !isempty(safe_temp_ped)
    println("  Пешеходы (μ ≥ $LOW_RISK_PEDESTRIAN): от $(minimum(safe_temp_ped))°C до $(maximum(safe_temp_ped))°C")
else
    println("  Пешеходы: нет безопасных температур в диапазоне")
end
if !isempty(safe_temp_drv)
    println("  Водители (μ ≥ $LOW_RISK_DRIVER): от $(minimum(safe_temp_drv))°C до $(maximum(safe_temp_drv))°C")
else
    println("  Водители: нет безопасных температур в диапазоне")
end

plots = [p1, p2, p3, p4, p5]
plot_names = [
    "ice_friction_pedestrians.png",
    "ice_friction_drivers.png",
    "ice_friction_comparison.png",
    "ice_friction_ratio.png",
    "ice_friction_rate_of_change.png"
]

for (i, (plot_obj, name)) in enumerate(zip(plots, plot_names))
    savefig(plot_obj, name)
end
==================================================
ДОПОЛНИТЕЛЬНАЯ СТАТИСТИКА
==================================================
Изменение от -80°C до 5°C:
  Пешеходы: -94.5% (с 0.091 до 0.005)
  Водители: -69.7% (с 0.264 до 0.08)

Корреляция между коэффициентами:
  Коэффициент корреляции Пирсона: 0.9388
  Интерпретация: Очень сильная связь

Безопасные температурные диапазоны:
  Пешеходы (μ ≥ 0.06): от -80.0°C до -30.0°C
  Водители (μ ≥ 0.25): от -80.0°C до -40.0°C

Статистические расчёты подтверждают и уточняют выводы, сделанные на основе графиков.

Вывод

Итоговые выводы по работе основаны на комплексном анализе экспериментальных данных о коэффициентах трения в температурном диапазоне от +5°C до -80°C. Установлено, что сцепление как с подошвой обуви, так и с автомобильной шиной существенно улучшается при понижении температуры, однако это улучшение происходит нелинейно и с разной интенсивностью. Автомобильные шины демонстрируют абсолютное и относительное преимущество над подошвой во всём исследуемом диапазоне. Наибольший дисбаланс в безопасности наблюдается в зоне околонулевых и слабоотрицательных температур, характерных для многих регионов в зимний период.

Практические рекомендации для пешеходов должны учитывать экстремально низкий коэффициент трения при температурах выше -5°C. В таких условиях необходимо использовать специальную обувь с противоскользящим покрытием или ледоступами, а также существенно снижать скорость передвижения и избегать резких движений. Особую осторожность следует проявлять на склонах и лестницах.

Практические рекомендации для водителей основываются на том, что хотя шины обеспечивают лучшее сцепление, его абсолютное значение в тёплый зимний период остаётся недостаточным для безопасного движения. При температурах от +5°C до -10°C необходимо увеличивать дистанцию, снижать скорость и избегать резких манёвров.