Файл: Эксперименты лаба10,11(2курс).pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 06.04.2021

Просмотров: 96

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

Учитывая в (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


background image

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


background image

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


background image

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


background image

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