Метод Эйлера численного интегрирования дифференциального уравнения. Алгоритм, блок-схема. Недостатки метода.
В основе метода Эйлера лежит идея графического построения решения дифференциального уравнения, этот метод называется также методом ломаных Эйлера.
Угловой коэффициент касательной к интегральной кривой в точке M0(x0,y0) равен
y0¢ = f (x0, y0).
Найдем ординату y1 касательной, соответствующей абсциссе x1=x0+h. | |||||||||||||||
Уравнение касательной к кривой в точке M | имеет вид | y - y | = y¢ | (x - x | ) или | ||||||||||
y = y | + y¢ | (x - x | ) , откуда y =y +hf(x ,y | ). | |||||||||||
1 | 0 | 0 | 0 |
Аналогично, угловой коэффициент касательной к интегральной кривой в точке
y1¢ = f (x1, y1).Точку M2(x2,y2) получим соответственно
y2=y1+hf(x1,y1).
Продолжая вычисления по данной схеме, получим формулы Эйлера для приближенного решения задачи Коши с начальными данными (x0,y0) на сетке отрезка [a, b] с шагом h:
xi=xi-1+h | yi=yi-1+hf(xi-1,yi-1). | (4) |
Графической | иллюстрацией приближенного решения | является ломаная, |
соединяющая последовательно точки M0, M1, …,Mm, которую называют ломанойЭйлера.
y | M4 |
M2 | M3 |
M1 |
M0
O | x0 | x1 | x2 | x3 | x4 | x |
Погрешность метода Эйлера можно оценить неравенством
d £ | max | ¢¢ | × h | × | b - a | , | (5) | |||||||||||||||||||
y (x) | ||||||||||||||||||||||||||
2 a£x£b | h | é0, | × (b - a)ù | |||||||||||||||||||||||
которое можно представить в виде d=Ch, где С Î | max | y¢¢(x) | . Таким | |||||||||||||||||||||||
ê | 2 a£x£b | ú | ||||||||||||||||||||||||
ë | û | |||||||||||||||||||||||||
образом, метод Эйлера имеет первый порядок точности. | ||||||||||||||||||||||||||
Практическую оценку погрешности решения, найденного на сетке с шагом h/2, в | ||||||||||||||||||||||||||
точке xiÎ[a, b] производят с помощью приближенного равенства – правила Рунге: | ||||||||||||||||||||||||||
y(xi ) | æ h | ö | yi | (h)- yi (h / 2) | (6) | |||||||||||||||||||||
- yi ç | ÷ | » | ||||||||||||||||||||||||
2P -1 | ||||||||||||||||||||||||||
è 2 | ø |
где P – порядок точности численного метода.
Таким образом, оценка полученного результата по правилу Рунге вынуждает проводить вычисления дважды: с шагом h и h/2, причем совпадение десятичных знаков
в полученных двумя способами результатах дает основание считать их верными. program Eiler;
var x,a,b,h,y:real;
m,i:integer;
function f(x,y: real): real;
begin f:=cos(x);
end;
begin writeln('Введите значения концов отрезка [a,b]'); readln(a,b);
writeln('Введите начальное значение y0=y(x0)');readln(y);
writeln('Введите число значений функции на промежутке [a,b]'); read(m);
x:=a; h:=(b-a)/m;
for i:=0 to m do
begin writeln (x:10:3, y:15:4);
y:=y+h*f(x,y); x:=x+h
end; readln;
end.
Методы Рунге-Кутта. Расчетные формулы, алгоритм, блок-схема, погрешность метода.
Численные методы решения задачи Коши y¢ = f (x, y) , y(x0)=y0 на равномерной
сетке {x0=a, x1, x2, …, | xm=b}отрезка[a, b]с шагом h = | b - a | являются методами Рунге- | |||
m | ||||||
Кутта, если, начиная с данных y(x0)=y0 | решение ведется по следующим рекуррентным | |||||
формулам: | ||||||
xi = xi-1+ h ; | yi = yi-1+ Dyi-1 | (i=1, 2, …, m) | (7) | |||
P | k [ji-1]= hf (xi-1+ c j h, yi-1+ c j k [ji--11]) | |||||
Dyi-1=åd j k [ji | -1] , |
j =1
Метод называют методом Рунге-Кутта порядка P, если он имеет P-й порядок точности по шагу h на сетке.
Метод Эйлера можно назвать методом Рунге-Кутта первого порядка.
Метод Рунге-Кутта второго порядка называют методом Эйлера-Коши, если P=2,
c1=0, | c2=1, | d1=d2=1/2 | |||||||||||||
xi = xi-1+ h ; | yi = yi-1+ Dyi-1 | (i=1, 2, …, m) | (8) | ||||||||||||
Dyi-1= | (k1[i-1] | + k | 2[i-1] ) | k1[i-1]= hf (xi-1, yi-1) k2[i-1]= hf (xi-1+ h, yi-1+ hf (xi-1, yi-1)) | |||||||||||
Для практической реализации погрешности решения можно применять правило | |||||||||||||||
æ h ö | yi (h)- yi (h / 2) | ||||||||||||||
Рунге, полагая P=2: | y(xi )- yi ç | ÷ | » | ||||||||||||
è | 2 ø |
Программа решения дифференциального уравнения методом Эйлера-Коши:
program Eiler_Koshi;
var x,a,b,h,y,z:real;
m,i:integer;
function f(x,y: real): real;
begin f:=cos(x); end;
begin writeln('Введите значения концов отрезка [a,b]'); readln(a,b); writeln('Введите начальное значение y0=y(x0)');readln(y);
writeln('Введите число значений функции на промежутке [a,b]'); read(m);
x:=a; h:=(b-a)/m;
for i:=0 to m do
begin writeln (x:10:3, y:15:4);
z:=y+h*f(x,y);
y:=y+h*(f(x,y)+f(x+h,z))/2;
x:=x+h
end; readln; end.