Professional Documents
Culture Documents
Untitled
Untitled
ü Персонална информация
ü Условие на задачата
Имаме:
u' H0L = 1
2
(6)
π
u =0 (7)
2
ü Брой интервали
N = 10
2 ОДУ 2-ри ред
+ O HhL
u1 − u0
u'0 = (10)
h
По-точно за грешката имаме:
0 + O Ih M − u0 − u0 = 0 + O Ih M
u1 − u0 1 h2 h
Ψ0 = − u'0 = u0 + h u'0 + u'' 3 '
u'' 2
(11)
h h 2 2
Т.е.:
0 + O Ih M
u1 − u0 h
u'0 = − u'' 2 (12)
h 2
Предвид началния вид на уравнението (1) за u''0 имаме:
u''
0 = q0 u0 + f0 (13)
Заместваме в (12):
Hq0 u0 + f0 L + O Ih2 M
u1 − u0 h
u'0 = − (14)
h 2
Т.е. получихме апроксимация за u'0 с грешка OIh2 M. Остава да заместим в граничното условие (2):
Hq0 y0 + f0 L = μ1
y1 − y0 h
α1 y0 + β1 − (15)
h 2
Светлин Анков 3
Правим същото и за второто гранично условие, но този път използваме backward разлика:
+ O HhL
un − un−1
u'n = (16)
h
Тогава:
n + O Ih M n + O Ih M
un − un−1 1 h2 h
Ψn = − u'n = un − un − h u'n + u'' 3
− u'n = − u'' 2
(17)
h h 2 2
Т.е.:
n + O Ih M
un − un−1 h
u'n = + u'' 2 (18)
h 2
За u''n от (1) имаме:
u''
n = qn un + fn (19)
Заместваме в (18):
Hqn un + fn L + O Ih2 M
un − un−1 h
u'n = + (20)
h 2
Последно заместмаме в граничното условие (2):
Hqn yn + fn L = μ2
yn − yn−1 h
α2 yn + β2 + (21)
h 2
След известно подреждане на коефициенти получаваме следното представяне, готово за директно решение с метода на
прогонката.
ai yi−1 + + =
Iα1 − β1 h − β1 2 q0 M
ci yi
Iβ1 h M y1
bi yi+1 fi
1 h 1 h
y0 + = μ1 + β1 f0 , i=0
I h2 M yi−1 I− h2 − qi M yi I h2 M yi+1
2
1 2 1 (22)
+ + = fi , i = 1, ..., n − 1
I−β2 h M yn−1 Iβ2 h + β2 2 qn + α2 M
1 1 h h
+ yn = μ2 − β2 2
fn , i=n
Т.е. имаме:
f0 , ..., fn , брой : n + 1
c0 , ..., cn , брой : n + 1
b0 , ..., bn−1 , брой : n , bn = 0
a1 , ..., an , брой : n , a0 = 0
4 ОДУ 2-ри ред
ü Реализация
ü Метод на прогонката
Получаваме данните във вид на вектори (не като матрица), което има смисъл предвид специализираността на метода.
Друг е въпроса, че този метод, представляващ модификация на този на Гаус, може да бъде използван за
по-икономичното решаване на n-диагонална матрица, където представянето на данните като вектори (а не като sparse
матрица например) вероятно ще е по-неудобно. Също тук са пропуснати известна доза проверки за валидност на
началните данни – практика срещана във функционалното програмиране.
H∗ Изчистваме символа преди да го въведем. Когато сменяме
сигнатурите на функциите би имало проблеми, ако не го направим ∗L
ClearAll@tridiagD;
Изисквания
Пример
tridiag@8a1, a2<, 8b0, b1<, 8c0, c1, c2<, 8f0, f1, f2<D решава системата
ê c0 b0 0 \\ ê f0 \\
» a1 c1 b1 » = » f1 »
\\ 0 a2 c2 ê \\ f2 ê
";
H∗
Тъй като в Mathematica всичко е изрази Hвключително и списъците, т.е. векторитеL,
нулевият елемент на един израз е запазен за главата му и следователно
индексите на елементите на един вектор започват от единица. С цел
да не усложняваме излишно индексите сме въвели wrapping функции,
които оправят този проблем. Необходимо е да дефинираме и стойност за a0 =0,
тъй като тя се използва от формулите.
∗L
aa@0D = 0;
aa@i_D := aPiT;
bb@i_D := bPi + 1T;
cc@i_D := cPi + 1T;
ff@i_D := fPi + 1T;
bb@0D
α@0D = − ;
cc@0D
ff@0D
β@0D = ;
cc@0D
H∗
По−странният синтаксис се обяснява с употребата на динамично програмиране.
Тъй като стойностите на α и β се изчисляват рекурентно,
неколкократно пресмятане би било излишно.
При този подход стойностите веднъж пресметнати няма да се пресмятат отново.
6 ОДУ 2-ри ред
Коефициентите са променени,
поради необходимостта аргумента да е от вида i, а не i + 1.
∗L
bb@i − 1D
α@i_D := α@iD = − ;
cc@i − 1D + aa@i − 1D α@i − 1D
H∗ Запомняме стойността за y ∗L
y@nD = β@nD;
H∗
Връщаме стойностите във вид на вектор
Hкоито досега са били във вид на конкретни стойности за функцияL.
∗L
Array@y, nD
F
ü Диференчна схема
Сигнатура:
diffode2@qHxL,fHxL,8x0 ,xn <,8α1 ,β1 ,μ1 <,8α2 ,β2 ,μ2 <,nD
n – брой интервали
diffode2@q_, fx_, 8x0_, xn_<, 8α1_, β1_, μ1_<, 8α2_, β2_, μ2_<, n_D :=
H∗ името на входния параметър за f е fx,
за да ползвам f за коефициентите от 3−диаг. системата. ∗L
ModuleB
:
H∗ a,b,c,f → коефициенти в тридиагоналната система;
h−стъпка ∗L
xn − x0
a, b, c, f, h = ,
t1, i
>,
H∗ за i = 0 ∗L
β1 h
c@0D = α1 − − β1 q@x0D;
h 2
β1
b@0D = ;
h
h
f@0D = μ1 + β1 fx@x0D;
2
H∗ за i = 1, ..., n−1 ∗L
H∗ Тъй като всички стойности са константи,
най−ефективно е по следния начин: ∗L
8 ОДУ 2-ри ред
1
a@i_D = b@i_D = ;
h2
H∗ остава да въведем неконстантните стойности за c,
2
но преди това да сметним константната стойност ∗L
h2
2
t1 = ;
h2
H∗ за i = n ∗L
β2
a@nD = − ;
h
β2 h
c@nD = α2 + + β2 q@xnD;
h 2
h
f@nD = μ2 − β2 fx@xnD;
tridiag@
Array@a, n, 1D, Array@b, n, 0D, Array@c, n + 1, 0D, Array@f, n + 1, 0D
D
H∗ 8Array@a,n,1D,Array@b,n,0D,Array@c,n+1,0D,Array@f,n+1,0D< ∗L
F
Светлин Анков 9
rungeEstError::badinput =
"Моля, въвеждайте данните във вида:
rungeEstError@yh ,y h ,y h D,
2 4
− y h : 4n + 1";
4
ForBi = 1, i ≤ n, i ++,
α@iD =
IfByh2Pω@i, 2DT − yh4Pω@i, 4DT 0,
0,
FF
yhPω@i,1DT−yh2Pω@i,2DT
LogBAbsB
yh2Pω@i,2DT−yh4Pω@i,4DT
Log@2D
F;
F;
Array@α, nD
F
10 ОДУ 2-ри ред
Output функция
ClearAll@diffode2printD;
tableData = 8
n
NumberFormB
TableFormB
tableData,
TableHeadings → :None, :"xi ", "yh ", "y h ", "y h ", "αi ">>
F,
2 4
88, 8<
F
F;
Светлин Анков 11
ü Резултати
ü Проверка на метода
Преди да изведем крайните резултати, нека проверим дали методът не прави логически грешки, т.е. дали наистина
работи. За целта ще решим задачата с Mathematica и с diffode2 и ще сравним резултата. Нека търсим решение на
нашата задача в 30 точки:
soldiffode2 =
&, I2 Sin@ D + I3 + M Cos@ DM &, :0, >, 80, 1, 1<, 81, 0, 0<, 30F êê N
π
2
diffode2B3
2
8− 1.8702, − 1.81784, − 1.76581, − 1.71435, − 1.66362, − 1.61371, − 1.56461, − 1.51627,
− 1.46857, − 1.42132, − 1.37432, − 1.3273, − 1.27997, − 1.23201, − 1.18309, − 1.13285,
− 1.08094, − 1.02701, − 0.970692, − 0.911654, − 0.849558, − 0.784086, − 0.714936,
− 0.641826, − 0.564497, − 0.48271, − 0.396247, − 0.304912, − 0.208529, − 0.10694, 0.<
Същото използвайки adaptive Runge-Kutta (извинявам се за неудобния запис, но резултатът от NDSolve е малко
необичаен (във вид на InterpolatingFunction)).
solRG = ModuleB
8y, t1<,
Max@Abs@soldiffode2 − solRGDD
0.000352618
&, I2 Sin@ D + I3 + M Cos@ DM &, :0, >, 80, 1, 1<, 81, 0, 0<, 10F
π
2
diffode2printB3
2
uB F = 0
π
2
Интервали: 10
xi yh yh yh αi
2 4