- •Розділ 8 Чисельне розв’язання звичайних диференціальних рівнянь
- •8.1 Різницева апроксимація диференціальних рівнянь однокроковими методами
- •8.1.1 Метод Ейлера
- •8.1.2 Схеми Рунге-Кутта другого порядку
- •8.1.3 Схеми Рунге-Кутта четвертого порядку
- •8.2 Багатокрокові методи
- •8.2.1 Метод прогнозу і корекції
- •8.2.2 Методи Адамса
- •8.2.3 Стійкість різницевих методів
- •8.2.4 Жорсткі диференціальні рівняння
- •8.3 Метод скінченних різниць
- •8.4 Різницева задача на власні значення
- •Питання і завдання до розділу 8
8.2 Багатокрокові методи
8.2.1 Метод прогнозу і корекції
Підправивши схему Ейлера в середній точці одержимо схему прогнозу
,
(8.20)
де
наближене
значення
.
Використовувати формулу (8.20)
не можна через те, що схема прогнозу
нестійка. З цієї причини використовуємо
схему корекції
(8.21)
Для оцінки похибки
корекції розкладемо в ряд Тейлора в
околі точки
корекцію
та саму функцію
.
Віднявши ці два розкладання , отримаємо
.
(8.22)
Для оцінки похибки прогнозу розкладемо в ряд Тейлора в околі точки прогноз
та саму функцію
.
Віднявши ці два розкладання , отримаємо похибку прогнозу
.
(8.23)
З
цих оцінок зрозуміло, що прогноз наближає
розв’язок з недостачею, а корекція з
надлишком. Отже, точне значення розв’язку
лежить між прогнозом і корекцією. На
будь-якому кроці можна оцінити точність
розв’язку . Якщо задається її значення
,
то
.
Віднімаючи рівності (8.23) та (8.22), маємо
.
Уточнюємо розв’язок, виходячи з формули (8.22)
.
(8.24)
Відтак формула (8.24) завершує схему прогнозу і корекції. .
Приклад 1 Розв’язати задачу Коші для диференціального рівняння другого порядку:
Розв’язання. 1 Введемо нові змінні :
U=y;
V=
.
Тоді, обравши сітку
,
визначимо на ній сіткові функції
:
2 Знаходимо
і
(
)
за допомогою розкладання в ряд Тейлора
:
3
З диференціального рівняння
знаходимо
і
:
Визначаємо прогноз
розв’язку в точці
.
Тимчасово покладаючи
U2=P2 ;
,
можна отримати
Обчислюємо корекцію
.
Тепер можна визначити V2
І нарешті на даному кроці уточнюємо розв’язок
Похибка обчислення
.
Приклад 2
Використовуючи метод прогнозу і корекції,
реалізувати алгоритм розв’язку крайової
задачі для звичайного диференціального
рівняння з точністю
на псевдокоді.
Розв’язання
Після заміни
отримаємо (користуючись системою символічної математики Derive)
vo1:=-0.3-vo/(0.7)
vo2:=1-2*vo-(vo1*(0.7)-vo)/(0.7)^2
vo3:=-2*vo1-(vo2*(0.7)^3-2*(0.7)*(vo1*(0.7)-vo))/(0.7)^4
u1:=0.5+0.3*vo+vo1*(0.3)^2/2+vo2*(0.3)^3/6
(24018*vo+48307)/98000
v1:=vo+0.3*vo1+vo2*(0.3)^2/2+vo3*(0.3)^3/6
(2099500*vo-129339)/3430000
2*u1+3*v1=1.2
SOLVE(2*u1+3*v1=1.2,vo);
Simp(#9)
[vo=1122527/7979760]; Approx(#10)
[vo=5122/36411=0.140671]
тоді розв’яжемо систему:
//x0 – початкове значення
//xn – кінцеве значення
//h – початковий крок
//X,Y – масиви результатів
Prognose_Correction(x0,u0,v0,h,X,Y):
u01:=v01;
v01:=x0-2*u0-v0/x0
u02:=v01
v02:=1-2*u01-((v01*x0-v0)/sqr(x0))
u03:=v02
v03:=-2*u02-((v02*x0*sqr(x0)-2*v01*sqr(x0)+2*v0*x0)/sqr(sqr(x0)))
u1:=u0+h*u01+h*h*u02/2+h*h*h*u03/6
v1:=v0+h*v01+h*h*v02/2+h*h*h*v03/6
i:=0
while (x1<=xN) do
i++
repeat
x1:=x0+i*h
x2:=x0+(i+1)*h
v11:=x1-2*u1-v1/x1
u11:=v1
p2:=u0+2*h*u11
p2z:=v0+2*h*v11
u2:=p2
v2:=p2z
u21:=p2z
v21:=x2-2*p2-p2z/x2
c2z:=v1+h*(v11+v21)/2
v2:=c2z+(p2z-c2z)/5
u21:=v2
c2:=u1+h*(u11+u21)/2
u2:=c2+(p2-c2)/5
if abs(p2-c2)<eps then
X[i]:=x2;
Y[i]:=u2;
fi
if abs(p2-c2)>e then
h:=h/2;
fi
until abs(p2-c2)<eps;
done //while
end
