Текст подпрограммы и версий
de95r_p.zip  de95e_p.zip  de91r_p.zip  de91e_p.zip  de93r_p.zip  de93e_p.zip  de97r_p.zip  de97e_p.zip
Тексты тестовых примеров
tde95r_p.zip  tde95e_p.zip  tde91r_p.zip  tde91e_p.zip  tde93r_p.zip  tde93e_p.zip  tde97r_p.zip  tde97e_p.zip

Подпрограмма:  DE95R (модуль DE95R_p) (версии: DE91R, DE93R, DE97R)

Назначение

Вычисление решения задачи Коши для жесткой системы обыкновенных дифференциальных уравнений первого порядка в конце интервала интегрирования методом типа Розенброка четвертого порядка.

Математическое описание

Решается задача Коши для системы M обыкновенных дифференциальных уравнений первого порядка

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

методом типа Розенброка четвертого порядка.

Решение вычисляется в одной точке XK, которая является концом интервала интегрирования. Для всех компонент решения осуществляется контроль точности по мере погрешности, который заключается в следующем. Если некоторая компонента приближенного решения по абсолютной величине не меньше некоторой наперед заданной константы P (называемой границей перехода), то контроль точности для этой компоненты ведется по относительной погрешности, иначе - по абсолютной.

Артемьев С.С., Демидов Г.В. A - устойчивый метод типа Розенброка четвертого порядка точности решения задачи Коши для жестких систем обыкновенных дифференциальных уравнений. Некоторые проблемы вычислительной и прикладной математики. Новосибирск: "Наука", 1975.

Современные численные методы решения обыкновенных дифференциальных уравнений. Под ред. Дж.Холла и Дж.Уатта. М.: "Мир", 1979.

Использование

procedure DE95R(F :Proc_F_DE; FJ :Proc_F_DE; FX :Proc_F_DE;
                M :Integer; XN :Real; var YN :Array of Real;
                XK :Real; HMIN :Real; EPS :Real; P :Real;
                var H :Real; var Y :Array of Real;
                var R :Array of Real; var IERR :Integer);

Параметры

F - имя подпрограммы вычисления значений правой части дифференциальных уравнений. Первый оператор подпрограммы должен иметь вид:
procedure F (X :Real; var Y :Array of Real; var DY :Array of Real; M :Integer);:
Здесь X, Y - значения независимой и зависимой переменных, соответственно. Вычисленное значение правой части должно быть помещено в DY; в случае системы уравнений, т.е. когда M ≠ 1, параметры Y и DY представляют одномерные массивы длиной M (тип параметров X, Y и DY: вещественный);
FJ - имя подпрограммы вычисления значений элементов матрицы Якоби ∂f / ∂y правой части системы. Первый оператор подпрограммы должен иметь вид:
procedure FJ (X :Real; var Y :Array of Real; var Z :Array of Real; M :Integer);
Здесь 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. Первый оператор подпрограммы должен иметь вид:
procedure FX (X :Real; var Y :Array of Real; var Z1 :Array of Real; M :Integer);
Здесь: X, Y - значения независимой и зависимой переменных, соответственно. В случае системы уравнений, т.е. когда M ≠ 1, параметры Y и Z1 представляют собой одномерные массивы длиной M. Значения частных производных по X правой части системы ∂f / ∂x должны быть помещены в массив Z1; при этом частная производная от правой части I - го уравнения запоминается в элементе Z1 (I) (тип параметров X, Y и Z1: вещественный);
M - количество уравнений в системе (тип: целый);
XN, YN - начальные значения аргумента и решения; в случае системы уравнений (т.е. M ≠ 1) YN представляет одномерный массив длины M (тип: вещественный);
XK - значение аргумента, при котором требуется вычислить решение задачи Коши (конец интервала интегрирования); XK может быть больше, меньше или равно XN (тип: вещественный);
HMIN - минимальное значение абсолютной величины шага, которое разрешается использовать при интегрировании данной системы уравнений (тип: вещественный);
EPS - допустимая мера погрешности, с которой требуется вычислить все компоненты решения (тип: вещественный);
P - граница перехода, используемая при оценке меры погрешности решения (тип: вещественный);
H - вещественная переменная, содержащая начальное значение шага интегрирования; может задаваться с учетом направления интегрирования, т.е. положительным, если XN < XK, отрицательным, если XN > XK, или без всякого учета в виде абсолютной величины;
Y - искомое решение задачи Коши, вычисленное подпрограммой при значении аргумента XK; для системы уравнений (когда M ≠ 1) задается одномерным массивом длины M. В случае совпадения значений параметров XN и XK значение Y полагается равным начальному значению YN (тип: вещественный);
R - одномерный рабочий массив вещественного типа длины 3*M*M + 11*M + 1;
IERR - целая переменная, значение которой в результате работы подпрограммы полагается равным 65, если какая - нибудь компонента решения не может быть вычислена с требуемой точностью EPS; в этом случае интегрирование системы можно повторить обращением к подпрограмме с новыми значениями параметров H и HMIN.

Версии

DE97R -

вычисление решения задачи Коши для жесткой системы обыкновенных дифференциальных уравнений первого порядка в конце интервала интегрирования методом типа Розенброка четвертого порядка. Отличие подпрограммы DE97R от подпрограммы DE95R состоит в том, что при обращении к подпрограмме DE97R не требуется задавать подпрограмму вычисления матрицы Якоби системы и подпрограмму вычисления частных производных правой части системы по  x. Все частные производные от правой части вычисляются в подпрограмме DE97R с помощью разностных отношений. Первый оператор подпрограммы DE97R имеет вид:

      procedure DE97R(F :Proc_F_DE; M :Integer; XN :Real;
                var YN :Array of Real; XK :Real; HMIN :Real;
                EPS :Real; P :Real; var H :Real;
                var Y :Array of Real; var R :Array of Real;
                var IERR :Integer);
    
Список формальных параметров подпрограммы DE97R отличается от списка параметров подпрограммы DE95R отсутствием параметров FJ и FX. Параметры подпрограммы DE97R имеют тот же смысл, что и одноименные параметры подпрограммы DE95R.
DE91R - вычисление решения задачи Коши для автономной жесткой системы обыкновенных дифференциальных уравнений первого порядка в конце интервала интегрирования методом типа Розенброка четвертого порядка. Данная подпрограмма предназначена для интегрирования систем уравнений, в правые части которых не входит независимая переменная  x, т.е. систем вида y ' = f (y). Первый оператор подпрограммы DE91R имеет вид:
      procedure DE91R(F :Proc_F_DE; FJ :Proc_F_DE; M :Integer; XN :Real;
                   var YN :Array of Real; XK :Real; HMIN :Real;
                   EPS :Real; P :Real; var H :Real;
                   var Y :Array of Real; var R :Array of Real;
                   var IERR :Integer);
  

Список формальных параметров подпрограммы DE91R отличается от списка параметров DE95R отсутствием параметра FX. Параметры подпрограммы DE91R имеют тот же смысл, что и одноименные параметры подпрограммы DE95R, кроме параметра R. В подпрограмме DE91R параметр R представляет одномерный вещественный рабочий массив длины 3M2 + 8M + 1 .

DE93R - вычисление решения задачи Коши для автономной жесткой системы обыкновенных дифференциальных уравнений первого порядка в конце интервала интегрирования методом Розенброка четвертого порядка. Данная подпрограмма предназначена для интегрирования систем уравнений, в правые части которых не входит независимая переменная  x, т.е. систем вида y ' = f (y). Отличие подпрограммы DE93R от подпрограммы DE95R состоит в том, что при обращении к подпрограмме DE93R не требуется задавать подпрограмму вычисления матрицы Якоби системы ∂f / ∂y и подпрограмму вычисления частных производных ∂f / ∂x. Все частные производные от правой части вычисляются в подпрограмме DE93R с помощью разностных отношений. Первый оператор подпрограммы DE93R имеет вид:
   
      procedure DE93R(F :Proc_F_DE; M :Integer; XN :Real;
                   var YN :Array of Real; XK :Real; var HMIN :Real;
                   var EPS :Real; var P :Real; var H :Real;
                   var Y :Array of Real; var R :Array of Real;
                   var IERR :Integer);
   

Список формальных параметров подпрограммы DE93R отличается от списка параметров подпрограммы DE95R отсутствием параметров FJ и FX. Параметры подпрограммы DE93R имеют тот же смысл, что и одноименные параметры подпрограммы DE95R, кроме параметра R. В подпрограмме DE93R параметр R представляет одномерный вещественный рабочий массив длины 3M2 + 8M + 1 .

DE95E - вычисление решения задачи Коши для жесткой системы обыкновенных дифференциальных уравнений первого порядка в конце интервала интегрирования методом типа Розенброка четвертого порядка с расширенной (Extended) точностью. Первый оператор подпрограммы имеет тот же вид, что и в подпрограмме DE95R; при этом параметры XN, YN, XK, HMIN, EPS, P, H, Y, R и параметры X, Y, DY, Z, Z1 в подпрограммах F, FJ и FX должны иметь тип Extended.
DE97E - вычисление решения задачи Коши для жесткой системы обыкновенных дифференциальных уравнений первого порядка в конце интервала интегрирования методом типа Розенброка четвертого порядка с расширенной (Extended) точностью. Первый оператор подпрограммы имеет тот же вид, что и в подпрограмме DE97R; при этом параметры XN, YN, XK, HMIN, EPS, P, H, Y, R и параметры X, Y, DY в подпрограмме F должны иметь тип Extended.
DE91E - вычисление решения задачи Коши для автономной жесткой системы обыкновенных дифференциальных уравнений первого порядка в конце интервала интегрирования методом типа Розенброка четвертого порядка с расширенной (Extended) точностью. Первый оператор подпрограммы имеет тот же вид, что и в подпрограмме DE91R; при этом параметры XN, YN, XK, HMIN, EPS, P, H, Y, R и параметры X, Y, DY, Z в подпрограммах F и FJ должны иметь тип Extended.
DE93E - вычисление решения задачи Коши для автономной жесткой системы обыкновенных дифференциальных уравнений первого порядка в конце интервала интергирования методом типа Розенброка четвертого порядка с расширенной (Extended) точностью. Первый оператор подпрограммы имеет тот же вид, что и в подпрограмме DE93R; при этом параметры XN, YN, XK, HMIN, EPS, P, H, Y, R и параметры X, Y, DY в подпрограмме F должны иметь тип Extended.

Вызываемые подпрограммы

       DE94R -
       DE94E  
выполнение одного шага численного интегрирования жесткой системы обыкновенных дифференциальных уравнений первого порядка методом типа Розенброка с обыкновенной и расширенной (Extended) точностью. Вызываются при работе подпрограмм DE95R и DE95E соответственно.
       DE96R -
       DE96E  
выполнение одного шага численного интегрирования жесткой системы обыкновенных дифференциальных уравнений первого порядка методом типа Розенброка с обыкновенной и расширенной (Extended) точностью. Вызываются при работе подпрограмм DE97R и DE97E соответственно.
       DE90R -
       DE90E  
выполнение одного шага численного интегрирования автономной жесткой системы обыкновенных дифференциальных уравнений первого порядка методом типа Розенброка с обыкновенной и расширенной (Extended) точностью. Вызываются при работе подпрограмм DE91R и DE91E соответственно.
       DE92R -
       DE92E  
выполнение одного шага численного интегрирования автономной жесткой системы обыкновенных дифференциальных уравнений первого порядка методом типа Розенброка с обыкновенной и расширенной (Extended) точностью. Вызываются при работе подпрограмм DE93R и DE93E соответственно.
      UTDE20 -
      UTDE21  
подпрограммы выдачи диагностических сообщений. Подпрограмма UTDE20 вызывается при работе подпрограмм DE91R, DE93R, DE95R, DE97R; подпрограмма UTDE21 вызывается при работе подпрограмм DE91E, DE93E, DE95E, DE97E.

Замечания по использованию

 

В общем случае заданная точность не гарантируется.

При работе подпрограммы и ее версий значения параметров M, XN, YN, XK, HMIN, EPS, P сохраняются. При работе подпрограмм F, FJ и FX значения параметров M, X, Y не должны изменяться.

Если после работы подпрограммы нет необходимости иметь начальное значение решения YN, то параметры YN и Y при обращении к ней можно совместить. При этом следует иметь в виду, что в случае аварийного выхода из подпрограммы, т.е. со значением IERR = 65, значение параметра YN будет испорчено.

В подпрограмме DE95R и ее версиях используется одношаговый метод типа Розенброка четвертого порядка точности. На каждом шаге h интегрирования, выполняемом из текущего узла интегрирования xn, вычисляются четыре значения правой части системы дифференциальных уравнений. Среди этих значений есть одно, которое должно вычисляться при значении независимой переменной  x, равном  xn - h. Это значение аргумента находится слева от точки  xn при  h > 0 и справа от точки  xn при  h < 0.

В частности, при выполнении первого шага  h из начальной точки  xN (напомним, что абсолютная величина первого шаг  h берется равной абсолютной величине значения, заданного параметром H при обращении к подпрограмме, а знак первого шага определяется соотношением значений параметров XN и XK) значение  xN - h не будет принадлежать интервалу интегрирования, ограниченному значениями, заданными параметрами XN и XK при обращении к подпрограмме DE95R (или ее версиями). Это следует учитывать при составлении подпрограммы F вычисления правой части системы. Если правая часть системы не определена для  x, не принадлежащих интервалу интегрирования, то попытка вычислить правую часть для указанного значения аргумента  x может привести к аварийному прерыванию.

Если при решении системы диффиренциальных уравнений не задаются подпрограммы FJ вычисления матрицы Якоби и FX вычисления частных производных по  x правой части системы (т.е. производится обращение к подпрограммам DE93R, DE97R, DE93E, DE97E), то все частные производные по  y  и по  x  в этих подпрограммах аппроксимируются центральными разностными отношениями. Замена точных значений производных разностными аппроксимациями может привести к росту погрешности приближенного решения системы дифференциальных уравнений по сравнению с тем, что было бы, если бы все частные производные вычислялись точно с помощью подпрограмм FJ и FX. Даже если будет мала погрешность аппроксимации частных производных (например, если правая часть системы является линейной функцией своих аргументов, то погрешность аппроксимации частных производных равна нулю), может оказаться значительной вычислительная погрешность, особенно, когда вычисления выполняются с одинарной точностью. При этом вычислительная погрешность может даже превосходить верхний предел погрешности приближенного решения, заданный при обращении к подпрограмме параметром EPS. В этом случае целесообразно использовать не подпрограммы DE93R, DE97R, а их версии, выполняющие вычисления с удвоенным числом значащих цифр, т.е. подпрограммы DE93E, DE97E.

Пример использования

      
   Пример 1.
  

Решается задача Коши y1' = -100 y1 y2' = -100 y1 - 2 y2 + 20 e - 100 x + 2 e - x cos x y3' = -100 y1 + 9998 y2 - 9990 y3 - 10 y4 + 20 e - 100 x + 2 e - x cos x y4' = -100 y1 + 9988 y2 + 20 y3 - 10010 y4 + 20 e - 100 x + 2 e - x cos x 0 ≤ x ≤ 10 , y1(0) = 10 , y2(0) = 11 , y3(0) = 111 , y4(0) = 11 Точное решение задачи имеет вид: y1 = 10 e -100 x y2 = 10 e - 100 x + e - x cos x + e - x sin x y3 = y2 + 100 e - 10000 x cos 10x y4 = y3 + 100 e - 10000 x sin 10x Матрица Якоби правой части системы имеет вид: | -100 0 0 0 | -100 -2 0 0 | -100 9998 -9990 -10 | -100 9988 20 -10010 Частные производные по x правой части системы имеют вид: | 0 | -2000 e - 100 x - 2 e - x (cos x + sin x) | -2000 e - 100 x - 2 e - x (cos x + sin x) | -2000 e - 100 x - 2 e - x (cos x + sin x)

Ниже приводятся фрагмент вызывающей программы для DE95R, подпрограммы F, FJ, FX и результаты счета, полученные после нескольких обращений к подпрограмме DE95R.

Unit TDE95R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, FDE95R_p, FJDE95R_p, FXDE95R_p, DE95R_p;

function TDE95R: String;

implementation

function TDE95R: String;
var
M,IH,IERR :Integer;
XN,HMIN,EPS,P,XK,Y1,Y2,Y3,Y4,H :Real;
YN :Array [0..3] of Real;
Y :Array [0..3] of Real;
R :Array [0..92] of Real;
label
_10;
begin
Result := '';  { результат функции }
M := 4;
XN := 0.0;
YN[0] := 10.0;
YN[1] := 11.0;
YN[2] := 111.0;
YN[3] := 111.0;
HMIN := 1.E-10;
EPS := 1.E-2;
P := 1.E3;
ХК := 10.0;
{   ВЫЧИСЛЕНИЕ ТОЧНОГО РЕШЕНИЯ CИCTEMЫ: }
Y1 := 10.0*Exp(-100.0*XK);
Y2 := Y1+Exp(-XK)*(Cos(XK)+Sin(XK));
Y3 := Y2+100.0*Exp(-1.E4*XK)*Cos(10.0*XK);
Y4 := Y3+100.0*Exp(-1.E4*XK)*Sin(10.0*XK);
Result := Result + Format(' %20.16f  %20.16f  %20.16f  %20.16f ',
 [Y1,Y2,Y3,Y4]) + #$0D#$0A;
IH := 0;
_10:
IH := IH + 1;
H := 0.01;
DE95R (FDE95R,FJDE95R,FXDE95R,M,XN,YN,XK,HMIN,EPS,P,H,Y,R,IERR);
Result := Result + Format('%s',[' ']) + #$0D#$0A; 
Result := Result + Format('%s',[' EPS= ']);
Result := Result + Format('%20.16f ',[EPS]) + #$0D#$0A;
Result := Result + Format('%s',[' ']) + #$0D#$0A; 
Result := Result + Format(' %20.16f  %20.16f  %20.16f  %20.16f ',
 [Y[0],Y[1],Y[2],Y[3]]) + #$0D#$0A;
Result := Result + Format('%s',[' H= ']);
Result := Result + Format('%20.16f ',[H]) + #$0D#$0A;
EPS := EPS*1.E-2;
if ( IH < 3 ) 
 then goto _10;
UtRes('TDE95R',Result);  { вывод результатов в файл TDE95R.res }
exit;
end;

end.

Unit fde95r_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc;

procedure fde95r(X :Real; var Y :Array of Real; var DY :Array of Real;
                M :Integer);

implementation

procedure fde95r(X :Real; var Y :Array of Real; var DY :Array of Real;
                M :Integer);
var
T1 :Real;
begin
DY[0] := -100.0*Y[0];
T1 := 20.0*Exp(-100.0*X)+2.0*Exp(-X)*Cos(X);
DY[1] := DY[0]-2.0*Y[1]+T1;
DY[2] := DY[0]+9998.0*Y[1]-9990.0*Y[2]-10.0*Y[3]+T1;
DY[3] := DY[0]+9988.0*Y[1]+20.0*Y[2]-10010.0*Y[3]+T1;
end;

end.

Unit fjde95r_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc;

procedure fjde95r(X :Real; var Y :Array of Real; var DF :Array of Real;
                M :Integer);

implementation

procedure fjde95r(X :Real; var Y :Array of Real; var DF :Array of Real;
                M :Integer);
begin
DF[0] := -100.0;
DF[4] := 0.0;
DF[8] := 0.0;
DF[12] := 0.0;
DF[1] := -100.0;
DF[5] := -2.0;
DF[9] := 0.0;
DF[13] := 0.0;
DF[2] := -100.0;
DF[6] := 9998.0;
DF[10] := -9990.0;
DF[14] := -10.0;
DF[3] := -100.0;
DF[7] := 9988.0;
DF[11] := 20.0;
DF[15] := -10010.0;
end;

end.

Unit fxde95r_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc;

procedure fxde95r(X :Real; var Y :Array of Real; var DX :Array of Real;
                M :Integer);

implementation

procedure fxde95r(X :Real; var Y :Array of Real; var DX :Array of Real;
                M :Integer);
begin
DX[0] := 0.0;
DX[1] := -2.E3*Exp(-1.E2*X)-2.0*Exp(-X)*(Cos(X)+Sin(X));
DX[2] := DX[1];
DX[3] := DX[1];
end;

end.

 Результаты: 

              Y1                                   Y2 
      0.000000000000+00    -6.279230870976-05 
              Y3                                   Y4 
     -6.279230870976-05    -6.279230870976-05 

      после первого обращения к подпрограмме -
      EPS = 1.0-02 
              Y(1)                                 Y(2) 
      7.146873880164-13    -6.764660892966-05 
              Y(3)                                 Y(4) 
     -6.764660892122-05    -6.764660892966-05 
      H = 2.560000000001+00 
   
      после второго обращения к подпрограмме -
      EPS = 1.0-04 
              Y(1)                                 Y(2) 
      6.621227792960-20    -6.330159900469-05 
              Y(3)                                 Y(4) 
     -6.330159900392-05    -6.330159900414-05 
      H = 2.560000000001+00 

      после третьего обращения к подпрограмме -
      EPS = 1.0-06
              Y(1)                                 Y(2) 
      0.000000000000+00    -6.286382905407-05 
              Y(3)                                 Y(4) 
     -6.286382905418-05    -6.286382905407-05 
      H = 1.280000000001+00 
   
      после четвертого обращения к подпрограмме -
      EPS = 1.0-08 
              Y(1)                                 Y(2) 
      0.000000000000+00    -6.279451115976-05 
              Y(3)                                 Y(4) 
     -6.279451115976-05    -6.279451116020-05 
      H = 3.200000000002-01 

   Пример 2.

Решается система из примера 1. Приводятся фрагмент вызывающей программы для DE97R, подпрограмма F и результаты счета, полученные после нескольких обращений к подпрограмме DE97R.

   
Unit tde97r_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, FDE97R_p, DE97R_p;

function tde97r: String;

implementation

function tde97r: String;
var
M,IH,IERR :Integer;
XN,HMIN,EPS,P,XK,Y1,Y2,Y3,Y4,H :Real;
YN :Array [0..3] of Real;
Y :Array [0..3] of Real;
R :Array [0..92] of Real;
label
_10;
begin
Result := '';  { результат функции }
M := 4;
XN := 0.0;
YN[0] := 10.0;
YN[1] := 11.0;
YN[2] := 111.0;
YN[3] := 111.0;
HMIN := 1.E-10;
EPS := 1.E-2;
P := 1.E3;
XK := 10.0;
{   BЫЧИCЛEHИE TOЧHOГO PEШEHИЯ CИCTEMЫ: }
Y1 := 10.0*Exp(-100.0*XK);
Y2 := Y1+Exp(-XK)*(Cos(XK)+Sin(XK));
Y3 := Y2+100.0*Exp(-1.E4*XK)*Cos(10.0*XK);
Y4 := Y3+100.0*Exp(-1.E4*XK)*Sin(10.0*XK);
Result := Result + Format(' %20.16f  %20.16f  %20.16f  %20.16f ',
 [Y1,Y2,Y3,Y4]) + #$0D#$0A;
IH := 0;
_10:
IH := IH + 1;
H := 0.01;
DE97R (FDE97R,M,XN,YN,XK,HMIN,EPS,P,H,Y,R,IERR);
Result := Result + Format('%s',[' ']) + #$0D#$0A; 
Result := Result + Format('%s',[' ']) + #$0D#$0A; 
Result := Result + Format('%s',[' EPS= ']);
Result := Result + Format('%20.16f ',[EPS]) + #$0D#$0A;
Result := Result + Format('%s',[' ']) + #$0D#$0A; 
Result := Result + Format(' %20.16f  %20.16f  %20.16f  %20.16f ',
 [Y[0],Y[1],Y[2],Y[3]]) + #$0D#$0A;
Result := Result + Format('%s',[' H= ']);
Result := Result + Format('%20.16f ',[H]) + #$0D#$0A;
EPS := EPS*1.E-1;
if ( IH < 3 ) 
 then goto _10;
UtRes('tde97r',Result);  { вывод результатов в файл tde97r.res }
exit;
end;

end.

Unit fde97r_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc;

procedure fde97r(X :Real; var Y :Array of Real; var DY :Array of Real;
                M :Integer);

implementation

procedure fde97r(X :Real; var Y :Array of Real; var DY :Array of Real;
                M :Integer);
var
T1 :Real;
begin
DY[0] := -100.0*Y[0];
T1 := 20.0*Exp(-100.0*X)+2.0*Exp(-X)*Cos(X);
DY[1] := DY[0]-2.0*Y[1]+T1;
DY[2] := DY[0]+9998.0*Y[1]-9990.0*Y[2]-10.0*Y[3]+T1;
DY[3] := DY[0]+9988.0*Y[1]+20.0*Y[2]-10010.0*Y[3]+T1;
end;

end.

      Результаты: 
              Y1                                   Y2 
      0.000000000000+00    -6.279230870976-05 
              Y3                                   Y4 
     -6.279230870976-05    -6.279230870976-05 

      после первого обращения к подпрограмме -
  
      EPS = 1.0-02 
              Y(1)                                 Y(2) 
      7.146874056701-13    -6.764660658287-05 
              Y(3)                                 Y(4) 
     -6.764662603498-05    -6.764660998348-05 
      H = 2.560000000001+00 

      после второго обращения к подпрограмме -
      EPS = 1.0-04 
              Y(1)                                 Y(2) 
      6.614556599143-02    -6.330157681200-05 
              Y(3)                                 Y(4) 
     -6.330157682632-05    -6.330157680712-05 
      H = 2.560000000001+00 
   
      после третьего обращения к подпрограмме -
      EPS = 1.0-06 
              Y(1)                                 Y(2) 
      2.733180996095-20    -6.286373127617-05 
              Y(3)                                 Y(4) 
     -6.286373127695-05    -6.286373127762-05 
      H = 1.280000000001+00

   Пример 3.
   Решается задача Коши
 
      y1'  =  - 10000 y1  + 100 y2 - 10 y3  + y4 
      y2'  =  - 1000 y2  + 10 y3 -10 y4 
      y3'  =  - y3  + 10 y4 
      y4'  =  - 0.1 y4 

      0 ≤ x ≤ 20 ,  y1(0) = 1 ,  y2(0) = 1 ,  y3(0) = 1 ,  y4(0) = 1 

   Точное решение задачи имеет вид:

      y1  = (1 - d - f - g) t3  + d t2  + f t1  + g y4 
      y2  = (1 - a - b) t2  + a t1  + b y4 
      y3  = (- 9.1 / 0.9) t1 + (10 / 0.9) y4
      y4  = e - 0.1 x 
 
 где   t1 = e - x  ,    t2 = e - 1000 x  ,     t3 = e - 10000 x   ,

  a = - 91 / (0.9*999) ,    b = 91 / (0.9*999.9)  ,    d =  ( 1 - a - b ) / 90  ,
              
  f = [ 100 a + (91 / 0.9) ] / 9999  ,    g = [ 100 b - (100 / 0.9)  + 1 ] / 9999.9  . 

   Матрица Якоби правой части системы имеет вид:

       -10000     100     -10      1     
         0           -1000    10    -10    
         0             0         -1      10    
         0             0          0      -0.1   

Ниже приводятся фрагмент вызывающей программы для DE91R, подпрограммы F и FJ и результаты счета, полученные после нескольких обращений к подпрограмме DE91R.

  
Unit tde91r_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, FDE91R_p, FJDE91R_p, DE91R_p;

function tde91r: String;

implementation

function tde91r: String;
var
M,IH,IERR :Integer;
XN,HMIN,EPS,P,XK,Y4,T1,Y3,T2,A,B,C,Y2,T3,DD,FF,GG,QQ,Y1,H :Real;
YN :Array [0..3] of Real;
Y :Array [0..3] of Real;
R :Array [0..80] of Real;
label
_10;
begin
Result := '';  { результат функции }
M := 4;
XN := 0.0;
YN[0] := 1.0;
YN[1] := 1.0;
YN[2] := 1.0;
YN[3] := 1.0;
HMIN := 1.E-10;
EPS := 1.E-2;
P := 100.0;
XK := 20.0;
{  BЫЧИCЛEHИE TOЧHOГO PEШEHИЯ CИCTEMЫ: }
Y4 := Exp(-0.1*XK);
T1 := Exp(-XK);
Y3 := -(9.1/0.9)*T1 + (10.0/0.9)*Y4;
T2 := Exp(-1.E3*XK);
A := -91.0/(0.9*999.0);
B := 91.0/(0.9*999.9);
C := 1.0-A-B;
Y2 := C*T2+A*T1+B*Y4;
T3 := Exp(-1.E4*XK);
DD := C/90.0;
FF := (100.0*A+91.0/0.9)/9999.0;
GG := (100.0*B-100.0/0.9+1.0)/9999.9;
QQ := 1.0-DD-FF-GG;
Y1 := QQ*T3+DD*T2+FF*T1+GG*Y4;
Result := Result + Format(' %20.16f  %20.16f  %20.16f  %20.16f ',
 [Y1,Y2,Y3,Y4]) + #$0D#$0A;
IH := 0;
_10:
IH := IH + 1;
H := 0.01;
DE91R (FDE91R,FJDE91R,M,XN,YN,XK,HMIN,EPS,P,H,Y,R,IERR);
Result := Result + Format('%s',[' ']) + #$0D#$0A; 
Result := Result + Format('%s',[' ']) + #$0D#$0A; 
Result := Result + Format('%s',[' ']) + #$0D#$0A; 
Result := Result + Format('%s',[' EPS= ']);
Result := Result + Format('%20.16f ',[EPS]) + #$0D#$0A;
Result := Result + Format('%s',[' ']) + #$0D#$0A; 
Result := Result + Format(' %20.16f  %20.16f  %20.16f  %20.16f ',
 [Y[0],Y[1],Y[2],Y[3]]) + #$0D#$0A;
Result := Result + Format('%s',[' H= ']);
Result := Result + Format('%20.16f ',[H]) + #$0D#$0A;
EPS := EPS*1.E-1;
if ( IH < 3 ) 
 then goto _10;
UtRes('tde91r',Result);  { вывод результатов в файл tde91r.res }
exit;
end;

end.

Unit fde91r_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc;

procedure fde91r(X :Real; var Y :Array of Real; var DY :Array of Real;
                M :Integer);

implementation

procedure fde91r(X :Real; var Y :Array of Real; var DY :Array of Real;
                M :Integer);
begin
DY[0] := -1.E4*Y[0]+1.E2*Y[1]-10.0*Y[2]+Y[3];
DY[1] := -1.E3*Y[1]+10.0*Y[2]-10.0*Y[3];
DY[2] := -Y[2]+10.0*Y[3];
DY[3] := -0.1*Y[3];
end;

end.

      Результаты: 

             Y1                                    Y2 
     -1.353352661869-03     1.368526917891-02 
             Y3                                    Y4 
      1.503725348452+00     1.353352832364-01 

      после первого обращения к подпрограмме -
      EPS = 1.0-02 
             Y(1)                                  Y(2) 
     -1.352902557240-03     1.368071768447-02 
             Y(3)                                  Y(4) 
      1.503225232165+00     1.352902708961-01 
      H = 1.024000000001+01 

      после второго обращения к подпрограмме -
      EPS = 1.0-04 
             Y(1)                                  Y(2) 
     -1.353311838306-03     1.368485637501-02 
             Y(3)                                  Y(4) 
      1.503679988920+00     1.353311999785-01 
      H = 2.560000000001+00 
   
      после третьего обращения к подпрограмме -
      EPS = 1.0-06 
             Y(1)                                  Y(2) 
     -1.353350127546-03     1.368524355264-02 
             Y(3)                                  Y(4) 
      1.503722532527+00     1.353350296827-01 
      H = 1.280000000001+00 

      после четвертого обращения к подпрограмме -
      EPS = 1.0-08 
             Y(1)                                  Y(2) 
     -1.353352646026-03     1.368526901869-02 
             Y(3)                                  Y(4) 
      1.503725330851+00     1.353352816498-01 
      H = 3.200000000002-01 

   Пример 4.

Решается задача Коши из примера 3. Приводятся фрагмент вызывающей программы для DE93R, подпрограмма F и результаты счета, полученные после нескольких обращений к подпрограмме DE93R.

  
Unit tde93r_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, FDE93R_p, DE93R_p;

function tde93r: String;

implementation

function tde93r: String;
var
M,IH,IERR :Integer;
XN,HMIN,EPS,P,XK,Y4,T1,Y3,T2,A,B,C,Y2,T3,DD,FF,GG,QQ,Y1,H :Real;
YN :Array [0..3] of Real;
Y :Array [0..3] of Real;
R :Array [0..80] of Real;
label
_10;
begin
Result := '';  { результат функции }
M := 4;
XN := 0.0;
YN[0] := 1.0;
YN[1] := 1.0;
YN[2] := 1.0;
YN[3] := 1.0;
HMIN := 1.E-10;
EPS := 1.E-2;
P := 100.0;
XK := 20.0;
{  BЫЧИCЛEHИE TOЧHOГO PEШEHИЯ CИCTEMЫ: }
Y4 := Exp(-0.1*XK);
T1 := Exp(-XK);
Y3 := -(9.1/0.9)*T1 + (10.0/0.9)*Y4;
T2 := Exp(-1.E3*XK);
A := -91.0/(0.9*999.0);
B := 91.0/(0.9*999.9);
C := 1.0-A-B;
Y2 := C*T2+A*T1+B*Y4;
T3 := Exp(-1.E4*XK);
DD := C/90.0;
FF := (100.0*A+91.0/0.9)/9999.0;
GG := (100.0*B-100.0/0.9+1.0)/9999.9;
QQ := 1.0-DD-FF-GG;
Y1 := QQ*T3+DD*T2+FF*T1+GG*Y4;
Result := Result + Format(' %20.16f  %20.16f  %20.16f  %20.16f ',
 [Y1,Y2,Y3,Y4]) + #$0D#$0A;
IH := 0;
_10:
IH := IH + 1;
H := 0.01;
DE93R (FDE93R,M,XN,YN,XK,HMIN,EPS,P,H,Y,R,IERR);
Result := Result + Format('%s',[' ']) + #$0D#$0A; 
Result := Result + Format('%s',[' ']) + #$0D#$0A; 
Result := Result + Format('%s',[' ']) + #$0D#$0A; 
Result := Result + Format('%s',[' EPS= ']);
Result := Result + Format('%20.16f ',[EPS]) + #$0D#$0A;
Result := Result + Format('%s',[' ']) + #$0D#$0A; 
Result := Result + Format(' %20.16f  %20.16f  %20.16f  %20.16f ',
 [Y[0],Y[1],Y[2],Y[3]]) + #$0D#$0A;
Result := Result + Format('%s',[' H= ']);
Result := Result + Format('%20.16f ',[H]) + #$0D#$0A;
EPS := EPS*1.E-1;
if ( IH < 3 ) 
 then goto _10;
UtRes('tde93r',Result);  { вывод результатов в файл tde93r.res }
exit;
end;

end.

Unit fde93r_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc;

procedure fde93r(X :Real; var Y :Array of Real; var DY :Array of Real;
                M :Integer);

implementation

procedure fde93r(X :Real; var Y :Array of Real; var DY :Array of Real;
                M :Integer);
begin
DY[0] := -1.E4*Y[0]+1.E2*Y[1]-10.0*Y[2]+Y[3];
DY[1] := -1.E3*Y[1]+10.0*Y[2]-10.0*Y[3];
DY[2] := -Y[2]+10.0*Y[3];
DY[3] := -0.1*Y[3];
end;

end.

   Результаты: 

             Y1                                   Y2 
     -1.353352661869-03     1.368526917891-02 
             Y3                                   Y4 
      1.503725348452+00     1.353352832364-01 

   после первого обращения к подпрограмме -
      EPS = 1.0-02 
             Y(1)                                 Y(2) 
     -1.352902572352-03     1.368071785960-02 
             Y(3)                                 Y(4) 
      1.503225234967+00     1.352902709414-01 
      H = 1.024000000001+01 

   после второго обращения к подпрограмме -
      EPS = 1.0-04 
             Y(1)                                 Y(2) 
     -1.353311843749-03     1.368485643758-02 
             Y(3)                                 Y(4) 
      1.503679988458+00     1.353311999721-01 
      H = 2.560000000001+00 

   после третьего обращения к подпрограмме -
      EPS = 1.0-06 
             Y(1)                                 Y(2) 
     -1.353350112996-03     1.368524337161-02 
             Y(3)                                 Y(4) 
      1.503722531763+00     1.353350295963-01 
      H = 1.280000000001+00 

   после четвертого обращения к подпрограмме -
      EPS = 1.0-08 
             Y(1)                                 Y(2) 
     -1.353351314448-03     1.368525627954-02 
             Y(3)                                 Y(4) 
      1.503725330012+00     1.353352828808-01 
      H = 3.200000000002-01 


   Пример 5.

   Решается задача Коши

      y1'  =  - a2 y1 y2 
      y2'  =  2 a1 y5 x92 - a2 y1 y2 - a5 x6 y2  + a6 x7 
      y3'  =  a3 x6 x8 - a7 y3 
      y4'  =  a6 x7  + a7 y3  + a4 x6 
      y5'  =  - a1 y5 x92

где
      x6  =  1 - a8 - 2 y1  + y2 - y3 - y4  + 2y5 
      x7  =  a8 + y1 - y2 - 2 y5 
      x8  =  a9 - y3 
      x9  =  - 0.8745 - a8  + y3  + y4  + 2 y5 

      a1  = 80,   a2  = 29,   a3  = 1,   a4  = 0.288*10-3  ,   a5  = 166 ,  
      a6  = 0.959 * 10-4  ,   a7  = 0.232 * 10-3  ,   a8  = 0.0477 ,   a9  = 0.602 , 
            
      0 ≤ x ≤ 3000 .

      y1(0)  =  1 ,   y2(0)  =  0.0477 ,   y3(0)  =  0 ,   y4(0)  =  0 ,   y5(0) = 0.5 

Этот пример взят из статьи С.С.Артемьева и Г.В.Демидова, которая приведена в списке литературы, данном в разделе "Математическое описание".

Ниже приводятся фрагмент вызывающей программы для DE91R, подпрограммы F и FJ и результаты счета, полученные после двух обращений к подпрограмме DE91R со значениями параметра EPS, равными 10-6 и 10-7.

 
Unit tde91r_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, FDE91R_p, FJDE91R_p, DE91R_p;

function tde91r: String;

implementation

function tde91r: String;
var
M,IH,IERR :Integer;
XN,HMIN,EPS,P,XK,Y4,T1,Y3,T2,A,B,C,Y2,T3,DD,FF,GG,QQ,Y1,H :Real;
YN :Array [0..3] of Real;
Y :Array [0..3] of Real;
R :Array [0..80] of Real;
label
_10;
begin
Result := '';  { результат функции }
M := 4;
XN := 0.0;
YN[0] := 1.0;
YN[1] := 1.0;
YN[2] := 1.0;
YN[3] := 1.0;
HMIN := 1.E-10;
EPS := 1.E-2;
P := 100.0;
XK := 20.0;
{  BЫЧИCЛEHИE TOЧHOГO PEШEHИЯ CИCTEMЫ: }
Y4 := Exp(-0.1*XK);
T1 := Exp(-XK);
Y3 := -(9.1/0.9)*T1 + (10.0/0.9)*Y4;
T2 := Exp(-1.E3*XK);
A := -91.0/(0.9*999.0);
B := 91.0/(0.9*999.9);
C := 1.0-A-B;
Y2 := C*T2+A*T1+B*Y4;
T3 := Exp(-1.E4*XK);
DD := C/90.0;
FF := (100.0*A+91.0/0.9)/9999.0;
GG := (100.0*B-100.0/0.9+1.0)/9999.9;
QQ := 1.0-DD-FF-GG;
Y1 := QQ*T3+DD*T2+FF*T1+GG*Y4;
Result := Result + Format(' %20.16f  %20.16f  %20.16f  %20.16f ',
 [Y1,Y2,Y3,Y4]) + #$0D#$0A;
IH := 0;
_10:
IH := IH + 1;
H := 0.01;
DE91R (FDE91R,FJDE91R,M,XN,YN,XK,HMIN,EPS,P,H,Y,R,IERR);
Result := Result + Format('%s',[' ']) + #$0D#$0A; 
Result := Result + Format('%s',[' ']) + #$0D#$0A; 
Result := Result + Format('%s',[' ']) + #$0D#$0A; 
Result := Result + Format('%s',[' EPS= ']);
Result := Result + Format('%20.16f ',[EPS]) + #$0D#$0A;
Result := Result + Format('%s',[' ']) + #$0D#$0A; 
Result := Result + Format(' %20.16f  %20.16f  %20.16f  %20.16f ',
 [Y[0],Y[1],Y[2],Y[3]]) + #$0D#$0A;
Result := Result + Format('%s',[' H= ']);
Result := Result + Format('%20.16f ',[H]) + #$0D#$0A;
EPS := EPS*1.E-1;
if ( IH < 3 ) 
 then goto _10;
UtRes('tde91r',Result);  { вывод результатов в файл tde91r.res }
exit;
end;

end.

Unit fde91r_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc;

procedure fde91r(X :Real; var Y :Array of Real; var DY :Array of Real;
                M :Integer);

implementation

procedure fde91r(X :Real; var Y :Array of Real; var DY :Array of Real;
                M :Integer);
begin
DY[0] := -1.E4*Y[0]+1.E2*Y[1]-10.0*Y[2]+Y[3];
DY[1] := -1.E3*Y[1]+10.0*Y[2]-10.0*Y[3];
DY[2] := -Y[2]+10.0*Y[3];
DY[3] := -0.1*Y[3];
end;

end.

Unit fjde91r_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc;

procedure fjde91r(X :Real; var Y :Array of Real; var DF :Array of Real;
                M :Integer);

implementation

procedure fjde91r(X :Real; var Y :Array of Real; var DF :Array of Real;
                M :Integer);
begin
DF[0] := -1.E4;
DF[4] := 1.E2;
DF[8] := -10.0;
DF[12] := 1.0;
DF[1] := 0.0;
DF[5] := -1.E3;
DF[9] := 10.0;
DF[13] := -10.0;
DF[2] := 0.0;
DF[6] := 0.0;
DF[10] := -1.0;
DF[14] := 10.0;
DF[3] := 0.0;
DF[7] := 0.0;
DF[11] := 0.0;
DF[15] := -0.1;
end;

end.
   
   Результаты: 

   после первого обращения к подпрограмме -
      EPS = 1.0-06 
             Y(1)                                 Y(2)                                Y(3) 
      7.743161591600-02     3.837857646993-05     5.035858808897-01 
             Y(4)                                 Y(5) 
      3.578708481186-01     3.240421442632-02 
      H = 1.638400000001+02 

   после второго обращения к подпрограмме -
      EPS = 1.0-07 
             Y(1)                                 Y(2)                                Y(3) 
      7.743302086658-02     3.837918184429-05     5.035845024640-01 
             Y(4)                                 Y(5) 
      3.578709420071-01     3.240497334838-02 
      H = 8.192000000004+01