Metod Adamca

advertisement
Метод Адамса
При решении задачи Коши методами Рунге-Кутты необходимо
вычислять правые части ОДУ в нескольких точках на каждом
шаге. Количество точек зависит от порядка используемого метода
После того как искомая интегральная кривая у(х) определена в
нескольких точках х0, x1,..., xn, можно применить алгоритмы
интерполяции и сократить количество вычислений правых частей
ОДУ для получения решения в очередной точке хп+1. Подобные
методы называют многоточечными, или многошаговыми.
Известно несколько типов таких методов.
Алгоритмы многоточечных методов основываются на
аппроксимации интерполяционными полиномами либо правых
частей ОДУ, либо интегральных кривых yk(х).
Рассмотрим четырехточечный вариант одного из методов первого
типа для задачи Коши, сформулированной в виде.
dy( x )
 f ( x , y ), y( x0 )  y0
x
С помощью любой из схем вычислим решения y1, y2, y3 заданного
дифференциального уравнения в точках x1, x2, x3. Правая часть
уравнения f(x, у) на интегральной кривой, соответствующей
начальному условию, будет функцией только одного аргумента х
f(x) = f(x,y(x)),
значения которой в рассматриваемых точках обозначим f0, f1, f2, f3.
В окрестности узлов х 0 ,..., х3 функцию f(x) приближенно заменим
интерполяционным полиномом Ньютона
( Pn(x) = A0 + A1(x-x0) + A2(x-x0) (x-x1) +…+ An(x-x0) (x-x1)…(x-xn-1) )
f(x)  f0 + f01(x-x0) + f012 (x-x0) (x-x1) + f0123 (x-x0) (x-x1)( x-x2), (1)
где f01, f012, f0123 – разделенные разности
A1 
f0  f1
 f 01
x0  x1
A2 
f 01  f 02
 f 012 ,
x1  x2
f 02 
f0  f 2
x0  x2
A3 
f 012  f 013
 f 0123
x2  x3
f 01  f 03
x1  x3
f 013 
f 03 
f0  f3
x0  x3
Представим искомое решение в точке х4 = х3 + h в виде
тейлоровского разложения около точки х3
h2
h3
h4
y4  y3  hf 3 
f ' ( x3 ) 
f ' ' ( x3 ) 
f ' ' ' ( x3 )  O( h5 )
2
6
24
(2)
где f’, f’’, f’’’ - производные по х от правой части дифференциального
уравнения в точке х3.
Дифференцируя полином (1), получим выражения для
производных
f’(x) = f01 + f012 (x-x0 + x-x1) + f0123[ (x-x0) (x-x1) + (x-x0) (x-x2) + (x-x1) (x-x2)],
f’’(x) = 2 f012 + 2 f0123(x-x0 + x-x1 + x-x2),
f’’’(x) = 6 f0123
Последние соотношения при х = х3 в случае равноотстоящих узлов
после подстановки в них раделенных разностей принимают вид
f’(x3) = (-2f0 + 9f1 – 18f2 + 11f3)/(6h),
f’’(x3) = (-f0 + 4f1 – 5f2 + 2f3)/ h2,
(3)
f’’’(x3) = (-f0 + 3f1 – 3f2 + f3)/h3
Подставляя производные (3) в разложение (2), получим
экстраполяционную формулу Адамса
y4 = y3 + (55 f3 - 59 f2 + 37f1 - 9f0) h /24 + О (h5), (4)
имеющую пятый порядок локальной погрешности и четвертый глобальной. Изменяя количество членов, учитываемых в ряде (2),
можно получить cхемы Адамса различных порядков. Остаточный
член формулы (4) равен (251/750) h5 f4 (x). Значительная величина
коэффициента в остаточном члене обусловлена тем, что точка х4
лежит вне интервала расположения узлов [х0, х3] по значениям
функции f(x), в которых построен интерполяционный полином. То
есть мы имеем дело с экстраполяцией, погрешность которой в
соответствии с оценкой
f ( x )  Pn ( x ) 
M n 1
( n  1 )!
n
 xx
j
,
i 0
где
M n 1  max f ( n 1 ) ( x )
всегда больше, чем при интерполяции.
С целью уменьшения погрешности способом, аналогичным
получению формулы (4), по узлам х1, х2, х3, х4 строится
интерполяционная формула Адамса
y4 = y3 + (9 f4 + 19 f3 - 5f2 + f) + О (h5)
(5)
Последняя формула является неявной, так как искомая величина у4
необходима для вычисления значения функции f4 = f(x4, y4),
входящего в правую часть. Выражение (5) можно рассматривать
как нелинейное уравнение относительно неизвестной величины у4
Наиболее часто здесь используется метод простых итераций, хотя
в некоторых случаях оказывается более предпочтительным метод
Ньютона. Следует иметь в виду, что каждая итерация потребует
нового вычисления правой части дифференциального уравнения
f(x,у). Решение, определенное по экстраполяционной формуле (4),
обычно выбирается в качестве начального приближения для
итерационных методов. Поэтому выражение (4) рассматривается
как формула прогноза, тогда выражение (5) является формулой
коррекции.
Таким образом, вычисления на каждом шаге интегрирования
дифференциального уравнения осуществляются по схеме Р(ЕС)т-1Е,
где этапы вычислительного процесса обозначены буквами Р прогноз; Е - вычисление функции f(x, у); С - коррекция; m количество итераций коррекции . Приводится эмпирическое
правило, согласно которому погрешность решения убывает только
до тех пор, пока т ≤ р, где р - порядок используемого неявного
метода. Следовательно, для метода четвертого порядка не
следует выполнять более четырех итераций коррекции. С другой
стороны, отмечается, что схема P(EC)m-1 E является более
устойчивой в смысле накопления вычислительной погрешности
по сравнению со схемой Р(ЕС)тЕ, следовательно, наиболее выгодной
будет схема РЕСЕ. При реализации последней схемы на каждом
шаге интегрирования осуществляется только одна коррекция.
Формулы (4) и (5) без изменений переносятся на системы ОДУ
первого порядка, записанные в форме Коши.
Текст програмы:
uses crt;
type vec=array[1..8] of real;
var p,x,x9,h:real; y:vec;
procedure rp(x:real; var y,f:vec); (*-Proizvodnie-*)
begin
f[1]:=y[2]; f[2]:=(sqr(p/x)-1.0)*y[1]-y[2]/x
end;
procedure rk4(n:integer; x,h:real; var y:vec);
var i,j:integer;
(*-Metod rynge-kytti 4 porjadka-*)
h1,h2,q:real; y0,y1,f:vec;
begin
h1:=0.0; h2:=h/2;
for i:=1 to n do begin y0[i]:=y[i]; y1[i]:=y[i] end;
for j:=1 to 4 do begin rp(x+h1,y,f);
if j=3 then h1:=h else h1:=h2;
for i:=1 to n do begin q:=h1*f[i]; y[i]:=y0[i]+q;
if j=2 then q:=2*q; y1[i]:=y1[i]+q/3.0
end
end;
for i:=1 to n do y[i]:=y1[i]
end;
procedure ad(n:integer; x,x9,h:real; var y:vec);
var i,k:integer; h4:real; y1,f,f1:vec;
d:array [1..2,1..8] of real;
begin
(*-metod Adamca-*)
h4:=h/24.0; rp(x,y,f1);
for k:=1 to 3 do begin rk4(n,x,h,y); x:=x+h;
writeln(x:8:6,' ',y[1]:8:6,' ',y[2]:8:6);
if k<>3 then begin rp(x,y,f);
for i:=1 to n do d[k,i]:=f[i]
end
end;
repeat rp(x,y,f);
for i:=1 to n do
y1[i]:=y[i]+h4*(55*f[i]-59*d[2,i]+37*d[1,i]-9*f1[i]);
x:=x+h; rp(x,y1,f1);
for i:=1 to n do begin
y[i]:=y[i]+h4*(9*f1[i]+19*f[i]-5*d[2,i]+d[1,i]);
f1[i]:=d[1,i]; d[1,i]:=d[2,i]; d[2,i]:=f[i]
end;
writeln(x:8:6,' ',y[1]:8:6,' ',y[2]:8:6)
until (x>=x9)=(h>0.0)
end;
BEGIN
(*-Osnovnaja programa-*)
clrscr;
repeat write('p,x,x9,h,y[1],y[2]?');
readln(p,x,x9,h,y[1],y[2]); ad(2,x,x9,h,y)
until false
END.
Результат работы программы:
Входные данные
p=0, x=1, x9=10, h=0.125 y1=0.7651977, y2=-0.4400506
Ожидаемый результат:
y1= -0.245982 y2= -0.0434078
Входные данные
p=0, x=1, x9=10, h=0.0625 y1=0.7651977, y2=-0.4400506
Ожидаемый результат:
y1= -0.245939 y2= -0.0434682
Download