ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 04.04.2021
Просмотров: 763
Скачиваний: 1
6.3.
Методы Рунге – Кутта
Рассмотренные ранее метод Эйлера и его модификация относятся к
классу методов Рунге – Кутта. Суть методов – для вычисления
y
i
+1
ис-
пользуется
y
i
, а также значения функции
f
(
x, y
)
в некоторых специ-
альных точках. Широко распространен метод Рунге – Кутта четвертого
порядка. Алгоритм этого метода имеет вид
y
i
+1
=
y
i
+
h
6
(
k
0
+ 2
k
1
+ 2
k
2
+
k
3
)
,
i
= 0
,
1
, ... ,
k
0
=
f
(
x
i
, y
i
)
,
k
1
=
f
µ
x
i
+
h
2
, y
i
+
hk
0
2
¶
,
k
2
=
f
µ
x
i
+
h
2
, y
i
+
hk
1
2
¶
,
k
3
=
f
(
x
i
+
h, y
i
+
hk
2
)
.
6.4.
Многоточечные методы
Многоточечные, или многошаговые методы решения задачи Коши от-
личаются тем, что решение в текущем узле зависит от данных не только
в одном предыдущем узле, но и в ряде предшествующих.
Такие методы можно строить, используя метод неопределенных ко-
эффициентов. Для этого запишем разностное соотношение для
i
-го узла
в виде
a
0
y
i
+
a
1
y
i
−
1
+
...
+
a
m
y
i
−
m
h
=
b
0
f
i
+
b
1
f
i
−
1
+
...
+
b
l
f
i
−
l
.
(100)
Коэффициенты
a
i
и
b
i
подбираются так, чтобы получить аппроксимацию
с нужным порядком точности. Если
a
0
=
−
a
1
= 1
,
a
2
=
...
=
a
m
= 0
,
то получаем методы Адамса. Уравнение
y
0
=
f
(
x, y
)
эквивалентно инте-
гральному соотношению
y
i
+1
−
y
i
=
x
i
+1
Z
x
i
f dx .
(101)
Если решение в узлах вплоть до
i
-го уже вычислено, то по известным зна-
чениям
f
i
=
f
(
x
i
, y
i
)
можно интерполировать подинтегральную функ-
цию полиномами различной степени. Далее, вычисляя интеграл от вы-
бранного интерполяционного полинома, получаем формулы Адамса.
61
Приближая функцию
f
на отрезке
[
x
i
, x
i
+1
]
полиномом в форме Нью-
тона
f
=
f
i
+
f
i
−
f
i
−
1
h
(
x
−
x
i
)+
+
f
i
−
2
f
i
−
1
+
f
i
−
2
2
h
2
(
x
−
x
i
)(
x
−
x
i
−
1
) +
...
(102)
и учитывая первые два слагаемых при вычислении интеграла, получаем
метод Адамса второго порядка точности
y
i
+1
−
y
i
h
=
3
2
f
i
−
1
2
f
i
−
1
.
(103)
Учитывая в (102) три слагаемых, приходим к методу третьего порядка
точности
y
i
+1
−
y
i
h
=
1
12
(23
f
i
−
16
f
i
−
1
+ 5
f
i
−
2
)
(104)
и случае четырех слагаемых в (102) метод Адамса четвертого порядка
y
i
+1
−
y
i
h
=
1
24
(55
f
i
−
59
f
i
−
1
+ 37
f
i
−
2
−
9
f
i
−
3
)
.
(105)
Метод Адамса по сравнению с методом Рунге – Кутты требует мень-
ших затрат при нахождении очередного значения
y
i
+1
, т.к. требуется най-
ти лишь
f
i
, а
f
i
−
1
, ... ,
f
i
−
3
уже известны к этому моменту, по формулам
Рунге – Кутты на каждом шаге надо находить четыре значения
f
.
Формулы Рунге – Кутты позволяют проводить вычисления с пере-
менным шагом. При использовании многошаговых методов может некон-
тролируемо возрастать погрешность вычислений, т.е. возникать неустой-
чивость.
6.5.
Задания для самостоятельной работы
Решить задачу Коши для обыкновенных дифференциальных уравне-
ний
а) методом Эйлера;
б) методом Эйлера с пересчетом;
в) методом Рунге – Кутты;
г) методом Адамса.
1.
y
0
= 2
x
−
3 +
y, y
(0) = 0
, a
= 0
, b
= 1
, h
= 0
,
1
2.
y
0
=
1
x
+ 2
y
, y
(
−
1) = 0
, a
=
−
1
, b
= 1
, h
= 0
,
1
62
3.
y
0
=
2
−
y
ctg
x
, y
(0) = 3
, a
= 0
, b
= 1
, h
= 0
,
1
4.
y
0
=
2
x
4
+ 2
y
x
, y
(
−
1) = 2
, a
=
−
1
, b
= 1
, h
= 0
,
2
5.
y
0
=
4
x
+ 2
y
2
x
+ 1
, y
(0) = 2
, a
= 0
, b
= 1
, h
= 0
,
1
6.
y
0
=
x
+ 2
y
x
, y
(2) = 2
, a
= 2
, b
= 3
, h
= 0
,
1
7.
y
0
=
y
2
x
+
y
−
4 ln
x
, y
(0) = 1
, a
= 0
, b
= 1
, h
= 0
,
1
8.
y
0
= 2
x
(
x
2
+
y
)
, y
(0) =
−
1
, a
= 0
, b
= 1
, h
= 0
,
1
9.
y
0
=
2
xy
−
y
2
x
2
, y
(2) = 4
, a
= 2
, b
= 3
, h
= 0
,
1
10.
y
0
=
(
x
+
y
) ln (
x
+
y
)
−
ln
x
+
y
x
, y
(1) = e
−
1
, a
= 1
, b
= 2
, h
= 0
,
1
6.6.
Примеры процедур в среде Maple
6.6.1.
Метод Эйлера
> restart;
> Euler:=proc(f,y_a,a,b,n)
# f — функция
# y_a — начальное условие задачи Коши
# a, b — границы
# n — количество точек разбиения промежутка [a,b]
local i,h,x,y;
# i — переменная циклов
# h — шаг
# x — узлы
# y — приближения в решению задачи
y[0]:=y_a;
h:=(b-a)/n;
for i from 0 to n-1 do
# задаем конечное множество точек на отрезке [a,b]
x[i]:=a+h*i;
# вычисление приближенных значений y(x[i])
y[i+1]:=y[i]+h*f(x[i],y[i]);
63
end do;
for i from 0 to n-1 do
print(x=x[i],y=y[i]);
end do;
end proc:
> f:=(x,y)->y+(1+x)*yˆ 2:
> dy/dx=f(x,y);
Проверим работу процедуры
> Euler(f,-1,1,1.5,5);
x = 1., y = -1
x = 1.100000000, y = -0.9000000000
x = 1.200000000, y = -0.8199000000
x = 1.300000000, y = -0.7539980778
x = 1.400000000, y = -0.6986398723
Сравним полученные результаты с решением данной задачи встроен-
ными командами Maple
> proverka:=proc(n,a,b)
local h,ODU,i,t;
h:=abs(b-a)/n;
ODU:=diff(y(x),x)-f(x,y(x));
for t from 0 to n do
i:=a+h*t;
print(evalf(eval(dsolve(ODU),_C1=0,x=i)));
end do;
end proc:
> proverka(5,1,1.5);
y(1.) = -1.
y(1.100000000) = -0.9090909091
y(1.200000000) = -0.8333333333
y(1.300000000) = -0.7692307692
y(1.400000000) = -0.7142857143
y(1.500000000) = -0.6666666667
6.6.2.
Метод Эйлера с пересчетом
> restart;
> EulerPereschet:=proc(f,y_a,a,b,n)
64
# f — функция
# y_a — начальное условие задачи Коши
# a, b — границы
# n — количество точек разбиения промежутка [a,b]
local i,h,x,y,y1;
# i — переменная циклов
# h — шаг
# x — узлы
# y — приближенное решение задачи
# y1 — скорректированное решение задачи
y1[0]:=y_a;
h:=(b-a)/n;
for i from 0 to n do
# задаем конечное множество точек на отрезке [a,b]
x[i]:=a+h*i;
# вычисление первого приближения (предиктора)
y1[i+1]:=y1[i]+h*f(x[i],y1[i]);
end do;
y[0]:=y1[0];
for i from 0 to n do
# уточнение результата (корректор)
y[i+1]:=y[i]+(h/2)*(f(x[i],y[i])+f(x[i+1],(y1[i+1])));
print(x=x[i], y=y[i]);
end do;
end proc:
> f:=(x,y)->y+(1+x)*yˆ 2:
> dy/dx=f(x,y);
Проверим работу процедуры
> EulerPereschet(f,-1,1,1.5,5);
x = 1., y = -1
x = 1.100000000, y = -0.9099500000
x = 1.200000000, y = -0.8355555936
x = 1.300000000, y = -0.7728574240
x = 1.400000000, y = -0.7191700795
x = 1.500000000, y = -0.6725981326
6.6.3.
Метод Рунге – Кутты
> restart;
65