Сквозной кейс: символьно вывести формулу, численно посчитать

Финал курса: соберём всё вместе. Решим инженерную задачу так, как делает учёный — выведем формулу символьно, посчитаем число численно.

Сквозной конвейер научного Python: SymPy выводит аналитическую формулу → lambdify превращает её в функцию → SciPy/NumPy считает конкретные числа.

Постановка задачи

Инженерная задача: тело брошено под углом, его высота описана функцией h(t) = v·t − g·t²/2 (где v — начальная скорость вверх, g — ускорение свободного падения). Вопросы: когда тело достигнет максимальной высоты и какова эта высота? Решим обоими подходами и увидим, как они дополняют друг друга.

Шаг 1: символьно выводим формулу (как сделал бы SymPy)

Максимум там, где производная высоты (скорость) равна нулю. Выведем формулу руками — это то, что SymPy делает через diff и solve:

import sympy as sp

t, v, g = sp.symbols("t v g", positive=True)
h = v*t - g*t**2/2

velocity = sp.diff(h, t)             # v - g*t  (производная высоты)
t_max = sp.solve(velocity, t)[0]     # t = v/g  (где скорость = 0)
h_max = h.subs(t, t_max)             # подставляем обратно
h_max = sp.simplify(h_max)

print("Время макс. высоты:", t_max)  # v/g
print("Макс. высота      :", h_max)  # v**2/(2*g) — ТОЧНАЯ ФОРМУЛА

SymPy вывел бы формулу: момент максимума t = v/g, а высота h_max = v²/(2g). Это аналитический результат — он верен для любых v и g, и его можно вставить в статью.

Шаг 2: численно считаем для конкретных чисел

Теперь подставим реальные значения (v = 20 м/с, g = 9.81 м/с²) — это работа для численного мира. И сделаем это на чистом stdlib, проверив формулу прямым поиском максимума:

v = 20.0      # начальная скорость, м/с
g = 9.81      # ускорение свободного падения, м/с^2

def h(t):
    return v*t - g*t**2/2

# по выведенной формуле:
t_max_formula = v / g
h_max_formula = v**2 / (2*g)

# проверка: численный поиск максимума перебором
best_t, best_h = 0.0, 0.0
t = 0.0
while t <= 5.0:
    if h(t) > best_h:
        best_h = h(t)
        best_t = t
    t += 0.001

print("По формуле : t =", round(t_max_formula, 4),
      "h =", round(h_max_formula, 4))
print("Перебором  : t =", round(best_t, 4),
      "h =", round(best_h, 4))

Вывод:

По формуле : t = 2.0387 h = 20.3874
Перебором  : t = 2.039 h = 20.3874

Совпало! Аналитическая формула v²/(2g) и численный перебор дают одну высоту ~20.39 м. Формула точна, перебор её подтверждает — вот сила связки.

Полный конвейер на одной схеме

   ЗАДАЧА (физика/инженерия)
        │
        ▼
   SymPy: diff + solve  ──►  ФОРМУЛА  h_max = v²/(2g)
        │                         │
        │                         ▼
        │                   lambdify  (формула → функция)
        ▼                         │
   проверка/анализ                ▼
   "в буквах"             SciPy/NumPy: подставляем числа
                                  │
                                  ▼
                          ОТВЕТ: 20.39 м (+ график)

Почему именно так работают учёные

Можно было решить задачу только численно (перебором) — но тогда у вас лишь число для одного набора v, g, и каждый новый случай надо считать заново. Аналитическая формула v²/(2g) мощнее: она показывает структуру (высота растёт как квадрат скорости!), верна для всех значений и мгновенно даёт ответ подстановкой. Поэтому идеал — вывести формулу символьно (понимание + общность), а потом численно подставить (конкретный ответ + скорость). Это и есть лейтмотив всего курса: «руками/символьно поняли — численно посчитали».

Как работает под капотом

В реальном конвейере связующее звено — lambdify. SymPy выводит h_max = v²/(2g) как дерево выражения; lambdify(v, g, h_max) компилирует его в обычную функцию lambda v, g: v**2/(2*g). Дальше эту функцию можно звать миллион раз с разными v и g на полной скорости NumPy — например, чтобы построить график зависимости максимальной высоты от скорости. Символьный вывод происходит один раз, численный счёт — сколько угодно. Так дорогая точная математика делается единожды, а дешёвый быстрый счёт — массово.

Частые ошибки

  • Считать всё численно «в лоб». Теряете общую формулу и понимание структуры; каждый новый случай — заново.
  • Гонять SymPy в численном цикле. Выведите формулу один раз, дальше — lambdify + NumPy.
  • Не проверять формулу численно. Символьный вывод стоит подтвердить независимым численным расчётом — поймаете опечатки.

Итог курса

  • Научный конвейер: SymPy выводит формулу → lambdify → SciPy/NumPy считает числа.
  • Символьный вывод даёт общность и понимание; численный счёт — конкретный ответ и скорость.
  • Формулу выводят один раз, численно подставляют сколько угодно.
  • Связка точного (SymPy) и приближённого (SciPy) — суть научного Python и этого курса.
Проверьте себя
1. В чём суть сквозного научного конвейера, показанного в курсе?
AСчитать всё численно
BSymPy выводит точную ФОРМУЛУ один раз → lambdify компилирует её → SciPy/NumPy массово считает числа
CИспользовать только SymPy
DИзбегать формул
2. Чем аналитическая формула h_max = v²/(2g) лучше численного ответа «20.39 м»?
AНичем
BОна верна для ВСЕХ v и g, показывает структуру (высота ~ квадрат скорости) и даёт ответ мгновенной подстановкой
CОна точнее числа
DОна быстрее считается всегда
3. Почему символьный вывод делают один раз, а численный счёт — много?
AТак принято
BСимвольные вычисления дорогие и медленные, поэтому формулу выводят однократно, а скомпилированную через lambdify функцию зовут массово на скорости NumPy
CЧисленный счёт нельзя повторять
DSymPy ломается при повторе