Bu usulning qulayligi shundaki, u diffirensial tenglama uchun chegaraviy masalani yechishni izlanayotgan funksiyaning ma’lum nuqtalardagi qiymatlariga nisbatan algebraik tenglamalar sistemasini yechishga olib keladi. Bunga diffirensial tenglamadagi hosilalarni chekli ayirmali approksimatsiya qilish orqali erishiladi.
Quyidagi
tenglamaning [a, b] kesmada
Lu u p x u q x u f x,
(5)
l0 y c1 ya c2 ya c,
l1 y d1 yb d2 yb d.
(6)
c1 c2
0,
d1 d2
0.
shartlarni qanoatlantiruvchi yechimini topish talab etilgan bo`lsin.
Masalani sonli yechish izlanayotgan u(x) haqiqiy yechimning x0, x1, x2,..., xn nuqtalardagi y0, y1,...yn taqribiy qiymatlarini topishdan iborat. xi, nuqtalar to`r tugunlari deb ataladi. Bir-biridan bir xil uzoqlikda joylashgan tugunlar sistemasidan hosil bo`lgan quyidagi tekis to`rni qo`llaymiz
xi=x0+ih, i=0,1,2,...,n.
Bundan
h – kattalik to`r qadami.
x0=a, xn=b, h=(b-a)/n.
Quyidagi belgilashlarni kiritamiz p(xi)=pi, q(xi)=qi, f(xi)=fi,
yxi
yi ,
yxi
yi,
y xi
yi.
yxi va
y xi
larni har bir ichki tugunda ayirmali markaziy hosilalar
yordamida approksimatsiyalaymiz
yxi
yi1 yi1
2h
Oh2 ,
y xi
yi 1 2 yi yi 1 Oh2 .
h2
Kesma oxirilarida bir tomonlama ayirmali іosilalarni qo`llaymiz
y0
y1 y0 h
Oh,
yn
yn yn1 Oh. h
Bu formulalarni qo`llab (5), (6) berilgan masala ayirmali approksimatsiyasini hosil qilamiz:
yi1 2 yi yi1 p yi1 yi1 q y
f ,
i 1, n 1,
h
2 i 2h
y1 y0
i i i
c1 y0 c2
c,
h
(7)
d
y
1 n
yn yn1
h
d.
Izlanayotgan echimning y0, y1,…, yn taqribiy qiymatlarini topish uchun (7) n+1 noma`lumli n+1 ta chiziqli tenglamalar sistemasini echish zarur. Bu sistemani CHATS ni echishning biron bir standart usullari (Gauss usuli, iteratsiya, Zeydel, bosh elementlar, relaksatsiya va h.k.) yordamida echish mumkin. Ammo (7) tenglamalar koeffitsientlaridan tuzilgan matritsa uch dioganallidir, shuning uchun uni echishda progonka usuli deb ataluvchi maxsus usulni qo`llaymiz.
sistemani quyidagi tarzda yozamiz
0 y0
0 y1
0
y
i i 1
i ,
i 1, 2,..., n 1,
(8)
bunda 0=- c1h+c2 , 0=c2 , 0=hc , I=fih2,
1 1
i 2
pi h ,
2 q h2 ,
i 1
pi h , 2
i 1,2,...,n 1
i
i
n= – d2 , n=-hd1- d2 , n=hd.
sistema echimini quyidagi ko`rinishda izlaymiz
yi=ui+viyi+1 , i=0, 1, . . . , n-1, (9) bu erada ui, vi , i=0,1,…,(n-1) lar progonka koeffitsientlari deb ataladi.
ni (8) ga qo`yib ui, vi lar uchun quyidagi rekkurent formulani hosil qilamiz:
i
i
v i ,
u i
i ui 1 ,
i 1, n.
(10)
i
i
i
vi 1
i
vi 1
Hisoblash sxemasini bir jinsli qilish uchun
0=0, n=0,
deb olamiz.
Progonka usuli ikki bosqichdan iborat.
Progonkaning to`g`ri yo`li. (10) bo`yicha i indes o`zgarishining o`sib borish tartibida ketma-ket ui, vi koeffitsientlar
0
v 0 ,
0
u 0 ,
0
0
(11)
qiymatlar yordamida hisoblanadi.
Progonkaning teskari yo`li. (9) formula bo`yicha i indeksning kamayish tartibida ketma-ket yn, yn-1,…,y0 kattaliklar aniqlanadi.
SHunday qilib n=0, u holda
vn=0 va yn=un , (12)
ya`ni progonkaning to`g’ri yo`lida vi , ui kattaliklar yordami bilan yn-1, yn-2, yn-3,…,y0 yechimlar hisoblanadi.
y9 u9 v9 y10
y8 u8 v8 y9
. . .
. . . . .
. . . . .
. . . . . .
4. Topshiriq variantlari
Masala. Ikkinchi tartibli oddiy diffirensial tenglama uchun (5), (6) chegaraviy masalani chekli ayirmalar usuli bilan yeching.
Barcha vaiantlar uchun
n=10, a=0, b=1, c2=0, d2=0.
Qolgan parametrlarning qiymatlari 2-jadvalda berilgan.
2-jadval
Var. №
|
p(x)
|
q(x)
|
f(x)
|
с1
|
с
|
d1
|
d
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
16
17
18
19
20
|
0,5+9,1x
|
26,5x+3
|
1,7
|
2,50
0,20
0,40
2,00
3,00
|
5,00
0,50
0,80
4,00
6,00
|
5,00
0,50
0,90
5,00
5,00
|
10,00
0,15
1,18
10,00
10,00
|
JURNALDAGI TARTIB RAQAMIM 19
C++ dagi kodi quyidagidan iborat bo’ladi
*******************************************************************************/
#include
#include
using namespace std;
int main()
{
float x[11],p[11],q[11],u[11],y[11],v[11],f=1.7;
u[0]=-2.5;
v[0]=0;
//cout<for(int i=0;i<=10;i++)
{
x[i]=i*0.1;
//cout<p[i]=0.5+9.1*x[i];
// cout<
q[i]=26.5*x[i]+3;
// cout<}
float alfa[11],betta[11],gamma[11];
for(int i=0;i<=10;i++)
{
alfa[i]=1-(0.1*p[i])/2;
betta[i]=2-q[i]*0.01;
gamma[i]=1+p[i]*0.1/2;
}
for(int i=1;i<=10;i++)
{ v[i]=gamma[i]/(betta[i]+alfa[i]*v[i-1]);
//cout<u[i]=(-f+alfa[i]*u[i-1])/(betta[i]+alfa[i]*v[i-1]);
}
y[10]=u[10];
for(int i=9;i>=0;i--)
{ y[i]=u[i]+v[i]*y[i+1];
cout<}
return 0;
}
Dostları ilə paylaş: |