- •Лабораторная работа №4
- •Донецк - 2003
- •I. Численные методы решения дифференциальных уравнений.
- •II. Методы Рунге - Куп а.
- •3. Модифицированный метод Эйлера.
- •III. Методы прогноза и коррекции.
- •Var X,XI,y,y1 : Ar; I : word;
- •6. Выводы, содержащие анализ точности и скорости сходимости рассмотренных методов.
Рис.2.
'рафическое
определение краевой задачи при решении
дифференциального
урав-
нения.
Теперь
приступим к решению заданного уравнения
численными методами:
Методы
Рунге - Кутта обладают следующими
отличительными свойствами:
Эти
методы одноступенчатые: чтобы найти
ут+| ,
нужна информация только о пре-
дыдущей
точке х„„
у,„.
Они
согласуются с рядом Тейлора вплоть до
членов порядка If
, где р
- различна для
различных методов и
называется порядком
метода.
Они
не требуют вычисления производных от
f(x,y)
, а
требуют только вычисления са-
мой
функции.
Именно
благодаря третьему пункту, эти методы
удобны для практических вычислений,
однако
для вычисления одной последующей точки
решения нам придется вычислять f(x,y)
не-
сколько раз при различных значениях
х
и
у.
1. Метод
Эйлера.
Один
из самых старых и широко известных
методов описывается формулой:
у
= у +
h-f(x
,у
)
J
m+1 *'
т \ т
у т/ (3)
Найденное
по формуле (3)
решение согласуется с разложением в
ряд Тейлора вплоть до
членов порядка
/?, т.е. данный
метод является методом Рунге - Кутта
первого порядка.
II. Методы Рунге - Куп а.
Этот
метод имеет довольно большую ошибку
приближения, кроме того, он очень
часто
оказывается неустойчивым -
малая ошибка (происходящая от приближения,
округления или ис-
ходных данных)
увеличивается с ростом х.
Для
вычисления ym+i
метод Эйлера использует наклон
касательной только в точке х„„ут.
11иже
приведены листинг программы, отражающей
суть метода Эйлера и результаты
вы-
числения для трех различных
величин шага h.
{ ЛАБОРАТОРНАЯ
РАБОТА № 4.
"ЧИСЛЕННЫЕ МЕТОДЫ"
Программа
№
1
: METHOD
EYLERA }
Program lab_4_l;
Uses Crt;
Const N_max
=
50 00;
X_beg
= 1 { переменная
X - начальное условие };
Y_beg
= 1 { переменная
Y - начальное условие };
X_kon
=8.5 { требуемое
конечное значение аргумента };
h =
0.1; { (h=0.1,0.05,0.015)
- величина шага
}
Type Ar
= array[0..N_max]
of real;
Var X,Y
: Ar;
i, n :
word;
{ - —
}
Function F (X,
Y :real)
: real;
{
функция вычисления уравнения f(x,у)
)
Begin
F:=
(2/(X*X*X))
- (3 * Y)/X;
End {
F };
(
}
Begin
ClrScr;
X[0]:=
X_beg; Y[0]:= Y_beg;
i :
= 0 ;
While X[i] <=
X_kon do
Begin
[i + 1]
: =Y [i]+h*F(X[i] ,Y[i]
) ;
inc
(i) ;
X[i+1] :=
X[i]+h
{
формирование следующей переменной X
}
End;
Writeln('
15,'Step
=
’,h:1:3); { печать
результатов )
Writeln
(' ':10,'Y_rez
['Д,']
= 1 ,Y[i]
:3:5) ;
Repeat
Until
KeyPressed
End.
Результаты
работы программы:
Step =
0.1
Y_rez
[76] = 0.02434
Step =
0.05
Y_rez [150] =
0.02546
Step =
0.015
Y_rez
[502] =
0.02578
И
так, мы видим,
что даже лучший полученный результат
все же «не дотягивает» до на-
шего
эталонного. Следует отметить, что с
уменьшением значения шага, результат
все больше при-
ближается
к ранее найденному, и, соответственно,
ошибка вычисления уменьшается. В
квадрат-
ных скобках указывается,
сколько промежуточных результатов
было произведено, чтобы вычис-
лить
конечный результат (точнее, на сколько
отрезков был разбит график функции от
исходного
до конечного значения
переменной X).
Этот
метод можно усовершенствовать множеством
различных способов. Ниже приведены
два
(исправленный и модифицированный)
усовершенствованных
метода Эйлера.
Исправленный
метод Эйлера.
В
исправленном методе Эйлера мы находим
средний тангенс угла наклона
касательной
для двух точек хт,
ут и хт+ь
ут +
h*y’m.
Соотношения, описывающие данный метод,
имеют вид:
Листинг
и результаты работы программы:
{ ЛАБОРАТОРНАЯ
РАБОТА № 4.
"ЧИСЛЕННЫЕ МЕТОДЫ"
Программа
№
2 : ISPRAVLEHHY METHOD EYLERA }
Program
lab_4_2;
Uses Crt;
Const N_max
= 5 00 0;
X_beg
=
1 { переменная
X - начальное условие };
Y_beg
=
1 { переменная
Y - начальное условие };
X_kon
=8.5 { требуемое
конечное значение аргумента }
h =
0.1; { (h=0.1,0.01,0.005)
- величина шага
}
Type Ar =
array[0..N_max]
of real;
Var X,Y
: Ar;
i,
n : word;
Function F (X, Y :real)
: real;
{
функция вычисления уравнения f(x,y)
}
Begin
F:=
(2/(X*X*X))
- (3*Y)/X;
End {
F };
{
}
Function Fii (X, Y,
h :real) : real;
Var F_tool :
real;
Begin
F_tOOl:=F(X,Y);
Fii :=
(1/2)*(F(X,Y) +
F(X+h, Y+h*F_tool));
End
{ Fii };
{
}
Begin
ClrScr;
X[0]:=
x_beg; Y[0]:=
Y_beg;
i : =0 ;
While X[i] <
X_kon do
Begin
[i + 1]
:=Y[i]+h*Fii(X[i],Y[i]
, h) ;
inc(i);
X [i] :=
X[i-l]+h;
End;
Writeln('
1:15,'Step
= ',h:1:3);
Writeln (' 1:10,'Y_rez
[',!,*] = 1,Y[i]:3:5);
Repeat