
6.2. Метод Эйлера
Пусть задано
дифференциальное уравнение
и начальное условие y(x0)=y0.
Требуется получить его приближенное
численное решение. Рассмотрение метода
Эйлера начнем с его геометрической
интерпретации (рис. 6.1).
Разобьем отрезок
интегрирования на n
равных частей
длиной h,
где h-
шаг интегрирования. Точка с координатами
(x0,y0)
нам известна
из начальных условий. Проведем через
нее касательную L1
к кривой F(x),
уравнение которой имеет вид:
Но по условию
и x1=x0+h,
тогда следующую точку y1
решения
дифференциального уравнения найдем
как точку пересечения прямой x1=x0+h
с касательной L1:
y1=y0+hf(x0,y0).
Ошибка, возникающая
при нахождении y1,
определяется отрезком e1.
Через точку с координатами (x1,y1)
проведем вторую касательную L2,
ее уравнение имеет вид
или
.
Аналогично определяются точки с координатами (x3,y3), (x4,y4) и т.д. Таким образом, получаем формулу приближенного решения дифференциального уравнения методом Эйлера:
.
Как видно из графика, метод дает относительно большую погрешность в вычислении yi, причем эта погрешность накапливается. Полученная формула Эйлера называется также методом Рунге-Кутта первого порядка, ибо она согласуется с разложением в ряд Тейлора вплоть до членов степени h.
Методы Рунге-Кутта
С целью повышения точности интегрирования дифференциального уравнения применяются различные усовершенствования метода Эйлера, известные как методы Рунге-Кутта. Основная идея этих методов состоит в том, что производные аппроксимируются через значения функции f(x) в точках на интервале [x0, x0+h], которые выбираются из условия наибольшей близости алгоритма к ряду Тейлора. В зависимости от старшей степени h, с которой учитываются члены ряда, построены вычислительные схемы Рунге-Кутта разных порядков точности.
Так, для второго порядка получены формулы численного интегрирования дифференциального уравнения
известные также как формулы исправленного и модифицированного методов Эйлера соответственно.
Для построения вычислительной схемы метода Рунге-Кутта четвертого порядка в тейлоровском разложении искомого решения y(x) учитываются члены, содержащие степени шага h до четвертой включительно. После аппроксимации производных правой части дифференциального уравнения получают формулу численного интегрирования
где
Данная схема на каждом шаге h требует вычисления правой части дифференциального уравнения в четырех точках.
Пример.
На отрезке [0, 1] составить таблицу значений
приближенного решения дифференциального
уравнения
с шагом интегрирования h=0,1.
Для оценки результатов расчета вывести
также значения точного решения уравнения
по формуле
Программа решения поставленной задачи может иметь следующий вид:
Uses Crt;
Label 1,2;
Type mas=array[1..25] of real;
Var x,y,z:mas; h,b:real;
n,i:integer; c,yes:char;
Function Fz(x:real):real; {Точное решение уравнения}
Begin
Fz:=x-1+exp(-x)
End;
Function Right(x,y:real):real; {Вычисление правой части уравнения}
Begin
Right:=x-y
End;
Procedure Eyler(Var x,y,z:mas); {Метод Эйлера}
Begin
For i:=2 to n do Begin
y[i]:=y[i-1]+h*Right(x[i-1],y[i-1]);
x[i]:=x[i-1]+h;
z[i]:=Fz(x[i])
End; End;
Procedure Eyler1(Var x,y,z:mas); {Исправленный метод Эйлера}
Var k,l:real;
Begin
For i:=2 to n do Begin
k:=Right(x[i-1],y[i-1]);
l:=Right(x[i-1]+h,y[i-1]+h*k);
y[i]:=y[i-1]+h*(k+l)/2;
x[i]:=x[i-1]+h;
z[i]:=Fz(x[i])
End; End;
Procedure Runge(x,y,z:mas); {Метод Рунге-Кутта четвертого порядка}
Var k1,k2,k3,k4:real;
Begin
For i:=2 to n do Begin
k1:=Right(x[i-1],y[i-1]);
k2:=Right(x[i-1]+h/2,y[i-1]+k1*h/2);
k3:=Right(x[i-1]+h/2,y[i-1]+k2*h/2);
k4:=Right(x[i-1]+h,y[i-1]+k3*h);
y[i]:=y[i-1]+(k1+2*k2+2*k3+k4)/6;
x[i]:=x[i-1]+h;
z[i]:=Fz(x[i])
End;
End;
Begin {Основная программа}
x[1]:=0; b:=1; h:=0.1;
y[1]:=0; z[1]:=y[1];
n:=Trunc((b-x[1])/h)+1;
1:ClrScr;
Writeln('Выберите метод расчета');
Writeln('1 - Метод Эйлера');
Writeln('2 - Исправленный метод Эйлера');
Writeln('3 - Метод Рунге-Кутта четвертого порядка');
c:=Readkey;
Writeln('***** Результаты расчета *****');
Case c of
'1': Begin
Eyler(x,y,z);
Writeln('Решение методом Эйлера')
End;
'2': Begin
Eyler1(x,y,z);
Writeln('Решение исправленным методом Эйлера')
End;
'3': Begin
Runge(x,y,z);
Writeln('Решение методом Рунге-Кутта четвертого порядка')
End;
Else Begin
Writeln('Ошибка при выборе метода расчета');
goto 2; End;
End;
Writeln('x':5,' y':10,' z':10);
For i:=1 to n do
Writeln(' ',x[i]:3:2,' ',y[i]:3:6,' ',z[i]:3:6);
2:Write('Желаете продолжить работу (Y/N) ?');
Readln(yes);
If (yes='Y') or (yes='y') Then goto 1;
End.
Выводы
Численные методы решения обыкновенного дифференциального уравнения - это алгоритмы вычисления приближенных значений искомой функции y(x) на некотором интервале [x0, xn]. Эти методы не позволяют найти общего решения уравнения (6.1); они могут дать только какое-то частное решение, например, решение задачи Коши.
Методы Рунге-Кутта обладают достаточно высокой точностью. Они являются явными, т.е. значение yi+1 вычисляется по ранее найденным значениям и определенным формулам. Данные методы допускают расчет с переменным шагом, удобны при программной реализации, однако в них трудно оценить погрешность ограничения (метода).
Для оценки погрешности метода на каждом шаге интегрирования и принятия решения о соответствующем изменении шага используются методы прогноза и коррекции (Рунге-Кутта - Мерсона, Адамса). Они более экономичны по затратам машинного времени, поскольку в них используется информация о предшествующей точке. Последнее обстоятельство, однако, приводит к тому, что с этих методов нельзя начинать решение дифференциального уравнения.