Численное решение обыкновенных дифференциальных уравнений
Краткое введение.Дифференциальное уравнение первого порядка ,разрешенное относительно производной , имеет вид
y ' = f (x ,y ). (1)
Решением дифференциального уравнения (1) называется функция φ ( x ), подстановка которой в уравнение обращает его в тождество : φ ' ( x ) = f (x , φ ( x ) ) . График решения y = φ ( x )называется интегральной кривой.
Задача Кошидля дифференциального уравнения (1) состоит в том , чтобы найти решение уравнения (1) , удовлетворяющему начальному условию
(2)
пару чисел ( x0 , y0 ) называют начальными данными . Решение задачи Коши называется частным решениемуравнения ( 1 ) при условии ( 2 ) .
Численное решение задачи Коши ( 1 ) - ( 2 ) состоит в том , чтобы получить искомое решение φ ( x )в виде таблицы его приближенных решений для заданных значений аргумента xна некотором отрезке [ a , b ]:
X0 = a , x 1 , x 2 , . . . , x m = b ( 3 )
Точки (3) называются узловыми точками, а множество этих точек называется сеткойна отрезке [ a , b ] . Будем использовать равномерную сетку с шагом h :
h = ( b - a ) / m ; x i - x i - 1 = h или x i = x 0 + ih ( i = 1 , . . . , m ) .
Приближенные значения численного решения задачи Коши в узловых точках x i обозначим через y i ; таким образом ,
( i = 1 , . . . , m ) .
Для любого численного метода решения задачи ( 1 ) - ( 2 ) начальное условие ( 2 ) выполняется точно , т . е . .
Величина погрешности численного метода решения задачи Коши на сетке отрезка
[ a , b ] оценивается величиной
,
Говорят , что численный метод имеет p- й порядок точности по шагу h на сетке , если расстояние d можно представить в виде степенной функции от h :
, p > 0 ,
где c - некоторая положительная постоянная , зависящая от правой части уравнения (1) и от рассматриваемого метода . В данном случае очевидно , что когда шаг h стремится к нулю , погрешность d также стремится к нулю .
Метод Эйлера.Простейшим численным методом решения задачи Коши ( 1 ) - ( 2 ) является метод Эйлера.
Угловой коэффициент касательной к интегральной кривой в точке P0 ( x0 , y0 ) есть
y '0 = f (x0 ,y0 ).
Найдем ординату y1 касательной , соответствующей абсциссе x 1 = x 0 + h . Так как уравнение касательной к кривой в точке P 0 имеет вид y - y0 = y ' ( x - x0 ) , то
y1 = y0 + h f (x0 , y0 ).
Угловой коэффициент в точке P1 (x1 ,y1) также находится из данного дифференциального уравнения y'1 = f(x1,y1). На следующем шаге получаем новую точку P2 (x2 ,y2) , причем
x2 = x1 + h , y2 = y1 + hf(x1 ,y1) .
Продолжая вычисления в соответствии с намеченной схемой , получим формулы Эйлерадля m приближенных значений решения задачи Коши с начальными данными (x0 , y0) на сетке отрезка [ a , b ] с шагом h:
xi = xi -1 + h , yi = yi - 1 + hf(xi - 1 , yi - 1 ) ( i = 1,2 , . . . , m ) (4)
Графической иллюстрацией приближенного решения является ломаная , соединяющая последовательно точки P0 , P1, P2, . . . ,Pm , которую называют ломаной Эйлера .
Погрешность метода Эйлера можно оценить неравенством
или представить в виде
, где .
Это означает , что метод Эйлера имеет первый порядок точности . В частности , при уменьшении шага h в 10 раз погрешность уменьшится примерно в 10 раз.
Практическую оценку погрешности решения , найденного на сетке с шагом h/2 , в точке производят с помощью приближенного равенства - правила Рунге:
,(5)
где p - порядок точности численного метода. Таким образом , оценка полученного результата по формуле (5) вынуждает проводить вычисления дважды : один раз с шагом h , другой - с шагом h/2 .
Методы Рунге - Кутта.Численные методы решения задачи Коши
,
на равномерной сетке { x0 = a , x1 , x2 , . . . ,xm = b}отрезка[ a, b ]с шагом
h = ( b -a) /m являются методами Рунге - Кутта , если , начиная с данных (x0 ,y0 ), решение ведется по следующим рекуррентным формулам
(6)
Метод называют методом Рунге - Кутта порядка p ,если он имеет p - й порядок точности по шагу h на сетке .Порядок точности p достигается с помощью формул (6) при определенных значениях коэффициентов cj и dj ( j = 1,2, . . . ,p); c1 всегда полагают равным нулю.
Метод Рунге - Кутта второго порядка называют методом Эйлера - Коши , если p = 2 ,
c1 = 0 , c2 = 1 , d1 = d2 = 1/2. Алгоритм Эйлера - Коши получается из формул (6):
xi =xi-1 + h, yi = yi-1 + Δyi-1, Δyi-1 = (1/2)[ k1[i -1] + k2[i -1]] ( i = 1, ..., m), (7)
k1[ i - 1] = hf ( xi-1,yi-1), k2[ i - 1 ] = hf ( xi-1 + h , yi-1 + hf ( xi-1 ,yi-1) )
Для практической оценки погрешности решения можно применять правило Рунге, полагая в формуле (5) р = 2.
Метод Рунге - Кутта четвертого порядка называют классическим методом Рунге - Кутта, если p = 4 , c1 = 0 , c2 = c3 = 1/2 , c4 = 1 , d1 = d4 = 1/6 , d2 = d3 =1/3.
Из рекуррентных формул (6)получим алгоритм решения задачи Коши классическим методом Рунге - Кутта :
x I = x i - 1 + h , y i = y i - 1 + Δy i – 1 ( i = 1,2, . . . , m) ,
Δyi-1 = 1/6 [ k1[ i - 1] + 2 k2[ i - 1] + 2k3[ i - 1] + k4[ i - 1] ] ,
k1[ i - 1] = h f ( xi - 1 , yi -1) ,
k2[ i - 1 ] = h f( xi - 1 + (1/2) h , y i - 1 + (1/2)k1[ i - 1 ] ) ,
k3[ i - 1] = h f ( xi - 1 + (1/2)h , y i - 1 + (1/2)k2[ i - 1 ] ) ,
k4[ i - 1 ] = h f( xi - 1 + h , y i - 1 + k3[ i - 1 ] ) ,
Графиком приближенного решения является ломаная , последовательно соединяющая точки
Pi( xi , yi) ( i = 0 , 1 , 2, . . ., m). С увеличением порядка численного метода звенья ломаной приближаются к ломаной , образованной хордами интегральной кривой y = φ(x) , последовательно соединяющими точки ( xi , φ(xi) ) на интегральной кривой .
Правило Рунге (5) практической оценки погрешности решения для численного метода четвертого порядка имеет вид
Задание на работу .
Решить задачу Коши на равномерной сетке. Решение найти в четырех узловых точках
( шаг h1 равен [ b - a ] / 4 ) . Найти решение в тех же узлах, ведя расчет с уменьшенным вдвое шагом. Вычислить погрешности приближений при расчете с шагом h2 = h1 / 2
Задачу решить :
а) методом Эйлера ;
б) методом Эйлера - Коши ;
в) методом Рунге - Кутта .
Варианты лабораторных работ.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Вспомогательные материалы.
Пример
Решить задачу Коши
на равномерной сетке с шагом h = 0.1 . Решение найти в четырех узловых точках .
С помощью программы найти решение в тех же узлах, ведя расчет с уменьшенным вдвое шагом. Вычислить погрешности приближений при расчете с шагом h = 0.05
Задачу решить :
а) методом Эйлера ;
б) методом Эйлера - Коши ;
в) методом Рунге - Кутта .
Решение. Здесь f ( x,y) = x + y ; m = 4 ; a = 0 ; b = 0.4 ;
h = ( b - a ) / m = 0.4 /4 = 0.1
а) Используя рекуррентные формулы
x0 = 0 ; y0 = 1; xi = x i - 1 + 0.1; y i = y i - 1 + 0.1( x i - 1 + y i - 1 ) i = ( 1, 2, 3, 4 ) ,
последовательно находим
при i = 1 : x1 = 0.1 ; y1 = 1 + 0.1( 0 + 1 ) = 1.1 ;
при i = 2 ; x2 = 0.2 ; y2 = 1.1 + 0.1( 0.1 + 1.1 ) = 1.22 ;
при i = 3 ; x3 = 0.3 ; y3 = 1.22 + 0.1( 0.2 + 1.22 ) = 1.362 ;
при i = 4 ; x4 = 0.4 ; y4 = 1.362 + 0.1( 0.3 + 1.362 ) = 1.5282.
С помощью программы находим решение при h = 0.05 .
Обозначив , d i = | y i ( h ) - y i ( h/2) | сведем результаты вычислений в таблицу
I | x i | y i ( h ) | y i ( h / 2) | d |
0.1 | 1.1 | 1.105 | 0.005 | |
0.2 | 1.22 | 1.231012 | 0.011012 | |
0.3 | 1.362 | 1.380119 | 0.018191 | |
0.4 | 1.5282 | 1.554911 | 0.028738 |
б) Формулы ( 7) в нашем случае принимают вид
k1[ i - 1] = h ( xi-1 + yi-1), k2[ i - 1 ] = h ( xi-1 + h + yi-1 + k1[ i - 1])
xi =xi-1 + h , yi = yi-1 + (1/2)[ k1[i -1] + k2[i -1]] ( i = 1, 2 , 3 , 4) .
Полагая x 0 = 0 , y 0 = 1 , последовательно находим
при i = 1 :
k1[ 0 ] =0.1( 0 + 1 ) = 0.1 ; k2[ 0 ] = 0.1( 0 + 0.1 + 1 + 0.1) = 0.12 ;
x1= 0 + 0.1 = 0.1 ; y1 = 1 + ( 1/2 )( 0.1 + 0.12 ) = 1.11 ;
при i = 2 :
k1[ 1 ] =0.1( 0.1 + 1.11 ) = 0.121 ; k2[ 1 ] = 0.1( 0.1+0.1+1.11+0.121) = 0.1431 ;
x1= 0.1 + 0.1 = 0.2 ; y1 = 1.11+(1/2)(0.121+0.143) = 1.2425 .
Далее получаем при i = 3 : x 3 = 0.3 ; y 3 = 1.398465 ;
При i = 4 : x 4 = 0.4 ; y 4 = 1.581804 .
С помощью программы проводим вычисления с половинным шагом . Результаты заносим в таблицу , аналогичную таблице пункта а) .
в) Из формул (8 ) получаем
k1[ i - 1] = h ( xi-1 + yi-1), k2[ i - 1 ] = h ( xi-1 + (1/2)h + yi-1 +(1/2) k1[ i - 1])
k3[ i - 1 ] = h ( xi-1 + (1/2)h + yi-1 +(1/2) k2[ i - 1])
k4[ i - 1 ] = h ( xi-1 + h + yi-1 + k3[ i - 1])
xi =xi-1 + h , yi = yi-1 + (1/6)[ k1[i -1] + 2k2[i -1] + 2k3[i -1] + k4[ i - 1 ]]
для i = 1, 2 , 3 , 4 .
Полагая x 0 = 0 , y 0 = 1 , последовательно находим
при i = 1 :
k1[ 0 ] =0.1( 0 + 1 ) = 0.1 ; k2[ 0 ] = 0.1( 0 + 0.05 + 1 + 0.05) = 0.11 ;
k3[ 0 ] = 0.1( 0 + 0.05 + 1 + 0.055) = 0.1105
k4[ 0 ] = 0.1( 0 + 0.1 + 1 + 0.1105) = 0.121050
x1= 0 + 0.1 = 0.1 ; y1 = 1 +( 1/6 )( 0.1 + 2*0.11+2*0.1105+
+0.12105 ) = 1.110342 ;
при i = 2 :
k1[ 1 ] =0.1( 0.1 + 1.110342 ) = 0.1210342 ;
k2[ 1 ] = 0.1( 0.1 + 0.05 + 1.110342 + 0.0605171) = 0.1326385 ;
k3[ 1 ] = 0.1( 0.1 + 0.05 + 1.110342 + 0.06604295) = 0.1326385 ;
k4[ 1 ] = 0.1( 0.1 + 0.1 + 1.110342 + 0.1326385) = 0.1442980 .
x2= 0.1 + 0.1 = 0.2 ;
y2 = y1 +( 1/6 ) [ k1[1] + 2 k2[1] +2 k3[1] + k4[1]] = 1.242805 ;
Далее получаем при i = 3 x3 = 0.3 ; y3 = 1.399717 ;
i = 4x4 = 0.4 ; y4 = 1.583648 ;
С помощью программы проводим вычисления с половинным шагом . Результаты заносим в таблицу .
2. Блок - схемачисленного решения задачи Коши для дифференциального уравнения первого порядка методами Эйлера , Эйлера - Коши и Рунге - Кутта
|
|
|
|
3. Пример программы для функции y / = x + y
program DifEquationsFirstOrder;
{*******************************************************}
uses Crt;
const
c:array[1..4] of real = (0,0.5,0.5,1);
type
coef = array[0..4] of real;
var
i,j,m:integer;
a,b,h,x,y,y1,y2,y3:real;
k0,k:coef;
ch:char;
{-----------------------SUBROUTINES---------------------}
{ Y = F ( x ,y ) (f = x+y) }
function f(x,y:real):real;
BEGIN
f := x + y
END;
{-------------------------------------------------------}
procedure Pausa;
BEGIN
WRITELN;WRITELN ( 'Для продолжения нажмите любую клавишу ...');
REPEAT ch := readkey UNTIL ch <> '';
END;
{------------------ОСНОВНАЯ ПРОГРАММА-------------------}
BEGIN
ClrScr;
WRITELN ( 'Введите значения концов отрезка [a,b]');
READ (a,b);
WRITELN ( 'Введите начальное значение функции y0 при x=x0 ');
READ (y);
WRITELN (' Введите число значений функции на промежутке [a,b]');
READ (m);
x:= a; h:= (b-a) / m; y1:= y; y2:= y; y3:=y;
WRITELN (' Метод Эйлера Метод Э.-Коши Метод Р.-Кутта');
WRITELN ( 'x=' ,x:5:2,' y1=',y:9:6,' y2=',y2:9:6,' y3=',y3:9:6);
FOR i:= 1 TO m DO
BEGIN
y1:= y1 + h*f(x,y1);
FOR j:=1 TO 2 DO
k0[j]:=h*f(x+2*c[j]*h , y2+2*c[j]*k0[j-1]);
y2:= y2+(k0[1]+k0[2]) / 2 ;
FOR j:=1 TO 4 DO
k[j]:= h*f(x+c[j]*h, y3+ c[j]*k[j-1]);
y3:= Y3+ (k[1]+2*k[2]+2*k[3]+k[4]) / 6;
x:= x+h;
WRITELN ('x=',x:5:2,' y1=',y1:9:6,' y2=',y2:9:6,' y3=',y3:9:6);
END;
PAUSA;
END.