К классу методов Рунге — Кутты относятся явный метод Эйлера и модифицированный метод Эйлера с пересчётом, которые представляют собой соответственно методы первого и второго порядка точности. Существуют стандартные явные методы третьего порядка точности, не получившие широкого распространения. Наиболее часто используется и реализован в различных математических пакетах (Maple, MathCAD, Maxima) классический метод Рунге — Кутты, имеющий четвёртый порядок точности. При выполнении расчётов с повышенной точностью всё чаще применяются методы пятого и шестого порядков точности[1][2]. Построение схем более высокого порядка сопряжено с большими вычислительными трудностями[3].
Методы седьмого порядка должны иметь по меньшей мере девять стадий, а методы восьмого порядка — не менее 11 стадий. Для методов девятого и более высоких порядков (не имеющих, впрочем, большой практической значимости) неизвестно, сколько стадий необходимо для достижения соответствующего порядка точности[3].
Классический метод Рунге — Кутты четвёртого порядка
Метод Рунге — Кутты четвёртого порядка при вычислениях с постоянным шагом интегрирования столь широко распространён, что его часто называют просто методом Рунге — Кутты.
Рассмотрим задачу Коши для системы обыкновенных дифференциальных уравнений первого порядка (далее , а ).
Тогда приближенное значение в последующих точках вычисляется по итерационной формуле:
Вычисление нового значения проходит в четыре стадии:
где — величина шага сетки по .
Этот метод имеет четвёртый порядок точности. Это значит, что ошибка на одном шаге имеет порядок , а суммарная ошибка на конечном интервале интегрирования имеет порядок .
Явные методы Рунге — Кутты
Семейство явных методов Рунге — Кутты является обобщением как явного метода Эйлера, так и классического метода Рунге — Кутты четвёртого порядка. Оно задаётся формулами
где — величина шага сетки по , а вычисление нового значения проходит в этапов:
Конкретный метод определяется числом и коэффициентами и . Эти коэффициенты часто упорядочивают в таблицу (называемую таблицей Бутчера):
Для коэффициентов метода Рунге — Кутты должны быть выполнены условия для . Если требуется, чтобы метод имел порядок , то следует также обеспечить условие
где — приближение, полученное по методу Рунге — Кутты. После многократного дифференцирования это условие преобразуется в систему полиномиальных уравнений относительно коэффициентов метода.
Неустойчивость явных методов Рунге — Кутты мотивировала развитие неявных методов. Неявный метод Рунге — Кутты имеет вид[5][6]:
где
Явный метод характерен тем, что матрица коэффициентов для него имеет нижний треугольный вид (включая и нулевую главную диагональ) — в отличие от неявного метода, где матрица имеет произвольный вид. Это также видно по таблице Батчера[англ.].
Следствием этого различия является необходимость на каждом шагу решать систему уравнений для , где — число стадий. Это увеличивает вычислительные затраты, однако при достаточно малом можно применить принцип сжимающих отображений и решать данную систему методом простой итерации[7]. В случае одной итерации это увеличивает вычислительные затраты всего лишь в два раза.
С другой стороны, Жан Кунцма́н[фр.] (1961) и Джон Батчер[англ.] (1964) показали, что при любом количестве стадий существует неявный метод Рунге — Кутты с порядком точности . Это значит, например, что для описанного выше явного четырёхстадийного метода четвёртого порядка существует неявный аналог с вдвое большим порядком точности.
Неявный метод Рунге — Кутты второго порядка
Простейшим неявным методом Рунге — Кутты является модифицированный метод Эйлера «с пересчётом». Он задаётся формулой:
.
Для его реализации на каждом шаге необходимы как минимум две итерации (и два вычисления функции).
Прогноз:
.
Коррекция:
.
Вторая формула — это простая итерация решения системы уравнений относительно , записанной в форме сжимающего отображения. Для повышения точности итерацию-коррекцию можно сделать несколько раз, подставляя . Модифицированный метод Эйлера «с пересчётом» имеет второй порядок точности.
Устойчивость
Преимуществом неявных методов Рунге — Кутты в сравнении с явными является их бо́льшая устойчивость, что особенно важно при решении жестких уравнений. Рассмотрим в качестве примера линейное уравнение y' = λy. Обычный метод Рунге — Кутты, применённый к этому уравнению, сведётся к итерации , с r, равным
где обозначает вектор-столбец из единиц[8]. Функция называется функцией устойчивости[9]. Из формулы видно, что является отношением двух полиномов степени , если метод имеет стадий. Явные методы имеют строго нижнюю треугольную матрицу откуда следует, что и что функция устойчивости является многочленом[10].
Численное решение данного примера сходится к нулю при условии с . Множество таких называется областью абсолютной устойчивости. В частности, метод называется A-устойчивым, если все с находятся в области абсолютной устойчивости. Функция устойчивости явного метода Рунге — Кутты является многочленом, поэтому явные методы Рунге — Кутты в принципе не могут быть A-устойчивыми[10].
Если метод имеет порядок , то функция устойчивости удовлетворяет условию при . Таким образом, представляет интерес отношение многочленов данной степени, приближающее экспоненциальную функцию наилучшим образом. Эти отношения известны как аппроксимации Паде. Аппроксимация Паде с числителем степени и знаменателем степени А-устойчива тогда и только тогда, когда [11]
-стадийный метод Гаусса — Лежандра имеет порядок , поэтому его функция устойчивости является приближением Паде . Отсюда следует, что метод является A-устойчивым[12]. Это показывает, что A-устойчивые методы Рунге — Кутты могут иметь сколь угодно высокий порядок. В отличие от этого, порядок А-устойчивости методов Адамса не может превышать два.
Произношение
Согласно грамматическим нормам русского языка, фамилия Ку́тта склоняется, поэтому говорят: «Метод Ру́нге — Ку́тты». Правила русской грамматики предписывают склонять все фамилии (в том числе и мужские), оканчивающиеся на -а, -я, которым предшествует согласный. Единственное исключение — фамилии французского происхождения с ударением на последнем слоге типа Дюма́, Золя́[13]. Однако иногда встречается несклоняемый вариант «Метод Ру́нге — Ку́тта» (например, в книге[14]).
Пример решения на алгоритмических языках программирования
производя замену и перенося в правую часть, получаем систему:
код на Java для решения системы дифференциальных уравнений методом Рунге-Кутты
publicclassMainClass{publicstaticvoidmain(String[]args){intk=2;doubleXo,Yo,Y1,Zo,Z1;doublek1,k2,k4,k3,h;doubleq1,q2,q4,q3;/* *Начальные условия */Xo=0;Yo=0.8;Zo=2;h=0.1;// шагSystem.out.println("\tX\t\tY\t\tZ");for(;r(Xo,2)<1.0;Xo+=h){k1=h*f(Xo,Yo,Zo);q1=h*g(Xo,Yo,Zo);k2=h*f(Xo+h/2.0,Yo+q1/2.0,Zo+k1/2.0);q2=h*g(Xo+h/2.0,Yo+q1/2.0,Zo+k1/2.0);k3=h*f(Xo+h/2.0,Yo+q2/2.0,Zo+k2/2.0);q3=h*g(Xo+h/2.0,Yo+q2/2.0,Zo+k2/2.0);k4=h*f(Xo+h,Yo+q3,Zo+k3);q4=h*g(Xo+h,Yo+q3,Zo+k3);Z1=Zo+(k1+2.0*k2+2.0*k3+k4)/6.0;Y1=Yo+(q1+2.0*q2+2.0*q3+q4)/6.0;System.out.println("\t"+r(Xo+h,k)+"\t\t"+r(Y1,k)+"\t\t"+r(Z1,k));Yo=Y1;Zo=Z1;}}/** * функция для округления и отбрасывания "хвоста" */publicstaticdoubler(doublevalue,intk){return(double)Math.round((Math.pow(10,k)*value))/Math.pow(10,k);}/** * функции, которые получаются из системы */publicstaticdoublef(doublex,doubley,doublez){return(Math.cos(3*x)-4*y);}publicstaticdoubleg(doublex,doubley,doublez){return(z);}}
Решение систем дифференциальных уравнений методом Рунге — Кутты является одним из самых распространённых численных методов решений в технике. В среде MATLAB реализована его одна из разновидностей — метод Дормана — Принса[англ.]. Для решения системы уравнений необходимо сначала записать функцию, вычисляющую производные, то есть функции y = g(x, y, z) и z = cos(3x) − 4y = f(x, y, z), о чём сказано выше. В одном из каталогов, к которому имеется доступ из системы MATLAB, нужно создать текстовый файл с именем (например) runge.m со следующим содержимым (для MATLAB версии 5.3):
Имя файла и имя функции должно совпадать, но оно может быть любым неиспользуемым ранее.
Затем необходимо создать главный файл c именем, например, main.m, который будет выполнять основные вычисления. Этот главный файл будет содержать следующий текст:
clear;clc;% Очистка памяти и экранаh=0.1;% Шаг интегрированияx_fin=8;% Конечное время интегрированияy0=0.8;% Начальное значение функцииDy0=2;% Начальное значение производной функции[x,y]=ode45('runge',[0:h:x_fin],[y0Dy0]);% Метод Рунге — Куттыplot(x,y,'LineWidth',2);grid;% Построение графика и сеткиlegend('y(x)','y''(x)',0);% Легенда на графике
Так как MATLAB ориентирован на работу с матрицами, решение по методу Рунге — Кутты очень легко выполняется для целого ряда x, как, например, в приведённом примере программы. Здесь решение — график функции в пределах времён от 0 до x_fin.
Переменные x и y, полученные в результате работы функции ODE45, есть векторы значений. Очевидно, что решение конкретно заданного выше примера — второй элемент x, так как первое значение — 0, шаг интегрирования h = 0,1, а интересующее значение x = 0,1.
Следующая запись в командном окне MATLAB даст искомое решение:
↑Ильина В. А., Силаев П. К. . Численные методы для физиков-теоретиков. Ч. 2. — Москва-Ижевск: Институт компьютерных исследований, 2004. — 118 с. — ISBN 5-93972-320-9. — С. 16—30.
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.