Текст подпрограммы и версий
de03r_p.zip , de03e_p.zip
Тексты тестовых примеров
tde03r_p.zip , tde03e_p.zip

Подпрограмма:  DE03R (модуль DE03R_p)

Назначение

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

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

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

(1)                         Y ' (X)   =   A * Y(X) + U(X, Y)  ,

                                   Y    =   ( y1,..., yM ) , 
                                   A    =   ( ai j ) ,     i, j  =  1, ..., M ,
                           U(X, Y)   =   ( U1(X, Y), ... , UM(X, Y) ) , 

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

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

где A - постоянная числовая матрица.

Предполагается, что среди характеристических корней матрицы A имеются большие по модулю корни, а константа Липшица для функции U (X, Y), т.е. константа L из условия Липшица

| Ui ( x, y1(1),..., yM(1) ) - Ui ( x, y1(2), ... , yM(2) ) |  ≤
                                                                                      M
                                                                             ≤  L  ∑   | yj(1) - yj(2)  |  , 
                                                                                     j=1 

независящая от  i,  x,  y(1),  y(2) , невелика. Также предполагается, что нелинейный член U (x, y) является достаточно малым. Решение вычисляется в одной точке ХК, которая является концом интервала интегрирования. Для интегрирования системы применяется метод Лоусона.

Метод Лоусона является одношаговым и заключается в следующем. Допустим, что искомое решение системы (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 ) A ] Z(x)  ,

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

(2)   Z ' (x)  =  U1(x, z)  =  exp [ - ( x - xn ) A ]  U( x, exp [( x - xn ) A ] Z(x) ) 

Данное преобразование выполняется самой подпрограммой. Характеристические корни матрицы Якоби

   ∂U1 / ∂Z   =   exp [ - ( x - xn ) A ]  (∂U / ∂y)  exp [ ( x - xn ) A ] 

являются характеристическими корнями матрицы ∂U / ∂y и в силу малости константы Липшица функции U (x, y) невелики. Поэтому система (2) не жесткая и может быть решена традиционными методами численного интегрирования. Данная подпрограмма решает ее методом Рунге - Кутта  4 - ого порядка, при этом одновременно с решением (2) производится обратное преобразование от функции Z (x) к функции  y (x) .

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

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

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

procedure DE03R(FU :Proc_F_DE; M :Integer; XN :Real;
                var YN :Array of Real; XK :Real; var A :Array of Real;
                HMIN :Real; EPS :Real; P :Real; var H :Real;
                var Y :Array of Real; var R :Array of Real;
                var IERR :Integer);

Параметры

FU - подпрограмма вычисления функции U (x, y) в правой части системы. Первый оператор подпрограммы должен иметь вид:
procedure FU (X :Real; var Y :Array of Real; var U :Array of Real; M :Integer);
Здесь Y и U - одномерные массивы длины M. В массив U помещается значение функции U (x, y), вычисленное при значении аргументов X и Y (тип параметров X, Y, U: вещественный);
M - количество уравнений в системе (тип: целый);
XN, YN - начальные значения аргумента и решения; в случае системы уравнений (т.е. M ≠ 1) YN представляет одномерный массив длины M (тип: вещественный);
XK - значение аргумента, при котором требуется вычислить решение задачи Коши (конец интервала интегрирования); XK может быть больше, меньше или равно XN (тип: вещественный);
A - вещественный двумерный массив размера M*M, содержащий элементы матрицы A;
HMIN - минимальное значение абсолютной величины шага, которое разрешается использовать при интегрировании данной системы уравнений (тип: вещественный);
EPS - допустимая мера погрешности, с которой требуется вычислить все компоненты решения (тип: вещественный);
P - граница перехода, используемая при оценке меры погрешности решения (тип: вещественный);
H - вещественная переменная, содержащая начальное значение шага интегрирования; может задаваться с учетом направления интегрирования, т.е. положительным, если XN < XK, отрицательным, если XN > XK, или без всякого учета в виде абсолютной величины;
Y - искомое решение задачи Коши, вычисленное подпрограммой при значении аргумента XK; для системы уравнений (когда M ≠ 1) задается одномерным массивом длины M. В случае совпадения значений параметров XN и XK значение Y полагается равным начальному значению YN (тип: вещественный);
R - вещественный одномерный рабочий массив длины 4*M*M+7*M+1;
IERR - целая переменная, значение которой в результате работы подпрограммы полагается равным 65, если какая - нибудь компонента решения не может быть вычислена с требуемой точностью EPS. В этом случае интегрирование системы прекращается; при желании интегрирование системы можно повторить обращением к подпрограмме с новыми значениями параметров HMIN и H.

Версии

DE03E - вычисление решения задачи Коши для квазилинейной системы обыкновенных дифференциальных уравнений первого порядка с большой константой Липшица в конце интервала интегрирования методом Лоусона с удвоенным числом значащих цифр. При этом параметры XN, YN, XK, A, HMIN, EPS, P, H, Y, R и параметры X, Y, R в подпрограмме FU должны иметь тип Extended.

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

      DE02R -
      DE02E  
выполнение одного шага численного интегрирования квазилинейной системы обыкновенных дифференциальных уравнений первого порядка с большой константой Липшица методом Лоусона.
      UTDE20 -
      UTDE21  
подпрограмма выдачи диагностических сообщений; Подпрограмма DE02R, UTDE20 вызывается при работе подпрограммы DE03R, а подпрограммы DE02E, UTDE21 - при работе DE03E.

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

 

Данная подпрограмма предназначена для интегрирования квазилинейных систем, имеющих малый нелинейный член U (x, y).

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

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

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

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

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

                                     
        y1'  =  - 500 y1  +  y2  +  sin ( y1 + y2 ) ( 1 + e - x/2 ) ,
        y1(0) = 50 
        y2'  =  - 1000 y1  +  y2  +  sin ( y1 - y2 ) ( 1 + e - x/2 ) ,
        y2(0) = 50 

        0 ≤ x ≤ 5 

Приводятся подпрограмма вычисления функций

        U1 (x, y)  =  sin ( y1 + y2 ) ( 1 + e - x/2 ) ,
        U2 (x, y)  =  sin ( y1 - y2 ) ( 1 + e - x/2 )

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

Unit TDE03R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, FUDE03R_p, DE03R_p;

function TDE03R: String;

implementation

function TDE03R: String;
var
M,IERR :Integer;
XN,HMIN,EPS,P,XK,H :Real;
A :Array [0..3] of Real;
Y :Array [0..1] of Real;
YN :Array [0..1] of Real;
R :Array [0..30] of Real;
begin
Result := '';  { результат функции }
M := 2;
XN := 0.0;
YN[0] := 5.E1;
YN[1] := 5.E1;
HMIN := 1.E-10;
EPS := 1.E-8;
P := 1.E2;
ХК := 5.0;
H := 0.01;
A[0] := -5.E2;
A[2] := 1.0;
A[1] := -1.E3;
A[3] := 1.0;
DE03R (FUDE03R,M,XN,YN,XK,A,HMIN,EPS,P,H,Y,R,IERR);
Result := Result + Format(' %20.16f  %20.16f  %20.16f   %2d ',[
 Y[0],Y[1],H,IERR]) + #$0D#$0A;
UtRes('TDE03R',Result);  { вывод результатов в файл TDE03R.res }
exit;
end;

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

procedure FUDE03R(X :Real; var Y :Array of Real; var U :Array of Real;
                M :Integer);
implementation

procedure FUDE03R(X :Real; var Y :Array of Real; var U :Array of Real;
                M :Integer);
var
T :Real;
begin
T := 1.0 + Exp(-X/2.0);
U[0] := T*Sin(Y[0] + Y[1]);
U[1] := T*Sin(Y[0] - Y[1]);
end;

end.
end.

 Результаты: 

             Y(1)                                   Y(2)                               H 
     -3.508894600484-04      -8.340807464992-02       1.250000000001-03 

      IERR = 0