Задача Коши — главный объект численных методов

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

Задача Коши — это дифференциальное уравнение y' = f(t, y) вместе с начальным условием y(t0) = y0, задающим одну точку траектории.

В предыдущих уроках мы видели, что одного закона скорости y' = f(t, y) недостаточно: он порождает целое семейство кривых. Чтобы выбрать из них одну, нужна точка привязки — мы говорим, где траектория находится в начальный момент: y(t0) = y0. Уравнение плюс это условие вместе образуют задачу Коши (Cauchy problem), названную в честь французского математика Огюстена Луи Коши. Именно она — центральный объект всего курса. Поймём, почему она так удобна для численного счёта и при каких условиях гарантированно имеет единственное решение.

Почему именно одна точка

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

(t0, y0) ---f--> (t1, y1) ---f--> (t2, y2) ---f--> ...
   старт          шаг 1          шаг 2
 каждый шаг: новая_точка = старая + dt * скорость_в_старой

Простейший шаг вперёд

Покажем эту идею на уравнении y' = y с начальным условием y(0) = 1. Аналитическое решение нам известно — это exp(t), и в точке t = 1 оно равно e ≈ 2.7183. Прошагаем численно с шагом dt = 0.25 и сравним.

import math
y = 1.0
t = 0.0
dt = 0.25
steps = 4
print('start: t=%.2f y=%.4f' % (t, y))
for i in range(steps):
    slope = y
    y = y + dt * slope
    t = t + dt
    print('step %d: t=%.2f y=%.4f' % (i + 1, t, y))
print('exact e^1 = %.4f' % math.exp(1.0))

Вывод:

start: t=0.00 y=1.0000
step 1: t=0.25 y=1.2500
step 2: t=0.50 y=1.5625
step 3: t=0.75 y=1.9531
step 4: t=1.00 y=2.4414
exact e^1 = 2.7183

Мы стартовали из известной точки и за четыре шага дошли до t = 1, получив 2.4414 против точного 2.7183. Приближение грубовато — шаг великоват, и метод систематически отстаёт, потому что использует скорость в начале шага, а она занижает реальный рост. Но принцип работает: из одной точки мы восстановили всю траекторию. Уменьшая шаг, мы приблизимся к эталону.

Существование и единственность

Прежде чем запускать метод, разумно спросить: а есть ли вообще решение, и единственное ли оно? Если бы у задачи Коши было два разных решения с одной стартовой точкой, компьютер не знал бы, какое из них считать. К счастью, есть теорема существования и единственности (теорема Пикара — Линделёфа). Она гарантирует: если правая часть f(t, y) ведёт себя достаточно прилично, то через каждую начальную точку проходит ровно одна траектория. Интуитивно это значит, что мир детерминирован: задав состояние сейчас, мы однозначно определяем всё будущее.

Условие Липшица на пальцах

Что значит «прилично себя ведёт»? Ключевое требование — условие Липшица по переменной y. Сформулируем его без формул. Представьте две близкие траектории, стартующие из чуть разных точек. Условие Липшица говорит: скорости в этих двух точках не могут отличаться слишком сильно — разница скоростей ограничена разницей положений, умноженной на некоторую константу L. Другими словами, функция f не должна меняться по y взрывным, бесконечно крутым образом. Если это так, то близкие траектории расходятся ограниченно, не пересекаются и не сливаются непредсказуемо — и решение единственно.

Наглядная картинка: если наклон чёрточек в поле направлений меняется плавно (нет бесконечно резких скачков по вертикали), решения ведут себя предсказуемо. Большинство функций из практики — многочлены, экспоненты, синусы, их комбинации — на любом ограниченном куске удовлетворяют условию Липшица. Проблемы возникают у экзотических правых частей вроде y' = sqrt(y) около нуля, где наклон становится бесконечно крутым, — там единственность может нарушиться, и из одной точки выходят несколько решений.

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

Почему мельчение шага улучшает результат? Каждый шаг вносит маленькую ошибку, потому что мы заменяем кривую её касательной на длине dt. Чем короче шаг, тем точнее касательная приближает кривую, и тем меньше накопленная ошибка. Прогоним наш пример y' = y, y(0) = 1 с разным числом шагов и посмотрим, как ошибка в точке t = 1 убывает.

import math
exact = math.exp(1.0)
for n in [1, 2, 4, 8, 16, 32]:
    dt = 1.0 / n
    y = 1.0
    for i in range(n):
        y = y + dt * y
    print('n=%2d  y(1)=%.5f  error=%.5f' % (n, y, exact - y))
print('exact=%.5f' % exact)

Вывод:

n= 1  y(1)=2.00000  error=0.71828
n= 2  y(1)=2.25000  error=0.46828
n= 4  y(1)=2.44141  error=0.27688
n= 8  y(1)=2.56578  error=0.15250
n=16  y(1)=2.63793  error=0.08035
n=32  y(1)=2.67699  error=0.04129
exact=2.71828

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

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

Первая ошибка — пытаться запустить численный метод без начального условия. Без точки старта шагать неоткуда; уравнение само по себе задаёт лишь поле скоростей. Вторая — путать существование с единственностью: решение может существовать, но быть не единственным, если нарушено условие Липшица; именно единственность гарантирует, что компьютер посчитает «то самое» решение. Третья — забывать, что численное решение всегда приближённое: получив красивые числа, легко принять их за истину, тогда как при большом шаге ошибка может быть огромной. Всегда полезно прогнать метод с двумя разными шагами и убедиться, что ответ стабилизируется.

  • Задача Коши = уравнение y' = f(t, y) плюс начальное условие y(t0) = y0.
  • Одна стартовая точка идеальна для пошагового движения вперёд — основа всех методов курса.
  • Теорема Пикара — Линделёфа гарантирует единственное решение при хорошей правой части.
  • Условие Липшица означает: скорость не меняется по y бесконечно резко — близкие траектории не сливаются.
  • Мельчение шага уменьшает ошибку; метод Эйлера имеет первый порядок точности.
  • Численное решение всегда приближённое — проверяйте устойчивость, сравнивая разные шаги.
Проверьте себя
1. Что входит в постановку задачи Коши?
AТолько уравнение y' = f(t, y)
BУравнение и условия на обоих концах отрезка
CУравнение y' = f(t, y) и начальное условие y(t0) = y0
DТолько начальное условие
2. Почему задача Коши удобна для численных методов?
AОна всегда линейна
BИзвестна стартовая точка, и можно шагать вперёд, опираясь только на текущее состояние
CОна не требует начального условия
DЕё решение всегда экспонента
3. Что интуитивно означает условие Липшица для функции f(t, y)?
Af линейна по t
BСкорость не меняется по y бесконечно резко, и близкие траектории не сливаются непредсказуемо
Cf не зависит от y
DРешение всегда положительно
4. В примере y'=y, y(0)=1 при удвоении числа шагов ошибка примерно делится пополам. О чём это говорит?
AО втором порядке точности
BО первом порядке точности метода Эйлера
CОб отсутствии сходимости
DО том, что метод точен