Текст подпрограммы и версий
de01r_p.zip , de01e_p.zip , de85r_p.zip , de85e_p.zip
Тексты тестовых примеров
tde01r_p.zip , tde01e_p.zip , tde85r_p.zip , tde85e_p.zip

Подпрограмма:  DE01R (модуль DE01R_p) (версия DE85R)

Назначение

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

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

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

(1)                             Y '  =  F(X, Y) ,

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

с начальными условиями, заданными в точке XN:

                         Y(XN)  =  YN ,   YN  =  ( y1,..., yM )  . 

Предполагается, что среди характеристических корней матрицы Якоби ∂F / ∂y функции F имеются большие по модулю корни. Решение вычисляется в одной точке XK, которая является концом интервала интегрирования. Предполагается также, что система (1) может быть достаточно хорошо аппроксимирована линейной однородной системой с кусочнопостоянными коэффициентами, т.е. на каждом из [ xn, xn + H ], на которые разбивается весь интервал интегрирования, она может быть аппроксимирована системой вида

                                     Y '  =   AY  , 

где A - постоянная матрица, вообще говоря, своя для каждого отрезка. Для интегрирования системы применяется метод Лоусона.

Метод Лоусона является одношаговым методом и заключается в следующем. Допустим, что искомое решение системы (1) уже вычислено в некоторой точке  x = xn  интервала интегрирования, т.е. известно  yn ≈ y(xn). Для отыскания решения  y(xn + 1) = y(xn + H) в следующем узле  xn + 1 = xn + H выполняются такие действия. Исходная система уравнений с помощью замены искомой функции  y (x) на  xn ≤ x ≤ xn + H  по формуле

                             y(x)  =  exp [ ( x - xn ) A0 ] Z(x)  ,

где A0 - некоторая постоянная матрица, преобразуется в систему уравнений относительно новой неизвестной функции Z(X):

(2) Z ' (x)  =  F1(x, z)  =  exp [ - ( x - xn ) A0 ] { F(x, exp [ ( x - xn ) A0 ] Z(x)) -
                                      - A0 exp [ ( x - xn ) A0 ] Z(x) } 

Матрица Якоби ∂ F1 / ∂Z системы (2) и матрица Якоби ∂F / ∂y системы (1) связаны между собой соотношением

         ∂ F1 / ∂Z  =  exp [ - (x - xn) A0] { ∂F / ∂y - A0 } exp [ ( x - xn ) A0 ] 

Указанное преобразование выполняется самой подпрограммой. В качестве матрицы A0 подпрограмма выбирает матрицу ∂F / ∂y, вычисленную либо в точке ( xn, yn ), либо в некоторой предыдущей точке ( xn - k, yn - k ). Если шаг H достаточно мал, то данное преобразование позволяет уменьшить характеристические корни матрицы ∂ F1 / ∂Z по сравнению с характеристическими корнями матрицы ∂F / ∂y. А это приводит к уменьшению константы Липшица системы (2) по сравнению с константой Липшица системы (1).

Для решения системы (2) применяются классический метод Рунге - Кутта четвертого порядка точности, причем одновременно с решением (2) производится обратное преобразование от функции Z (x) к функции Y (x).

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

J.Douglas Lowson, Generalized Runge - Kutta processes for stable systems with large lipshitz constants, SIAM Journal on Numerical Analisys, 1967, Vol.4, No 3.

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

procedure DE01R(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; N :Integer; var H :Real;
                var Y :Array of Real; var R :Array of Real;
                var IERR :Integer);

Параметры

F - подпрограмма вычисления правой части системы в точке X. Первый оператор подпрограммы должен иметь вид:
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 - подпрограмма вычисления матрицы Якоби правой части системы. Первый оператор подпрограммы должен иметь вид:
procedure FJ (X :Real; var Y :Array of Real; var DF :Array of Real; M :Integer);
Здесь X и Y - значения независимой и зависимой переменных, соответственно, причем Y представляет одномерный массив длины M. DF - двумерный массив размера M*M. Вычисленное значение матрицы Якоби ∂F / ∂y должно быть помещено в массив DF, при этом частная производная от правой части I - ого уравнения F по J - ой переменной Y (J) запоминается в DF (I, J), т.е. DF (I, J) = ∂Fi / ∂yj (тип параметров X, Y и DF: вещественный);
M - количество уравнений в системе (тип: целый);
XN, YN - начальные значения аргумента и решения; в случае системы уравнений (т.е. M ≠ 1) YN представляет одномерный массив длины M;
XK - значение аргумента, при котором требуется вычислить решение задачи Коши (конец интервала интегрирования); XK может быть больше, меньше или равно XN (тип: вещественный);
HMIN - минимальное значение абсолютной величины шага, которое разрешается использовать при интегрировании данной системы уравнений (тип: вещественный);
EPS - допустимая мера погрешности, с которой требуется вычислить все компоненты решения (тип: вещественный);
P - граница перехода, используемая при оценке меры погрешности решения (тип: вещественный);
N - целый параметр, управляющий режимом вычисления матрицы A0 и имеющий следующие значения:
Если N ≤ 0 , (т.е. имеет произвольное отрицательное или нулевое значение), то матрица A0 вычисляется только один раз и полагается равной значению A0 = ∂F / ∂y в точке [x = x0, y = y0]  на протяжении всего интервала интегрировария;
если N > 0, то матрица A0 изменяется периодически, при этом она остается постоянной на протяжении каждого ряда из N последовательных шагов и вычисляется вновь на первом шаге каждого ряда, т.е. матрица A0 = ∂F / ∂y вычисляется только в следующих точках:
[x = x0, y = y0]   при x0 ≤ x ≤ xN;
[x = xN, y = yN]   при xN < x ≤ x2N;
[x = x2N, y = y2N]  при x2N < x≤ x3N;
Чем сильнее меняется матрица Якоби ∂f / ∂y системы при изменении  x, тем меньше должно быть значение параметра N. В частности, если N = 1, то матрица Якоби системы ∂f / ∂y будет вычисляться в каждой точке  xn,  yn .
H - вещественная переменная, содержащая начальное значение шага интегрирования; может задаваться с учетом направления интегрирования, т.е. положительным, если XN < XK, отрицательным, если XN > XK, или без всякого учета в виде абсолютной величины;
Y - искомое решение задачи Коши, вычисленное подпрограммой при значении аргумента XK; для системы уравнений (когда M ≠ 1) задается одномерным массивом длины M. В случае совпадения значений параметров XN и XK значение Y полагается равным начальному значению YN (тип: вещественный);
R - одномерный рабочий массив вещественного типа длины 5*M*M+7*M+1;
IERR - целая переменная, значение которой в результате работы подпрограммы полагается равным 65, если какая - нибудь компонента решения не может быть вычислена с требуемой точностью EPS. В этом случае интегрирование системы прекращается; при желании интегрирование системы можно повторить обращением к подпрограмме с новыми значениями параметров HMIN, H и N.

Версии

DE01E - вычисление решения задачи Коши для устойчивой системы обыкновенных дифференциальных уравнений первого порядка с большой константой Липшица в конце интервала интегрирования методом Лоусона с удвоенным числом значащих цифр. При этом параметры XN, YN, XK, HMIN, EPS, P, H, Y, R и параметры X, Y, DY в подпрограмме F и X, Y, DF в подпрограмме FJ должны иметь тип Extended.
DE85R - вычисление решения задачи Коши для устойчивой системы обыкновенных дифференциальных уравнений первого порядка с большой константой Липшица в конце интервала интегрирования методом Лоусона. В отличии от подпрограммы DE01R первый оператор подпрограммы DE85R не содержит в списке формальных параметров имени подпрограммы вычисления матрицы Якоби и имеет следующий вид:
      procedure DE85R(F :Proc_F_DE; M :Integer; XN :Real;
                var YN :Array of Real; XK :Real; HMIN :Real;
                EPS :Real; P :Real; N :Integer; var H :Real;
                var Y :Array of Real; var R :Array of Real;
      
При использовании этой подпрограммы пользователь не составляет подпрограмму вычисления матрицы Якоби. Все параметры подпрограммы DE85R имеют тот же смысл, что и одноименные параметры подпрограммы DE01R.
DE85E - вычисление решения задачи Коши для устойчивой системы обыкновенных дифференциальных уравнений первого порядка с большой константой Липшица в конце интервала интервала интегрирования методом Лоусона с удвоенным числом значащих цифр. Первый оператор подпрограммы имеет тот же вид, что и в подпрограмме DE85R, при этом параметры XN, YN, XK, HMIN, EPS, P, H, Y, R и параметры X, Y, DY в подпрограмме F должны иметь тип Extended.

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

      DE00R -
      DE00E  
выполнение одного шага интегрирования системы обыкновенных дифференциальных первого порядка с большой константой Липшица методом Лоусона.
      UTDE20 -
      UTDE21  
подпрограммы выдачи диагностических сообщений.
  Подпрограммы DE00R, UTDE20 вызываются при работе подпрограммы DE01R, а подпрограммы DE00E, UTDE21 - при работе DE01E.

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

 

Данная подпрограмма предназначена для интегрирования таких нелинейных систем, которые могут быть достаточно хорошо аппроксимированы линейной однородной системой с кусочнопостоянными коэффициентами, т.е. на каждом из отрезков [x, x + H] , на которые разбивается весь интервал интегрирования, они могут быть аппроксимированы системой вида

                     Y '  =  AY 

где A - постоянная матрица, вообще говоря, своя для каждого отрезка.

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

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

При работе подпрограмм F и FJ значения параметров X, Y, M не должны изменяться.

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

Подпрограммы DE01R и DE01E предназначены также для решения задачи Коши для жестких дифференциальных уравнений (1).

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

                                     
     y1'  =  (- 500 + 2 x) y1  +  (1 - x /10 ) y2  +  (1 + 1/(x +    ) sin y1 ,
     y1(   = 49 
     y2'  =  (- 1000 - 10 x) y1  +  (1 + x /10 ) y2  +  (2  + 1/(x + 2) ) cos y2 ,
     y2(   = 50 

              1 ≤ X ≤ 6  

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

Unit TDE01R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, FDE01R_p, FJDE01R_p, DE01R_p;

function TDE01R: String;

implementation

function TDE01R: String;
var
M,N,IERR :Integer;
XN,HMIN,EPS,P,H,ХК :Real;
YN :Array [0..1] of Real;
Y :Array [0..1] of Real;
R :Array [0..34] of Real;
begin
Result := '';  { результат функции }
M := 2;
XN := 1.0;
YN[0] := 49.0;
YN[1] := 50.0;
HMIN := 1.E-10;
EPS := 1.E-8;
P := 100.0;
H := 0.01;
ХК := 6.0;
N := 2;
DE01R (FDE01R,FJDE01R,M,XN,YN,XK,HMIN,EPS,P,N,H,Y,R,IERR);
Result := Result + Format('     %20.16f      %20.16f      %20.16f      %1d ',
 [Y[0],Y[1],H,IERR]) + #$0D#$0A;
UtRes('TDE01R',Result);  { вывод результатов в файл TDE01R.res }
exit;
end;

end.

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

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

procedure FDE01R(X :Real; var Y :Array of Real; var DY :Array of Real;
                M :Integer);
var
E2,E,E3,E1 :Real;
begin
DY[0] := (2.0*X-5.E2)*Y[0]+(1.0-X*1.E-1)*Y[1]+
      (1.0+1.0/(1.0+X))*Sin(Y[0]);
DY[1] := (-1.E3-1.E1*X)*Y[0]+(1.0+X*1.E-1)*Y[1]+
     (2.0+1.0/(2.0+X))*Cos(Y[1]);
end;

end.

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

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

procedure FJDE01R(X :Real; var Y :Array of Real;
                var DF :Array of Real; M :Integer);
var
E2,E,E3,E1 :Real;
begin
DF[0+0*2] := 2.0*X-5.E2+(1.0+1.0/(1.0+X))*Cos(Y[0]);
DF[0+1*2] := 1.0-X*1.E-1;
DF[1+0*2] := -1.E3-1.E1*X;
DF[1+1*2] := 1.0+X*1.E-1-(2.0+1.0/(2.0+X))*Sin(Y[1]);
end;

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

             Y(1)                                    Y(2)                              H 
     -4.175740488392-02       -5.087148371158+01      2.500000000001-03 
      IERR = 0 

Результаты решения этой же задачи, полученные с помощью подпрограммы DE85R

     -4.175740472033-02       -5.087148363417+01      5.000000000003-03 
      IERR = 0

Результаты решения этой же задачи, полученные с помощью подпрограммы DE25R

     -4.175740429849-02       -5.087148203468+01      1.756831014061-03 
      IERR = 0