Метод Рунге — Кутты

Эта статья находится на начальном уровне проработки, в одной из её версий выборочно используется текст из источника, распространяемого под свободной лицензией
Материал из энциклопедии Руниверсалис
(перенаправлено с «Метод Рунге — Кутта»)

Ме́тоды Ру́нге — Ку́тты (в литературе встречается название методы Рунге — Кутта) — большой класс численных методов решения задачи Коши для обыкновенных дифференциальных уравнений и их систем. Первые методы данного класса были предложены около 1900 года немецкими математиками К. Рунге и М. В. Куттой.

К классу методов Рунге — Кутты относятся явный метод Эйлера и модифицированный метод Эйлера с пересчётом, которые представляют собой соответственно методы первого и второго порядка точности. Существуют стандартные явные методы третьего порядка точности, не получившие широкого распространения. Наиболее часто используется и реализован в различных математических пакетах (Maple, MathCAD, Maxima) классический метод Рунге — Кутты, имеющий четвёртый порядок точности. При выполнении расчётов с повышенной точностью всё чаще применяются методы пятого и шестого порядков точности[1][2]. Построение схем более высокого порядка сопряжено с большими вычислительными трудностями[3].

Методы седьмого порядка должны иметь по меньшей мере девять стадий, а методы восьмого порядка — не менее 11 стадий. Для методов девятого и более высоких порядков (не имеющих, впрочем, большой практической значимости) неизвестно, сколько стадий необходимо для достижения соответствующего порядка точности[3].

Классический метод Рунге — Кутты четвёртого порядка

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

Рассмотрим задачу Коши для системы обыкновенных дифференциальных уравнений первого порядка (далее [math]\displaystyle{ \mathbf y, \mathbf f, \mathbf k_i \in \mathbb{R}^n }[/math], а [math]\displaystyle{ x, h \in \mathbb{R}^1 }[/math]).

[math]\displaystyle{ \textbf{y}'=\textbf{f}(x,\textbf{y}), \quad \textbf{y}(x_0)=\textbf{y}_0. }[/math]

Тогда приближенное значение в последующих точках вычисляется по итерационной формуле:

[math]\displaystyle{ \textbf{y}_{n+1} = \textbf{y}_n + {h \over 6}(\textbf{k}_1 + 2\textbf{k}_2 + 2\textbf{k}_3 + \textbf{k}_4) }[/math]

Вычисление нового значения проходит в четыре стадии:

[math]\displaystyle{ \textbf{k}_1 = \textbf{f} \left( x_n, \textbf{y}_n \right), }[/math]
[math]\displaystyle{ \textbf{k}_2 = \textbf{f} \left( x_n + {h \over 2}, \textbf{y}_n + {h \over 2} \textbf{k}_1 \right), }[/math]
[math]\displaystyle{ \textbf{k}_3 = \textbf{f} \left( x_n + {h \over 2}, \textbf{y}_n + {h \over 2} \textbf{k}_2 \right), }[/math]
[math]\displaystyle{ \textbf{k}_4 = \textbf{f} \left( x_n + h, \textbf{y}_n + h\ \textbf{k}_3 \right). }[/math]

где [math]\displaystyle{ h }[/math] — величина шага сетки по [math]\displaystyle{ x }[/math].

Этот метод имеет четвёртый порядок точности. Это значит, что ошибка на одном шаге имеет порядок [math]\displaystyle{ O(h^5) }[/math], а суммарная ошибка на конечном интервале интегрирования имеет порядок [math]\displaystyle{ O(h^4) }[/math] .

Явные методы Рунге — Кутты

Семейство явных методов Рунге — Кутты является обобщением как явного метода Эйлера, так и классического метода Рунге — Кутты четвёртого порядка. Оно задаётся формулами

[math]\displaystyle{ \textbf{y}_{n+1} = \textbf{y}_n + h\sum_{i=1}^n b_i \textbf{k}_i, }[/math]

где [math]\displaystyle{ h }[/math] — величина шага сетки по [math]\displaystyle{ x }[/math], а вычисление нового значения проходит в [math]\displaystyle{ s }[/math] этапов:

[math]\displaystyle{ \begin{array}{ll} \textbf{k}_1 =& \textbf{f}(x_n, \textbf{y}_n),\\ \textbf{k}_2 =& \textbf{f}(x_n+c_2h, \textbf{y}_n+a_{21}h\textbf{k}_1),\\ \cdots&\\ \textbf{k}_s =& \textbf{f}(x_n+c_sh, \textbf{y}_n+a_{s1}h\textbf{k}_1+a_{s2}h\textbf{k}_2+\cdots+a_{s,s-1}h\textbf{k}_{s-1}) \end{array} }[/math]

Конкретный метод определяется числом [math]\displaystyle{ s }[/math] и коэффициентами [math]\displaystyle{ b_i, a_{ij} }[/math] и [math]\displaystyle{ c_i }[/math]. Эти коэффициенты часто упорядочивают в таблицу (называемую таблицей Бутчера):

[math]\displaystyle{ \begin{array}{c|ccccc} 0 &&&&&\\ c_2 & a_{21} &&&&\\ c_3 & a_{31} & a_{32} &&&\\ \vdots & \vdots & \vdots& \ddots&&\\ c_s & a_{s1} & a_{s2}& \dots & a_{ss-1}&\\ \hline & b_1 & b_2 & \dots & b_{s-1} & b_s \end{array} }[/math]

Для коэффициентов метода Рунге — Кутты должны быть выполнены условия [math]\displaystyle{ \sum_{j=1}^{i-1} a_{ij} = c_i }[/math] для [math]\displaystyle{ i=2, \ldots, s }[/math]. Если требуется, чтобы метод имел порядок [math]\displaystyle{ p }[/math], то следует также обеспечить условие

[math]\displaystyle{ \bar{\textbf{y}}(h+x_0)- {\textbf{y}}(h+x_0)=O(h^{p+1}), }[/math]

где [math]\displaystyle{ \bar{\textbf{y}}(h+x_0) }[/math] — приближение, полученное по методу Рунге — Кутты. После многократного дифференцирования это условие преобразуется в систему полиномиальных уравнений относительно коэффициентов метода.

Неявные методы Рунге — Кутты

Все до сих пор упомянутые методы Рунге — Кутты являются явными методами[англ.]. К сожалению, явные методы Рунге — Кутты, как правило, непригодны для решения жестких уравнений из-за малой области их абсолютной устойчивости[4]. Неустойчивость явных методов Рунге — Кутты создаёт весьма серьёзные проблемы и при численном решении дифференциальных уравнений в частных производных[англ.].

Неустойчивость явных методов Рунге — Кутты мотивировала развитие неявных методов. Неявный метод Рунге — Кутты имеет вид[5][6]:

[math]\displaystyle{ y_{n+1} = y_n + h\sum_{i=1}^s b_i k_i, }[/math]

где

[math]\displaystyle{ k_i = f\bigl( x_n + c_i h, y_n + h\sum_{j=1}^s a_{ij} k_j \bigr), \quad i = 1, \ldots, s. }[/math]

Явный метод характерен тем, что матрица коэффициентов [math]\displaystyle{ a_{ij} }[/math] для него имеет нижний треугольный вид (включая и нулевую главную диагональ) — в отличие от неявного метода, где матрица имеет произвольный вид. Это также видно по таблице Батчера[англ.].

[math]\displaystyle{ \begin{array}{c|cccc} c_1 & a_{11} & a_{12}& \dots & a_{1s}\\ c_2 & a_{21} & a_{22}& \dots & a_{2s}\\ \vdots & \vdots & \vdots& \ddots& \vdots\\ c_s & a_{s1} & a_{s2}& \dots & a_{ss} \\ \hline & b_1 & b_2 & \dots & b_s\\ \end{array} = \begin{array}{c|c} \mathbf{c}& A\\ \hline & \mathbf{b^T} \\ \end{array} }[/math]

Следствием этого различия является необходимость на каждом шагу решать систему уравнений для [math]\displaystyle{ k_i, i=1,2,...,s }[/math], где [math]\displaystyle{ s }[/math] — число стадий. Это увеличивает вычислительные затраты, однако при достаточно малом [math]\displaystyle{ h }[/math] можно применить принцип сжимающих отображений и решать данную систему методом простой итерации[7]. В случае одной итерации это увеличивает вычислительные затраты всего лишь в два раза.

С другой стороны, Жан Кунцма́н[фр.] (1961) и Джон Батчер[англ.] (1964) показали, что при любом количестве стадий [math]\displaystyle{ s }[/math] существует неявный метод Рунге — Кутты с порядком точности [math]\displaystyle{ p=2s }[/math]. Это значит, например, что для описанного выше явного четырёхстадийного метода четвёртого порядка существует неявный аналог с вдвое большим порядком точности.

Неявный метод Рунге — Кутты второго порядка

Простейшим неявным методом Рунге — Кутты является модифицированный метод Эйлера «с пересчётом». Он задаётся формулой:

[math]\displaystyle{ \mathbf y_{n+1} =\mathbf y_{n}+h\frac{\mathbf f(x_n,\mathbf y_n)+\mathbf f(x_{n+1},\mathbf y_{n+1})}{2} }[/math].

Для его реализации на каждом шаге необходимы как минимум две итерации (и два вычисления функции).

Прогноз:

[math]\displaystyle{ \tilde \mathbf y_{n+1}=\mathbf y_n+h\mathbf f(x_n,\mathbf y_n) }[/math].

Коррекция:

[math]\displaystyle{ \mathbf y_{n+1}=\mathbf y_n+h\frac{\mathbf f(x_n,\mathbf y_n)+\mathbf f(x_{n+1},\tilde \mathbf y_{n+1})}{2} }[/math].

Вторая формула — это простая итерация решения системы уравнений относительно [math]\displaystyle{ \mathbf y_{n+1} }[/math], записанной в форме сжимающего отображения. Для повышения точности итерацию-коррекцию можно сделать несколько раз, подставляя [math]\displaystyle{ \tilde\mathbf y_{n+1}=\mathbf y_{n+1} }[/math]. Модифицированный метод Эйлера «с пересчётом» имеет второй порядок точности.

Устойчивость

Преимуществом неявных методов Рунге — Кутты в сравнении с явными является их бо́льшая устойчивость, что особенно важно при решении жестких уравнений. Рассмотрим в качестве примера линейное уравнение y' = λy. Обычный метод Рунге — Кутты, применённый к этому уравнению, сведётся к итерации [math]\displaystyle{ y_{n+1} = r(h\lambda) \, y_n }[/math], с r, равным

[math]\displaystyle{ r(z) = 1 + z b^T (I-zA)^{-1} e = \frac{\det(I-zA+zeb^T)}{\det(I-zA)}, }[/math]

где [math]\displaystyle{ e }[/math] обозначает вектор-столбец из единиц[8]. Функция [math]\displaystyle{ r }[/math] называется функцией устойчивости[9]. Из формулы видно, что [math]\displaystyle{ r }[/math] является отношением двух полиномов степени [math]\displaystyle{ s }[/math], если метод имеет [math]\displaystyle{ s }[/math] стадий. Явные методы имеют строго нижнюю треугольную матрицу [math]\displaystyle{ A, }[/math] откуда следует, что [math]\displaystyle{ \det (I - z A) = 1, }[/math] и что функция устойчивости является многочленом[10].

Численное решение данного примера сходится к нулю при условии [math]\displaystyle{ | r(z) | \lt 1 }[/math] с [math]\displaystyle{ z = h\lambda }[/math]. Множество таких [math]\displaystyle{ z }[/math] называется областью абсолютной устойчивости. В частности, метод называется A-устойчивым, если все [math]\displaystyle{ z }[/math] с [math]\displaystyle{ \textrm{Re}(z) \lt 0 }[/math] находятся в области абсолютной устойчивости. Функция устойчивости явного метода Рунге — Кутты является многочленом, поэтому явные методы Рунге — Кутты в принципе не могут быть A-устойчивыми[10].

Если метод имеет порядок [math]\displaystyle{ p }[/math], то функция устойчивости удовлетворяет условию [math]\displaystyle{ r(z) = \textrm{e}^z + O(z^{p+1}) }[/math] при [math]\displaystyle{ z \to 0 }[/math]. Таким образом, представляет интерес отношение многочленов данной степени, приближающее экспоненциальную функцию наилучшим образом. Эти отношения известны как аппроксимации Паде. Аппроксимация Паде с числителем степени [math]\displaystyle{ m }[/math] и знаменателем степени [math]\displaystyle{ n }[/math] А-устойчива тогда и только тогда, когда [math]\displaystyle{ m \le n \le m + 2. }[/math][11]

[math]\displaystyle{ s }[/math]-стадийный метод Гаусса — Лежандра имеет порядок [math]\displaystyle{ 2s }[/math], поэтому его функция устойчивости является приближением Паде [math]\displaystyle{ m=n=s }[/math]. Отсюда следует, что метод является A-устойчивым[12]. Это показывает, что A-устойчивые методы Рунге — Кутты могут иметь сколь угодно высокий порядок. В отличие от этого, порядок А-устойчивости методов Адамса не может превышать два.

Произношение

Согласно грамматическим нормам русского языка, фамилия Ку́тта склоняется, поэтому говорят: «Метод Ру́нге — Ку́тты». Правила русской грамматики предписывают склонять все фамилии (в том числе и мужские), оканчивающиеся на -а, -я, которым предшествует согласный. Единственное исключение — фамилии французского происхождения с ударением на последнем слоге типа Дюма́, Золя́[13]. Однако иногда встречается несклоняемый вариант «Метод Ру́нге — Ку́тта» (например, в книге[14]).

Пример решения на алгоритмических языках программирования

[math]\displaystyle{ y'' + 4y = \cos 3x,\quad y(0) = 0.8,\ y'(0) = 2,\ x \in [0,1],\ h = 0.1 }[/math]

производя замену [math]\displaystyle{ y'=z }[/math] и перенося [math]\displaystyle{ 4y }[/math] в правую часть, получаем систему:

[math]\displaystyle{ \begin{cases} y' = z = g(x,y,z)\\ z' = \cos(3x) - 4y = f(x,y,z) \end{cases} }[/math]

В программе на С# используется абстрактный класс RungeKutta, в котором следует переопределить абстрактный метод F, задающий правые части уравнений.

Пример решения в среде MATLAB

Решение систем дифференциальных уравнений методом Рунге — Кутты является одним из самых распространённых численных методов решений в технике. В среде MATLAB реализована его одна из разновидностей — метод Дормана — Принса[англ.]. Для решения системы уравнений необходимо сначала записать функцию, вычисляющую производные, то есть функции y = g(x, y, z) и z = cos(3x) − 4y = f(x, y, z), о чём сказано выше. В одном из каталогов, к которому имеется доступ из системы MATLAB, нужно создать текстовый файл с именем (например) runge.m со следующим содержимым (для MATLAB версии 5.3):

Имя файла и имя функции должно совпадать, но оно может быть любым неиспользуемым ранее.

Затем необходимо создать главный файл c именем, например, main.m, который будет выполнять основные вычисления. Этот главный файл будет содержать следующий текст:

Так как MATLAB ориентирован на работу с матрицами, решение по методу Рунге — Кутты очень легко выполняется для целого ряда x, как, например, в приведённом примере программы. Здесь решение — график функции в пределах времён от 0 до x_fin.

Решение в среде MATLAB

Переменные x и y, полученные в результате работы функции ODE45, есть векторы значений. Очевидно, что решение конкретно заданного выше примера — второй элемент x, так как первое значение — 0, шаг интегрирования h = 0,1, а интересующее значение x = 0,1. Следующая запись в командном окне MATLAB даст искомое решение:

Ответ: y1 = 0,98768

Примечания

  1. Бахвалов Н. С., Жидков Н. П., Кобельков Г. М. . Численные методы. — М.: Лаборатория Базовых Знаний, 2001. — 630 с. — ISBN 5-93208-043-4. — С. 363—375.
  2. Ильина В. А., Силаев П. К. . Численные методы для физиков-теоретиков. Ч. 2. — Москва-Ижевск: Институт компьютерных исследований, 2004. — 118 с. — ISBN 5-93972-320-9. — С. 16—30.
  3. 3,0 3,1 Butcher J. C.[англ.] . Numerical Methods for Ordinary Differential Equations. — New York: John Wiley & Sons, 2008. — ISBN 978-0-470-72335-7.
  4. Süli & Mayers, 2003, p. 349—351.
  5. Iserles, 1996, p. 41.
  6. Süli & Mayers, 2003, p. 351—352.
  7. Неявные методы Рунге — Кутты Архивная копия от 6 марта 2019 на Wayback Machine.
  8. Hairer & Wanner, 1996, p. 40—41.
  9. Hairer & Wanner, 1996, p. 40.
  10. 10,0 10,1 Iserles, 1996, p. 60.
  11. Iserles, 1996, p. 62—63.
  12. Iserles, 1996, p. 63.
  13. Как склонять фамилии (трудные случаи) — «Грамота.ру» — справочно-информационный Интернет-портал «Русский язык». Дата обращения: 5 июля 2016. Архивировано 23 мая 2018 года.
  14. Демидович Б. П., Марон И. А., Шувалова Э. З. . Численные методы анализа. 3-е изд. — М.: Наука, 1967.

Литература

  • Hairer E., Wanner G. . Solving ordinary differential equations II: Stiff and differential-algebraic problems. 2nd ed. — Berlin, New York: Springer-Verlag, 1996. — ISBN 978-3-540-60452-5.
  • Iserles A. . A First Course in the Numerical Analysis of Differential Equations. — Cambridge: Cambridge University Press, 1996. — ISBN 978-0-521-55655-2.
  • Süli E., Mayers D. . An Introduction to Numerical Analysis. — Cambridge: Cambridge University Press, 2003. — ISBN 0-521-00794-1.