- Метод Рунге — Кутта
-
Метод Рунге — Кутта
Ме́тоды Ру́нге — Кутта́ (Ме́тоды Ру́нге — Кутты́) — важное семейство численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.
Формально, методом Рунге — Кутта является модифицированный и исправленный метод Эйлера, они представляют собой схемы второго порядка точности. Существуют стандартные схемы третьего порядка, не получившие широкого распространения. Наиболее часто используется и реализована в различных математических пакетах (Maple, MathCAD, Maxima) стандартная схема четвёртого порядка. Иногда при выполнении расчётов с повышенной точностью применяются схемы пятого и шестого порядков[1][2]. Построение схем более высокого порядка сопряжено с большими вычислительными трудностями[3]. Методы седьмого порядка должны иметь по меньшей мере девять этапов, в схему восьмого порядка входит 11 этапов. Хотя схемы девятого порядка не имеют большой практической значимости, неизвестно, сколько этапов необходимо для достижения этого порядка. Аналогичная задача существует для схем десятого и более высоких порядков[3].
Содержание
Классический метод Рунге — Кутта 4 порядка
Метод Рунге—Кутта 4 порядка столь широко распространён, что его часто называют просто методом Рунге—Кутта.
Рассмотрим задачу Коши
- .
Тогда приближенное значение в последующих точках вычисляется по итерационной формуле:
где h — величина шага сетки по x и вычисление нового значения проходит в четыре этапа:
Этот метод имеет четвёртый порядок точности, т.е. суммарная ошибка на конечном интервале интегрирования имеет порядок O(h4) (ошибка на каждом шаге порядка O(h5)).
Прямые методы Рунге — Кутта
Семейство прямых методов Рунге — Кутта является обобщением метода Рунге — Кутта 4 порядка. Оно задаётся формулами
где h — величина шага сетки по x и вычисление нового значение проходит в s этапов:
Конкретный метод определяется числом s и коэффициентами bi,aij и ci. Эти коэффициенты часто упорядочивают в таблицу
Для коэффициентов метода Рунге — Кутта должны быть выполнены условия для . Если требуется, чтобы метод имел порядок p, то следует так же обеспечить условие
где — приближение полученное по методу Рунге — Кутта. После многократного дифференцирования это условие преобразуется в систему полиномиальных уравнений на коэффициенты метода.
Произношение
Согласно грамматическим нормам русского языка фамилия Кутта́ склоняется[4], поэтому говорят: "Метод Ру́нге — Кутты́ четвёртого порядка", так как законы русской грамматики предписывают склонять все мужские и женские фамилии, оканчивающиеся на -а, -я, которым предшествует согласный. Единственное исключение – фамилии французского происхождения с ударением на последнем слоге типа Дюма́, Золя́. Однако, в речевой практике зачастую встречается и несклоняемый вариант "Метод Ру́нге — Кутта́" (например, в книге[5]). Как указывает Справочно-информационный портал Грамота.ру[6], несклонение может быть оправдано тем, что фамилия Кутта́ имеет ударение на последнем слоге.
Решение систем ОДУ
Метод Рунге-Кутта непосредственно обобщается на случай систем обыкновенных дифференциальных уравнений.
Пример программы
Приведем пример программы на языке C#. В программе используется абстрактный класс TRungeKutta, в котором следует перекрыть абстрактный метод F, задающий правые части уравнений.
using System; using System.Collections.Generic; namespace rwsh_rk4 { public abstract class TRungeKutta { public int N; double t; // текущее время public double[] Y; // искомое решение Y[0] - само решение, Y[i] - i-тая производная решения double[] YY, Y1, Y2, Y3, Y4; // внутренние переменные public TRungeKutta(int aN) // aN - размерность системы { N = aN; // сохранить размерность системы if (N < 1) { N = -1; // если размерность меньше единицы, то установить флаг ошибки return; // и выйти из конструктора } Y = new double[N]; // создать вектор решения YY = new double[N]; // и внутренних решений Y1 = new double[N]; Y2 = new double[N]; Y3 = new double[N]; Y4 = new double[N]; } public void SetInit(double t0, double[] Y0) // установить начальные условия. { // t0 - начальное время, Y0 - начальное условие t = t0; int i; for (i = 0; i < N; i++) { Y[i] = Y0[i]; } } public double GetCurrent() // вернуть текущее время { return t; } public abstract void F(double t, double[] Y, ref double[] FY); // правые части системы. public void NextStep(double dt) // следующий шаг метода Рунге-Кутта, dt - шаг по времени (может быть переменным) { if(dt<0) { return; } int i; F(t, Y, ref Y1); // расчитать Y1 for (i = 0; i < N; i++) { YY[i] = Y[i] + Y1[i] * (dt / 2.0); } F(t + dt / 2.0, YY, ref Y2); // расчитать Y2 for (i = 0; i < N; i++) { YY[i] = Y[i] + Y2[i] * (dt / 2.0); } F(t + dt / 2.0, YY, ref Y3); // расчитать Y3 for (i = 0; i < N; i++) { YY[i] = Y[i] + Y3[i] * dt; } F(t + dt, YY, ref Y4); // расчитать Y4 for (i = 0; i < N; i++) { Y[i] = Y[i] + dt / 6.0 * (Y1[i] + 2.0 * Y2[i] + 2.0 * Y3[i] + Y4[i]); // расчитать решение на новом шаге } t = t + dt; // увеличить шаг } } public class TMyRK : TRungeKutta { public TMyRK(int aN) : base(aN) { } public override void F(double t, double[] Y, ref double[] FY) { FY[0] = Y[1]; // пример математический маятник FY[1] = -Y[0]; // y''(t)+y(t)=0 } } class Program { static void Main(string[] args) { TMyRK RK4 = new TMyRK(2); double[] Y0 = {0, 1}; // зададим начальные условия y(0)=0, y'(0)=1 RK4.SetInit(0, Y0); while (RK4.GetCurrent() < 10) // решаем до 10 { Console.WriteLine("{0}\t{1}\t{2}", RK4.GetCurrent(), RK4.Y[0], RK4.Y[1]); // вывести t, y, y' RK4.NextStep(0.01); // расчитать на следующем шаге, шаг интегрирования dt=0.01 } } } }
См. также
Ссылки
- ↑ Бахвалов Н.С., Жидков Н.П., Кобельков Г.М. Численные методы. - М.: Бином, 2001 - с. 363-375.
- ↑ Ильина В.А., Силаев П.К. Численные методы для физиков-теоретиков. т.2. - Москва-Ижевск: Институт компьютерных исследований, 2004. – с. 16-30.
- ↑ 1 2 J. C. Butcher. Numerical Methods for Ordinary Differential Equations. The University of Auckland, New Zealand.
- ↑ http://www.gramota.ru/spravka/buro/search_answer/?s=%F1%EB%EE%E3%E5, вопрос №255386.
- ↑ Б. П. Демидович, И. А. Марон, Э. 3. Шувалова. Численные методы анализа, 3-е изд. - М.: Наука, 1967.
- ↑ http://www.gramota.ru/spravka/buro/search_answer/?s=%D0%F3%ED%E3%E5, вопрос №255356.
Wikimedia Foundation. 2010.