§ 2. Приближенное решение обыкновенного дифференциального уравнения методом Эйлера с уточнением
Другой модификацией этого же метода является нелинейная вычислительная схема: зная предыдущее значение уi, вычисляют у ~i+1 как у ~i+1 = уi + h уi , а затем определяют поправку к решению D у ~ i+1 по формуле D у ~i+1 = f(хi+1, уi+1) . Решение находится из уравнения
уi+1 = уi + h/2. [ f(хi,уi) + D у ~i+1 ] .
Эту вычислительную схему еще называют методом Эйлера - Коши.
Другая вычислительная схема, которую называют методом Эйлера с упорядочением решения, заключается в том, что каждое значение уi+1 = у(хi+1), где у(х) - искомое решение, а х i+1 = х0 + h. (I+1), i = 0, 1, ..., N, определяется по следующей схеме:
1) за начальное приближение берется
,
2) найденное значение уточняется по формуле
, где i = 1, 2, ..., N;
3) уточнение продолжают до тех пор, пока в пределах требуемой точности (заранее заданной) два последовательных приближения не совпадут, т.е.
,
где e - погрешность или любое малое число. После этого полагают уk+1 = уk+1-(i), где уk+1-(i) общая часть полученного ряда решений уk+1(i).
Иногда описанная выше схема называется методом Эйлера с итерационным уточнением решения.
Если после трех итераций решения в пределах требуемой погрешности не совпали, то следует либо уменьшить шаг, либо увеличить погрешность.
В заключение краткого обзора отметим, что метод Эйлера с итерационным уточнением наиболее часто применяется в вычислительной практике, так как дает погрешность порядка h2 , т.е. относится к методам второго порядка, несмотря на то, что сам метод Эйлера является методом первого порядка.
При решении обыкновенных дифференциальных уравнений методом Эйлера с итерационным уточнением значения уk+1 удобно пользоваться подпрограммой-функцией, формальные значения параметров которой не приводятся в виду простоты и понятности предлагаемой процедуры:
function eyler ( x,y,h,eps : real) : real;
var yk, y0 : real;
dn : boolean;
begin
dn := false;
y0 := y + func (x,y) * h;
repeat
yk := y + func (x,y0) * h * 0.5;
if abs ( yk - y0) < eps then
dn := true;
y0 := yk;
until dn;
eyler := y0;
end.
В подпрограмме-функции eyler используется процедура-функция func(х,у) для вычисления правой части задачи. Ее следует составлять для каждого случая отдельно.
Для проверки и тестирования процедуры составим таблицу приближенных значений интеграла дифференциального уравнения у' = х + соs (0.7 - у) на отрезке [0.7; 1.7] с шагом h= 0.1, удовлетворяющего начальным условиям у0(0.7) = =1.1, используя метод Эйлера с уточнением. Все вычисления произведем с точностью 10-5.
Процедура-функция, по которой вычисляется правая часть уравнения, выглядит:
function func (x,y: real) : real;
begin
func := x + cos (0.7 * y);
end;
Результаты работы программы приводятся в табл. 4.2.
Таблица 4.2
Решение дифференциального уравнения у' = х + соs (0.7 - у) |
|||
при h = 0.1 |
при h = 0.05 |
||
x = 0.70000 |
y = 1.100000 |
x = 0.700000 |
y = 1.100000 |
|
|
x = 0.750000 |
y = 1.135017 |
x = 0.80000 |
y = 1.169169 |
x = 0.800000 |
y = 1.170830 |
|
|
x = 0.850000 |
y = 1.207420 |
x = 0.90000 |
y = 1.241447 |
x = 0.900000 |
y = 1.244765 |
|
|
x = 0.950000 |
y = 1.282844 |
x = 1.000000 |
y = 1.316671 |
x = 1.000000 |
y = 1.321637 |
|
|
x = 1.050000 |
y = 1.361123 |
x = 1.100000 |
y = 1.394676 |
x = 1.100000 |
y = 1.401280 |
|
|
x = 1.150000 |
y = 1.442088 |
x = 1.200000 |
y = 1.475300 |
x = 1.200000 |
y = 1.483526 |
|
|
x = 1.250000 |
y = 1.525575 |
х = 1.300000 |
y = 1.558385 |
x = 1.300000 |
y = 1.568215 |
|
|
x = 1.350000 |
y = 1.611427 |
x = 1.400000 |
y = 1.643779 |
x = 1.400000 |
y = 1.655191 |
|
|
x = 1.450000 |
y = 1.699491 |
x = 1.500000 |
y = 1.731338 |
x = 1.500000 |
y = 1.744308 |
|
|
x = 1.550000 |
y = 1.789626 |
x = 1.600000 |
y = 1.820929 |
x = 1.600000 |
y = 1.835429 |
|
|
x = 1.650000 |
y = 1.881701 |
x = 1.700000 |
y = 1.912428 |
x = 1.700000 |
y = 1.928429 |
|
|
x = 1.750000 |
y = 1.975598 |
§ 3. ПРИБЛИЖЕННОЕ РЕШЕНИЕ ОБЫКНОВЕННОГО ДИФФЕРЕНЦИАЛЬНОГО УРАВНЕНИЯ МЕТОДОМ АДАМСА
Если дифференциальное уравнение у'= f(х, у) имеет в правой части сложное аналитическое выражение, то тогда применяют экстраполяционный метод Адамса, который не требует многократного подсчета правой части.
Пусть для дифференциального уравнения заданы начальные условия х = х0 , у = у0. Требуется найти решение уравнения у' = f(х, у) на отрезке [а, b].
Разобьем отрезок [а, b] равномерно на n частей точками хi = х0 + h.i, i = 0, 1, ..., n, h = (b - а)/n. Выберем произвольно элементарный отрезок, на котором проинтегрируем дифференциальное уравнение
или .
Для нахождения производной воспользуемся второй интерполяционной формулой Ньютона, ограничившись разностями третьего порядка с учетом t = (х - хi)/h:
Подставим полученное выражение для у' в интегральное уравнение и, учитывая, что dх = hdt, имеем
Обозначим через qi = уi'; h = f(хi, уi).h, , тогда для любой разности Dm qi = Dm (уi'h) имеем выражение
Dyi = qi + 1/2 . Dqi-1 + 5/12 . D2qi-2 + 3/8 . D3qi-3,
используемое для получения решения уравнения
уi+1 = уi + Dуi.
Две последние формулы являются основными в экстраполяционном методе Адамса.
Схема предлагается из работы [Численные ..., 1976]. Для начала процесса вычисления нужны четыре начальных значения у0, у1, у2 и у3, которые можно определить любым известным методом. Далее, зная у0, у1, у2 и у3 , находят q0 = =hy0’ = h f(x0, y0); q2 = hy2’ = h f(x2, y2); q3 = hy3’ =h f(x3, y3); q4 = hy4’ = h f(x4, y4) и составляют таблицу конечных разностей величин q (табл. 4.3)
Таблица 4.3
№ п/п |
xi |
yi |
Dyi |
yi’=f(x0,y0) |
qi = hyi’ |
Конечные разности |
||||||||
0 |
x0 |
y0 |
|
f(x0,y0) |
— |
— |
— |
— |
||||||
1 |
x1 |
y1 |
|
f(x1,y1) |
q0 |
Dq0 |
D2q0 |
D3q0 |
||||||
2 |
x2 |
y2 |
|
f(x2,y2) |
q1 |
Dq1 |
D2q1 |
|
||||||
3 |
x3 |
y3 |
Dy3 |
f(x3,y3) |
q2 |
Dq2 |
|
|
||||||
4 |
x4 |
y4 |
|
f(x4,y4) |
q3 |
|
|
|
||||||
5 |
x4 |
y5 |
|
... |
... |
|
|
|
||||||
... |
... |
... |
|
|
|
|
|
|
Метод Адамса заключается в продолжении данной таблицы разностей с помощью формулы для Dуi. Используя уже вычисленные q3, Dq2, D2q1 и D3q0, расположенные в таблице диагонально, по формуле для Dуi получают, полагая n = 3,
Dу3 = q3 + 0.5Dq2 + (5/12) . D2q1 + (3/8) . D3q0 ,
Dу3 вносят в таблицу и находят у4 = у3+Dу3. Затем, используя х4 и у4 находят f(х4,у4), q4, Dq3, D 2q2 и D3q1, т.е. новую диагональ. По этим данным определяют значение Dу4, которое тут же вносят в таблицу, и находят у5 = у4 + Dу4.
Таблицу продолжают по описанному алгоритму до ее заполнения, вычисляя правую часть формулы при этом только один раз. Чтобы оценить погрешность полученного результата, можно применить правило Рунге или просто следить за третьими разностями D3qi, которые считаются постоянными. Этого можно добиться, выбирая h каждый раз такой, чтобы выражение для оценки погрешности было |D3qi-1 - D3qi| < e. На практике h выбирают из неравенства h4 < e, где e - заданная точность решения.
Метод Рунге состоит в том, что сначала находится решение дифференциального уравнения при шаге h, а затем значение h удваивается и находится решение при новом шаге. Погрешность оценивается по формуле
e = (2m - 1) . |yn~ - y~2n| ,
где yn~ - значение приближенного вычисления при двойном шаге; m - порядок метода.
Процедура, реализующая указанную схему, может быть следующей:
prоcedure adams (a,b,h,eps,yn : real;
var yi:mas1);
type mas = array [1..20] of real;
var x0, y0, y : real; ff : text; i : integer;
xi, dyi, ysh, qi, dqi, d2qi, d3qi : mas;