|
Nümunə. Koşi məsələsinin [0;1] parçasında h=0,1 addımı ilə 4-cü tərtib Runge-Kutta üsulu ilə təqribi həllini tapmalı.
Həlli
|
bet | 31/35 | Sana | 06.12.2023 | Hajmi | 2,93 Mb. | | #112648 | Turi | Dərs |
Bog'liq C fakepathKOMPUTER MUHENDISLIYINDE EDEDI USULLAR 01 06 (2) (1)Nümunə. Koşi məsələsinin [0;1] parçasında h=0,1 addımı ilə 4-cü tərtib Runge-Kutta üsulu ilə təqribi həllini tapmalı.
Həlli. Əvvəlcə bu 1-ci tərtib xətti tənliyin dəqiq həllini tapaq.
1)
2)
Onda dəqiq həll şəklində olar.
İndi isə təqribi həlli tapmaq üçün 4-cü tərtib Runge-Kutta metodunu h=0,1 addımı ilə tətbiq edək. Bunun üçün aşağıdakı düsturlardan istifadə edək:
Onda
,
n
|
|
|
|
|
|
|
|
Dəqiq qiymət-lər
|
0
|
0
|
0
|
0
|
0,0025
|
0,002501
|
0,010018
|
0,003337
|
0
|
1
|
0,1
|
0,000334
|
0,01002
|
0,022632
|
0,022675
|
0,040633
|
0,023545
|
0,000334
|
2
|
0,2
|
0,002688
|
0,040644
|
0,064369
|
0,064592
|
0,094933
|
0,065583
|
0,002688
|
3
|
0,3
|
0,009246
|
0,09496
|
0,133009
|
0,133709
|
0,181431
|
0,134971
|
0,009246
|
4
|
0,4
|
0,022744
|
0,181492
|
0,241149
|
0,242961
|
0,318567
|
0,244713
|
0,022743
|
5
|
0,5
|
0,047215
|
0,318698
|
0,414566
|
0,418916
|
0,543032
|
0,421449
|
0,047215
|
6
|
0,6
|
0,08936
|
0,543305
|
0,703721
|
0,713888
|
0,926793
|
0,717553
|
0,089359
|
7
|
0,7
|
0,161115
|
0,927332
|
1,207835
|
1,231503
|
1,61371
|
1,23662
|
0,161115
|
8
|
0,8
|
0,284777
|
1,614692
|
2,127454
|
2,183025
|
2,901619
|
2,189545
|
0,284779
|
9
|
0,9
|
0,503732
|
2,903203
|
3,884036
|
4,016816
|
5,434521
|
4,023238
|
0,503741
|
10
|
1
|
0,906055
|
|
|
|
|
|
0,906094
|
C++ dilində bu metodun həlli üçün proqram kodu aşağıdakı kimi olar:
#include
#include
#define EPS 1E-2
using namespace std;
double hesabla_f(double x, double y)
{
return exp(-x * y);
}
int main()
{
double t,t2;
bool isEnd;
do{
isEnd = true;
double a;
double b;
cout << "Daxil edin: a = ";
cin >> a;
cout << " Daxil edin: b = ";
cin >> b;
double y0;
cout << " Daxil edin: y0 = ";
cin >> y0;
int n;
cout << " Daxil edin: n = ";
cin >> n;
double h = (b - a) / n;
double x[n + 1];
double y[n + 1];
double y_2[2*(n + 1)];
x[0] = a;
y[0] = y0;
for (int j = 1; j < n; j++)
{
cout.precision(7);
cout.setf(ios::fixed);
x[j] = x[j - 1] + h;
y[j] = y[j - 1] + h * hesabla_f(x[j - 1], y[j - 1]);
t = y[j];
cout <<"-------------------" << endl;
cout << "x_h= " << x[j-1] + h << endl;
cout << "y_h= " << t << endl;
for (int i = 0; i < 2; i++)
{
x[i] = x[i - 1] + h/2;
y_2[i] = y_2[i - 1] + (h/2) * hesabla_f(x[i - 1], y_2[i - 1]);
t2 = y_2[i];
}
cout << "y_h2= " << t2 << endl;
cout <<"eps= " << abs(t2-t) << endl;
cout <<"-------------------" << endl;
if(abs(t2-t) > EPS)
{
h = h/2;
}
cout << "h= " << h << endl;
}
} while(!isEnd);
cin.ignore();
cin.get();
}
Mövzuya aid tapşırıqların variantları
Koşi məsələsinin həllini [0;3] parçasında 0,1 addımı ilə həll etməli:
Variantın №-si
|
f(x,y1,y2)
|
a
|
y20
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
-ae-0.6x
-axy2-y1
-ae-x
|
0.01
0.02
0.03
0.04
0.05
0.06
0.07
0.08
0.09
0.06
0.07
0.08
0.09
0.1
0.01
0.02
0.03
0.04
0.05
0.6
|
0.5
1/3
0.25
0.2
1/6
1/7
0.125
1/9
0.1
1/7
0.125
1/9
0.1
1/11
0.5
1/3
0/25
0.2
1/6
0.5
|
12.3. Qovma üsulu
Tutaq ki, [a,b] parçasında aşağıdakı
(12.3.1)
(12.3.2)
sərhəd şərtlərini ödəyən
(12.3.3)
d iferensial tənliyinin həllini tapmaq tələb olunur. Burada p(x), q(x), f(x) [a,b] parçasında kəsilməz funksiyalardır, ədədləri isə şərtini ödəyir.
Qovma metodu sonlu fərqlər tipli üsullara aiddir və baxılan xətti sərhəd məsələsinin həllini təqribən üçdiaqonallı matrisi olan xətti cəbri tənliklər sisteminin həlli ilə əvəz etməyə imkan verir. Öz növbəsində alınan üçdiaqonallı sistem isə “qovma” metodu adlanan üsulla həll olunur. Bununla əlaqədar bütün (12.3.1)-(12.3.3) sərhəd məsələsinin həlli üsulunu da “qovma” üsulu adlandırırlar.
Əvvəlcə [a,b] parçasını uzunluğu h olan n bərabər hissəyə bölək:
,
burada
Aşağıdakı işarələmələri qəbul edək:
; ; ; ;
; ; .
İndi isə (12.3.1)-(12.3.3) məsələsinə xi nöqtələrində baxaq və törəmələri sonlu-fərq münasibətləri ilə əvəz edək. Onda yazmaq olar ki,
, ,
, .
Beləliklə, nəticədə (12.3.1)-(12.3.3) sərhəd məsələsinin sonlu-fərqlər şəklində analoqunu, yəni aşağıdakı sonlu fərqlər tənlikləri sistemini alırıq:
, , (12.3.4)
, (12.3.5)
. (12.3.6)
Alınan (12.3.4)-(12.3.6) sistemi (n+1) sayda məchulu olan (n+1) tənlikdən ibarət sistem olur. Bu sistemin əsas xüsusiyyəti ondan ibarətdir ki, onun hər tənliyində üçdən artıq məchul olmur. Ona görə də bu sistemin matrisi yalnız üç diaqonalında sıfırdan fərqli elementləri olan matrisdir. Belə sistem üçdiaqonallı sistem adlanır və yuxarıda dediyimiz kimi «Qovma» üsulu ilə həll olunur.
Bunun üçün (12.3.4)-(12.3.6) sistemində məchulları aşağıdakı kimi qruplaşdıraq:
,
(12.3.7)
; (12.3.8)
. (12.3.9)
Alınan sistemdə aşağıdakı işarələmələri qəbul edək:
Onda sistem:
= ;
= ;
= ;
. . . . . . . . . . . . .
= ;
. . . . . . . . . . . . . . .
= ;
= .
şəklini alacaqdır.
Bu sistemi məlum Qauss metodundan istifadə edərək həll etsək aşağıdakı şəkildə sistem alarıq:
;
;
. . . . . . . . . . . . .
;
;
. . . . . . . . . . . . . . .
;
.
Burada alınan qovma əmsalları adlanır. Qeyd edək ki,
; ; (12.3.10)
Aydındır ki, əgər axırıncı sistemdə qovma əmsalları məlum olarsa, onda ardıcıl olaraq qiymətlərini təyin etmək olur. Beləliklə, -ların hesablaması qovma əmsallarının hesablanmasına gətirilir.
Onları təyin etmək üçün (**)i-1 və (**)ş münasibətlərinə baxaq. Bu münasibətlərdən yi-1 -i çıxarsaq alarıq:
(12.3.11)
(12.3.11) ifadəsini (**)i bərabərliyi ilə müqayisə etsək, aşağıdakı rekurrent düsturları alarıq:
(12.3.12)
(12.3.13)
Bu düsturlar (12.3.10) düsturu ilə birlikdə qovma əmsallarının qiymətlərini təyin edir.
Bundan sonra (12.3.14) münasibətlərindən axtarılan kəmiyyətləri hesablanır:
(12.3.14)
Beləliklə, (12.3.1)-(12.3.3) məsələsinin axtarılan y(x) təqribi həllini tapmış oluruq.
Bu sərhəd məsələsinin həllinin xətası yalnız fərq aproksimasiyası zamanı alınan O(h) xətası ilə təyin olunur. h=(b-a)/n olduğu üçün n-i artırmaqla, yəni hesablamaların həcmini artırmaq hesabına (12.3.1)-(12.3.3) məsələsinin həllini kifayət qədər dəqiq tapmaq olar.
Praktiki məsələlərdə xəta aşağıdakı düsturla hesablanır:
(12.3.15)
Burada -məsələnin nöqtəsində dəqiq həlli və uyğun olaraq h və h/2 addımı ilə həmin nöqtədə hesablamalarda alınan həllidir.
Baxılan məsələnin kompüterdə həlli daha effektivdir. Bunun üçün C++ dilində tərtib olunmuş proqram aşağıdakı şəkildə olar:
#include
#include
#include
using namespace std;
double foo(double x, double y)
{
return exp(-x * y);
}
double Runqe_Kutta_metodu (double x, double y, double h)
{
double K1 = h*foo (x, y);
double K2 = h*foo (x + h / 2.0, y + K1 / 2.0);
double K3 = h*foo (x + h / 2.0, y + K2 / 2.0);
double K4 = h*foo (x + h, y + K3);
return y + (K1 + 2.0 * K2 + 2.0 * K3 + K4) / 6.0;
}
int main()
{
double x0 = 0.0;
double y0 = 0.0;
double xn = 1.0;
double h;
cout << "h= ";
cin >> h;
int n = ceil((xn-x0)/h) + 2;
double** arr = new double* [n];
for (int i = 0; i < n; ++i){
arr[i] = new double [2];
}
double x = x0;
double y = y0;
double y_ = 0.0;
arr[0][0] = x;
arr[0][1] = y;
for (int i = 1; i < n; ++i){
x += h;
y = Runqe_Kutta_metodu (x, y, h);
arr[i][0] = x;
arr[i][1] = y;
}
cout << "Runqe-Kutta:" << endl;
for(int i = 0; i < n; ++i){
cout << fixed << setprecision(4) << arr[i][0] << "\t" << fixed << setprecision(4) << arr[i][1] << endl;
}
return 0;
}
|
|
Bosh sahifa
Aloqalar
Bosh sahifa
Nümunə. Koşi məsələsinin [0;1] parçasında h=0,1 addımı ilə 4-cü tərtib Runge-Kutta üsulu ilə təqribi həllini tapmalı.
Həlli
|