Методы вычислений

ПримерЭйлерRK2RK4СравнениеДемо

Пример на всей странице

Чтобы сравнивать методы «в одних единицах», везде ниже берём одну и ту же задачу Коши:

\[ y' = y,\qquad y(0) = 1,\qquad h = 0.5. \]

Точное решение — \( y(x) = e^{x} \). На двух шагах: \( y(0{,}5) \approx 1{,}648721 \), \( y(1) \approx 2{,}718282 \). Правая часть \( f(x,y) = y \) не зависит от \( x \), поэтому руками считать коэффициенты просто, а расхождение методов всё равно хорошо видно.

Тот же пример можно открыть на калькуляторе ОДУ-1 и сравнить кривые визуально.

Метод Эйлера

Явный (вперёд) Эйлер — схема порядка 1. Из точки \( (x_n, y_n) \) берём наклон \( k_1 = f(x_n, y_n) \) и делаем прямолинейный шаг длины \( h \):

\[ y_{n+1} = y_n + h\,k_1,\qquad x_{n+1} = x_n + h. \]

Геометрически это касательная к полю направлений: при крупном \( h \) ломаная заметно уходит от истинной интегральной кривой — удобно для обучения.

/**
 * Один шаг явного метода Эйлера для y′ = f(x, y).
 * @param {(x: number, y: number) => number} f  правая часть
 * @param {number} x  текущий x
 * @param {number} y  текущий y
 * @param {number} h  шаг
 * @returns {{ x: number, y: number, k1: number }}
 */
function eulerStep(f, x, y, h) {
  const k1 = f(x, y)
  return { x: x + h, y: y + h * k1, k1 }
}

Два шага для нашего примера. На шаге 0: \( k_1 = f(0,1) = 1 \), значит \( y_1 = 1 + 0{,}5\cdot 1 = 1{,}5 \). На шаге 1: \( k_1 = 1{,}5 \), \( y_2 = 1{,}5 + 0{,}5\cdot 1{,}5 = 2{,}25 \).

ixyk₁x′y′
00110.51.5
10.51.51.512.25

К \( x = 1 \) Эйлер дал \( 2{,}25 \) против точных \( \approx 2{,}718 \) — занижение порядка 17%.

Метод Хьюна (RK2)

Хьюн (улучшенный Эйлер, явный RK2) — схема порядка 2. Сначала «прогноз» Эйлера, затем наклон в конце шага; итоговый прирост — среднее двух наклонов:

\[ k_1 = f(x_n,y_n),\qquad k_2 = f(x_n+h,\, y_n + h\,k_1), \]

\[ y_{n+1} = y_n + \frac{h}{2}(k_1 + k_2). \]

В ODEPLOT этот метод подписан как RK2 — тот же код, что в модуле интегрирования калькулятора ОДУ-1.

/**
 * Один шаг метода Хьюна (явный RK2, predictor–corrector) для y′ = f(x, y).
 * @param {(x: number, y: number) => number} f  правая часть
 * @param {number} x  текущий x
 * @param {number} y  текущий y
 * @param {number} h  шаг
 * @returns {{ x: number, y: number, k1: number, k2: number }}
 */
function heunStep(f, x, y, h) {
  const k1 = f(x, y)
  const k2 = f(x + h, y + h * k1)
  return { x: x + h, y: y + (h * (k1 + k2)) / 2, k1, k2 }
}

Шаг 0: \( k_1 = 1 \), \( k_2 = f(0{,}5,\,1{,}5) = 1{,}5 \), \( y_1 = 1 + 0{,}5\cdot(1+1{,}5)/2 = 1{,}625 \). Шаг 1: \( k_1 = 1{,}625 \), \( k_2 = 2{,}4375 \), \( y_2 = 2{,}640625 \).

ixyk₁k₂x′y′
00111.50.51.625
10.51.6251.6252.437512.640625

Ошибка на \( x = 1 \) уже около 3% — заметно лучше Эйлера при тех же двух вызовах \( f \) на шаг (один «лишний» против Эйлера).

Метод Рунге–Кутты 4-го порядка (RK4)

Классический явный RK4 — схема порядка 4. Четыре оценки наклона: в начале шага, дважды около середины и в конце; итог — взвешенное среднее:

\[ \begin{aligned} k_1 &= f(x_n, y_n),\\ k_2 &= f\!\left(x_n+\tfrac{h}{2},\, y_n+\tfrac{h}{2}k_1\right),\\ k_3 &= f\!\left(x_n+\tfrac{h}{2},\, y_n+\tfrac{h}{2}k_2\right),\\ k_4 &= f(x_n+h,\, y_n+h\,k_3),\\ y_{n+1} &= y_n + \frac{h}{6}(k_1 + 2k_2 + 2k_3 + k_4). \end{aligned} \]

На калькуляторе ОДУ-1 RK4 — метод по умолчанию: гладкие кривые при умеренном \( h \).

/**
 * Один шаг классического Рунге–Кутты 4-го порядка для y′ = f(x, y).
 * @param {(x: number, y: number) => number} f  правая часть
 * @param {number} x  текущий x
 * @param {number} y  текущий y
 * @param {number} h  шаг
 * @returns {{ x: number, y: number, k1: number, k2: number, k3: number, k4: number }}
 */
function rk4Step(f, x, y, h) {
  const k1 = f(x, y)
  const k2 = f(x + h / 2, y + (h * k1) / 2)
  const k3 = f(x + h / 2, y + (h * k2) / 2)
  const k4 = f(x + h, y + h * k3)
  return {
    x: x + h,
    y: y + (h * (k1 + 2 * k2 + 2 * k3 + k4)) / 6,
    k1, k2, k3, k4,
  }
}

Шаг 0 даёт \( y_1 = 1{,}6484375 \) (точное \( \approx 1{,}648721 \)). После второго шага \( y_2 \approx 2{,}717346 \) при точном \( \approx 2{,}718282 \).

ixyk₁k₂k₃k₄x′y′
00111.251.31251.656250.51.6484375
10.51.64843751.64843752.0605468752.163574218752.73022460937512.71734619140625

Сравнение на \( x = 1 \)

Методy(1)Ошибка ≈
Точное \(e^{1}\)2.718282—
Эйлер2.250.468
RK2 (Хьюн)2.6406250.078
RK42.7173460.00094

Порядок метода виден уже на двух крупных шагах: Эйлер грубо занижает, RK2 подтягивает, RK4 почти совпадает с экспонентой. На странице поля направлений те же три схемы можно включить сразу и смотреть таблицу шагов / CSV.