Текст подпрограммы и версий
de42r_p.zip , de42e_p.zip , de48r_p.zip , de48e_p.zip
Тексты тестовых примеров
tde42r_p.zip , tde42e_p.zip , tde48r_p.zip , tde48e_p.zip

Подпрограмма:  DE42R (модуль DE42R_p) (версия DE48R)

Назначение

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

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

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

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

многошаговым предсказывающе - исправляющим методом пятого порядка точности. Суть метода состоит в том, что сначала по явной формуле Адамса - Штермера строятся предсказанные значения приближенного решения, которые затем исправляются по неявной формуле Адамса - Штермера.

По значению решения  YX в узле  Xn вычисляется значение этого решения в узле  Xn + H. При этом, если  Xn является началом  XN интервала интегрирования, то для вычисления решения в   XN + H требуется еще и значение производной решения в  XN. Вместе с решением подпрограмма определяет также всю информацию, необходимую для вычисления приближенного решения в любом следующем узле.

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

Березин И.С., Жидков Н.П. Методы вычислений, т.2, Физматгиз, М., 1960.

Бахвалов H.C., Численные методы, т.1, "Hаука", 1975.

Жоголев E.A. Программа интегрирования систем обыкновенных дифференциальных уравнений второго порядка методом Штермера. Сб. "Вычислительные методы и программирование", вып. 1, Изд - во МГУ, 1962.

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

procedure DE42R(F :Proc_F_DE; M :Integer; var JSTART :Integer;
                HMIN :Real; HMAX :Real; EPS :Real;
                P :Real; var YX :Array of Real; var X :Real;
                var DY :Array of Real; var H :Real; var BUL :Boolean;
                var DELTY :Array of Real; var DF :Array of Real;
                var RFN :Array of Real; var RF :Array of Real;
                var YP :Array of Real; var DYP :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: вещественный);

M - количество уравнений в системе (тип: целый);
JSTART - целый указатель режима использования подпрограммы имеющий следующие значения:
0 - первое обращение к подпрограмме должно быть выполнено с нулевым значением   JSTART;
+1 - выполнить один шаг интегрирования системы дифференциальных уравнений для значений независимой и зависимой переменных и шага интегрирования, заданных параметрами  X, YX и  H, соответственно;
-1 - повторить последний шаг интегрирования с новыми значениями праметров  H и / или  HMIN;
  на выходе из подпрограммы  JSTART полагается равным + 1;
HMIN - минимальное значение абсолютной величины шага, котоpое разрешается использовать при интегрировании данной системы уравнений (тип: вещественный);
HMAX - максимальное значение абсолютной величины шага, котоpое разрешается использовать при интегрировании данной системы уравнений (тип: вещественный);
EPS - допустимая меpа погрешности, с которой требуется вычислить все компоненты решения (тип: вещественный);
P - граница перехода, используемая при оценке меры погрешности приближенного решения (тип: вещественный);
X, YX - заданные вещественные значения аргумента и решения в нем; в результате работы подпрограммы в  X получается новое значение аргумента, а в  YX  -  соответствующее значение решения; в случае системы уравнений, т.е. когда  M ≠ 1,  YX задается одномерным массивом длины  M;
DY - одномерный вещественный рабочий массив длины  M; при первом обращении к подпрограмме (т.е. со значением  JSTART = 0) в этом массиве задается значение производной pешения в начальном узле интервала интегрирования;
H - вещественная переменная, содержащая значение шага интегрирования; если для этого значения шага точность приближенного значения достигается, то именно он и реализуется подрограммой, иначе этот шаг уменьшается подпрограммой до тех пор, пока не будет достигнута заданная точность  EPS; на выходе из подпрограммы  H содержит pекомендуемое подпрограммой значение следующего шага интегрирования, определяемое ею с целью достижения более экономного способа интегрирования;
BUL - логическая переменная, значение которой при обращении к подпрограмме полагается равным TRUE, если заданный в  H шаг выводит в конец интервала интегрирования, и FALSE в противном случае; в результате работы подпрограммы  BUL pавно FALSE, если вместо исходного шага интегрирования был реализован меньший шаг; в противном случае, т.е. когда был выполнен именно заданный при обращении в  H шаг, значение паpаметpа  BUL не меняется;
       DELTY -
       RFN, RF  
       YP, DYP  
одномерные вещественные рабочие массивы длины  M;
DF - двумерный вещественный рабочий массив размеpа  M * 5, в котоpом запоминаются значения правой части системы и ее разностей до четвертого порядка включительно, умноженные на  H 2 / 12;
IERR - целая переменная, служащая для сообщения об ошибках, обнаруженных в процессе работы подпрограммы; при этом:
IERR=65 - когда интегрирование системы выполнено с заданным в  HMIN минимальным шагом, но требуемая точность полученного при этом значения  YX решения не достигнута; в этом случае последний шаг интегрирования системы можно повторить обращением к программе с новыми значениями параметров  H и   HMIN и со значением  JSTART = -1;
IERR=66 - когда решение не может быть вычислено с требуемой точностью   EPS при первом обращении к подпрограмме (т.е. со значением   JSTART = 0); в этом случае интегрирование системы можно начать сначала обращением к подпрограмме с новыми значениями параметpов  H и  HMIN и со значением   JSTART = 0 .

Версии

DE42E - выполнение одного шага численного интегрирования системы обыкновенных дифференциальных уpавнений второго порядка методом Штермера с повыной точностью. При этом параметры  HMIN, HMAX, EPS, P, YX, X, DY, H, DELTY, DF, RFN, RF, YP, DYP и параметры  X, Y и  DY в подпрограмме  F должны иметь тип Extended.
DE48R - назначение этой подпрограммы такое же, как и подпрограммы DE42R, но схема организации вычислений в ней несколько иная, чем в DE42R, а именно: во - первых, исправленное и предсказанное значения решения вычисляются через значения некоторой промежуточной переменной, введение которой позволяет уменьшить вычислительную погрешность в приближенном значении решения, во - вторых, для вычисления приближенного решения на одном шаге используется на одно вычисление правой части уравнения больше, чем в подпрограмме DE42R. Таким образом обеспечивается возможность вычислить решение уравнения более точно, чем в DE42R.
DE48E - тоже, что и DE48R, но все вычисления ведутся с удвоенным числом значащих цифр; при этом параметры  HMIN, HMAX, EPS, P, YX, X, DY, H, DELTY, DF, RFN, RF, YP, DYP и параметры  X, Y и  DY в подпрограмме  F должны иметь тип Extended.

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

DE34R - построение начальных значений при интегрировании системы обыкновенных дифференциальных уравнений второго порядка методом Штермера с контролем точности.
DE34E - построение начальных значений с расширенной (Extended) точностью при интегрировании системы обыкновенных дифференциальных уравнений второго порядка методом Штермера с контролем точности.
       DE18R -
       DE18E  
построение начальных значений при интегрировании системы обыкновенных дифференциальных уравнений второго порядка методом Штермера, преобразованным к виду, где влияние вычислительной погрешности меньше.
      UTDE12 -
      UTDE13  
      UTDE16  
      UTDE17  
подпрограммы выдачи диагностических сообщений.
 

Подпрограммы DE34R и UTDE12 вызываются при работе подпрограммы DE42R, а подпрограммы DE34E и UTDE13 - при работе подпрограммы DE42E.

Подпрограммы DE18R и UTDE16 вызываются при работе подпрограммы DE48R, подпрограммы DE18E и UTDE17 - при pаботе DE48E.

Kpоме того, DE42R и DE42E используют рабочие подпрограммы DE28RS, DE42RP и DE28ES, DE42EP.

Подпрограммы DE48R и DE48E используют рабочие подпрограммы DE48RP и DE48EP, соответственно.

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

 

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

При работе подпрограммы и ее версий значения параметров   M, HMIN, HMAX, EPS, P сохраняются.

При многократном использовании подпрограммы или ее веpсий для вычисления решения системы уравнений на отрезке необходимо выполнять следующие требования:

- значения параметров  M, YX, X и значения рабочих массивов, задаваемых параметрами  DY, DF, YP, DYP не должны изменяться в вызывающей программе между последовательными обращениями к подпрограмме или ее версиям;

- значение параметра  HMAX не должно быть слишком большим, т.к. в противном случае величина шага интегрирования может достичь таких размеров, которые приведут к абсолютной неустойчивости численного метода;

- т.к. подпрограммы DE48R и DE48E используют глобальные записи (структуры данных) с именами _COM48R и _COM48D, соответственно, для хранения промежуточных значений, поэтому пользователь не должен портить содержимое их элементов.

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

     y1'' = - y1   ,
     y2'' = - y2   ;

     y1 (3/4 π) = √2 / 2   ,      y2 (3/4 π) = - √2 / 2   ,
     y1' (3/4 π) = - √2 / 2   ,   y2' (3/4 π) = - √2 / 2   .

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

Unit TDE42R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, FDE42R_p, DE42R_p;

function TDE42R: String;

implementation

function TDE42R: String;
var
M,IH,JSTART,IERR :Integer;
H,HMIN,X,EPS,P,HMAX,Y1,Y2 :Real;
BUL :Boolean;
Y :Array [0..1] of Real;
DY :Array [0..1] of Real;
DELTY :Array [0..1] of Real;
DF :Array [0..9] of Real;
RFN :Array [0..1] of Real;
RF :Array [0..1] of Real;
YP :Array [0..1] of Real;
DYP :Array [0..1] of Real;
label
_6,_7,_8,_53,_20;
begin
Result := '';  { результат функции }
H := -0.01;
HMIN := 1.E-10;
M := 2;
X := 0.75*3.14159265359;
Y[0] := Sqrt(2.0)/2.0;
Y[1] := -Y[0];
EPS := 0.0001;
DY[0] := Y[1];
DY[1] := -Y[0];
IH := 0;
BUL := False;
JSTART := 0;
P := 100.0;
НМАХ := 0.1;
_6:
DE42R(FDE42R,M,JSTART,HMIN,HMAX,EPS,P,Y,X,DY,H,BUL,DELTY,
     DF,RFN,RF,YP,DYP,IERR);
IH := IH+1;
Y1 := Sin(X);
Y2 := Cos(X);
Result := Result + Format(' %20.16f %20.16f %20.16f %20.16f %20.16f %20.16f ',
 [X,Y[0],Y[1],H,Y1,Y2]) + #$0D#$0A;
if ( IH = 1 ) 
 then goto _6;
if ( IH = 5 ) 
 then goto _20;
JSTART := -1;
if ( IH = 4 ) 
 then goto _8;
if ( IH = 3 ) 
 then goto _7;
H := 0.005;
H := -H;
goto _6;
_7:
H := 0.02;
goto _6;
_8:
H := 0.01;
goto _6;
_53:
if ( IERR <> 0 ) 
 then goto _20;
_20:
UtRes('TDE42R',Result);  { вывод результатов в файл TDE42R.res }
exit;
end;

end.

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

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

implementation

procedure fde42r(X :Real; var Y :Array of Real; var DY :Array of Real;
                M :Integer);
begin
DY[0] := -Y[0];
DY[1] := -Y[1];
end;

end.

Результаты:

после первого обращения к подпрограмме -

                   X                            Y(1)                              Y(2)
       2.346194490 + 00      7.141423761 - 01      - 7.000004762 - 01

                   H                            Y1                                 Y2
     - 1.000000000 - 02      7.141423761 - 01      - 7.000004762 - 01

после второго обращения к подпрограмме -

                   X                            Y(1)                              Y(2)
       2.336194490 + 00      7.211065574 - 01      - 6.928241717 - 01

                   H                            Y1                                 Y2
     - 1.000000000 - 02      7.211065574 - 01      - 6.928241717 - 01

после третьего обращения к подпрограмме -

                   X                           Y(1)                               Y(2)
       2.341194490 + 00      7.176334371 - 01      - 6.964210292 - 01

                   H                           Y1                                  Y2
     - 5.000000000 - 03      7.176334371 - 01      - 6.964210292 - 01

после четвертого обращения к подпрограмме -

                   X                           Y(1)                               Y(2)
       2.366194490 + 00      7.000004762 - 01      - 7.141423761 - 01

                   H                           Y1                                  Y2
       2.000000000 - 02      7.000004762 - 01      - 7.141423761 - 01

после пятого обращения к подпрограмме -

                   X                           Y(1)                                Y(2)
       2.356194490 + 00      7.071067812 - 01      - 7.071067812 - 01

                   H                           Y1                                   Y2
       1.000000000 - 02      7.071067812 - 01      - 7.071067812 - 01