Òåêñò ïîäïðîãðàììû è âåðñèé
de94r_c.zip, de94d_c.zip, de96r_c.zip, de96d_c.zip, de90r_c.zip, de90d_c.zip, de92r_c.zip, de92d_c.zip
Òåêñòû òåñòîâûõ ïðèìåðîâ
tde94r_c.zip, tde94d_c.zip, tde96r_c.zip, tde96d_c.zip , tde90r_c.zip, tde90d_c.zip, tde92r_c.zip, tde92d_c.zip

Ïîäïðîãðàììà:  de94r_c (âåðñèè: de96r_c, de90r_c, de92r_c)

Íàçíà÷åíèå

Âûïîëíåíèå îäíîãî øàãà ÷èñëåííîãî èíòåãðèðîâàíèÿ æåñòêîé ñèñòåìû îáûêíîâåííûõ äèôôåðåíöèàëüíûõ óðàâíåíèé ïåðâîãî ïîðÿäêà ìåòîäîì òèïà Ðîçåíáðîêà ÷åòâåðòîãî ïîðÿäêà

Ìàòåìàòè÷åñêîå îïèñàíèå

Âûïîëíÿåòñÿ îäèí øàã ÷èñëåííîãî èíòåãðèðîâàíèÿ ñèñòåìû  M îáûêíîâåííûõ äèôôåðåíöèàëüíûõ óðàâíåíèé ïåðâîãî ïîðÿäêà

                                Y ' =  F( X, Y ) ,

          Y = ( y1, ..., yM ) ,   F = ( f1 ( X, y1, ..., yM ), ..., fM ( X, y1, ..., yM ) ) 

ìåòîäîì òèïà Ðîçåíáðîêà ÷åòâåðòîãî ïîðÿäêà.

Ïî çàäàííîìó çíà÷åíèþ YX ðåøåíèÿ â óçëå Xn âû÷èñëÿåòñÿ çíà÷åíèå ýòîãî ðåøåíèÿ â óçëå Xn + H. Âñå êîìïîíåíòû ðåøåíèÿ âû÷èñëÿþòñÿ ñ êîíòðîëåì òî÷íîñòè ïî ìåðå ïîãðåøíîñòè, êîòîðûé çàêëþ÷àåòñÿ â ñëåäóþùåì. Åñëè íåêîòîðàÿ êîìïîíåíòà ïðèáëèæåííîãî ðåøåíèÿ ïî àáñîëþòíîé âåëè÷èíå íå ìåíüøå íåêîòîðîé çàäàííîé êîíñòàíòû  P (íàçûâàåìîé ãðàíèöåé ïåðåõîäà), òî êîíòðîëü òî÷íîñòè äëÿ ýòîé êîìïîíåíòû âåäåòñÿ ïî îòíîñèòåëüíîé ïîãðåøíîñòè, èíà÷å - ïî àáñîëþòíîé. Çíà÷åíèå  H ìîæåò áûòü ìåíüøå èëè ðàâíî çíà÷åíèþ øàãà èíòåãðèðîâàíèÿ, çàäàâàåìîìó ïîëüçîâàòåëåì ïðè îáðàùåíèè ê ïîäïðîãðàììå.

Àðòåìüåâ Ñ.Ñ., Äåìèäîâ Ã.Â.  A - óñòîé÷èâûé ìåòîä òèïà Ðîçåíáðîêà ÷åòâåðòîãî ïîðÿäêà òî÷íîñòè ðåøåíèÿ çàäà÷è Êîøè äëÿ æåñòêèõ ñèñòåì îáûêíîâåííûõ äèôôåðåíöèàëüíûõ óðàâíåíèé. Íåêîòîðûå ïðîáëåìû âû÷èñëèòåëüíîé è ïðèêëàäíîé ìàòåìàòèêè. Íîâîñèáèðñê: "Íàóêà", 1975.

Ñîâðåìåííûå ÷èñëåííûå ìåòîäû ðåøåíèÿ îáûêíîâåííûõ äèôôåðåíöèàëüíûõ óðàâíåíèé. Ïîä ðåä. Äæ.Õîëëà è Äæ.Óàòòà. Ì.: "Ìèð", 1979.

Èñïîëüçîâàíèå

    int de94r_c(real *f, S_fp fj, S_fp fx, integer *m,
                integer *jstart, real *hmin, real *eps, real *p, real *yx, real *x,
                real *h, logical *bul, real *xp, real *yp, real *a, real *a1,
                real *a2, real *rab, real *r1, real *r2, real *r3, real *r4,
                real *yd, integer *ierr)

Ïàðàìåòðû

f - èìÿ ïîäïðîãðàììû âû÷èñëåíèÿ çíà÷åíèé ïðàâîé ÷àñòè äèôôåðåíöèàëüíûõ óðàâíåíèé. Ïåðâûé îïåðàòîð ïîäïðîãðàììû äîëæåí èìåòü âèä:
int f (float *x, float *y, float *dy, int *m).
Çäåñü x, y - çíà÷åíèÿ íåçàâèñèìîé è çàâèñèìîé ïåðåìåííûõ, ñîîòâåòñòâåííî. Âû÷èñëåííîå çíà÷åíèå ïðàâîé ÷àñòè äîëæíî áûòü ïîìåùåíî â dy; â ñëó÷àå ñèñòåìû óðàâíåíèé, ò.å. êîãäà m ≠ 1, ïàðàìåòðû  y è dy ïðåäñòàâëÿþò îäíîìåðíûå ìàññèâû äëèíîé  m (òèï ïàðàìåòðîâ  x, y è dy: âåùåñòâåííûé);
fj - èìÿ ïîäïðîãðàììû âû÷èñëåíèÿ çíà÷åíèé ýëåìåíòîâ ìàòðèöû ßêîáè ∂f / ∂y ïðàâîé ÷àñòè ñèñòåìû. Ïåðâûé îïåðàòîð ïîäïðîãðàììû äîëæåí èìåòü âèä:
int fj (float *x, float *y, float *z, int *m).
Çäåñü x, y - çíà÷åíèÿ íåçàâèñèìîé è çàâèñèìîé ïåðåìåííûõ, ñîîòâåòñòâåííî.  ñëó÷àå ñèñòåìû óðàâíåíèé, ò.å. êîãäà m ≠ 1, ïàðàìåòð y ïðåäñòàâëÿåò ñîáîé îäíîìåðíûé ìàññèâ äëèíû m, à ïàðàìåòð z - äâóìåðíûé ìàññèâ ðàçìåðà m * m. Çíà÷åíèÿ ýëåìåíòîâ ìàòðèöû ßêîáè ∂f / ∂y ïðàâîé ÷àñòè ñèñòåìû äîëæíû áûòü ïîìåùåíû â ìàññèâ z, ïðè ýòîì ÷àñòíàÿ ïðîèçâîäíàÿ îò ïðàâîé ÷àñòè  i - ãî óðàâíåíèÿ ïî  j - îé ïåðåìåííîé y ( j ) çàïîìèíàåòñÿ â ýëåìåíòå z ( i, j )(òèï ïàðàìåòðîâ x, y è z: âåùåñòâåííûé);
fx - èìÿ ïîäïðîãðàììû âû÷èñëåíèÿ çíà÷åíèé ÷àñòíûõ ïðîèçâîäíûõ ïî x ïðàâîé ÷àñòè ñèñòåìû ∂f / ∂x. Ïåðâûé îïåðàòîð ïîäïðîãðàììû äîëæåí èìåòü âèä:
int fx (float *x, float *y, float *z1, int *m).
Çäåñü: x, y - çíà÷åíèÿ íåçàâèñèìîé è çàâèñèìîé ïåðåìåííûõ, ñîîòâåòñòâåííî.  ñëó÷àå ñèñòåìû óðàâíåíèé, ò.å. êîãäà m ≠ 1, ïàðàìåòðû y è z1 ïðåäñòàâëÿþò ñîáîé îäíîìåðíûå ìàññèâû äëèíîé m. Çíà÷åíèÿ ÷àñòíûõ ïðîèçâîäíûõ ïî x ïðàâîé ÷àñòè ñèñòåìû ∂f / ∂x äîëæíû áûòü ïîìåùåíû â ìàññèâ z1; ïðè ýòîì ÷àñòíàÿ ïðîèçâîäíàÿ îò ïðàâîé ÷àñòè  i - ãî óðàâíåíèÿ çàïîìèíàåòñÿ â ýëåìåíòå z1 ( i ) (òèï ïàðàìåòðîâ x, y è z1: âåùåñòâåííûé);
m - êîëè÷åñòâî óðàâíåíèé â ñèñòåìå (òèï: öåëûé);
jstart - öåëûé óêàçàòåëü ðåæèìà èñïîëüçîâàíèÿ ïîäïðîãðàììû, èìåþùèé ñëåäóþùèå çíà÷åíèÿ:
0,+1 - âûïîëíèòü îäèí øàã èíòåãðèðîâàíèÿ ñèñòåìû äèôôåðåíöèàëüíûõ óðàâíåíèé äëÿ çíà÷åíèé íåçàâèñèìîé è çàâèñèìîé ïåðåìåííûõ è øàãà èíòåãðèðîâàíèÿ, çàäàííûõ ïàðàìåòðàìè x, yx è h, ñîîòâåòñòâåííî;
-1 - ïîâòîðèòü ïîñëåäíèé øàã èíòåãðèðîâàíèÿ ñ íîâûìè çíà÷åíèÿìè ïàðàìåòðîâ h è/èëè hmin;
  íà âûõîäå èç ïîäïðîãðàììû jstart ðàâåí + 1;
hmin - ìèíèìàëüíîå çíà÷åíèå àáñîëþòíîé âåëè÷èíû øàãà, êîòîðîå ðàçðåøàåòñÿ èñïîëüçîâàòü ïðè èíòåãðèðîâàíèè äàííîé ñèñòåìû óðàâíåíèé (òèï: âåùåñòâåííûé);
eps - äîïóñòèìàÿ ìåðà ïîãðåøíîñòè, ñ êîòîðîé òðåáóåòñÿ âû÷èñëèòü âñå êîìïîíåíòû ðåøåíèÿ (òèï: âåùåñòâåííûé);
p - ãðàíèöà ïåðåõîäà, èñïîëüçóåìàÿ ïðè îöåíêå ìåðû ïîãðåøíîñòè ðåøåíèÿ (òèï: âåùåñòâåííûé);
yx, x - çàäàííûå âåùåñòâåííûå çíà÷åíèÿ ðåøåíèÿ è ñîîòâåòñòâóþùåå åìó çíà÷åíèå àðãóìåíòà; â ðåçóëüòàòå ðàáîòû ïîäïðîãðàììû â x ïîëó÷àåòñÿ íîâîå çíà÷åíèå àðãóìåíòà, â yx - ñîîòâåòñòâóþùåå çíà÷åíèå ðåøåíèÿ; â ñëó÷àå ñèñòåìû óðàâíåíèé, ò.å. êîãäà m ≠ 1, yx çàäàåòñÿ îäíîìåðíûì ìàññèâîì äëèíû m;
h - âåùåñòâåííàÿ ïåðåìåííàÿ, ñîäåðæàùàÿ çíà÷åíèå øàãà èíòåãðèðîâàíèÿ; åñëè äëÿ ýòîãî çíà÷åíèÿ øàãà òî÷íîñòü ïðèáëèæåííîãî ðåøåíèÿ äîñòèãàåòñÿ, òî èìåííî îí è ðåàëèçóåòñÿ ïîäïðîãðàììîé, èíà÷å ýòîò øàã óìåíüøàåòñÿ ïîäïðîãðàììîé äî òåõ ïîð, ïîêà íå áóäåò äîñòèãíóòà çàäàííàÿ òî÷íîñòü eps; íà âûõîäå èç ïîäïðîãðàììû h ñîäåðæèò ðåêîìåíäóåìîå ïîäïðîãðàììîé çíà÷åíèå ñëåäóþùåãî øàãà èíòåãðèðîâàíèÿ, îïðåäåëÿåìîå åþ ñ öåëüþ äîñòèæåíèÿ áîëåå ýêîíîìíîãî ñïîñîáà èíòåãðèðîâàíèÿ;
bul - ëîãè÷åñêàÿ ïåðåìåííàÿ, çíà÷åíèå êîòîðîé ïðè îáðàùåíèè ê ïîäïðîãðàììå ïîëàãàåòñÿ ðàâíûì TRUE_, åñëè çàäàííûé â h øàã âûâîäèò â êîíåö èíòåðâàëà èíòåãðèðîâàíèÿ, è FALSE_ â ïðîòèâíîì ñëó÷àå; â ðåçóëüòàòå ðàáîòû ïîäïðîãðàììû bul ðàâíî FALSE_, åñëè âìåñòî èñõîäíîãî øàãà èíòåãðèðîâàíèÿ áûë ðåàëèçîâàí ìåíüøèé øàã; â ïðîòèâíîì ñëó÷àå, ò.å. êîãäà áûë âûïîëíåí èìåííî çàäàííûé ïðè îáðàùåíèè â h øàã, çíà÷åíèå ïàðàìåòðà bul íå ìåíÿåòñÿ;
xp, yp - âåùåñòâåííàÿ ðàáî÷àÿ ïåðåìåííàÿ è îäíîìåðíûé ðàáî÷èé ìàññèâ äëèíû m, ñîîòâåòñòâåííî; çíà÷åíèÿ ïàðàìåòðîâ xp, yp íà âûõîäå èç ïîäïðîãðàììû ðàâíû òåì çíà÷åíèÿì, êîòîðûå èìåëè ïàðàìåòðû x, yx ïðè âõîäå â íåå (ò.å. ïðåäûäóùèé óçåë è ðåøåíèå â íåì);
            a -
        a1, a2  
âåùåñòâåííûå äâóìåðíûå ðàáî÷èå ìàññèâû ðàçìåðà m * m;
rab - âåùåñòâåííûé îäíîìåðíûé ðàáî÷èé ìàññèâ äëèíû 5 * m; íà âûõîäå èç ïîäïðîãðàììû â ïåðâûõ m ýëåìåíòàõ ýòîãî ìàññèâà ñîäåðæèòñÿ ïîãðåøíîñòü âû÷èñëåííîãî ïðèáëèæåííîãî ðåøåíèÿ, ïîëó÷åííàÿ ïî ïðàâèëó Ðóíãå;
       r1, r2 -
       r3, r4  
            yd  
âåùåñòâåííûå îäíîìåðíûå ðàáî÷èå ìàññèâû äëèíû m;
ierr - öåëàÿ ïåðåìåííàÿ, çíà÷åíèå êîòîðîé â ðåçóëüòàòå ðàáîòû ïîäïðîãðàììû ïîëàãàåòñÿ ðàâíûì 65, åñëè êàêàÿ - íèáóäü êîìïîíåíòà ðåøåíèÿ íå ìîæåò áûòü âû÷èñëåíà ñ òðåáóåìîé òî÷íîñòüþ eps; â ýòîì ñëó÷àå ïîñëåäíèé øàã èíòåãðèðîâàíèÿ ñèñòåìû ìîæíî ïîâòîðèòü îáðàùåíèåì ê ïîäïðîãðàììå ñ íîâûìè çíà÷åíèÿìè ïàðàìåòðîâ h, hmin è çíà÷åíèåì jstart = - 1.

Âåðñèè

de96r_c - âûïîëíåíèå îäíîãî øàãà ÷èñëåííîãî èíòåãðèðîâàíèÿ æåñòêîé ñèñòåìû îáûêíîâåííûõ äèôôåðåíöèàëüíûõ óðàâíåíèé ïåðâîãî ïîðÿäêà ìåòîäîì òèïà Ðîçåíáðîêà ÷åòâåðòîãî ïîðÿäêà. Îòëè÷èå ïîäïðîãðàììû de96r_c îò ïîäïðîãðàììû de94r_c ñîñòîèò â òîì, ÷òî ïðè îáðàùåíèè ê ïîäïðîãðàììå de96r_c íå òðåáóåòñÿ çàäàâàòü ïîäïðîãðàììó âû÷èñëåíèÿ ìàòðèöû ßêîáè ñèñòåìû è ïîäïðîãðàììó âû÷èñëåíèÿ ÷àñòíûõ ïðîèçâîäíûõ ïðàâîé ÷àñòè ñèñòåìû ïî  x . Âñå ÷àñòíûå ïðîèçâîäíûå îò ïðàâîé ÷àñòè âû÷èñëÿþòñÿ â ïîäïðîãðàììå de96r_c ñ ïîìîùüþ ðàçíîñòíûõ îòíîøåíèé. Ïåðâûé îïåðàòîð ïîäïðîãðàììû de96r_c èìååò âèä:

int de96r_c (real *f, integer *m, integer *jstart, real *hmin,
         real *eps, real *p, real *yx, real *x, real *h, logical *bul,
         real *xp, real *yp, real *a, real *a1, real *a2, real *rab, real *r1,
         real *r2, real *r3, real *r4, real *yd, integer *ierr) 
Ñïèñîê ôîðìàëüíûõ ïàðàìåòðîâ ïîäïðîãðàììû de96r_c îòëè÷àåòñÿ îò ñïèñêà ïàðàìåòðîâ ïîäïðîãðàììû de94r_c îòñóòñòâèåì ïàðàìåòðîâ fj è fx. Ïàðàìåòðû ïîäïðîãðàììû de96r_c èìåþò òîò æå ñìûñë, ÷òî è îäíîèìåííûå ïàðàìåòðû ïîäïðîãðàììû de94r_c;
de90r_c - âûïîëíåíèå îäíîãî øàãà ÷èñëåííîãî èíòåãðèðîâàíèÿ àâòîíîìíîé æåñòêîé ñèñòåìû îáûêíîâåííûõ äèôôåðåíöèàëüíûõ óðàâíåíèé ïåðâîãî ïîðÿäêà ìåòîäîì òèïà Ðîçåíáðîêà ÷åòâåðòîãî ïîðÿäêà. Äàííàÿ ïîäïðîãðàììà ïðåäíàçíà÷åíà äëÿ èíòåãðèðîâàíèÿ ñèñòåì óðàâíåíèé, â ïðàâûå ÷àñòè êîòîðûõ íå âõîäèò íåçàâèñèìàÿ ïåðåìåííàÿ  x , ò.å. ñèñòåì âèäà  y' = f (y) . Ïåðâûé îïåðàòîð ïîäïðîãðàììû de90r_c èìååò âèä:
int de90r_c (real *f, S_fp fj, integer *m, integer *jstart,
         real *hmin, real *eps, real *p, real *yx, real *x, real *h,
         logical *bul, real *xp, real *yp, real *a, real *a1, real *a2,
         real *rab, real *r1, real *r2, real *yd, integer *ierr)
Ñïèñîê ôîðìàëüíûõ ïàðàìåòðîâ ïîäïðîãðàììû de90r_c îòëè÷àåòñÿ îò ñïèñêà ïàðàìåòðîâ de94r_c îòñóòñòâèåì ïàðàìåòðîâ fx, r3, r4. Ïàðàìåòðû ïîäïðîãðàììû de90r_c èìåþò òîò æå ñìûñë, ÷òî è îäíîèìåííûå ïàðàìåòðû ïîäïðîãðàììû de94r_c, êðîìå ïàðàìåòðà rab.  ïîäïðîãðàììå de90r_c ïàðàìåòð rab ïðåäñòàâëÿåò îäíîìåðíûé âåùåñòâåííûé ðàáî÷èé ìàññèâ äëèíû 4 * m;
de92r_c - âûïîëíåíèå îäíîãî øàãà ÷èñëåííîãî èíòåãðèðîâàíèÿ æåñòêîé àâòîíîìíîé ñèñòåìû îáûêíîâåííûõ äèôôåðåíöèàëüíûõ óðàâíåíèé ïåðâîãî ïîðÿäêà ìåòîäîì òèïà Ðîçåíáðîêà ÷åòâåðòîãî ïîðÿäêà. Äàííàÿ ïîäïðîãðàììà ïðåäíàçíà÷åíà äëÿ èíòåãðèðîâàíèÿ ñèñòåì óðàâíåíèé, â ïðàâûå ÷àñòè êîòîðûõ íå âõîäèò íåçàâèñèìàÿ ïåðåìåííàÿ x, ò.å. ñèñòåì âèäà  y' = f (y) . Îòëè÷èå ïîäïðîãðàììû de92r_c îò ïîäïðîãðàììû de94r_c ñîñòîèò â òîì, ÷òî ïðè îáðàùåíèè ê ïîäïðîãðàììå de92r_c íå òðåáóåòñÿ çàäàâàòü ïîäïðîãðàììó âû÷èñëåíèÿ ìàòðèöû ßêîáè ñèñòåìû  ∂f / ∂y  è ïîäïðîãðàììó âû÷èñëåíèÿ ÷àñòíûõ ïðîèçâîäíûõ  ∂f / ∂x . Ïåðâûé îïåðàòîð ïîäïðîãðàììû de92r_c èìååò âèä:
int de92r_c (real *f, integer *m, integer *jstart, real *hmin,
         real *eps, real *p, real *yx, real *x, real *h, logical *bul,
         real *xp, real *yp, real *a, real *a1, real *a2, real *rab,
         real *r1, real *r2, real *yd, integer *ierr)
Ñïèñîê ôîðìàëüíûõ ïàðàìåòðîâ ïîäïðîãðàììû de92r_c îòëè÷àåòñÿ îò ñïèñêà ïàðàìåòðîâ ïîäïðîãðàììû de94r_c îòñóòñòâèåì ïàðàìåòðîâ fj, fx, r3, r4. Ïàðàìåòðû ïîäïðîãðàììû èìåþò òîò æå ñìûñë, ÷òî è â ïîäïðîãðàììå de94r_c, êðîìå ïàðàìåòðà rab.  ïîäïðîãðàììå de92r_c ïàðàìåòð rab ïðåäñòàâëÿåò îäíîìåðíûé âåùåñòâåííûé ðàáî÷èé ìàññèâ äëèíû 4 * m;
de94d_c - âûïîëíåíèå îäíîãî øàãà ÷èñëåííîãî èíòåãðèðîâàíèÿ æåñòêîé ñèñòåìû îáûêíîâåííûõ äèôôåðåíöèàëüíûõ óðàâíåíèé ïåðâîãî ïîðÿäêà ìåòîäîì òèïà Ðîçåíáðîêà ÷åòâåðòîãî ïîðÿäêà ñ ïîâûøåííîé òî÷íîñòüþ. Ïåðâûé îïåðàòîð ïîäïðîãðàììû èìååò òîò æå âèä, ÷òî è â ïîäïðîãðàììå de94r_c; ïðè ýòîì ïàðàìåòðû hmin, eps, p, yx, x, h, xp, yp, a, a1, a2, rab, r1, r2, r3, r4, yd è ïàðàìåòðû x, y, dy, z, z1 â ïîäïðîãðàììàõ f, fj, fx äîëæíû èìåòü òèï double;
de96d_c - âûïîëíåíèå îäíîãî øàãà ÷èñëåííîãî èíòåãðèðîâàíèÿ æåñòêîé ñèñòåìû îáûêíîâåííûõ äèôôåðåíöèàëüíûõ óðàâíåíèé ïåðâîãî ïîðÿäêà ìåòîäîì òèïà Ðîçåíáðîêà ÷åòâåðòîãî ïîðÿäêà ñ ïîâûøåííîé òî÷íîñòüþ. Ïåðâûé îïåðàòîð ïîäïðîãðàììû èìååò òîò æå âèä, ÷òî è â ïîäïðîãðàììå de96r_c; ïðè ýòîì ïàðàìåòðû hmin, eps, p, yx, x, h, xp, yp, a, a1, a2, rab, r1, r2, r3, r4, yd è ïàðàìåòðû x, y, dy â ïîäïðîãðàììå f äîëæíû èìåòü òèï double;
de90d_c - âûïîëíåíèå îäíîãî øàãà ÷èñëåííîãî èíòåãðèðîâàíèÿ àâòîíîìíîé æåñòêîé ñèñòåìû îáûêíîâåííûõ äèôôåðåíöèàëüíûõ óðàâíåíèé ïåðâîãî ïîðÿäêà ìåòîäîì òèïà Ðîçåíáðîêà ÷åòâåðòîãî ïîðÿäêà ñ ïîâûøåííîé òî÷íîñòüþ. Ïåðâûé îïåðàòîð ïîäïðîãðàììû èìååò òîò æå âèä, ÷òî è â ïîäïðîãðàììå de90r_c; ïðè ýòîì ïàðàìåòðû hmin, eps, p, yx, x, h, xp, yp, a, a1, a2, rab, r1, r2, yd è ïàðàìåòðû x, y, dy, z â ïîäïðîãðàììàõ f, fj äîëæíû èìåòü òèï double;
de92d_c - âûïîëíåíèå îäíîãî øàãà ÷èñëåííîãî èíòåãðèðîâàíèÿ æåñòêîé àâòîíîìíîé ñèñòåìû îáûêíîâåííûõ äèôôåðåíöèàëüíûõ óðàâíåíèé ïåðâîãî ïîðÿäêà ìåòîäîì òèïà Ðîçåíáðîêà ÷åòâåðòîãî ïîðÿäêà ñ ïîâûøåííîé òî÷íîñòüþ. Ïåðâûé îïåðàòîð ïîäïðîãðàììû èìååò òîò æå âèä, ÷òî è â ïîäïðîãðàììå de92r_c; ïðè ýòîì ïàðàìåòðû hmin, eps, p, yx, x, h, xp, yp, a, a1, a2, rab, r1, r2, yd è ïàðàìåòðû x, y, dy â ïîäïðîãðàììå f äîëæíû èìåòü òèï double.

Âûçûâàåìûå ïîäïðîãðàììû

aig2r_c - îáðàùåíèå âåùåñòâåííîé ìàòðèöû ìåòîäîì Æîðäàíà ñ âûáîðîì âåäóùåãî ýëåìåíòà ïî âñåé ìàòðèöå. Âûçûâàåòñÿ ïðè ðàáîòå ïîäïðîãðàìì de90r_c, de92r_c, de94r_c, de96r_c;
aig2d_c - îáðàùåíèå âåùåñòâåííîé ìàòðèöû, çàäàííîé ñ óäâîåííîé òî÷íîñòüþ, ìåòîäîì Æîðäàíà ñ âûáîðîì âåäóùåãî ýëåìåíòà ïî âñåé ìàòðèöå. Âûçûâàåòñÿ ïðè ðàáîòå ïîäïðîãðàìì de90d_c, de92d_c, de94d_c, de96d_c;
utde20_c - ïîäïðîãðàììà âûäà÷è äèàãíîñòè÷åñêèõ ñîîáùåíèé ïðè ðàáîòå ïîäïðîãðàìì de90r_c, de92r_c, de94r_c, de96r_c;
utde21_c - ïîäïðîãðàììà âûäà÷è äèàãíîñòè÷åñêèõ ñîîáùåíèé ïðè ðàáîòå ïîäïðîãðàìì de90d_c, de92d_c, de94d_c, de96d_c.
  Êðîìå òîãî, ïðè ðàáîòå ïîäïðîãðàììû de90r_c âûçûâàþòñÿ ðàáî÷èå ïîäïðîãðàììû de92rs_c, de92rk_c; ïðè ðàáîòå ïîäïðîãðàììû de92r_c âûçûâàþòñÿ ðàáî÷èå ïîäïðîãðàììû de92rs_c, de92rk_c, de84rj_c; ïðè ðàáîòå ïîäïðîãðàììû de94r_c âûýûâàþòñÿ ðàáî÷èå ïîäïðîãðàììû de96rs_c, de92rk_c; ïðè ðàáîòå ïîäïðîãðàììû de96r_c âûçûâàþòñÿ ðàáî÷èå ïîäïðîãðàììû de96rs_c, de92rk_c, de84rj_c, de96rx_c; ïðè ðàáîòå ïîäïðîãðàììû de90d_c âûçûâàþòñÿ ðàáî÷èå ïîäïðîãðàììû de92ds_c, de92dk_c; ïðè ðàáîòå ïîäïðîãðàììû de92d_c âûçûâàþòñÿ ïîäïðîãðàììû de92ds_c, de92dk_c, de84dj_c; ïðè ðàáîòå ïîäïðîãðàììû de94d_c âûçûâàþòñÿ ïîäïðîãðàììû de94ds_c, de92dk_c; ïðè ðàáîòå ïîäïðîãðàììû de96d_c âûçûâàþòñÿ ïîäïðîãðàììû de96ds_c, de92dk_c, de84dj_c, de96dx_c.

Çàìå÷àíèÿ ïî èñïîëüçîâàíèþ

 

 îáùåì ñëó÷àå çàäàííàÿ òî÷íîñòü íå ãàðàíòèðóåòñÿ.

Ïðè ðàáîòå ïîäïðîãðàììû è åå âåðñèé çíà÷åíèÿ ïàðàìåòðîâ m, hmin, eps, p ñîõðàíÿþòñÿ. Ïðè ðàáîòå ïîäïðîãðàìì f, fj, fx çíà÷åíèÿ ïàðàìåòðîâ m, x, y íå äîëæíû èçìåíÿòüñÿ.

Ïðè âûïîëíåíèè èç òî÷êè  xn  îäíîãî øàãà h ìåòîäà òèïà Ðîçåíáðîêà â ïîäïðîãðàììå de94r_c è åå âåðñèÿõ âû÷èñëÿþòñÿ ÷åòûðå çíà÷åíèÿ ïðàâîé ÷àñòè ñèñòåìû äèôôåðåíöèàëüíûõ óðàâíåíèé. Ñðåäè ýòèõ çíà÷åíèé åñòü îäíî, êîòîðîå äîëæíî âû÷èñëÿòüñÿ ïðè çíà÷åíèè íåçàâèñèìîé ïåðåìåííîé  x, ðàâíîì  xn - h. Ýòî çíà÷åíèå àðãóìåíòà  xn  íàõîäèòñÿ ñëåâà îò òî÷êè  xn  ïðè h > 0 è ñïðàâà îò òî÷êè  xn  ïðè h < 0. Ýòî ñëåäóåò ó÷èòûâàòü ïðè ñîñòàâëåíèè ïîäïðîãðàììû f âû÷èñëåíèÿ ïðàâîé ÷àñòè ñèñòåìû. Åñëè ïðàâàÿ ÷àñòü ñèñòåìû äèôôåðåíöèàëüíûõ óðàâíåíèé íå îïðåäåëåíà äëÿ  x < xn  ïðè èíòåãðèðîâàíèè ñëåâà íàïðàâî (h > 0) èëè äëÿ  x < xn  ïðè èíòåãðèðîâàíèè ñïðàâà íàëåâî (h < 0), òî ïîïûòêà âû÷èñëèòü ïðàâóþ ÷àñòü äëÿ óêàçàííîãî çíà÷åíèÿ àðãóìåíòà  x  ìîæåò ïðèâåñòè ê àâîñòó.

Åñëè ïðè ðåøåíèè ñèñòåìû äèôôåðåíöèàëüíûõ óðàâíåíèé íå çàäàþòñÿ ïîäïðîãðàììû fj âû÷èñëåíèÿ ìàòðèöû ßêîáè è fx âû÷èñëåíèÿ ÷àñòíûõ ïðîèçâîäíûõ ïî  x  ïðàâîé ÷àñòè ñèñòåìû (ò.å. ïðîèçâîäèòñÿ îáðàùåíèå ê ïîäïðîãðàììàì de92r_c, de96r_c, de92d_c, de96d_c), òî âñå ÷àñòíûå ïðîèçâîäíûå ïî  y  è ïî  x  â ýòèõ ïîäïðîãðàììàõ àïïðîêñèìèðóþòñÿ öåíòðàëüíûìè ðàçíîñòíûìè îòíîøåíèÿìè. Çàìåíà òî÷íûõ çíà÷åíèé ïðîèçâîäíûõ ðàçíîñòíûìè àïïðîêñèìàöèÿìè ìîæåò ïðèâåñòè ê ðîñòó ïîãðåøíîñòè ïðèáëèæåííîãî ðåøåíèÿ ñèñòåìû äèôôåðåíöèàëüíûõ óðàâíåíèé ïî ñðàâíåíèþ ñ òåì, ÷òî áûëî áû, åñëè áû âñå ÷àñòíûå ïðîèçâîäíûå âû÷èñëÿëèñü òî÷íî ñ ïîìîùüþ ïîäïðîãðàìì fj è fx. Äàæå åñëè áóäåò ìàëà ïîãðåøíîñòü àïïðîêñèìàöèè ÷àñòíûõ ïðîèçâîäíûõ (íàïðèìåð, åñëè ïðàâàÿ ÷àñòü ñèñòåìû ÿâëÿåòñÿ ëèíåéíîé ôóíêöèåé ñâîèõ àðãóìåíòîâ, òî ïîãðåøíîñòü àïïðîêñèìàöèè ÷àñòíûõ ïðîèçâîäíûõ ðàâíà íóëþ), ìîæåò îêàçàòüñÿ çíà÷èòåëüíîé âû÷èñëèòåëüíàÿ ïîãðåøíîñòü, îñîáåííî, êîãäà âû÷èñëåíèÿ âûïîëíÿþòñÿ ñ îäèíàðíîé òî÷íîñòüþ. Ïðè ýòîì âû÷èñëèòåëüíàÿ ïîãðåøíîñòü ìîæåò äàæå ïðåâîñõîäèòü âåðõíèé ïðåäåë ïîãðåøíîñòè ïðèáëèæåííîãî ðåøåíèÿ, çàäàííûé ïðè îáðàùåíèè ê ïîäïðîãðàììå ïàðàìåòðîì eps.  ýòîì ñëó÷àå öåëåñîîáðàçíî èñïîëüçîâàòü íå ïîäïðîãðàììû de92r_c, de96r_c, à èõ âåðñèè, âûïîëíÿþùèå âû÷èñëåíèÿ ñ óäâîåííûì ÷èñëîì çíà÷àùèõ öèôð, ò.å. ïîäïðîãðàììû de92d_c, de96d_c.

Åñëè ÷àñòíûå ïðîèçâîäíûå ïî  x  îò ïðàâîé ÷àñòè ñèñòåìû âû÷èñëÿþòñÿ ñ ïîìîùüþ öåíòðàëüíûõ ðàçíîñòíûõ îòíîøåíèé (ò.å. êîãäà ïðîèçâîäèòñÿ îáðàùåíèå ê ïîäïðîãðàììàì de96r_c, de96d_c), òî çíà÷åíèÿ ïðàâîé ÷àñòè ñèñòåìû, íåîáõîäèìûå äëÿ àïïðîêñèìàöèè ýòîé ïðîèçâîäíîé, áóäóò âû÷èñëÿòüñÿ ñ ïîìîùüþ ïîäïðîãðàììû f ïðè çíà÷åíèÿõ àðãóìåíòà x, íàõîäÿùèõñÿ ïî ðàçíûå ñòîðîíû îò òî÷êè xn, à èìåííî, ïðè xn - Δ, xn + Δ ãäå Δ - çíà÷åíèå, çàäàâàåìîå ïàðàìåòðîì eps. Åñëè ïðàâàÿ ÷àñòü ñèñòåìû äèôôåðåíöèàëüíûõ óðàâíåíèé íå îïðåäåëåíà äëÿ  x < xn  ïðè èíòåãðèðîâàíèè ñëåâà íàïðàâî èëè äëÿ  x > xn  ïðè èíòåãðèðîâàíèè ñïðàâà íàëåâî, òî ïîïûòêà âû÷èñëèòü ïðàâóþ ÷àñòü äëÿ óêàçàííîãî çíà÷åíèÿ àðãóìåíòà  x  ìîæåò ïðèâåñòè ê àâîñòó.

Ïðèìåð èñïîëüçîâàíèÿ

      
   Ðåøàåòñÿ çàäà÷à Êîøè

      y1' = - 100y1 
      y2' = - 100y1  - 2y2  + 20e - 100x + 2e - x cos x 
      y3' = - 100y1  + 9998y2 - 9990y3 - 10y4  + 20e - 100x + 2e - x cos x 
      y4' = - 100y1  + 9988y2  + 20y3 - 10010y4  + 20e - 100x + 2e - x cos x 

      x  =  0 ,  y1(0) = 10 ,  y2(0) = 11 ,  y3(0) = 111 ,  y4(0) = 111 . 

   Òî÷íîå ðåøåíèå çàäà÷è èìååò âèä:

      y1  = 10e - 100x 
      y2  = 10e - 100x + e - x cos x + e - x sin x 
      y3  = y2  + 100e - 10000x cos 10x 
      y4  = y3  + 100e - 10000x sin 10x 

   Ìàòðèöà ßêîáè ïðàâîé ÷àñòè ñèñòåìû èìååò âèä:

              - 100        0             0              0      
              - 100      - 2             0              0      
              - 100        9998     - 9990     - 10     
              - 100        9988       20         - 10010   

   ×àñòíûå ïðîèçâîäíûå ïî  x  ïðàâîé ÷àñòè ñèñòåìû èìåþò âèä:

                        0                 
     - 2000e - 100x - 2e - x (cos x + sin x)   
     - 2000e - 100x - 2e - x (cos x + sin x)   
     - 2000e - 100x - 2e - x (cos x + sin x)   

Íèæå ïðèâîäÿòñÿ ôðàãìåíò âûçûâàþùåé ïðîãðàììû äëÿ de94r_c, ïîäïðîãðàììû f, fj, fx è ðåçóëüòàòû ñ÷åòà, ïîëó÷åííûå ïîñëå íåñêîëüêèõ îáðàùåíèé ê ïîäïðîãðàììå de94r_c.

int main(void)
{
    /* Builtin functions */
    double exp(double), cos(double), sin(double);

    /* Local variables */
    extern int de94r_c(U_fp, U_fp, U_fp, int *, int *, float *, float *,
                       float *, float *, float *, float *, logical *,
                       float *, float *, float *, float *, float *,
                       float *, float *, float *, float *, float *,
                       float *, int *);
    static float hmin;
    static int ierr;
    static float a[16] /* was [4][4] */;
    extern int f_c();
    static float h__;
    static int m;
    static float p, x, a1[16] /* was [4][4] */,
                       a2[16] /* was [4][4] */,
                 r1[4], r2[4], r3[4], r4[4], y1, y2, y3, y4;
    extern int fj_c();
    static int ih;
    static float yd[4];
    extern int fx_c();
    static float xp, yp[4], yx[4];
    static int jstart;
    static float rab[20];
    static logical bul;
    static float eps;

    m = 4;
    x = 0.f;
    yx[0] = 10.f;
    yx[1] = 11.f;
    yx[2] = 111.f;
    yx[3] = 111.f;
    hmin = 1e-10f;
    eps = 1e-4f;
    p = 1e3f;
    jstart = 0;
    h__ = .01f;
    ih = 0;
L100:
    ++ih;
    de94r_c((U_fp)f_c, (U_fp)fj_c, (U_fp)fx_c, &m, &jstart, &hmin, &eps, &p,
            yx, &x, &h__, &bul, &xp, yp, a, a1, a2, rab, r1, r2, r3, r4, yd,
            &ierr);

/*   B›—ˆC‹EHˆE TO—HOƒO PE˜EHˆŸ CˆCTEM›: */
    y1 = (float)exp(x * -100.f) * 10.f;
    y2 = y1 + (float)exp(-x) * ((float)cos(x) + (float)sin(x));
    y3 = y2 + (float)exp(x * -1e4f) * 100.f *
         (float)cos(x * 10.f);
    y4 = y3 + (float)exp(x * -1e4f) * 100.f *
         (float)sin(x * 10.f);

    printf("\n %16.7e %16.7e ", y1, y2);
    printf("\n %16.7e %16.7e \n", y3, y4);
    printf("\n %16.7e %16.7e ", yx[0], yx[1]);
    printf("\n %16.7e %16.7e \n", yx[2], yx[3]);
    printf("\n %16.7e \n", x);
    printf("\n %16.7e \n", h__);
/* PAC�E—ATKA �OƒPE˜HOCTˆ �Pˆ�‹ˆ†EHHOƒO PE˜EHˆŸ */
    printf("\n %16.7e %16.7e ", rab[0], rab[1]);
    printf("\n %16.7e %16.7e \n\n", rab[2], rab[3]);
    switch (ih) {
        case 1:  goto L101;
        case 2:  goto L102;
        case 3:  goto L103;
        case 4:  goto L104;
        case 5:  goto L105;
        case 6:  goto L106;
    }
L101:
    h__ = 1e-8f;
    goto L100;
L102:
    h__ = -1e-8f;
    goto L100;
L103:
    jstart = -1;
    goto L100;
L104:
    jstart = -1;
    h__ = -1e-8f;
    goto L100;
L105:
    h__ = .01f;
    goto L100;
L106:
    return 0;
} /* main */

int f_c(float *x, float *y, float *dy, int *m)
{
    /* Builtin functions */
    double exp(double), cos(double);

    /* Local variables */
    static float t1;

    /* Parameter adjustments */
    --dy;
    --y;

    /* Function Body */
    dy[1] = y[1] * -100.f;
    t1 = (float)exp(*x * -100.f) * 20.f +
         (float)exp(-(*x)) * 2.f * (float)cos(*x);
    dy[2] = dy[1] - y[2] * 2.f + t1;
    dy[3] = dy[1] + y[2] * 9998.f - y[3] * 9990.f - y[4] * 10.f + t1;
    dy[4] = dy[1] + y[2] * 9988.f + y[3] * 20.f - y[4] * 10010.f + t1;
    return 0;
} /* f_c */

int fj_c(float *x, float *y, float *df, int *m)
{
#define df_ref(a_1,a_2) df[(a_2)*4 + a_1]

    /* Parameter adjustments */
    df -= 5;
    --y;

    /* Function Body */
    df_ref(1, 1) = -100.f;
    df_ref(1, 2) = 0.f;
    df_ref(1, 3) = 0.f;
    df_ref(1, 4) = 0.f;
    df_ref(2, 1) = -100.f;
    df_ref(2, 2) = -2.f;
    df_ref(2, 3) = 0.f;
    df_ref(2, 4) = 0.f;
    df_ref(3, 1) = -100.f;
    df_ref(3, 2) = 9998.f;
    df_ref(3, 3) = -9990.f;
    df_ref(3, 4) = -10.f;
    df_ref(4, 1) = -100.f;
    df_ref(4, 2) = 9988.f;
    df_ref(4, 3) = 20.f;
    df_ref(4, 4) = -10010.f;
    return 0;
} /* fj_c */

#undef df_ref

int fx_c(float *x, float *y, float *dx, int *m)
{
    /* Builtin functions */
    double exp(double), cos(double), sin(double);

    /* Parameter adjustments */
    --dx;
    --y;

    /* Function Body */
    dx[1] = 0.f;
    dx[2] = (float)exp(*x * -100.f) * -2e3f -
            (float)exp(-(*x)) * 2.f * ((float)cos(*x) +
            (float)sin(*x));
    dx[3] = dx[2];
    dx[4] = dx[2];
    return 0;
} /* fx_c */


Ðåçóëüòàòû:

ïîñëå ïåðâîãî îáðàùåíèÿ ê ïîäïðîãðàììå -

              y1                                   y2 
      9.997558891759 + 00     1.099755889174 + 01
              y3                                   y4 
      1.085857138761 + 02     1.085880963993 + 02
             yx(1)                               yx(2)
      9.997558891700 + 00     1.099755889169 + 01
             yx(3)                                yx(4)
      1.085857138677 + 02     1.085880963909 + 02
              x                                     h
      2.441406250001 - 06     2.441406250001 - 06

Ðàñïå÷àòêà êîíòðîëüíîãî ÷ëåíà ïîãðåøíîñòè:

            rab(1)                           rab(2)
    - 9.701276818918 - 13     - 2.910383045670 - 12
            rab(3)                           rab(4)
      7.823109626764 - 09       7.784304519497 - 09

ïîñëå âòîðîãî îáðàùåíèÿ ê ïîäïðîãðàììå -

              y1                                   y2 
      9.997548894156 + 00     1.099754889414 + 01
              y3                                   y4 
      1.085759455506 + 02     1.085783375935 + 02
             yx(1)                               yx(2)
      9.997548894098 + 00     1.099754889408 + 01
             yx(3)                               yx(4)
      1.085759455420 + 02     1.085783375847 + 02
              x                                     h
      2.451406249999 - 06     2.000000000004 - 08

Ðàñïå÷àòêà êîíòðîëüíîãî ÷ëåíà ïîãðåøíîñòè:

            rab(1)                           rab(2)
      0.000000000000 + 00     0.000000000000 + 00
            rab(3)                           rab(4)
    - 7.761021455135 - 12   - 1.552204291027 - 11

ïîñëå òðåòüåãî îáðàùåíèÿ ê ïîäïðîãðàììå -

              y1                                   y2 
      9.997558891759 + 00     1.099755889174 + 01
              y3                                   y4 
      1.085857138761 + 02     1.085880963993 + 02
             yx(1)                               yx(2)
      9.997558891613 + 00     1.099755889160 + 01
             yx(3)                               yx(4)
      1.085857138667 + 02     1.085880963901 + 02
              x                                     h
      2.441406249998 - 06   - 2.000000000004 - 08

Ðàñïå÷àòêà êîíòðîëüíîãî ÷ëåíà ïîãðåøíîñòè:

            rab(1)                           rab(2)
    - 9.701276818918 - 13   - 9.701276818918 - 13
            rab(3)                           rab(4)
    - 2.328306436536 - 11   - 1.552204291027 - 11

ïîñëå ÷åòâåðòîãî îáðàùåíèÿ ê ïîäïðîãðàììå -

              y1                                   y2 
      9.997568889303 + 00     1.099756888929 + 01
              y3                                   y4 
      1.085954831772 + 02     1.085978561790 + 02
             yx(1)                               yx(2)
      9.997568889157 + 00     1.099756888914 + 01
             yx(3)                               yx(4)
      1.085954831680 + 02     1.085978561698 + 02
              x                                     h
      2.431406249996 - 06   - 4.000000000008 - 08

Ðàñïå÷àòêà êîíòðîëüíîãî ÷ëåíà ïîãðåøíîñòè:

            rab(1)                           rab(2)
    - 1.940255363783 - 12   - 1.940255363783 - 12
            rab(3)                           rab(4)
    - 1.552204291027 - 11   - 1.552204291027 - 11

ïîñëå ïÿòîãî îáðàùåíèÿ ê ïîäïðîãðàììå -

              y1                                   y2 
      9.997558891759 + 00     1.099755889174 + 01
              y3                                   y4 
      1.085857138761 + 02     1.085880963993 + 02
             yx(1)                               yx(2)
      9.997558891613 + 00     1.099755889160 + 01
             yx(3)                               yx(4)
      1.085857138667 + 02     1.085880963901 + 02
              x                                     h
      2.441406249998 - 06   - 2.000000000004 - 08

Ðàñïå÷àòêà êîíòðîëüíîãî ÷ëåíà ïîãðåøíîñòè:

            rab(1)                           rab(2)
    - 9.701276818918 - 13   - 9.701276818918 - 13
            rab(3)                           rab(4)
    - 2.328306436536 - 11   - 1.552204291027 - 11

ïîñëå øåñòîãî îáðàùåíèÿ ê ïîäïðîãðàììå -

              y1                                   y2 
      9.995118379389 + 00     1.099511837936 + 01
              y3                                   y4 
      1.062995982552 + 02     1.062342483763 + 02
             yx(1)                               yx(2)
      9.995118379200 + 00     1.099511837916 + 01
             yx(3)                               yx(4)
      1.062995982379 + 02     1.062342483588 + 02
              x                                     h
      4.882812499996 - 06     2.441406250001 - 06

Ðàñïå÷àòêà êîíòðîëüíîãî ÷ëåíà ïîãðåøíîñòè:

            rab(1)                           rab(2)
    - 1.940255363783 - 12   - 2.910387045670 - 12
            rab(3)                           rab(4)
      7.644606133297 - 09     7.590278983110 - 09