Eylerning 1-takomillashtirilgan usuli
Ushbu usulda f(xi, yi) ning o‘rniga f(xi, yi) va f(xi+1, yi+1) larning o‘rta arifmetigi olinadi. U holda
(*)
Bu oshkormas sxema hisoblanib, uni ikkita iteratsiya bilan amalga oshiriladi: avvalo yi ni dastlabki qiymat deb hisoblab, bo‘yicha birinchi yaqinlashish topiladi:
,
So‘ngra bu qiymatni (*) ning o‘ng qismidagi yi+1 ning o‘rniga olib borib qo‘yiladi:
2-misol. tenglamani yeching, bunda [0;1] da va deb oling.
Yechilishi: va
da
da ;
da ;
va hokazo hisoblashlar bajariladi.
3. Eylerning 2-takomillashtirilgan usuli
Har bir olingan yi qiymat uchun iteratsion qayta ishlashni qo‘llab, Eyler usulini yanada aniqlashtirish mumkin.
Xususan, oldiniga
birinchi qo‘pol yaqinlashishdan kelib chiqib, quyidagi sxema bo‘yicha iteratsion jarayon quriladi
.
Ikkita ketma-ket , yaqinlashishlarning mos o‘nlik belgilari ustma-ust tushmaguncha iteratsiya davom etadi va deb faraz qilinadi.
Qoidaga ko‘ra, yetarlicha h kichik qadamlarda iteratsiya tezroq yaqinlashadi. Agar 3-4 iteratsiyadan keyin ham mos o‘nlik belgilari ustma-ust tushmasa, hisoblash qadami h kichraytiriladi. yi qiymatni bunday qayta ishlashdan keyin navbatdagi xi+1 tugunga o‘tiladi.
3-misol. [0;1] kesmada tenglamaning yechimlari jadvalini Eyler usuli yordamida tuzing. Bunda qadamni h = 0.2, boshlang‘ich shartni y(0) = 1 deb oling.
Hisoblash natijalarini jadvalga joylashtiramiz:
i
|
xi
|
yi
|
yi
|
Aniq yechim
у =
|
0
|
0
|
1,0000
|
0,2000
|
1,0000
|
1
|
0,2
|
1,2000
|
0,1733
|
1,1832
|
2
|
0,4
|
1,3733
|
0,1561
|
1,3416
|
3
|
0,6
|
1,5294
|
0,1492
|
1,4832
|
4
|
0,8
|
1,6786
|
0,1451
|
1,6124
|
5
|
1,0
|
1,8237
|
|
1,7320
|
Birinchi satrda i = 0 bo‘lganda x0 = 0, y0 =1,000 deb yoziladi va shular asosida f(x0, y0) = 1 hisoblanadi, so‘ngra y0=hf(x0, y0)= 0,2 topiladi. U holda formuladan y1=1+0,2 = 1,2 qiymatni olamiz.
i = 1 bo‘lgandagi x1 = 0,2 va y1 = 1,2000 qiymatlar 2-satrga yoziladi. Ulardan foydalanib, quyidagilarni hisoblash mumkin:
f(x1,y1) = 0,8667; y1=hf(x1,y1)=0,20,8667=0,1733.
U holda y2 = y1 + y1 = 1,2 + 0,1733 = 1,3733.
i=2,3,4,5 bo‘lgan hollar uchun ham shunga o‘xshash hisoblashlar bajariladi. Jadvalning oxirgi ustuniga taqqoslash maqsadida aniq yechim joylashtirilgan. Jadvaldan ko‘rinadiki, y5 uchun absol’yut xatolik ga teng, ya’ni 9% foizni tashkil etadi.
Eyler usulida , y(0) = 1, [0;1], h = 0.2 Koshi masalasini yechish dasturi:
#include
#include
using namespace std;
int main()
{
const int n=5;
double a=0, b=1, h,x[n], y[n],z[n],e[n];
h=(b-a)/n;
x[0]=0; y[0]=1;
for(int i=0;i<=n;i++)
{
x[i+1]=x[i]+h;
y[i+1]=y[i]+h*(y[i]-2*x[i]/y[i]);
}
for(int i=0; i
{
z[i]=pow(2*x[i]+1,1/2);
e[i]=(z[i]-y[i]);
cout<
}
return 0;
}
Ikkinchi tartibli Runge-Kutta usuli. Ushbu usul asosida turli aniqlik darajalariga ega bo‘lgan ayirmaviy sxemalarni qurish mumkin. Usul g‘oyasi izlanayotgan y=y(x) funksiyani to‘rning tugunlari atrofida Teylor qatoriga yoyishdan iborat.
Ushbu usulda уi+1 qiymatlar quyidagi formulalardan topiladi:
уi+1 = уi + ∆уi;
∆уi= ∆уi1 + ∆уi2 ,
U holda .
Belgilash kiritamiz: y*i+1 = yi+h f (xi,yi),
shunda .
y'=x2+y2 tenglama uchun Runge - Kutta usulida Koshi masalasini yechish dasturi:
#include
#include
using namespace std;
int main()
{
const int n=5;
double a=0, b=1, h,x[n], y[n],y1[n],z[n],e[n];
h=(b-a)/n;
x[0]=0; y[0]=0;
for(int i=0;i<=n;i++)
{
x[i+1]=x[i]+h;
y1[i+1]=y[i]+h*pow(x[i]+y[i],2);
y[i+1]=y[i]+h/2*(pow(x[i]+y[i],2)+pow(x[i]+y1[i+1],2));
}
for(int i=0; i
{
z[i]=tan(x[i])-x[i];
e[i]=(z[i]-y[i]);
cout<
}
return 0;
}
To‘rtinchi tartibli Runge-Kutta usuli.
Amaliyotda ko‘pincha 4-tartibli Runge-Kutta usulidan foydalaniladi. Bu usulda yi+l kattaliklar quyidagi formulalardan topiladi:
уi+1 = уi + ∆уi;
, bunda i=1,2,…;
k1=f(xi,yi);
k2=f(xi+h/2, yi+hk1/2);
k3=f(xi+h/2, yi+hk2/2);
k4=f(xi+h, yi+hk3);
5-misol. у' = у – х differensial tenglama у(0)=1,5 boshlang‘ich shart bilan berilgan bo‘lsin. Runge-Kutta usuli bilan х= 1,5 uchun ε = 0,01 aniqlikda tenglamani yeching.
Yechilishi: h=0,25 bo‘lsin deylik. Butun integrallanuvchi [0; 1,5] kesmani 6 ta nuqta bilan bo‘laklarga ajratamiz:
x0=0; х1=0,25; х2=0,5; х3=0,75; х4=1; х5=1,25; х6=1,5.
Boshlang‘ich shartlardan х0=0; у0=1,5 larga egamiz.
Birinchi yaqinlashishni topamiz:
y1=y0+∆y0, bunda ;
Runge-Kutta usulidan foydalanib, quyidagilarni aniqlaymiz:
k1=(y0+x0)h= 1.5•0.25=0.375;
k2=[(y0+k1/2)-(x0+h/2)]h=[(1.5+0.187)-0.125]•0.25=0.39;
k3 =[(y0+k2/2)-(x0+h/2)]= 0.392;
k4 =[(y0+k3)-(x0+h)]h= 0.41.
Bulardan ∆у0 = (0.375 + 2 • 0.39 + 2 • 0.392 + 0,41) = 0,392.
Shunday qilib, у1 = 1.5 + 0.392 = 1.892 va h.k.
Xulosa qilib shuni ta’kidlaymizki, bir qadamli Runge-Kutta usulidan 1–tartibli differensial tenglamalar sistemalarini yechishda foydalanish mumkin.
4–tartibli Runge-Kutta usuli bilan y'=x2+y2 tenglamani yechish dasturi:
#include
#include
using namespace std;
int main()
{
const int n=5;
double a=0, b=1, h,x[n], y[n],y1[n],z[n],e[n],k0,k1,k2,k3;
h=(b-a)/n;
x[0]=0; y[0]=0;
for(int i=0;i
{
k0=pow(x[i]+y[i],2);
k1=pow(x[i]+h/2+y[i]+h/2*k0,2);
k2=pow(x[i]+h/2+y[i]+h/2*k1,2);
k3=pow(x[i]+h+y[i]+h*k2,2);
y[i+1]=y[i]+h/6*(k0+2*k1+2*k2+k3);
x[i+1]=x[i]+h;
}
for(int i=0; i
{
z[i]=tan(x[i])-x[i];
e[i]=fabs(z[i]-y[i]);
cout<
}
return 0;
}
Do'stlaringiz bilan baham: |