• 12.3. Qovma üsulu
  • 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




    Download 2,93 Mb.
    bet31/35
    Sana06.12.2023
    Hajmi2,93 Mb.
    #112648
    TuriDərs
    1   ...   27   28   29   30   31   32   33   34   35
    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 üçdiaqo­nal­­lı 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 üçdiaqo­nal­­lı sistem isə “qovma” metodu adlanan üsulla həll olu­nur. 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ə­si­­nin sonlu-fərqlər şəklində analoqunu, yəni aşağı­dakı son­lu 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 ele­ment­­ləri olan matrisdir. Belə sistem üçdiaqonallı sistem adla­nı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ət­lə­ri­ni təyin etmək olur. Beləliklə, -ların hesab­la­ması 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 əmsal­­ları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 aprok­simasiyası zamanı alınan O(h) xətası ilə təyin olunur. h=(b-a)/n olduğu üçün n-i artırmaqla, yəni hesab­la­ma­ları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 hesab­lanı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ə hesab­la­­malarda alınan həllidir.
    Baxılan məsələnin kompüterdə həlli daha effektivdir. Bu­nun üçün C++ dilində tərtib olunmuş proqram aşağıdakı şəkil­­də 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;
    }


    Download 2,93 Mb.
    1   ...   27   28   29   30   31   32   33   34   35




    Download 2,93 Mb.

    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

    Download 2,93 Mb.