Файл: Вычислительный эксперимент и методы вычислений.pdf

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

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

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

Добавлен: 04.04.2021

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

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

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

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


background image

Приближая функцию

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


background image

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


background image

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


background image

# 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