Текст подпрограммы и версий
de23r_p.zip , de23e_p.zip , de25r_p.zip , de25e_p.zip
Тексты тестовых примеров
tde23r_p.zip , tde23e_p.zip , tde25r_p.zip , tde25e_p.zip

Подпрограмма:  DE23R (модуль DE23R_p) (версия DE25R)

Назначение

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

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

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

          Y' = F (X, Y) ,

          Y = ( y1, ..., yM ) ,
          F = ( f1 (X, y1,..., yM),..., fM (X, y1,..., yM) )
 с начальными условиями, заданными в точке XN:
          Y(XN) = YN ,     YN = ( y10,..., yM0 ) , 

методом Гира. Решение вычисляется в одной точке XK, которая является концом интервала интегрирования.

Метод Гира для нежесткой системы является многошаговым предсказывающе - исправляющим методом Адамса, записанным в форме Нордсика, при этом предсказание и исправление имеют один и тот же порядок.

B случае, когда система уравнений является жесткой, интегрирование осуществляется специальным методом, основанном на методе типа Адамса и использующим якобиан ( ∂F/∂Y ) системы, который вычисляется подпрограммой по формулам численного дифференцирования. При интегрировании данной системы уравнений численное решение проверяется на точность; считается что значение решения в узле  xn вычислено с требуемой точностью ЕРS, если выполняется следующее соотношение:

                M   
             (  ∑ δI2 )1/2  ≤  EPS  ,
                I=1 

где δI - одна из погрешностей следующих типов: абсолютная, относительная или стандартная. При этом под относительной погрешностью приближенного значения I - й компоненты решения в узле  xn подразумевается отношение абсолютной погрешности  eI этого значения в узле  xn к абсолютной величине значения I - й компоненты в предыдущем узле  xn - 1, т.е.  eI / | yIn - 1|, а под стандартной погрешностью - отношение  eI / YPM (I), где

           YPM(I)  =  max ( | yI0 |, | yI1 |,..., | yIn-1 | ) 

Tип погрешности специфицируется пользователем при обращении к подпрограмме.

Gear C.W. The automatic integration of ordinary differential equations. Communicatuons of the ACM, 14, 3 (March 1971), 176-179.

Gear C.W., Numerical Initial Value Problems in Ordinary Differential Equations, Prentice - Hall, Englewood Cliffs, N.J., 1971.

Gear C.W., The automatic integration of stiff ordinary differential equations. Information Processing 68, A.J.H.

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

procedure DE23R(F :Proc_F_DE; M :Integer; XN :Real;
                var YN :Array of Real; XK :Real; HMIN :Real;
                HMAX :Real; EPS :Real; ISTIFJ :Integer;
                IORDER :Integer; IU :Integer; var H :Real;
                var Y :Array of Real; var YPM :Array of Real;
                var DELTY :Array of Real; var RAB :Array of Real;
                var YP :Array of Real; var IERR :Integer);

Параметры

F - имя подпрограммы вычисления значений правой части дифференциального уравнения. Первый оператоp подпрограммы должен иметь вид:
procedure F (X :Real; var Y :Array of Real; var DY :Array of Real; M :Integer);
Здесь: X, Y - значения независимой и зависимой переменных, соответственно. Вычисленное значение правой части должно быть помещено в DY. B случае системы уравнений, т.е. когда M ≠ 1, параметры Y и DY представляют массивы длины M (тип параметров X, Y и DY: вещественный);
M - количество уравнений в системе (тип: целый);
XN, YN - начальные значения аргумента и решения; в случае системы уравнений (т.е. M ≠ 1) YN представляет массив длины M (тип: вещественный);
XK - значение аргумента, при котоpом требуется вычислить решение задачи Коши (конец интервала интегрирования); XK может быть больше, меньше, или pавно XN (тип: вещественный);
HMIN - минимальное значение абсолютной величины шага, котоpое разрешается использовать при интегрировании данной системы уравнений; это значение должно быть много меньше среднего ожидаемого шага интегрирования, задаваемого параметром H (тип: вещественный);
HMAX - максимальное значение абсолютной величины шага, котоpое разрешается использовать при интегрировании данной системы уравнений (тип: вещественный);
EPS - допустимая погрешность, с которой требуется вычислить все компоненты решения; тип погрешности специфицируется с помощью параметpа IU (тип: вещественный);
ISTIFJ - целый указатель метода численного интегрирования:
ISTIFJ=0 - интегрирование системы ведется методом Адамса;
ISTIFJ=1 - интегрирование ведется специальным методом, предназначенным для жестких систем;
IORDER - целая переменная, указывающая максимальный допустимый порядок метода; IORDER должен быть не больше 7 для метода Адамса и не больше 6 для метода интегрирования жестких систем;
IU - целый указатель типа погрешности численного решения:
IU = 1 - для стандартной погрешности;
IU = 2 - для относительной погрешности;
IU = 3 - для абсолютной погрешности;
H - вещественная переменная, содержащая начальное значение шага интегрирования; может задаваться с учетом направления итегрирования, т.е. положительным, если XK > XN, отрицательным, если XK < XN, или без такого учета в виде абсолютной величины;
Y - искомое решение задачи Коши, вычисленное подпрограммой для значения аргумента XK; для системы уравнений (когда M ≠ 1) задается массивом длиной M; в случае совпадения значений параметров XN и XK значение Y полагается равным начальному значению YN (тип: вещественный);
         YPM -
       DELTY  
одномерные вещественные рабочие массивы длиной M;
RAB - одномерный вещественный рабочий массив; при интегрировании нежесткой системы уравнений RAB имеет размер 17*M, при интегрировании жесткой системы - M*(M + 17);
YP - двумерный вещественный рабочий массив размеpа 8*M;
IERR - целая переменная, служащая для сообщения об ошибках, обнаруженных в процессе работы подпрограммы; при этом:
IERR= 1 - когда неправильно задан параметр IORDER, а именно, когда IORDER превосходит максимальный допустимый порядок метода; в этом случае интегрирование системы ведется методом Гира порядка не выше 7 для нежесткой системы, и не выше 6 для жесткой;
IERR=65 - когда решение системы не может быть вычислено с требуемой точностью EPS при заданных начальном шаге H, его минимальном значении HMIN и порядке метода IORDER;
IERR=66 - когда приближенное значение решения не может быть вычислено, т.к. итерационный процесс его определения не сходится для шагов интегрирования H, больших заданного минимального значения HMIN;
IERR=67 - когда требуемая точность EPS вычисления приближенного решения меньше той, которая может быть достигнута для данной задачи при тех размерах шага интегрирования, начальное значение которого задано параметром H;
  при IERR = 65, 66, 67 интегрирование системы прекращается; при желании интегрирование можно повторить обращением к подпрограмме с новыми значениями параметров H, HMIN и IORDER;
IERR=68 - когда приближенное значение решения для жесткой системы не может быть вычислено с заданной точностью; для достижения тебуемой точности следует воспользоваться версиями подпрограммы DE23E, DE25R или DE25E.

Версии

DE23E - вычисление решения задачи Коши для нежесткой и жесткой систем обыкновенных дифференциальных уравнений первого порядка в конце интервала интегрирования методом Гира с расширенной (Extended) точностью. При этом параметры XN, YN, XK, HMIN, HMAX, EPS, H, Y, YPM, DELTY, RAB, YP и параметры X, Y и DY в подпрограмме F должны иметь тип Extended.
DE25R - вычисление решения задачи Коши для жесткой системы обыкновенных дифференциальных уравнений первого порядка в конце интервала интегрирования методом Гира с автоматическим выбором шага. Первый оператор подпрограммы имеет вид:
      procedure DE25R(F :Proc_F_DE; FJ :Proc_F_DE; M :Integer; XN :Real;
                var YN :Array of Real; XK :Real; HMIN :Real;
                HMAX :Real; EPS :Real; IORDER :Integer;
                IU :Integer; var H :Real; var Y :Array of Real;
                var YPM :Array of Real; var DELTY :Array of Real;
                var RAB :Array of Real; var YP :Array of Real;
                var IERR :Integer);
      
Здесь: FJ - имя подпрограммы вычисления якобиана правой части системы; первый оператор этой подпрограммы имеет вид:
procedure FJ (X :Real; var Y :Array of Real; var Z :Array of Real; M :Integer);
Здесь: X, Y - значения независимой и зависимой переменных, соответственно, причем Y представляет одномерный массив длины M; вычисленное значение якобиана должно быть помещено в двумерный массив Z размера M*M, при этом частная производная от правой части I - ого уравнения по J - ой переменной Y (J) запоминается в элементе Z (I, J) (тип параметров X, Y и Z: вещественный). Остальные параметры подпрограммы DE25R имеют тот же смысл, что и одноименные параметры подпрограммы DE23R.
DE25E - вычисление решения задачи Коши для жесткой системы обыкновенных дифференциальных уравнений первого порядка в конце интервала интегрирования методом Гира с расширенной (Extended) точностью. Первый оператор подпрограммы имеет тот же вид, что и в подпрограмме DE25R; при этом параметры XN, YN, XK, HMIN, HMAX, EPS, H, Y, YPM, DELTY, RAB, YP и параметры X, Y, DY и Z в подпрограммах F и FJ должны иметь тип Extended.

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

DE21R - выполнение одного шага численного интегрирования нежесткой и жесткой систем обыкновенных дифференциальных уравнений первого порядка методом Гира с контролем точности; вызывается при работе подпрограммы DE23R.
DE21E - выполнение одного шага численного интегрирования нежесткой и жесткой систем обыкновенных дифференциальных уравнений первого порядка методом Гира с расширенной (Extended) точностью; вызывается при работе подпрограммы DE23E.
DE24R - выполнение одного шага численного интегрирования жесткой системы обыкновенных дифференциальных уравнений первого порядка методом Гира с контролем точности; вызывается при работе подпрограммы DE25R.
DE24E - выполнение одного шага численного интегрирования жесткой системы обыкновенных дифференциальных уравнений первого порядка методом Гира с расширенной (Extended) точностью; вызывается при работе подпрограммы DE25E.
UTDE12 - подпрограмма выдачи диагностических сообщений при работе подпрограмм DE21R, DE23R, DE24R, DE25R.
UTDE13 - подпрограмма выдачи диагностических сообщений при работе подпрограмм DE21E, DE23E, DE24E, DE25E.

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

 

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

При работе подпрограммы и ее версий значения параметров M, XN, YN, XK, HMIN, HMAX, EPS, ISTIFJ, IORDER, IU сохраняются. Если после работы подпрограммы нет необходимости иметь начальное значение решения YN, то параметры YN и Y при обращении к ней можно совместить.

Значение HMIN должно быть много меньше среднего ожидаемого шага интегрирования, задаваемого параметром H при обращении к подпрограмме и ее версиям, т.к. интегрирование системы начинается с метода первого порядка.

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

 
         y1'  =  -20 y1  +  y2
         y2'  =   19 y1 - 2 y2 ,     0 ≤ x ≤ 1

         y1(0)  =  2 ,      y2(0)  =  18
 
 Собственные значения якобиевой матрицы системы
   λ1  =  -21 ,    λ2  =  -1 .
 Поэтому эту систему можно рассматривать как жесткую.
    
Unit TDE23R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, FDE23R_p, DE23R_p;

function TDE23R: String;

implementation

function TDE23R: String;
var
IU,IORDER,M,ISTIFJ,IERR :Integer;
EPS,HMIN,XN,XK,HMAX,H,X :Real;
RАВ :Array [0..37] of Real;
Y :Array [0..1] of Real;
YN :Array [0..1] of Real;
DELTY :Array [0..1] of Real;
YРМ :Array [0..1] of Real;
YP :Array [0..15] of Real;
begin
Result := '';  { результат функции }
IU := 3;
EPS := 0.00001;
IORDER := 6;
HMIN := 1.E-10;
M := 2;
XN := 0.0;
YN[0] := 2.0;
YN[1] := 18.0;
ХК := 1.0;
ISTIFJ := 1;
НМАХ := 0.1;
H := 0.01;
DE23R(FDE23R,M,XN,YN,XK,HMIN,HMAX,EPS,ISTIFJ,IORDER,
     IU,H,Y,YPM,DELTY,RAB,YP,IERR);
Result := Result + Format(' %20.16f %20.16f %20.16f ',
 [X,Y[0],Y[1]]) + #$0D#$0A;
UtRes('TDE23R',Result);  { вывод результатов в файл TDE23R.res }
exit;
end;

end.

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

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

implementation

procedure fde23r(X :Real; var Y :Array of Real; var DY :Array of Real;
                M :Integer);
begin
DY[0] := -20.0*Y[0]+Y[1];
DY[1] := 19.0*Y[0]-2.0*Y[1];
end;

end.

Результаты:

          IERR  =  0

          Y(1)  =  3.678796482-01
          Y(2)  =  6.989709436