15.4. Линейные дифференциальные уравнения
Рассмотрим задачу Коши для системы обыкновенных дифференциальных уравнений
(1)
или подробнее
(2)
(3)
Существует две группы численных методов решения задачи Коши: многошаговые разностные методы и методы Рунге-Кутта. Приведем примеры и поясним основные понятия, возникающие при использовании численных методов. Для простоты будем рассматривать одно уравнение
. (4)
Введем по переменному t равномерную сетку с шагом >0, т.е рассмотрим множество точек
.
Будем обозначать через u(t) точное решение задачи (4), а через yn=y(tn) – приближенное решение. Заметим, что приближенное решение является сеточной функцией, т.е. определено только в точках сетки .
Пример 1. Метод Эйлера. Уравнение (4) заменяется разностным уравнением
. (5)
Решение этого уравнения находится явным образом по рекуррентной формуле
Пример 2. Симметричная схема. Уравнение (4) заменяется разностным уравнением
. (6)
Данный метод более сложен в реализации, чем метод Эйлера (5), так как новое решение yn+1 определяется по найденному ранее yn путем решения уравнения
,
где . По этой причине метод называется неявным. Преимуществом метода (7) по сравнению с методом (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 видно, что метод приближенного решения по симметричной схеме дает более точное решение.