ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 21.04.2021

Просмотров: 358

Скачиваний: 5

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Приведенные примеры представляют собой простейшие случаи разностных методов. Методы Рунге-Кутта отличаются от разностных методов тем, что в них допускается вычисление правых частей f(t,u) не только в точках сетки, но и в некоторых промежуточных точках.

Пример 3. Метод Рунге-Кутта второго порядка точности. Предположим, что известно приближенное значение yn решения исходной задачи в момент t=tn. Для нахождения yn+1 = y(tn+1) поступим следующим образом. Сначала, используя схему Эйлера

,

Вычислим промежуточное значение , а затем воспользуемся разностным уравнением

,

из которого явным образом найдем искомое значение .

Реализация метода в виде двух этапов (8), (9) называется метод предиктор-корректор (предсказывающее-исправляющим), т.к. на первом этапе (8) приближенное значение предсказывается с невысокой точностью О(), а на втором этапе (9) точность имеет второй порядок по .

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

.

Это уравнение имеет точное решение .

Код для реализации метода Эйлера показан в листинге

Листинг 15.5. Решение уравнения методом Эйлера

a = 0; b = 2; m = 50;

dx = (b - a) / m;

x = 0, y = 1;

for (int i = 1; i <= m; i++)

{

y += dx*F(x,y);

x += dx;

g.DrawEllipse(Pens.Black, II(x) - 2,

JJ(y) - 2, 4, 4);

}

Для симметричной схемы уравнение (6) принимает вид:

и его удается решить явно:

.

Код для решения уравнения по симметричной схеме представлен ниже:

Листинг 15.6. Решение уравнения по симметричной схеме

a = 0; b = 2; m = 50; dx=(b-a)/m; x = 0; y = 1;

for (int i = 1; i <= m; i++)

{

y = (y+dx/2*F(x,y))/(1-(x+dx)*dx/2);

x += dx;

g.FillEllipse(myBrush,II(x)-3, JJ(y)-3,6,6);

}

В следующем листинге 15.7 представлен код для реализации метода Рунге-Кутта:

Листинг 15.7. Решение уравнения методом Рунге-Кутта

a = 0; b = 2; m = 50;

dx = (b - a) / m;

x = 0; y = 1; yt = 0;

for (int i = 1; i <= m; i++)

{

yt = y + dx / 2 * F6(x, y);

y = y + dx / 2 * F6(x + dx / 2, yt);

x += dx;

g.FillEllipse(myBrush,II(x)-2,JJ(y) - 2, 4, 4);

}

На рис. 15.6 на интервале [0,2] представлено точное решение (сплошная линия), приближенное решение по методу Эйлера (маленькие черные точки), по симметричной схеме (большие черные точки) и методом Рунге-Кутта (белые точки).

Рис. 15.6. Сравнение точного и приближенных решений линейного уравнения

Из рис. 15.6 видно, что метод приближенного решения по симметричной схеме дает более точное решение.