|
Текст подпрограммы и версий de01r_p.zip , de01e_p.zip , de85r_p.zip , de85e_p.zip |
Тексты тестовых примеров tde01r_p.zip , tde01e_p.zip , tde85r_p.zip , tde85e_p.zip |
Вычисление решения задачи Коши для устойчивой системы обыкновенных дифференциальных уравнений первого порядка с большой константой Липшица методом Лоусона.
Решается задача Коши для устойчивой системы 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