Текст подпрограммы и версий 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