Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЧМ_2012 / Лекции / Численные_методы.pdf
Скачиваний:
392
Добавлен:
09.06.2015
Размер:
1.99 Mб
Скачать

94

Глава_7. Решение Обыкновенных Дифференциальных Уравнений

Можно выделить три типа методов решения обыкновенных дифференциальных уравнений: точные, приближенные и численные. Точные методы предусматривают получение решения в виде комбинации элементарных функций или в виде квадратур от последних. Приближенные

методы сводятся к построению последовательности функций

wn (x) ,

имеющих пределом искомую функцию

v(x) . Обрывая

эту

последовательность на каком-то k , получают приближенное решение. Наиболее универсальными методами являются численные.

1) Метод Рунге-Кутта

Является одними из численных методов повышенной точности решения ОДУ. Рассмотрим суть данного метода на примере ОДУ первого порядка.

Пусть на отрезке [a;b] имеем задачу Коши:

y'= f (x, y),

y(x0 ) = y0 .

Разобьем отрезок [a;b] на n равных частей (заметим, что a = x0 ). Тогда i -ая точка отрезка находится по формуле:

xi = x0 +ih , где

h =

b a

.

 

 

 

n

Последовательность точек yi искомого решения может быть определена как:

yi+1 = yi + yi .

Нам осталось определить yi , - разложим это слагаемое в ряд Тейлора (до четвертого порядка):

yi = y(xi + h) y(xi ) = h y'(

Теперь для каждой текущей точки

K1(i) = f (

K2(i) = f (

K3(i) = f (

K4(i) = f (

xi ) +

h2

y''(xi ) +

h3

y'''(xi ) +

h4

y(IV ) (xi ) .

 

 

 

 

 

 

 

2

 

 

3!

4!

 

(xi , yi ) определим четыре числа:

xi , yi );

 

 

 

 

 

 

 

 

xi +

h

,

yi +

h K

(i)

);

 

 

 

 

 

1

 

 

2

2

 

 

 

 

 

 

 

 

 

 

 

 

 

xi +

h

,

yi +

h K

(i)

);

 

 

 

 

 

2

 

 

2

2

 

 

 

 

 

 

 

 

 

 

 

 

 

xi + h, yi + h K3(i) ).

Тогда с точностью до порядка K 4 имеем:

yi = 16 h (K1(i) + 2K2(i) + 2K3(i) + K4(i) ) .

Вычисления удобно располагать в виде таблицы:

95

 

 

 

 

 

 

 

____

 

 

 

____

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'

 

 

 

 

 

 

yi

 

 

 

 

 

 

 

i

X k , k =

0, 3

Yk , k = 0, 3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

yi = f (X k

,Yk )

K (i)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

X 0

= x0

 

 

 

 

 

 

 

 

Y0

= y0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

f (X 0 ,Y0 )

 

K1(o) = f (X 0

,Y0 )

 

 

1

(0)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

y0 =

6

h (K1

 

+

 

X1

= x0

+

 

 

h

 

Y1 = y0 + h f (x0 , y0 );

 

 

 

 

 

 

 

 

f (X

 

,Y )

 

K (o) = f (X

 

,Y )

 

 

 

2

 

 

пусть A = h f (x0 , y0 )

 

 

 

 

 

 

 

 

 

1

1

 

2

1

1

 

(0)

+

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+2 K2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+2 K3(0) +

 

 

 

0

X 2

= x0

+

 

 

h

 

Y2

= y0 +h f (x0 +

h

,

 

y0 +

A

);

 

 

f (X 2 ,Y2 )

 

K3(o) = f (X 2 ,Y2 )

 

 

 

 

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(0)

)

 

 

 

 

 

 

2

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

h

 

 

 

 

 

 

A

 

 

 

 

 

 

 

 

 

+K4

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

пустьB =h f (x

 

+

 

, y

 

+

 

 

)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

 

 

2

 

 

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

X

3

= x

0

+ h

Y = y

0

+ B

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

f (X

3

,Y )

 

K (o) = f (X

3

,Y )

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

 

4

3

 

 

 

 

 

 

 

 

 

 

 

 

 

Получили первую точку последовательности решения

:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

y1 = y0 + y0 , x1 = x0 + h

 

 

 

 

 

 

 

 

 

 

 

X 0

= x1

 

 

 

 

 

 

 

 

Y0

= y1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

f (X 0 ,Y0 )

 

K1(o) = f (X 0

,Y0 )

 

 

1

(0)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

y1 =

 

 

 

h (K1

+

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

6

 

X1

= x1

+

 

h

Y1 = y1 + h f (x1 , y1 );

 

 

 

 

 

 

 

 

f (X

 

,Y )

 

K (o) = f (X

 

,Y )

 

 

2

 

 

 

пусть A = h f (x , y )

 

 

 

 

 

 

 

 

 

1

1

 

2

1

1

 

(0)

+

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+2 K2

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+2 K3(0) +

 

 

 

X 2

= x1 +

 

 

h

 

Y2 = y1 +h f (x1 +

h

 

 

 

 

y1 +

A

 

f (X 2 ,Y2 )

 

K3(o) = f (X 2 ,Y2 )

 

 

 

 

 

2

 

 

2

,

 

2

);

 

 

 

 

 

 

 

 

+K(0))

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

h

 

 

 

 

 

 

A

 

 

 

 

 

 

 

 

4

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

пустьB =h f (x +

, y +

)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

2

 

1

 

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

X

3

= x + h

Y = y + B

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

f (X

3

,Y )

 

K (o) = f (X

3

,Y )

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

3

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

 

4

3

 

 

 

 

 

 

 

 

 

 

 

 

Получили вторую точку последовательности решения

:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

y2 = y1 + y1 , x2 = x1 + h ;

 

 

 

 

 

 

 

 

 

 

Продолжаем итерационный процесс до тех пор, пока не достигнем конца отрезка – точки b .

Примечание.

Данный метод имеет четвертый порядок точности. Поэтому величина шага, при котором найденное решение удовлетворяет заданной точности, ищется из соотношения (данное соотношение можно получить, применив правило Рунге):

h4 ε , где ε - заданная точность.

Приведем реализацию данного метода в системе Scilab.

96

Листинг 7.1.

//метод Рунге-Кутта четвертого порядка function[value] = f(x, y)

value = 0.5*(x - y); endfunction

y_0 = 1;

a_0 = 0; // начальная точка b_ = 3; // конечная точка h = 0.125; // шаг

n = (b_ - a_0)/h; // разбиение

iter = 0; // итерации

for i = 1:n // формирование массива ответов a(i) = 0;

end

a(1) = y_0; // нач. условие - первый элемент массива ответов

while iter < n

a_ = a_0 + iter*h;

K_1 = f(a_, a(iter + 1));

K_2 = f(a_ + h/2, a(iter + 1) + K_1*h/2); K_3 = f(a_ + h/2, a(iter + 1) + K_2*h/2); K_4 = f(a_ + h, a(iter + 1) + K_3*h);

dy = (1/6)*h*(K_1 + 2*K_2 + 2*K_3 + K_4);

//не забываем, что индекс массива начинается с 1,

//а не с 0(как в С)

a(iter + 2) = a(iter + 1) + dy; iter = iter + 1;

end

a

97

Рис. 1. Результат работы Листинга_7.1

2) Метод Эйлера

Данный метод носит еще название метода ломаных Пусть на отрезке [a;b] имеем задачу Коши:

y'= f (x, y),

y(x0 ) = y0 .

Метод основывается на том, что дифференциальное уравнение может быть решено на основе представления искомой функции в ряд Тейлора (причем из разложения в ряд Тейлора берется только первая производная). Тогда решение представимо в виде:

y = f (x0 ) + f '(x0 )(x x0 ) .

Разобьем отрезок [a;b] на n равных частей (заметим, что a = x0 ). Тогда i -ая точка отрезка находится по формуле:

98

xi = x0 +ih , где

h =

b a

.

 

 

 

n

Тогда получаем последовательность точек yi искомого решения:

yi+1 = yi + h f (xi , yi ) .

Приведем реализацию данного метода в системе Scilab.

Листинг 7.2.

//метод Эйлера

function[value] = f(x, y) value = 0.5*(x - y); endfunction

y_0 = 1;

a_0 = 0; // начальная точка b_ = 3; // конечная точка h = 0.125; // шаг

n = (b_ - a_0)/h; // разбиение

iter = 0; // итерации

for i = 1:n // формирование массива ответов a(i) = 0;

end

a(1) = y_0; // нач. условие - первый элемент массива ответов

while iter < n

a_ = a_0 + iter*h;

//не забываем, что индекс массива начинается с 1,

//а не с 0(как в С)

a(iter + 2) = a(iter + 1) + h*f(a_, a(iter + 1)); iter = iter + 1;

end

a