2  Силы, которые можно почувствовать

Сядь, дай одной стопе свободно повиснуть и захвати двумя пальцами тяж, который лежит под кожей сзади над пяткой: он поддаётся, мягкий и подвижный. Теперь встань и оторви пятку от пола. То же самое место становится твёрдым, его края резко проступают. Этот тяж — твоё ахиллово сухожилие: оно есть всегда, изменилась лишь тяга, с которой икра тянет за него. Место, в котором эта тяга заканчивается, — пяточная кость, и тягой ты только что управляла сама. Твоё тело стало лабораторией.

Насколько она сильна, записано в приложении с числами в конце книги: в списке, где каждое число этой книги стоит со своей единицей и своим происхождением (?sec-anhang-zahlenkanon) и откуда каждая глава берёт свои значения. При беге ахиллово сухожилие тянет примерно с 3,5 массы тела, опора давит в ответ примерно с 2,5 массы тела (подтверждено от 2,0 до 2,9). Для бегуньи массой 75 кг из главы 1 это около 2600 и 1800 ньютонов на одной-единственной небольшой кости — а один ньютон это примерно та сила, с которой яблоко давит на ладонь. Но сила — это больше, чем такое число. У неё есть ещё и направление, и приложена она в определённом месте — без того и другого нельзя сказать, что она делает с костью. Эта глава даёт силе три её свойства: модуль (длина) вектора, направление и точку приложения. Расчёт по составляющим, которым такие силы раскладывают и складывают, придёт только в главе 3 — здесь щупают, показывают и самое большее умножают.

Цели обучения

После этой главы ты сможешь

  1. описывать силу как величину с направлением, модулем и точкой приложения и отличать её от простого числа,
  2. назвать три силы у пятки, показать их направление и нащупать на собственной стопе (опора, ахиллово сухожилие, подошвенный апоневроз),
  3. складывать две силы графически в одну (правило параллелограмма) и объяснять, почему результирующая сила блуждает на протяжении шага,
  4. оценивать порядок величин трёх сил кратно массе тела, как они стоят в приложении с числами.

2.1 Тело как лаборатория: три силы на ощупь

В главе 1 ты эти три силы уже однажды почувствовала — там речь шла о том, что они есть. Теперь речь о другом: о направлении, в котором каждая из них тянет или давит. Поэтому проделай опыты ещё раз и следи на этот раз за тем, куда тянет. Покажи направление пальцем, прежде чем читать дальше.

  • Опора. Встань и перенеси вес на одну пятку. Давление, которое ты чувствуешь под пяточной подушкой, — это ответ опоры, сила реакции опоры. Она направлена снизу вверх, отвесно внутрь кости.
  • Ахиллово сухожилие. Нащупай тяж сзади над пяткой дважды: со свободно висящей стопой и с приподнятой пяткой. Тугим он становится только во втором случае — это и есть тяга. Она не просто поднимает пяточную кость вверх, а тянет наискось назад и вверх, в сторону икры; проведи пальцем вдоль сухожилия — вот тебе и направление.
  • Подошвенный апоневроз. Сидя, потяни большой палец вверх и нащупай другой рукой подошву. Лента, которая натягивается от пяточной кости вперёд, — это подошвенный апоневроз. Его тяга действует вдоль подошвы вперёд, слегка вниз, в сторону подушечек пальцев.

Три силы, три направления — и каждая тянет за другое место кости. Именно это одному числу и не удержать.

2.2 Вектор силы: направление и модуль

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

Прежде чем появится первый рисунок, несколько слов о коде, который сейчас будет виден. Он той породы, которую глава 1 объявила под заголовком «Как считает эта книга»: его можно читать, имена русские, никакого волшебства. Он задаёт три силы с их точками приложения, к тому же масштаб, переводящий ньютоны в длину стрелки, и чертёжные инструменты для всех рисунков этой главы. Ячейка свёрнута — кто захочет узнать, откуда взялось имя, тот её развернёт. Свои числа она берёт из приложения с числами (?sec-anhang-zahlenkanon), она их не выдумывает.

Расчётный механизм этой главы — развернуть и прочитать
# --- Общие блоки всех рисунков с силами в этой главе --------------------
import json
import pathlib
import sys

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import FancyArrow

sys.path.insert(0, "programme/gemeinsam")
import kanon

МТ_Н = kanon.wert_von("KOERPERGEWICHT")   # масса тела в ньютонах (канон)
ММ_НА_МТ = 6.0                   # длина стрелки: мм на одну кратность МТ

ЦВЕТ = {"опора": "#1f77b4", "ахилл": "#d62728",
        "апоневроз": "#2ca02c", "равнод": "#7a2b8a"}

# Точки приложения (мм): точки граничных групп эталонного расчёта,
# спроецированные на настоящий контур из 48 точек — опора под бугром,
# ахиллово сухожилие на задней стенке бугра, подошвенный апоневроз на
# переднем нижнем скате бугристости (в настоящем месте шпоры). Тем самым
# они лежат НА контуре (соглашение о полевых картинах). Направления в
# градусах (0 = вперёд/вправо, 90 = вверх); стандартные модули в · МТ.
# Направление апоневроза — каноническое значение RICHTUNG_FASZIE
# (0,985 / -0,174), это -10 градусов; опора 90 градусов тоже канонична.
# Угол ахиллова сухожилия — схематическое допущение этой главы (не канон).
ПРИКРЕПЛЕНИЯ = {"опора": (8.594, 2.237), "ахилл": (1.343, 23.278),
                "апоневроз": (24.065, 3.353)}
НАПРАВЛЕНИЯ = {"опора": 90.0, "ахилл": 118.0, "апоневроз": -10.0}
МОДУЛИ = {"опора": 2.5, "ахилл": 3.5, "апоневроз": 2.0}
НАЧАЛО_РАВНОД = (26.0, 18.0)
НАЗВАНИЕ = {"опора": "реакция опоры", "ахилл": "ахиллово сухожилие",
            "апоневроз": "подошвенный апоневроз"}

def мт(x):
    """Модуль в русской записи через запятую, например 3,50."""
    return f"{x:.2f}".replace(".", ",")

# Расписание сил: пять моментов опорной фазы с тремя силами (кратно массе
# тела) и с долей времени каждого момента. Эта таблица — единственный
# источник книги для шага; главы 7, 11 и 14 считают с теми же числами
# (максимумы из канона, ход кривой и доли времени — модельное допущение).
М_ОПОРА = [1.45, 2.00, 2.50, 1.20, 0.30]
М_АХИЛЛ = [0.30, 1.50, 2.00, 3.50, 2.80]
М_АПОНЕВРОЗ = [0.10, 0.30, 0.60, 1.20, 2.00]
ВЕСА = [0.15, 0.20, 0.30, 0.20, 0.15]
ФАЗЫ = ["касание пяткой", "нарастание нагрузки", "средняя опорная фаза",
        "отрыв пятки", "отталкивание"]

_контур = json.loads(
    pathlib.Path("../geometrie/kalkaneus_kontur.json").read_text())
КОНТУР = np.array(_контур["punkte"]) * 1000.0     # м -> мм

def стрелка(ось, начало, градусы, модуль, цвет):
    """Нарисовать вектор силы: длина = модуль (· МТ) · ММ_НА_МТ.

    Наконечник растёт вместе с модулем (с нижней границей), чтобы малые
    силы не выпячивались из-за постоянного крупного наконечника. Подпись
    берёт на себя постоянная цветовая легенда, а не остриё стрелки.
    """
    рад = np.deg2rad(градусы)
    dx = модуль * ММ_НА_МТ * np.cos(рад)
    dy = модуль * ММ_НА_МТ * np.sin(рад)
    наконечник = max(2.0, 1.2 + 0.7 * модуль)
    ось.add_patch(FancyArrow(начало[0], начало[1], dx, dy,
                             width=max(0.4, 0.22 * модуль),
                             head_width=наконечник,
                             length_includes_head=True, color=цвет, zorder=5))

def равнодействующая(модули, градусы):
    """Векторная сумма стрелок; возвращает (модуль, вершину в мм)."""
    vx = sum(мод * np.cos(np.deg2rad(гр)) for мод, гр in zip(модули, градусы))
    vy = sum(мод * np.sin(np.deg2rad(гр)) for мод, гр in zip(модули, градусы))
    вершина = (НАЧАЛО_РАВНОД[0] + vx * ММ_НА_МТ,
               НАЧАЛО_РАВНОД[1] + vy * ММ_НА_МТ)
    return float(np.hypot(vx, vy)), вершина

def масштаб(ось, x_нач, y_нач):
    """Масштабная линейка в ньютонах: одна масса тела как эталон длины."""
    ось.plot([x_нач, x_нач + ММ_НА_МТ], [y_нач, y_нач], color="#333", lw=2)
    for xx in (x_нач, x_нач + ММ_НА_МТ):
        ось.plot([xx, xx], [y_нач - 1.2, y_нач + 1.2], color="#333", lw=2)
    ось.text(x_нач, y_нач + 2.5, "1 · МТ ≈ 736 Н", fontsize=8, color="#333")

def ориентация(ось):
    ось.text(-2, 46, "сзади (пятка)", fontsize=9, color="#666")
    ось.text(50, 34, "спереди (пальцы)", fontsize=9, color="#666")
    ось.add_patch(FancyArrow(-24, 18, 0, 12, width=0.15, head_width=2.2,
                             color="#666"))
    ось.text(-23, 31, "вверх", fontsize=9, color="#666")

def сцена_сил(ось, ахилл_градусы=None, ахилл_модуль=None,
              модули=None, градусы=None, с_равнодействующей=True,
              со_следом=False):
    """Контур + три вектора силы + необязательная равнодействующая."""
    мод = dict(МОДУЛИ) if модули is None else dict(модули)
    гр = dict(НАПРАВЛЕНИЯ) if градусы is None else dict(градусы)
    if ахилл_градусы is not None:
        гр["ахилл"] = ахилл_градусы
    if ахилл_модуль is not None:
        мод["ахилл"] = ахилл_модуль
    ось.fill(КОНТУР[:, 0], КОНТУР[:, 1], color="#f0e2d0", ec="#a9825f",
             lw=1.6, zorder=2)
    ось.text(46, 9, "пяточная кость", fontsize=8, color="#8a6a4a",
             ha="center", zorder=3)
    from matplotlib.lines import Line2D
    обозначения = []
    for сила in ("опора", "ахилл", "апоневроз"):
        стрелка(ось, ПРИКРЕПЛЕНИЯ[сила], гр[сила], мод[сила], ЦВЕТ[сила])
        обозначения.append(Line2D([0], [0], color=ЦВЕТ[сила], lw=3,
                                  label=f"{НАЗВАНИЕ[сила]} {мт(мод[сила])} · МТ"))
    модуль_равнод = None
    if с_равнодействующей:
        порядок = ("опора", "ахилл", "апоневроз")
        модуль_равнод, вершина = равнодействующая(
            [мод[имя] for имя in порядок], [гр[имя] for имя in порядок])
        ось.annotate("", xy=вершина, xytext=НАЧАЛО_РАВНОД,
                     arrowprops=dict(arrowstyle="-|>", color=ЦВЕТ["равнод"],
                                     lw=2.4, ls="--"), zorder=6)
        обозначения.append(Line2D(
            [0], [0], color=ЦВЕТ["равнод"], lw=2.4, ls="--",
            label=f"равнодействующая (результирующая сила) "
                  f"{мт(модуль_равнод)} · МТ"))
    # Легенда вверху слева в свободной части рисунка (над контуром) — она
    # не должна закрывать ни подошвенный контур, ни стрелку апоневроза.
    ось.legend(handles=обозначения, loc="upper left", fontsize=7.5,
               framealpha=0.92, handlelength=1.6, borderpad=0.5)
    масштаб(ось, -32, -22)
    ориентация(ось)
    ось.set_xlim(-34, 84)
    ось.set_ylim(-26, 76)
    ось.set_aspect("equal")
    ось.axis("off")
    return модуль_равнод
Код
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import FancyArrow, FancyArrowPatch, Arc

рис, ось = plt.subplots(figsize=(7.6, 4.4))

# Вектор силы (тяга ахиллова сухожилия, 3,5 · МТ), крупный и цветной.
x_нач, y_нач = 0.0, 0.0
градусы, модуль = 118.0, 3.5
рад = np.deg2rad(градусы)
dx = модуль * ММ_НА_МТ * np.cos(рад)
dy = модуль * ММ_НА_МТ * np.sin(рад)
ось.add_patch(FancyArrow(x_нач, y_нач, dx, dy, width=0.7, head_width=3.8,
                         length_includes_head=True, color=ЦВЕТ["ахилл"],
                         zorder=4))

# Направление: горизонтальная линия отсчёта + дуга угла, подпись свободно
# над остриём стрелки (никакого текста за стрелкой).
ось.plot([0, 16], [0, 0], ls=":", color="#999", lw=1.2, zorder=2)
ось.add_patch(Arc((0, 0), 20, 20, theta1=0.0, theta2=градусы, color="#888",
                  lw=1.3, zorder=3))
ось.annotate("направление\n(куда указывает стрелка)", xy=(dx, dy),
             xytext=(dx - 2, dy + 7), fontsize=10, color=ЦВЕТ["ахилл"],
             fontweight="bold", ha="center", va="bottom",
             arrowprops=dict(arrowstyle="->", color=ЦВЕТ["ахилл"]))

# Модуль: мерная скоба параллельно древку, сдвинутая вправо; текст справа
# в свободном месте.
направление = np.array([np.cos(рад), np.sin(рад)])
перпендикуляр = np.array([np.sin(рад), -np.cos(рад)])   # смотрит в +x (вправо)
скоба_нач = np.array([x_нач, y_нач]) + перпендикуляр * 4.0
скоба_кон = np.array([dx, dy]) + перпендикуляр * 4.0
ось.add_patch(FancyArrowPatch(tuple(скоба_нач), tuple(скоба_кон),
                              arrowstyle="<|-|>", mutation_scale=10,
                              color="#555", lw=1.3, zorder=3))
середина = (скоба_нач + скоба_кон) / 2 + перпендикуляр * 1.5
ось.annotate("модуль = длина стрелки\n3,5 · МТ ≈ 2576 Н", xy=tuple(середина),
             xytext=(20, 12), fontsize=10, color=ЦВЕТ["ахилл"],
             fontweight="bold", ha="left", va="center",
             arrowprops=dict(arrowstyle="->", color="#555"))

# Точка приложения в начале стрелки.
ось.plot(x_нач, y_нач, "o", color="#333", ms=9, zorder=5)
ось.annotate("точка\nприложения\n(здесь сила приложена)", xy=(0, 0),
             xytext=(6, -8), fontsize=10, color="#333", ha="left", va="top",
             arrowprops=dict(arrowstyle="->", color="#333"))

# Масштабная линейка: 1 · МТ как эталон длины, прямо сравнимый со стрелкой.
x_линейки = 20.0
ось.plot([x_линейки, x_линейки + ММ_НА_МТ], [-2, -2], color="#333", lw=2.5)
for xx in (x_линейки, x_линейки + ММ_НА_МТ):
    ось.plot([xx, xx], [-3.4, -0.6], color="#333", lw=2.5)
ось.text(x_линейки, -6, "1 · МТ ≈ 736 Н\n(стрелка в 3,5 раза длиннее)",
         fontsize=8.5, color="#333", va="top")

ось.set_xlim(-24, 44)
ось.set_ylim(-12, 38)
ось.set_aspect("equal")
ось.axis("off")
plt.tight_layout()
plt.show()
Рисунок 2.1: Вектор силы удерживает и то и другое: направление (куда указывает стрелка) и модуль (какой она длины). Здесь — тяга ахиллова сухожилия величиной 3,5 · массы тела. Масштабная линейка переводит длину в ньютоны: одна масса тела (МТ ≈ 736 Н) служит эталонной длиной, а стрелка в три с половиной раза длиннее. Точка — это точка приложения: там сила и приложена.

Как это понимать. Две стрелки одинаковой длины, но разного направления — это две разные силы, даже если их модуль в ньютонах один и тот же. В этом и вся разница между силой и числом.

Сам модуль получается простым умножением: кратность на массу тела. Так из «3,5 · МТ» выходит сила в ньютонах. Следующая ячейка считает это для всех трёх сил пятки — каждую кратность из приложения с числами, умноженную на массу тела бегуньи.

От кратности к модулю в ньютонах
def сила_в_ньютонах(кратность_массы_тела):
    """Модуль силы по её кратности массы тела.

    кратность_массы_тела: например 2,5 для реакции опоры.
    Возврат: модуль силы в ньютонах (МТ_Н берётся из канона).
    """
    return кратность_массы_тела * МТ_Н
Таблица 2.1: Три силы пятки, полученные из их кратностей массы тела (?tbl-kanon-lasten).
Сила Кратность Модуль (Н)
реакция опоры 2,50 · МТ 1840
ахиллово сухожилие 3,50 · МТ 2576
подошвенный апоневроз 2,00 · МТ 1472

Как понимать таблицу. Для бегуньи массой 75 кг из трёх кратностей выходят 1840 ньютонов под пяткой (опора), 2576 ньютонов в ахилловом сухожилии и 1472 ньютона в подошвенной ленте — три силы одного порядка, каждая кратна массе тела, и все на одной-единственной небольшой кости. Но один модуль ещё не говорит, что каждая из них делает с костью; для этого не хватает направления, которое приносит следующий раздел.

Чтобы поменять самой — тот же расчёт в браузере. Измени кратность в списке и выполни ячейку: столбик растёт вместе с ней, а штриховая черта показывает, где лежит сама масса тела. Так сразу видно, во сколько раз сила её превосходит.

2.3 Три силы у пятки

Теперь они сходятся все три, каждая с направлением и модулем, приложенная к кости. Это та же сцена, что и на рисунке 1.2, только с модулями кратно массе тела (приложение с числами) и с масштабом в ньютонах.

Код
import matplotlib.pyplot as plt

рис, ось = plt.subplots(figsize=(7.2, 4.4))
сцена_сил(ось)
plt.tight_layout()
plt.show()
Рисунок 2.2: Три силы с их рабочими значениями, приложенные к пяточной кости в масштабе (длина контура 66 мм; правая стопа снаружи, сзади слева, спереди справа, вверх ↑). Реакция опоры снизу (2,50 · МТ, 90°), ахиллово сухожилие на задней стенке бугра назад и вверх (3,50 · МТ, ~118°), подошвенный апоневроз на переднем нижнем скате вперёд и вниз (2,00 · МТ, −10°). Это НЕ настоящий момент шага: эти максимумы не наступают одновременно (см. блуждающие силы ниже). Штриховая стрелка — их равнодействующая (результирующая сила).

Как это понимать. Реакция опоры давит вверх, ахиллово сухожилие тянет назад и вверх, подошвенный апоневроз — вперёд. Их равнодействующая — штриховая стрелка — это векторная сумма трёх, их результирующая сила. Она описывает только общий баланс внешних сил, а не местное действие на протяжённой кости: давят ли снизу или тянут спереди — для настоящей кости это разница, которой одна суммарная стрелка не видит. Как эту сумму строят аккуратно, сейчас покажет правило параллелограмма. И три силы сами по себе не уравновешивают друг друга; равновесие замыкает только сила в суставе сверху (глава 12).

Где этот срез лежит в настоящей стопе, показывает обзорный анатомический рисунок из главы 1 (Рисунок 1.1): пяточная кость внизу сзади, над ней таранная кость, ахиллово сухожилие на задней стороне, подошвенный апоневроз под подошвой вперёд. Именно к этим прикреплениям и приложены три стрелки.

ПредупреждениеСила — это не число

Догадка: «На пятку действуют 736 ньютонов, и всё».

Почему это напрашивается: число с единицей выглядит законченным. 736 ньютонов звучит как ясное, готовое указание.

Что на самом деле: две силы с одним и тем же модулем могут нагружать кость совершенно по-разному, если они направлены в разные стороны. Давление опоры снизу (2,5 · МТ) и тяга апоневроза вперёд (2,0 · МТ) имеют похожие модули, но противоположное действие — одно сминает бугор снизу, другая тянет за переднее прикрепление вперёд. Поэтому направление принадлежит силе, и поэтому мы рисуем стрелку, а не число.

2.4 Где сила приложена

У стрелки есть и третье свойство, которого у числа нет: её начало. И с ним дело обстоит странно — равнодействующая его вовсе не замечает. Следующая пара рисунков показывает дважды одни и те же три силы с единственным различием: тяга апоневроза приложена один раз к своему прикреплению, другой раз на восемь миллиметров дальше назад по подошве. Сравни две штриховые стрелки между собой, прежде чем читать дальше.

Код
import matplotlib.pyplot as plt

рис, оси = plt.subplots(2, 1, figsize=(7.2, 8.6))
места = [(ПРИКРЕПЛЕНИЯ["апоневроз"], "прикрепление модели (24,1 / 3,4 мм)"),
         ((15.59, 0.45),
          "на восемь миллиметров дальше назад (15,6 / 0,5 мм)")]
запомнено = ПРИКРЕПЛЕНИЯ["апоневроз"]
for ось, (точка, заголовок) in zip(оси, места):
    ПРИКРЕПЛЕНИЯ["апоневроз"] = точка
    сцена_сил(ось)
    ось.plot(точка[0], точка[1], "o", color="#333", ms=8, zorder=7)
    ось.set_title(заголовок, fontsize=10, pad=2)
ПРИКРЕПЛЕНИЯ["апоневроз"] = запомнено
plt.tight_layout()
plt.show()
Рисунок 2.3: Одна и та же сила апоневроза (2,00 · МТ, −10°) в двух местах подошвы, рисунки друг под другом: сверху на переднем нижнем скате бугристости, в том прикреплении, с которым эта книга считает; снизу примерно на восемь миллиметров дальше назад. Реакция опоры и тяга ахиллова сухожилия на обоих рисунках неизменны. Штриховая стрелка равнодействующей и сверху, и снизу имеет один и тот же модуль и одно и то же направление. Правая стопа снаружи; сзади слева, спереди справа, вверх ↑.

Как это понимать. Две штриховые стрелки одинаковой длины и смотрят в одну сторону: результирующей силе всё равно, где сила приложена. Кости — нет. Если лента тянет дальше назад, нагружается другой кусок кости — и именно вокруг этого вопроса, где тянут, в конце книги и разворачивается спор о пяточной шпоре. Точка приложения, стало быть, и есть то свойство, которого суммарное число передать в принципе не может; видимым оно становится только тогда, когда считают внутренность кости.

А вот если поменять направление силы, равнодействующая очень даже сдвинется. Лучше всего попробовать это самой.

Важное уведомлениеПрогноз

Прежде чем двигать: регулятор поворачивает направление тяги ахиллова сухожилия — от крутого (почти отвесного) до пологого (далеко назад). Если сухожилие потянет круче: равнодействующая (результирующая сила) трёх сил станет больше или меньше? Определись.

Как это понимать. Три приложенные стрелки — это внешние силы; их равнодействующая (штриховая) — их результирующая сила. Если ахиллово сухожилие тянет круче, растёт его направленная вверх доля, а поскольку силы опоры и апоневроза при этом не меняются, результирующая сила становится больше — штриховая стрелка удлиняется. Как эта нагрузка распределяется в кости в виде напряжений, посчитает только моделирование в следующих частях; здесь важно направление, а не поле напряжений.

2.5 Сложение двух сил: правило параллелограмма

На регуляторе результирующая сила только что появлялась уже готовой. Для двух сил её можно построить и от руки, и делает это правило параллелограмма: обе силы откладывают от одной точки, достраивают до параллелограмма и проводят диагональ. Эта диагональ и есть равнодействующая.

Код
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import FancyArrow

рис, ось = plt.subplots(figsize=(6.4, 4.6))

начало = np.array([0.0, 0.0])
# Реакция опоры (вверх) и подошвенный апоневроз (вперёд, слегка вниз).
опора_градусы, опора_модуль = НАПРАВЛЕНИЯ["опора"], МОДУЛИ["опора"]
апо_градусы, апо_модуль = НАПРАВЛЕНИЯ["апоневроз"], МОДУЛИ["апоневроз"]
вектор_опоры = опора_модуль * ММ_НА_МТ * np.array(
    [np.cos(np.deg2rad(опора_градусы)), np.sin(np.deg2rad(опора_градусы))])
вектор_апоневроза = апо_модуль * ММ_НА_МТ * np.array(
    [np.cos(np.deg2rad(апо_градусы)), np.sin(np.deg2rad(апо_градусы))])
вектор_равнод = вектор_опоры + вектор_апоневроза

for вектор, цвет, название in [
        (вектор_опоры, ЦВЕТ["опора"], "реакция опоры 2,5 · МТ"),
        (вектор_апоневроза, ЦВЕТ["апоневроз"],
         "подошвенный апоневроз 2,0 · МТ")]:
    ось.add_patch(FancyArrow(начало[0], начало[1], вектор[0], вектор[1],
                             width=0.6, head_width=3.2,
                             length_includes_head=True,
                             color=цвет, zorder=4))
    ось.text(вектор[0], вектор[1] + 1.2, название, color=цвет, fontsize=9,
             fontweight="bold",
             ha="center" if название.startswith("реакция") else "left")

# Достроение до параллелограмма (штриховое).
ось.plot([вектор_опоры[0], вектор_равнод[0]],
         [вектор_опоры[1], вектор_равнод[1]], "--", color="#999", lw=1.4)
ось.plot([вектор_апоневроза[0], вектор_равнод[0]],
         [вектор_апоневроза[1], вектор_равнод[1]], "--", color="#999", lw=1.4)

# Диагональ = равнодействующая.
модуль_равнод = np.hypot(*вектор_равнод) / ММ_НА_МТ
ось.annotate("", xy=вектор_равнод, xytext=начало,
             arrowprops=dict(arrowstyle="-|>", color=ЦВЕТ["равнод"], lw=2.6))
ось.text(вектор_равнод[0] + 1.5, вектор_равнод[1],
         f"равнодействующая {модуль_равнод:.1f} · МТ".replace(".", ","),
         color=ЦВЕТ["равнод"], fontsize=10, fontweight="bold", va="center")

ось.plot(начало[0], начало[1], "o", color="#333", ms=7, zorder=5)
ось.plot([2, 2 + ММ_НА_МТ], [-6, -6], color="#333", lw=2)
ось.text(2, -8.5, "1 · МТ ≈ 736 Н", fontsize=8, color="#333")
ось.set_xlim(-6, 34)
ось.set_ylim(-10, 26)
ось.set_aspect("equal")
ось.axis("off")
plt.tight_layout()
plt.show()
Рисунок 2.4: Правило параллелограмма для реакции опоры (2,50 · МТ, вверх) и подошвенного апоневроза (2,00 · МТ, вперёд и вниз). Обе отложены от одной точки и достроены до параллелограмма (штриховкой); диагональ — это равнодействующая (≈ 2,9 · МТ вперёд и вверх). Так две силы графически складываются в одну.

Как это понимать. Из двух стрелок получается третья. Равнодействующая опоры и апоневроза смотрит вперёд и вверх и длиннее каждой из двух по отдельности — но не так длинна, как их сумма в виде простых чисел (2,5 + 2,0 = 4,5), потому что направления расходятся. Здесь она построена как картинка — параллелограмм и диагональ, без сложения хоть одного числа. Разложение по составляющим, которым вычислительная машина образует ту же сумму внутри себя, придёт в главе 3; тогда компьютер станет делать это сложение для тысяч сил одновременно.

В шаге нагрузка перемещается от приземления к отталкиванию. Книга удерживает этот ход в пяти мгновенных снимках — каждый с тремя модулями сил этого мгновения и с долей времени, которую это мгновение занимает в контакте с опорой. Эта таблица называется в книге расписанием сил, и она единственный источник для шага: глава 7 делает из её опорных значений кривую, глава 11 просчитывает один из её моментов на сетке, а в части V каждая из её пяти строк становится отдельным случаем нагружения.

Таблица 2.2: Расписание сил: пять моментов опорной фазы. Три силы кратно массе тела (· МТ), доля времени — как часть контакта с опорой (сумма равна единице).
Момент Опора Ахиллово сухожилие Подошвенный апоневроз Доля времени
касание пяткой 1,45 0,30 0,10 0,15
нарастание нагрузки 2,00 1,50 0,30 0,20
средняя опорная фаза 2,50 2,00 0,60 0,30
отрыв пятки 1,20 3,50 1,20 0,20
отталкивание 0,30 2,80 2,00 0,15

Как читать расписание. Каждая строка — это стоп-кадр, а не промежуток времени, и три наибольших значения стоят в трёх разных строках: опора давит сильнее всего в средней опорной фазе, сухожилие тянет сильнее всего при отрыве пятки, подошвенная лента — при отталкивании. Только эти три наибольших значения взяты из приложения с числами; ход между ними — модельное допущение, а не измеренная кривая. Это относится и к первому значению в столбце опоры: 1,45 · МТ при касании пяткой — это опорное значение сглаженной кривой; короткий жёсткий пик, которым пятка при беге с пятки в действительности ударяется, в нём не разрешён. Доли времени, наконец, — допущение о том, как долго стопа задерживается в каждом моменте; в части V они решают, насколько тяжело момент весит в итоге.

Следующая анимация переключает пять строк одну за другой. Три направления при этом остаются постоянными — так модель считает и в части V, — и меняется одна лишь смесь модулей: сначала преобладает давление опоры, позже — тяга ахиллова сухожилия, а тяга апоневроза нарастает к отталкиванию.

Как это понимать. Ни один момент не похож на другой. При касании пяткой главенствует опора, при отталкивании перенимают ахиллово сухожилие и апоневроз; вершина равнодействующей при этом перескакивает с момента на момент, а пунктирная линия вычерчивает её след — не траекторию в кости, а только череду вершин результирующей силы. Результирующая сила, стало быть, блуждает, хотя ни одна из трёх сил своего направления не меняет; довольно того, что смещается их смесь. Это блуждание и есть причина, почему шаг в части V описывают не одним случаем нагружения, а пятью мгновенными снимками.

2.6 Почему порядки величин расходятся

Последнее свойство сил надо знать, прежде чем верить их знакам после запятой: они определены нерезко. Насколько велика сила ахиллова сухожилия при беге на самом деле, зависит от того, каким путём её получают. Измерения на самом сухожилии дают примерно 3,2–3,5 · МТ; если же пересчитывать её обратно из моментов в суставах, выходит до примерно 7 · МТ (и то и другое в приложении с числами). Рабочее значение 3,5 · МТ — это нижний якорь, опирающийся на измерения; 7 · МТ — не статистический выброс, а показатель того, насколько чувствителен результат к выбору метода: чувствительность, а не разброс измерений. Это не разгильдяйство, а биология и методика измерения разом.

Код
import numpy as np
import matplotlib.pyplot as plt

названия = ["реакция опоры", "ахиллово сухожилие", "подошвенный апоневроз"]
значения = [2.5, 3.5, 2.0]
# Планками погрешностей показаны только подтверждённые диапазоны (опора,
# апоневроз). Для ахиллова сухожилия 3,5–7 — это чувствительность метода,
# а не статистический разброс, поэтому не планка, а штриховая метка.
низ = [2.5 - 2.0, 0.0, 2.0 - 1.3]
верх = [2.9 - 2.5, 0.0, 2.9 - 2.0]
цвета = [ЦВЕТ["опора"], ЦВЕТ["ахилл"], ЦВЕТ["апоневроз"]]

рис, ось = plt.subplots(figsize=(7.0, 3.8))
y = np.arange(len(названия))[::-1]
ось.barh(y, значения, color=цвета, height=0.5, zorder=2)
ось.errorbar(значения, y, xerr=[низ, верх], fmt="none", ecolor="#333",
             capsize=5, lw=1.5, zorder=3)
# Метка чувствительности ахиллова сухожилия около 7 · МТ.
y_ахилла = y[1]
ось.plot([7.0, 7.0], [y_ахилла - 0.28, y_ахилла + 0.28],
         color=ЦВЕТ["ахилл"], lw=2, ls="--", zorder=4)
ось.annotate("сценарий чувствительности ~7 · МТ\n(обратный пересчёт из "
             "моментов)",
             xy=(7.0, y_ахилла), xytext=(4.4, y_ахилла + 0.6), fontsize=7.5,
             color=ЦВЕТ["ахилл"],
             arrowprops=dict(arrowstyle="->", color=ЦВЕТ["ахилл"], lw=1))
ось.axvline(1.0, color="#888", lw=1.2, ls="--", zorder=1)
ось.text(1.1, 1.5, "масса тела (1 · МТ)", fontsize=8, color="#666")
ось.set_yticks(y)
ось.set_yticklabels(названия)
ось.set_xlabel("Модуль (кратно массе тела · МТ)")
ось.set_xlim(0, 7.8)
for yy, знач in zip(y, значения):
    ось.text(знач + 0.05, yy + 0.28, f"{знач:.1f} · МТ".replace(".", ","),
             fontsize=9, color="#333")

# Вторая ось: те же кратности в ньютонах.
ось2 = ось.twiny()
ось2.set_xlim(0, 7.8 * МТ_Н)
ось2.set_xlabel("Модуль (ньютоны)")
plt.tight_layout()
plt.show()
Рисунок 2.5: Три силы кратно массе тела (приложение с числами). Реакция опоры 2,5 (подтверждённый диапазон 2,0–2,9) и подошвенный апоневроз 2,0 (1,3–2,9) несут планки погрешностей своего подтверждённого диапазона. Ахиллово сухожилие стоит со своим рабочим значением 3,5, опирающимся на измерения; штриховая метка около 7 — это НЕ диапазон разброса, а сценарий чувствительности при обратном пересчёте из моментов. Тонкая линия при 1 · МТ — масса тела как ориентир; правая ось показывает тот же модуль в ньютонах.

Как это понимать. Все три силы лежат в одном порядке величин, грубо между двумя и четырьмя массами тела. Только ахиллово сухожилие, смотря по тому, как его определяют, может оказаться вдвое больше. Модель, которая выдаёт одно из этих чисел с тремя знаками после запятой, делает вид, будто знает больше, чем биология. Именно эта чувствительность и становится поэтому темой регулятора.

Важное уведомлениеПрогноз

Прежде чем двигать: регулятор удваивает силу ахиллова сухожилия внутри подтверждённого диапазона чувствительности, с 3,5 до 7 · МТ. Сильно ли изменится равнодействующая (результирующая сила) — или сила опоры удержит её, и направление останется почти прежним? Определись.

Как это понимать. Удвоение видно отчётливо: красная стрелка становится вдвое длиннее, и результирующая сила следует за ней — она растёт и поворачивается немного назад и вверх, туда, куда тянет сухожилие. Значит, сила опоры одна ей не противостоит. Кто читает биомеханическое моделирование, тому стоит поэтому всегда спрашивать, с каким значением внутри диапазона чувствительности оно считало.

Упражнения

Упр. 2.1 (Понять). Нарисуй для каждой из трёх сил (опора, ахиллово сухожилие, подошвенный апоневроз) по стрелке у пяточной кости и напиши одним предложением, при каком движении она наибольшая или отчётливее всего прощупывается — при стоянии, при подъёме на носки или при отталкивании.

Упр. 2.2 (Изменить). Открой регулятор чувствительности. Заранее запиши, чего ты ждёшь, а потом сдвинь силу ахиллова сухожилия с 3,5 на 7 · МТ. Отметь модуль равнодействующей (результирующей силы) при обоих значениях и то, насколько он меняется.

Упр. 2.3 (Перенести). Следующая таблица из анатомического атласа 1918 года — кладезь всего того, что наша модель опускает. Найди на ней ещё одну силу — вдобавок к силе в суставе с таранной костью, — которая действует на пяточную кость, и обоснуй, почему плоский срез через пятку её увидеть не может. Что пришлось бы изменить в модели, чтобы её учесть?

Рисунок 2.6: Сухожилия внутренней стороны стопы: ахиллово сухожилие (Tendocalcaneus) со своей синовиальной сумкой, перед ним сухожилия сгибателей, которых в нашей модели нет. Для ориентировки: все модельные рисунки этой книги показывают правую стопу снаружи, пяткой влево. Эта таблица смотрит с другой стороны, на внутреннюю сторону стопы, — поэтому пятка здесь справа, а пальцы слева. Кто сравнивает таблицу с рисунком Рисунок 1.1, должен мысленно её отразить. Источник: Gray, Anatomy of the Human Body, 20-е изд. 1918, таблица 442 (общественное достояние).

Красная нить

Где это уже встречалось, где встретится снова? Из трёх стрелок чёрного ящика в главе 1 получились силы с направлением и модулем. В главе 3 вектор силы получит список чисел и станет вектором — тогда равнодействующую можно будет не только нарисовать, но и вычислить. Три силы этой главы — это ровно те граничные условия, которые глава 12 прикладывает к сетке; четвёртая, сила в суставе с таранной костью, добавляется там не четвёртой стрелкой, а реакцией закрепления, которым удерживают таранную кость. А расписание сил (Таблица 2.2) станет в части V пятью случаями нагружения шага.

Чего эта глава не делает

Она не считает по составляющим: никакого разложения сил на числа по x и по y, никаких уравнений, никаких напряжений в кости. Равнодействующая строится здесь как картинка (параллелограмм и диагональ), а не вычисляется из координат — разложение по составляющим, которое лежит в основе той же суммы, придёт в главе 3. Интерактивные регуляторы показывают внешние силы и их результирующую силу в виде стрелок — они не вычисляют поля напряжений и ничего не утверждают о месте, в котором кость растёт; это дело следующих частей. И равновесие кости здесь тоже не замыкается: четвёртая сила, сила в суставе сверху, только объявлена.