ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 06.04.2021
Просмотров: 96
Скачиваний: 1
Учитывая в (10) три слагаемых, приходим к методу третьего порядка
точности
y
i
+1
−
y
i
h
=
1
12
(23
f
i
−
16
f
i
−
1
+ 5
f
i
−
2
)
(12)
и случае четырех слагаемых в (10) метод Адамса четвертого порядка
y
i
+1
−
y
i
h
=
1
24
(55
f
i
−
59
f
i
−
1
+ 37
f
i
−
2
−
9
f
i
−
3
)
.
(13)
Метод Адамса по сравнению с методом Рунге – Кутты требует мень-
ших затрат при нахождении очередного значения
y
i
+1
, т.к. требуется най-
ти лишь
f
i
, а
f
i
−
1
, ... ,
f
i
−
3
уже известны к этому моменту, по формулам
Рунге – Кутты на каждом шаге надо находить четыре значения
f
.
Формулы Рунге – Кутты позволяют проводить вычисления с пере-
менным шагом. При использовании многошаговых методов может некон-
тролируемо возрастать погрешность вычислений, т.е. возникать неустой-
чивость.
1.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
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
6
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
1.6.
Примеры процедур в среде Maple
1.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]);
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
7
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
1.6.2.
Метод Эйлера с пересчетом
> restart;
> EulerPereschet:=proc(f,y_a,a,b,n)
# 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;
8
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
1.6.3.
Метод Рунге – Кутты
> restart;
> RungeKutt:=proc(f,y_a,a,b,n)
# f — функция
# y_a — начальное условие задачи Коши
# a, b — границы
# n — количество точек разбиения промежутка [a,b]
local i,h,x,y,dy,K1,K2,K3,K4;
y[0]:=y_a;
h:=(b-a)/n;
for i from 0 to n do
# задаем конечное множество точек на отрезке [a,b]
x[i]:=a+h*i;
end do;
9
for i from 0 to n do
K1[i]:=h*f(x[i],y[i]);
K2[i]:=h*f(x[i]+h/2,y[i]+K1[i]/2);
K3[i]:=h*f(x[i]+h/2,y[i]+K2[i]/2);
K4[i]:=h*f(x[i]+h,y[i]+K3[i]);
dy[i]:=(1/6)*(K1[i]+2*K2[i]+2*K3[i]+K4[i]);
y[i+1]:=y[i]+dy[i];
end do;
for i from 0 to n 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);
Проверим работу процедуры
> RungeKutt(f,-1,1,1.5,5);
x = 1., y = -1
x = 1.100000000, y = -0.9090933148
x = 1.200000000, y = -0.8333367499
x = 1.300000000, y = -0.7692344925
x = 1.400000000, y = -0.7142893912
x = 1.500000000, y = -0.6666701276
1.6.4.
Метод Адамса
> restart;
> Adams:=proc(f,y_a,a,b,n)
# f — функция
# y_a — начальное условие задачи Коши
# a, b — границы
# n — количество точек разбиения промежутка [a,b]
local i,h,x,y,dy,K1,K2,K3,K4;
y[0]:=y_a;
h:=(b-a)/n;
for i from 0 to n do
# задаем конечное множество точек на отрезке [a,b]
x[i]:=a+h*i;
end do;
y[1]:=y[0]+h*f(x[0],y[0]);
10