Методы рунге-кутты. Прямые методы Рунге — Кутта

Пример . Решить методом Рунге-Кутты четвертого порядка уравнение dy /dx = –y , y (0) = 1.

В соответствии с приведенными выше соотношениями определяем коэффициенты:

Построим последовательность значений искомой функции:

Результаты получаемого численного решения для значения аргумента x = 10 при различных шагах интегрирования приведены в табл. 15.2. Три верные значащие цифры получены для шага h = 0.25.

Сравнение таблиц 15.1 и 15.2 с решениями одной и той же задачи позволяет сделать вывод, что более высокая степень аппроксимации дифференциального уравнения разностным аналогом позволяет получать более точное решение при более крупном шаге и, следовательно, меньшем числе шагов, то есть приводит к снижению требуемых ресурсов ЭВМ.

На сегодняшний день для грубого расчета вычисления производятся методом Эйлера, для точного расчета - методом Рунге-Кутты

16. Лекция 16.
Методы прогноза и коррекции
(итерационные методы)

Изученные нами ранее методы обладали одной важной особенностью - каждому методу соответствует обычно определенный класс точности, который мы обозначали как O i . Например, метод Эйлера обладал первым классом точности O 1 . Это означало, что с уменьшением шага в 10 раз (на порядок) точность результата повышается тоже в 10 раз (на один порядок). Метод Рунге-Кутты обладает 4 порядком точности - O 4 , при уменьшении шага в 10 раз, результат улучшается в 10 000 раз. Поскольку этот метод по сравнению с методом Эйлера использует всего в 4 раза больше вычислений, то использование его более выгодно. На сегодняшний день известны методы до 8 порядка точности (например, метод Prince Dortmund), хотя одновременно стоит иметь в виду, что написание алгоритмов для них - задача достаточно трудная. Достоинством всех этих алгоритмов является то, что объем вычислений для них заранее известен.

Если требуется достичь ЛЮБОЙ точности на шаге, то следует использовать методы прогноза и коррекции. Этот подход состоит в том, что расчет траектории, задаваемой уравнением, на каждом шаге происходит многократно. А именно, сначала происходит расчет приближенного значения функции на конце шага какой-либо простой формулой (например, методом Эйлера), далее в этой точке вычисляется производная, и расчет происходит снова из начальной точки на шаге, но с уточненным значением производной. Последняя операция - уточнения производной и значения функции на конце шага - происходит МНОГОКРАТНО НА КАЖДОМ ШАГЕ , то есть до тех пор, пока вычисленные значения (функции и производной в конце шага) не перестанут меняться или будут меняться уже незначительно, меньше чем задаваемая заранее величина ε . Только тогда можно сказать, что точность ε достигнута.

Итак, за счет итерационной процедуры на каждом отдельном шаге можно достичь любой, наперед заданной точности ε . За такое достоинство метода приходится платить: к сожалению, невозможно сказать заранее, сколько итераций потребуется для достижения на шаге заданной точности ε . Поэтому такие методы нельзя, например, использовать в системах реального времени.

Рассмотрим для примера два метода из этого класса. Как и ранее задача состоит в нахождении функции y (t ) из дифференциального уравнения dy /dt = f (y , x , t ) или множества функций из системы таких уравнений.

Метод Эйлера. Усовершенствованный метод Эйлера.
Классический метод Рунге-Кутты

Не обошла стороной вычислительная математика и дифференциальные уравнения! Сегодня на уроке мы познакомимся с основами приближённых вычислений в этом разделе математического анализа, после чего перед вами приветливо распахнутся толстые-претолстые книги по теме. Ибо вычислительная математика стороной диффуры ещё как не обошла =)

Перечисленные в заголовке методы предназначены для приближённого нахождения решений дифференциальных уравнений , систем ДУ , и краткая постановка наиболее распространённой задачи такова:

Рассмотрим дифференциальное уравнение первого порядка , для которого требуется найти частное решение , соответствующее начальному условию . Что это значит? Это значит, нам нужно найти функцию (предполагается её существование) , которая удовлетворяет данному дифф. уравнению, и график которой проходит через точку .

Но вот незадача – переменные в уравнении разделить невозможно. Никакими известными науке способами. А если и возможно, то получается неберущийся интеграл. Однако частное-то решение существует! И здесь на помощь приходят методы приближенных вычислений, которые позволяют с высокой (а зачастую с высочайшей) точностью «сымитировать» функцию на некотором промежутке.

Идея методов Эйлера и Рунге-Кутты состоит в том, чтобы заменить фрагмент графика ломаной линией , и сейчас мы узнаем, как эта идея реализуется на практике. И не только узнаем, но и непосредственно реализуем =) Начнём с исторически первого и самого простого метода. …Вы хотите иметь дело со сложным дифференциальным уравнением? Вот и я тоже не хочу:)

Задание

Найти частное решение дифференциального уравнения , соответствующее начальному условию , методом Эйлера на отрезке с шагом . Построить таблицу и график приближённого решения.

Разбираемся. Во-первых, перед нами обычное линейное уравнение , которое можно решить стандартными способами, и поэтому очень трудно устоять перед соблазном сразу же найти точное решение:

– желающие могут выполнить проверку и убедиться, что данная функция удовлетворяет начальному условию и является корнем уравнения .

Что нужно сделать? Нужно найти и построить ломаную , которая приближает график функции на промежутке . Поскольку длина этого промежутка равна единице, а шаг составляет , то наша ломаная будет состоять из 10 отрезков:

причём, точка уже известна – она соответствует начальному условию . Кроме того, очевидны «иксовые» координаты других точек:

Осталось найти . Никакого дифференцирования и интегрирования – только сложение и умножение! Каждое следующее «игрековое» значение получается из предыдущего по простой рекуррентной формуле:

Представим дифференциальное уравнение в виде :

Таким образом:

«Раскручиваемся» от начального условия :

Понеслось:

Результаты вычислений удобно заносить в таблицу:

А сами вычисления автоматизировать в Экселе – потому что в математике важен не только победный, но ещё и быстрый конец:)

По результатам 2-го и 3-го столбцов изобразим на чертеже 11 точек и 10 отрезков, соединяющих смежные точки. Для сравнения я построю график точного частного решения :


Существенным недостатком простого метода Эйлера является слишком большая погрешность, при этом легко заметить, что погрешность имеет тенденцию накапливаться – чем дальше мы уходим от точки , тем преимущественно больше становится расхождение между приближением и истиной. Это объяснимо самим принципом, который Эйлер положил в основу своего метода: отрезки параллельны соответствующим касательным к графику функции в точках . Данный факт, кстати, тоже хорошо просматривается по чертежу.

Как можно улучшить приближение? Первая мысль – измельчить разбиение. Разделим отрезок , например, на 20 частей. Тогда шаг составит: , и совершенно понятно, что ломаная из 20 звеньев заметно точнее приблизит частное решение. С помощью того же Экселя не составит труда обработать 100-1000 и даже миллион (!) промежуточных отрезков, однако зададимся вопросом: а нельзя ли КАЧЕСТВЕННО улучшить метод?

Но перед тем как раскрыть этот вопрос, не могу не остановиться на неоднократно прозвучавшей сегодня фамилии. Читая биографию Леонарда Эйлера , просто поражаешься, как невероятно много может успеть сделать за свою жизнь человек! Сопоставимо вспомнился только К.Ф. Гаусс. …Вот и мы постараемся не потерять мотивацию к обучению и новым открытиям:))

Усовершенствованный метод Эйлера

Рассмотрим тот же самый пример: дифференциальное уравнение , частное решение, удовлетворяющее условию , промежуток и его разбиение на 10 частей
( – длина каждой части).

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

И идея модификации такова: отрезки должны быть параллельны касательным , которые проведены к графику функции не на левых краях , а «посерединке» интервалов разбиения. Что, естественно, улучшит качество приближения.

Алгоритм решения работает в том же русле, но формула, как нетрудно догадаться, усложняется:
, где

Плясать вновь начинаем от частного решения и сразу же находим 1-й аргумент «внешней» функции:

Теперь находим нашего «монстра», который на поверку оказался не таким уж и страшным – обратите внимание, что это ТА ЖЕ функция , вычисленная в другой точке:

Умножаем результат на шаг разбиения:

Таким образом:

Алгоритм заходит на второй круг, не поленюсь, распишу его подробно:

рассматриваем пару и находим 1-й аргумент «внешней» функции:

Рассчитываем и находим её 2-й аргумент:

Вычислим значение:

и его произведение на шаг:

Вычисления разумно провести в Экселе (растиражировав формулы по той же схеме – см. видеоролик выше) , а результаты свести в таблицу:


Числа целесообразно округлять до 4-5-6 знаков после запятой. Нередко в условии той или иной задачи есть прямое указание , с какой точностью следует проводить округление. Я подровнял сильно «хвостатые» значения до 6 знаков.

По результатам 2-го и 3-го столбцов (слева) построим ломаную , и для сравнения я снова приведу график точного решения :


Результат существенно улучшился! – красные квадратики практически «спрятались» за зелёными точками точного решения.

Однако нет пределов совершенству. Одна голова хорошо, а две – лучше. И снова немецкие:

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

Его цель добиться ещё бОльшего приближения «красных квадратиков» к «зелёным точкам». Вы спросите, куда ещё ближе? Во многих, в частности физических, исследованиях бывает ПРИНЦИПИАЛЬНО важен 10-й, а то и 50-й точный знак после запятой. Нет, такой точности можно достичь и простым методом Эйлера, но на СКОЛЬКО частей придётся разбить промежуток ?! …Хотя с современными вычислительными мощностями это не проблема – тысячи кочегаров китайского космического корабля гарантируют!

И, как правильно подсказывает заголовок, при использовании метода Рунге-Кутты на каждом шаге нам придётся вычислить значение функции 4 раза (в отличие от двукратного вычисления в предыдущем параграфе) . Но задача эта вполне и вполне подъёмная если нанять китайцев. Каждое следующее «игрековое» значение получается из предыдущего – ловим формулы:
, где , где:

Готовы? Ну тогда начинаем:))


Таким образом:

Первая строка запрограммирована, и я копирую формулы по образцу:


Не думал, что так быстро разделаюсь с методом Рунге-Кутты =)

В чертеже нет смысла, поскольку он уже не показателен. Давайте лучше проведём аналитическое сравнение точности трёх методов, ибо когда известно точное решение , то грех не сравнить. Значения функции в узловых точках элементарно рассчитываются в том же Экселе – один раз забиваем формулу и тиражируем её на остальные .

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


Как видите, метод Рунге-Кутты даёт уже 4-5 верных знака после запятой по сравнению с 2 верными знаками усовершенствованного метода Эйлера! И это не случайность:

– Погрешность «обычного» метода Эйлера не превосходит шага разбиения. И в самом деле – взгляните на самый левый столбец погрешностей – там после запятых только один ноль, что и говорит нам о точности 0,1.

– Усовершенствованный метод Эйлера гарантирует точность: (смотрим на 2 нуля после запятой в средней колонке погрешностей) .

– И, наконец, классический метод Рунге-Кутты обеспечивает точность .

Изложенные оценки погрешностей строго обосновывается в теории.

Как можно ЕЩЁ улучшить точность приближения? Ответ прямо-таки философский: качеством и/или количеством =) В частности, существует и другие, более точные модификации метода Рунге-Кутты. Количественный путь, как уже отмечалось, состоит в уменьшении шага, т.е. в разбиении отрезка на бОльшее количество промежуточных отрезков. И с увеличением этого количества ломаная всё больше и больше будет походить на график точного решения и в пределе – совпадёт с ним.

В математике это свойство называется спрямляемостью кривой . К слову (небольшой оффтоп) , «спрямить» удаётся далеко не всё – рекомендую прочитать интереснейшую , в которых уменьшение «участка исследования» не влечёт за собой упрощение объекта исследования.

Так получилось, что я разобрал всего лишь одно дифференциальное уравнение и поэтому пара дополнительных замечаний. Что ещё нужно иметь в виду на практике? В условии задачи вам может быть предложен другой отрезок и другое разбиение, причём иногда встречается следующая формулировка: «найти методом… …на промежутке , разбив его на 5 частей». В этом случае нужно найти шаг разбиения , после чего придерживаться обычной схемы решения. Кстати, начальное условие должно быть такого вида: , то есть «икс нулевое», как правило, совпадает с левым концом отрезка. Образно говоря, ломаная всегда «выходит» из точки .

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

Но почти всё в этой жизни поправимо! – ведь мы рассмотрели лишь малую толику темы, и моя фраза о толстых-претолстых книгах была вовсе не шуткой. Существует великое множество приближённых методов нахождения решений ДУ и их систем, в которых применяются, в том числе, принципиально другие подходы. Так, например, частное решение можно приблизить степенным рядом . Однако это уже статья другого раздела.

Надеюсь, мне удалось разнообразить скучноватую вычислительную математику, и вам было интересно!

Спасибо за внимание!

Наиболее популярными среди классических явных одношаговых методов являются методы Рунге - Кутты. Методы Эйлера, Эйлера - Коши и усовершенствованный метод Эйлера можно рассматривать как простейших представителей этого класса методов.

1. Вывод расчетных формул.

Поясним вывод расчетных формул метода Рунге-Кутты. Пусть (как и в § 14.5) решение

дифференциального уравнения удовлетворяющее условию Запишем равенство (14.58) в следующем виде:

Если бы входящий в это равенство интеграл можно было вычислить точно, то получилась бы простая формула, позволяющая последовательно вычислить значения решения в узлах сетки. Поскольку в действительности это невозможно, попробуем получить приближенную формулу, заменив интеграл квадратурной суммой (см. гл. 13).

Введем на отрезке вспомогательных узлов , Заметим, что Заменяя входящий в равенство (14.66) интеграл квадратурной суммой с узлами получаем приближенное равенство

Однако воспользоваться равенством (14.67) для вычисления нельзя, так как значения функции у в точках для неизвестны. Чтобы найти эти значения, запишем равенства

аналогичные равенству (14.66). Заменяя для каждого входящий в формулу (14.68) интеграл соответствующей ему квадратурной формулой с узлами придем к приближенным равенствам

позволяющим последовательно вычислять приближения к значениям

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

Часто из этих формул исключают вспомогательные величины и записывают формулы так:

Заметим, что выведенные формулы задают явный одношаговый метод вида где для вычисления значений функции используются значения правой части вспомогательных точках. Поэтому этот метод называют явным -этапным методом Рунге-Кутты.

Выбор конкретных значений параметров осуществляется исходя из различных соображений. Естественно, что одним из основных является желание сделать порядок аппроксимации максимально возможным.

2. Устойчивость и сходимость.

Следующая теорема позволяет в дальнейшем называть методы Рунге-Кутты, имеющие порядок аппроксимации, методами порядка точности.

Теорема 14.7. Пусть правая часть дифференциального уравнения удовлетворяет условию Тогда всякий явный -этапный метод Рунге-Кутты устойчив на конечном отрезке

Следствие. Пусть выполнено условие Тогда если явный -этапный метод Рунге-Кутты имеет порядок аппроксимации, то он сходится с порядком точности.

Справедливость следствия вытекает из теоремы 14 4.

3. Семейство явных двухэтапных методов.

Выведем расчетные формулы семейства явных двухэтапных методов Рунге-Кутты второго порядка точности. Запишем формулы явного двухэтапного метода

Параметрами этого метода являются величины Представим погрешность аппроксимации

Решение дифференциального уравнения в виде разложения по степеням Формула Тейлора

с учетом равенств дает формулу

(аргументы у функции и ее частных производных опускаем).

Представим значение функции в точке используя формулу Тейлора для функции двух переменных с центром в точке

Таким образом,

Если потребовать, чтобы выполнялись условия (что эквивалентно выбору то первые два слагаемых в формуле для обратятся в нуль, и поэтому метод будет иметь второй порядок аппроксимации.

Итак (с учетом следствия из теоремы 14.7), можно утверждать, что при любом метод

имеет второй порядок точности.

Заметим, что при формула (14.69) дает метод Эйлера-Коши, а при усовершенствованный метод Эйлера (см. § 14.5).

4. Метод Рунге-Кутты четвертого порядка точности.

Наиболее известным из методов Рунге-Кутты является классический -этапный метод четвертого порядка точности:

Этот метод весьма прост и, как показывает практика, довольно эффективен в обычных расчетах, когда отрезок не очень велик и нужна сравнительно невысокая точность.

Замечание. Применение метода (14.70) к решению задачи о вычислении интеграла (14.36) порождает формулу Симпсона

Таким образом, классический метод Рунге-Кутты четвертого порядка точности (14.70) можно рассматривать как аналог формулы Симпсона, отвечающий решению задачи Коши.

Пример 14.15. Про демонстрируем работу метода Рунге-Кутты четвертого порядка точности применительно к решению «задачи Коши (14.45). В этом случае расчетные формулы принимают вид

Найденные с шагом приближенные значения решения и их погрешности приведены в табл. 14.4.

Таблица 14.4 (см. скан)

5. Обсуждение методов Рунге-Кутты.

Методы Рунге-Кутты имеют несколько достоинств, определивших их популярность среди значительного числа исследователей. Эти методы легко программируются. Они обладают достаточными для широкого круга задач свойствами точности и устойчивости. Эти методы (как и все одношаговые методы) являются самостартующими и позволяют на любом этапе вычислений легко изменять шаг интегрирования.

Увеличивая число вспомогательных точек, можно построить методы Рунге-Кутты любого порядка точности Однако уже при

Эти методы используются довольно редко. Это объясняется как чрезмерной громоздкостью получающихся вычислительных формул, так и том, что преимущества методов высокого порядка точности над методами, в которых проявляются либо в тех задачах, где нужна очнь высокая точность и используются ЭВМ высокой разрядности, либо в тех задачах, где решение очень гладкое. Кроме того, методы Рунге-Кутты высокого порядка точности часто оказываются менее эффективными по сравнению с методами Адамса того же порядка точности (см. § 14 7).

Замечай и Кроме описанных выше классических явных методов Рунге-Кутты используются и более сложные в реализации неявные -этапные методы Рунге-Кутты:

Эти методы имеют ряд преимуществ перед явными методами, однако это достигается за счет существенного усложнения вычислительного алгоритма, так как на каждом шаге необходимо решать систему нелинейных уравнений. В настоящее время неявные методы Рунге-Кутты применяются в основном для решения так называемых жестких задач (см. § 14 11).

6. Автоматический выбор шага.

Отметим, что в современных программах, реализующих методы Рунге-Кутты, обязательно используется некоторый алгоритм автоматического изменения шага интегрирования

Интуитиьно ясно, что на участках плавного изменения решения счет можно вести с достаточно крупным шагом. В то же время на тех участках, где происходят резкие изменения поведения решения, необходимо выбирать мелкий шаг интегрирования. Обычно начальное значение шага задает пользователь. Далее шаг интегрирования меняется в соответствии с величинои получаемой в ходе вычислений оценки локальной погрешности. Само по себе изменение шага для методов Рунге-Кутты (впрочем, как и для всех других одношаговых методов) не представляет сложности. Действительная проблема состоит в том, как оценить локальную погрешность и выбрать очередной шаг интегрирования.

Один из распространенных подходов состоит в использовании правила Руте (правила двойною пересчета) Пусть значение в точке

уже найдено и решение уравнения удовлетворяющее условию Обозначим через приближение к значению найденное с помощью одношагового метода

Приведут здесь к локальной погрешности

Вычитая из равенства (14.72) равенство (14.73), получим формулу

Сравнение ее с (14.73) приводит к приближенному равенству

Использование этой формулы для апостериорной оценки локальной погрешности значения (которое в дальнейшем принимается за приближенное значение решения задачи Коши в точке и называют правилом Руте. Заметим, что этот способ контроля точности приводит к увеличению времени счета примерно на 50%.

Существуют более экономичные методы оценки локальной погрешности, основанные на использовании для контроля точности двух различных методов Рунге - Кутты. В настоящее время одним из самых эффективных методов такого типа является метод Рунге-Кутты-Фельберга. В этом методе для оценки погрешности метода пятого порядка точности используются формулы метода четвертого порядка точности, причем на одном шаге требуется всего лишь шесть вычислений значений правой части

После того как тем или иным способом оценена локальная ошибка, программа принимает решение о том, оставить ли шаг интегрирования прежним, уменьшить ли его вдвое или увеличить в два раза. Это происходит примерно по той же схеме, что и в адаптивных программах, предназначенных для вычисления определенных интегралов (см. § 13.5). Известно, что при оптимальном выборе шагов интегрирования абсолютные погрешности, приходящиеся на каждый из шагов, должны быть примерно равны (см. ). Этот результат учитывается при создании стандартных программ с автоматическим выбором шага.

7. Влияние вычислительной погрешности.

Влияние погрешностей на результат вычислений с помощью явных методов Рунге - Кутты примерно таково же, как и для метода Эйлера (см. § 14.4). Однако для них Кроме того, высокая точность методов позволяет вести интегрирование со сравнительно большим шагом и поэтому влияние вычислительной погрешности обычно бывает несущественным.

Классический метод Рунге - Кутта 4 порядка

Тема 6.3. Метод Рунге-Кутгы

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

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

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

Рассмотрим задачу Коши . Тогда значение в следующей точке вычисляется по формуле:

Величина шага сетки по .

Этот метод имеет 4 порядок, т.е. ошибка на каждом шаге составляет O(h5), а суммарная ошибка на конечном интервале интегрирования O(h4).

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

Конкретный метод определяется числом s и коэффициентами bi,aij и ci. Эти коэффициенты часто упорядочивают в таблицу

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

Формально, методом Рунге - Кутты является модифицированный и исправленный метод Эйлера , они представляют собой схемы второго порядка точности. Существуют стандартные схемы третьего порядка, не получившие широкого распространения. Наиболее часто используется и реализована в различных математических пакетах (Maple , MathCAD , Maxima) стандартная схема четвёртого порядка. Иногда при выполнении расчётов с повышенной точностью применяются схемы пятого и шестого порядков . Построение схем более высокого порядка сопряжено с большими вычислительными трудностями . Методы седьмого порядка должны иметь по меньшей мере девять стадий, в схему восьмого порядка входит 11 стадий. Хотя схемы девятого порядка не имеют большой практической значимости, неизвестно, сколько стадий необходимо для достижения этого порядка точности. Аналогичная задача существует для схем десятого и более высоких порядков .

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

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

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

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

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

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

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

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

public class MainClass { public static void main(String args) { int k = 2; double Xo, Yo, Y1, Zo, Z1; double k1, k2, k4, k3, h; double q1, 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; } } /** * функция для округления и отбрасывания "хвоста" */ public static double r(double value, int k){ return (double)Math.round((Math.pow(10, k)*value))/Math.pow(10, k); } /** * функции, которые получаются из системы */ public static double f(double x, double y, double z){ return (Math.cos(3*x) - 4*y); } public static double g(double x, double y, double z){ return (z); } }

using System; using System.Collections.Generic; namespace PRJ_RungeKutta { ///

/// Реализация метода Ру́нге - Ку́тты для обыкновенного дифференциального уравнения /// public abstract class RungeKutta { /// /// Текущее время /// public double t; /// /// Искомое решение Y - само решение, Y[i] - i-тая производная решения /// public double Y; /// /// Внутренние переменные /// double YY, Y1, Y2, Y3, Y4; protected double FY; /// /// Конструктор /// /// размерность системы public RungeKutta(uint N) { Init(N); } /// /// Конструктор /// public RungeKutta(){} /// /// Выделение памяти под рабочие массивы /// /// Размерность массивов protected void Init(uint N) { Y = new double[N]; YY = new double[N]; Y1 = new double[N]; Y2 = new double[N]; Y3 = new double[N]; Y4 = new double[N]; FY = new double[N]; } /// /// Установка начальных условий /// /// Начальное время /// Начальное условие public void SetInit(double t0, double Y0) { t = t0; if (Y == null) Init((uint)Y0.Length); for (int i = 0; i < Y.Length; i++) Y[i] = Y0[i]; } /// /// Расчет правых частей системы /// /// текущее время /// вектор решения /// правая часть abstract public double F(double t, double Y); /// /// Следующий шаг метода Рунге-Кутта /// /// текущий шаг по времени (может быть переменным) public void NextStep(double dt) { int i; if (dt < 0) return; // рассчитать Y1 Y1 = F(t, Y); for (i = 0; i < Y.Length; i++) YY[i] = Y[i] + Y1[i] * (dt / 2.0); // рассчитать Y2 Y2 = F(t + dt / 2.0, YY); for (i = 0; i < Y.Length; i++) YY[i] = Y[i] + Y2[i] * (dt / 2.0); // рассчитать Y3 Y3 = F(t + dt / 2.0, YY); for (i = 0; i < Y.Length; i++) YY[i] = Y[i] + Y3[i] * dt; // рассчитать Y4 Y4 = F(t + dt, YY); // рассчитать решение на новом шаге for (i = 0; i < Y.Length; i++) Y[i] = Y[i] + dt / 6.0 * (Y1[i] + 2.0 * Y2[i] + 2.0 * Y3[i] + Y4[i]); // рассчитать текущее время t = t + dt; } } class TMyRK: RungeKutta { public TMyRK(uint N) { Init(N); } /// /// пример математический маятник /// y""(t)+y(t)=0 /// /// Время /// Решение /// Правая часть public override double F(double t, double Y) { FY = Y; FY = -Y; return FY; } /// /// Пример использования /// static public void Test() { // Шаг по времени double dt = 0.001; // Объект метода TMyRK task = new TMyRK(2); // Определим начальные условия y(0)=0, y"(0)=1 задачи double Y0 = { 0, 1 }; // Установим начальные условия задачи task.SetInit(0, Y0); // решаем до 15 секунд while (task.t <= 15) { Console.WriteLine("Time = {0:F5}; Func = {1:F8}; d Func / d x = {2:F8}", task.t, task.Y, task.Y); // вывести t, y, y" // рассчитать на следующем шаге, шаг интегрирования task.NextStep(dt); } Console.ReadLine(); } } class Program { static void Main(string args) { TMyRK.Test(); } } }

В программе на С# используется абстрактный класс 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 , который будет выполнять основные вычисления. Этот главный файл будет содержать следующий текст:

clear; clc; % Очистка памяти и экрана h = 0,1; % Шаг интегрирования x_fin = 8; % Конечное время интегрирования y0 = 0,8; % Начальное значение функции Dy0 = 2; % Начальное значение производной функции = ode45("runge", , ); % Метод Рунге - Кутты 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 даст искомое решение:

Ответ: y1 = 0,98768

Напишите отзыв о статье "Метод Рунге - Кутты"

Ссылки

Отрывок, характеризующий Метод Рунге - Кутты

– Вы не знаете, Болконский, – обратился Билибин к князю Андрею, – что все ужасы французской армии (я чуть было не сказал – русской армии) – ничто в сравнении с тем, что наделал между женщинами этот человек.
– La femme est la compagne de l"homme, [Женщина – подруга мужчины,] – произнес князь Ипполит и стал смотреть в лорнет на свои поднятые ноги.
Билибин и наши расхохотались, глядя в глаза Ипполиту. Князь Андрей видел, что этот Ипполит, которого он (должно было признаться) почти ревновал к своей жене, был шутом в этом обществе.
– Нет, я должен вас угостить Курагиным, – сказал Билибин тихо Болконскому. – Он прелестен, когда рассуждает о политике, надо видеть эту важность.
Он подсел к Ипполиту и, собрав на лбу свои складки, завел с ним разговор о политике. Князь Андрей и другие обступили обоих.
– Le cabinet de Berlin ne peut pas exprimer un sentiment d"alliance, – начал Ипполит, значительно оглядывая всех, – sans exprimer… comme dans sa derieniere note… vous comprenez… vous comprenez… et puis si sa Majeste l"Empereur ne deroge pas au principe de notre alliance… [Берлинский кабинет не может выразить свое мнение о союзе, не выражая… как в своей последней ноте… вы понимаете… вы понимаете… впрочем, если его величество император не изменит сущности нашего союза…]
– Attendez, je n"ai pas fini… – сказал он князю Андрею, хватая его за руку. – Je suppose que l"intervention sera plus forte que la non intervention. Et… – Он помолчал. – On ne pourra pas imputer a la fin de non recevoir notre depeche du 28 novembre. Voila comment tout cela finira. [Подождите, я не кончил. Я думаю, что вмешательство будет прочнее чем невмешательство И… Невозможно считать дело оконченным непринятием нашей депеши от 28 ноября. Чем то всё это кончится.]
И он отпустил руку Болконского, показывая тем, что теперь он совсем кончил.
– Demosthenes, je te reconnais au caillou que tu as cache dans ta bouche d"or! [Демосфен, я узнаю тебя по камешку, который ты скрываешь в своих золотых устах!] – сказал Билибин, y которого шапка волос подвинулась на голове от удовольствия.
Все засмеялись. Ипполит смеялся громче всех. Он, видимо, страдал, задыхался, но не мог удержаться от дикого смеха, растягивающего его всегда неподвижное лицо.
– Ну вот что, господа, – сказал Билибин, – Болконский мой гость в доме и здесь в Брюнне, и я хочу его угостить, сколько могу, всеми радостями здешней жизни. Ежели бы мы были в Брюнне, это было бы легко; но здесь, dans ce vilain trou morave [в этой скверной моравской дыре], это труднее, и я прошу у всех вас помощи. Il faut lui faire les honneurs de Brunn. [Надо ему показать Брюнн.] Вы возьмите на себя театр, я – общество, вы, Ипполит, разумеется, – женщин.
– Надо ему показать Амели, прелесть! – сказал один из наших, целуя кончики пальцев.
– Вообще этого кровожадного солдата, – сказал Билибин, – надо обратить к более человеколюбивым взглядам.
– Едва ли я воспользуюсь вашим гостеприимством, господа, и теперь мне пора ехать, – взглядывая на часы, сказал Болконский.
– Куда?
– К императору.
– О! о! о!
– Ну, до свидания, Болконский! До свидания, князь; приезжайте же обедать раньше, – пocлшaлиcь голоса. – Мы беремся за вас.
– Старайтесь как можно более расхваливать порядок в доставлении провианта и маршрутов, когда будете говорить с императором, – сказал Билибин, провожая до передней Болконского.
– И желал бы хвалить, но не могу, сколько знаю, – улыбаясь отвечал Болконский.
– Ну, вообще как можно больше говорите. Его страсть – аудиенции; а говорить сам он не любит и не умеет, как увидите.

На выходе император Франц только пристально вгляделся в лицо князя Андрея, стоявшего в назначенном месте между австрийскими офицерами, и кивнул ему своей длинной головой. Но после выхода вчерашний флигель адъютант с учтивостью передал Болконскому желание императора дать ему аудиенцию.
Император Франц принял его, стоя посредине комнаты. Перед тем как начинать разговор, князя Андрея поразило то, что император как будто смешался, не зная, что сказать, и покраснел.
– Скажите, когда началось сражение? – спросил он поспешно.
Князь Андрей отвечал. После этого вопроса следовали другие, столь же простые вопросы: «здоров ли Кутузов? как давно выехал он из Кремса?» и т. п. Император говорил с таким выражением, как будто вся цель его состояла только в том, чтобы сделать известное количество вопросов. Ответы же на эти вопросы, как было слишком очевидно, не могли интересовать его.
– В котором часу началось сражение? – спросил император.
– Не могу донести вашему величеству, в котором часу началось сражение с фронта, но в Дюренштейне, где я находился, войско начало атаку в 6 часу вечера, – сказал Болконский, оживляясь и при этом случае предполагая, что ему удастся представить уже готовое в его голове правдивое описание всего того, что он знал и видел.
Но император улыбнулся и перебил его:
– Сколько миль?
– Откуда и докуда, ваше величество?
– От Дюренштейна до Кремса?
– Три с половиною мили, ваше величество.
– Французы оставили левый берег?
– Как доносили лазутчики, в ночь на плотах переправились последние.
– Достаточно ли фуража в Кремсе?
– Фураж не был доставлен в том количестве…
Император перебил его.
– В котором часу убит генерал Шмит?…
– В семь часов, кажется.
– В 7 часов. Очень печально! Очень печально!
Император сказал, что он благодарит, и поклонился. Князь Андрей вышел и тотчас же со всех сторон был окружен придворными. Со всех сторон глядели на него ласковые глаза и слышались ласковые слова. Вчерашний флигель адъютант делал ему упреки, зачем он не остановился во дворце, и предлагал ему свой дом. Военный министр подошел, поздравляя его с орденом Марии Терезии З й степени, которым жаловал его император. Камергер императрицы приглашал его к ее величеству. Эрцгерцогиня тоже желала его видеть. Он не знал, кому отвечать, и несколько секунд собирался с мыслями. Русский посланник взял его за плечо, отвел к окну и стал говорить с ним.
Вопреки словам Билибина, известие, привезенное им, было принято радостно. Назначено было благодарственное молебствие. Кутузов был награжден Марией Терезией большого креста, и вся армия получила награды. Болконский получал приглашения со всех сторон и всё утро должен был делать визиты главным сановникам Австрии. Окончив свои визиты в пятом часу вечера, мысленно сочиняя письмо отцу о сражении и о своей поездке в Брюнн, князь Андрей возвращался домой к Билибину. У крыльца дома, занимаемого Билибиным, стояла до половины уложенная вещами бричка, и Франц, слуга Билибина, с трудом таща чемодан, вышел из двери.
Прежде чем ехать к Билибину, князь Андрей поехал в книжную лавку запастись на поход книгами и засиделся в лавке.
– Что такое? – спросил Болконский.
– Ach, Erlaucht? – сказал Франц, с трудом взваливая чемодан в бричку. – Wir ziehen noch weiter. Der Bosewicht ist schon wieder hinter uns her! [Ах, ваше сиятельство! Мы отправляемся еще далее. Злодей уж опять за нами по пятам.]
– Что такое? Что? – спрашивал князь Андрей.
Билибин вышел навстречу Болконскому. На всегда спокойном лице Билибина было волнение.
– Non, non, avouez que c"est charmant, – говорил он, – cette histoire du pont de Thabor (мост в Вене). Ils l"ont passe sans coup ferir. [Нет, нет, признайтесь, что это прелесть, эта история с Таборским мостом. Они перешли его без сопротивления.]
Князь Андрей ничего не понимал.
– Да откуда же вы, что вы не знаете того, что уже знают все кучера в городе?
– Я от эрцгерцогини. Там я ничего не слыхал.
– И не видали, что везде укладываются?
– Не видал… Да в чем дело? – нетерпеливо спросил князь Андрей.
– В чем дело? Дело в том, что французы перешли мост, который защищает Ауэсперг, и мост не взорвали, так что Мюрат бежит теперь по дороге к Брюнну, и нынче завтра они будут здесь.
– Как здесь? Да как же не взорвали мост, когда он минирован?
– А это я у вас спрашиваю. Этого никто, и сам Бонапарте, не знает.
Болконский пожал плечами.
– Но ежели мост перейден, значит, и армия погибла: она будет отрезана, – сказал он.
– В этом то и штука, – отвечал Билибин. – Слушайте. Вступают французы в Вену, как я вам говорил. Всё очень хорошо. На другой день, то есть вчера, господа маршалы: Мюрат Ланн и Бельяр, садятся верхом и отправляются на мост. (Заметьте, все трое гасконцы.) Господа, – говорит один, – вы знаете, что Таборский мост минирован и контраминирован, и что перед ним грозный tete de pont и пятнадцать тысяч войска, которому велено взорвать мост и нас не пускать. Но нашему государю императору Наполеону будет приятно, ежели мы возьмем этот мост. Проедемте втроем и возьмем этот мост. – Поедемте, говорят другие; и они отправляются и берут мост, переходят его и теперь со всею армией по сю сторону Дуная направляются на нас, на вас и на ваши сообщения.
– Полноте шутить, – грустно и серьезно сказал князь Андрей.
Известие это было горестно и вместе с тем приятно князю Андрею.
Как только он узнал, что русская армия находится в таком безнадежном положении, ему пришло в голову, что ему то именно предназначено вывести русскую армию из этого положения, что вот он, тот Тулон, который выведет его из рядов неизвестных офицеров и откроет ему первый путь к славе! Слушая Билибина, он соображал уже, как, приехав к армии, он на военном совете подаст мнение, которое одно спасет армию, и как ему одному будет поручено исполнение этого плана.
– Полноте шутить, – сказал он.
– Не шучу, – продолжал Билибин, – ничего нет справедливее и печальнее. Господа эти приезжают на мост одни и поднимают белые платки; уверяют, что перемирие, и что они, маршалы, едут для переговоров с князем Ауэрспергом. Дежурный офицер пускает их в tete de pont. [мостовое укрепление.] Они рассказывают ему тысячу гасконских глупостей: говорят, что война кончена, что император Франц назначил свидание Бонапарту, что они желают видеть князя Ауэрсперга, и тысячу гасконад и проч. Офицер посылает за Ауэрспергом; господа эти обнимают офицеров, шутят, садятся на пушки, а между тем французский баталион незамеченный входит на мост, сбрасывает мешки с горючими веществами в воду и подходит к tete de pont. Наконец, является сам генерал лейтенант, наш милый князь Ауэрсперг фон Маутерн. «Милый неприятель! Цвет австрийского воинства, герой турецких войн! Вражда кончена, мы можем подать друг другу руку… император Наполеон сгорает желанием узнать князя Ауэрсперга». Одним словом, эти господа, не даром гасконцы, так забрасывают Ауэрсперга прекрасными словами, он так прельщен своею столь быстро установившеюся интимностью с французскими маршалами, так ослеплен видом мантии и страусовых перьев Мюрата, qu"il n"y voit que du feu, et oubl celui qu"il devait faire faire sur l"ennemi. [Что он видит только их огонь и забывает о своем, о том, который он обязан был открыть против неприятеля.] (Несмотря на живость своей речи, Билибин не забыл приостановиться после этого mot, чтобы дать время оценить его.) Французский баталион вбегает в tete de pont, заколачивают пушки, и мост взят. Нет, но что лучше всего, – продолжал он, успокоиваясь в своем волнении прелестью собственного рассказа, – это то, что сержант, приставленный к той пушке, по сигналу которой должно было зажигать мины и взрывать мост, сержант этот, увидав, что французские войска бегут на мост, хотел уже стрелять, но Ланн отвел его руку. Сержант, который, видно, был умнее своего генерала, подходит к Ауэрспергу и говорит: «Князь, вас обманывают, вот французы!» Мюрат видит, что дело проиграно, ежели дать говорить сержанту. Он с удивлением (настоящий гасконец) обращается к Ауэрспергу: «Я не узнаю столь хваленую в мире австрийскую дисциплину, – говорит он, – и вы позволяете так говорить с вами низшему чину!» C"est genial. Le prince d"Auersperg se pique d"honneur et fait mettre le sergent aux arrets. Non, mais avouez que c"est charmant toute cette histoire du pont de Thabor. Ce n"est ni betise, ni lachete… [Это гениально. Князь Ауэрсперг оскорбляется и приказывает арестовать сержанта. Нет, признайтесь, что это прелесть, вся эта история с мостом. Это не то что глупость, не то что подлость…]
– С"est trahison peut etre, [Быть может, измена,] – сказал князь Андрей, живо воображая себе серые шинели, раны, пороховой дым, звуки пальбы и славу, которая ожидает его.
– Non plus. Cela met la cour dans de trop mauvais draps, – продолжал Билибин. – Ce n"est ni trahison, ni lachete, ni betise; c"est comme a Ulm… – Он как будто задумался, отыскивая выражение: – c"est… c"est du Mack. Nous sommes mackes , [Также нет. Это ставит двор в самое нелепое положение; это ни измена, ни подлость, ни глупость; это как при Ульме, это… это Маковщина. Мы обмаковались. ] – заключил он, чувствуя, что он сказал un mot, и свежее mot, такое mot, которое будет повторяться.
Собранные до тех пор складки на лбу быстро распустились в знак удовольствия, и он, слегка улыбаясь, стал рассматривать свои ногти.
– Куда вы? – сказал он вдруг, обращаясь к князю Андрею, который встал и направился в свою комнату.
– Я еду.
– Куда?
– В армию.
– Да вы хотели остаться еще два дня?
– А теперь я еду сейчас.
И князь Андрей, сделав распоряжение об отъезде, ушел в свою комнату.
– Знаете что, мой милый, – сказал Билибин, входя к нему в комнату. – Я подумал об вас. Зачем вы поедете?
И в доказательство неопровержимости этого довода складки все сбежали с лица.
Князь Андрей вопросительно посмотрел на своего собеседника и ничего не ответил.
– Зачем вы поедете? Я знаю, вы думаете, что ваш долг – скакать в армию теперь, когда армия в опасности. Я это понимаю, mon cher, c"est de l"heroisme. [мой дорогой, это героизм.]
– Нисколько, – сказал князь Андрей.
– Но вы un philoSophiee, [философ,] будьте же им вполне, посмотрите на вещи с другой стороны, и вы увидите, что ваш долг, напротив, беречь себя. Предоставьте это другим, которые ни на что более не годны… Вам не велено приезжать назад, и отсюда вас не отпустили; стало быть, вы можете остаться и ехать с нами, куда нас повлечет наша несчастная судьба. Говорят, едут в Ольмюц. А Ольмюц очень милый город. И мы с вами вместе спокойно поедем в моей коляске.
– Перестаньте шутить, Билибин, – сказал Болконский.
– Я говорю вам искренно и дружески. Рассудите. Куда и для чего вы поедете теперь, когда вы можете оставаться здесь? Вас ожидает одно из двух (он собрал кожу над левым виском): или не доедете до армии и мир будет заключен, или поражение и срам со всею кутузовскою армией.
И Билибин распустил кожу, чувствуя, что дилемма его неопровержима.
– Этого я не могу рассудить, – холодно сказал князь Андрей, а подумал: «еду для того, чтобы спасти армию».
– Mon cher, vous etes un heros, [Мой дорогой, вы – герой,] – сказал Билибин.

В ту же ночь, откланявшись военному министру, Болконский ехал в армию, сам не зная, где он найдет ее, и опасаясь по дороге к Кремсу быть перехваченным французами.
В Брюнне всё придворное население укладывалось, и уже отправлялись тяжести в Ольмюц. Около Эцельсдорфа князь Андрей выехал на дорогу, по которой с величайшею поспешностью и в величайшем беспорядке двигалась русская армия. Дорога была так запружена повозками, что невозможно было ехать в экипаже. Взяв у казачьего начальника лошадь и казака, князь Андрей, голодный и усталый, обгоняя обозы, ехал отыскивать главнокомандующего и свою повозку. Самые зловещие слухи о положении армии доходили до него дорогой, и вид беспорядочно бегущей армии подтверждал эти слухи.