Сквозной кейс: символьно вывести формулу, численно посчитать
Финал курса: соберём всё вместе. Решим инженерную задачу так, как делает учёный — выведем формулу символьно, посчитаем число численно.
Сквозной конвейер научного 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 и этого курса.