Текст подпрограммы и версий de00r_p.zip , de00e_p.zip , de84r_p.zip , de84e_p.zip |
Тексты тестовых примеров tde00r_p.zip , tde00e_p.zip , tde84r_p.zip , tde84e_p.zip |
Выполнение одного шага численного интегрирования устойчивой системы обыкновенных дифференциальных уравнений первого порядка с большой константой Липшица методом Лоусона.
Выполняется один шаг численного интегрирования системы M обыкновенных дифференциальных уравнений первого порядка
(1) Y ' = F(X, Y) , Y = ( y1,..., yM ) , F = ( f1( X, y1,..., yM ), ... , fM( X, y1,..., yM ) )
Предполагается, что среди характеристических корней матрицы Якоби ∂F / ∂y функции F имеются большие по модулю корни. По заданному значению решения YX в узле xn вычисляется значение этого решения в узле xn + H . Предполагается также, что система (1) на [ xn, xN + H ] может быть достаточно хорошо аппроксимирована линейной однородной системой с постоянными коэффициентами, т.е. системой вида
Y ' = AY ,
где A - некоторая постоянная матрица. Вычисление производится по методу Лоусона. Метод Лоусона заключается в следующем. Исходная система уравнений с помощью замены искомой функции y (x) на [ xn, 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 DE00R(F :Proc_F_DE; FJ :Proc_F_DE; M :Integer; var JSTART :Integer; HMIN :Real; EPS :Real; P :Real; var YX :Array of Real; var X :Real; var H :Real; var BUL :Boolean; var XP :Real; var YP :Array of Real; var A :Array of Real; var E1 :Array of Real; var E2 :Array of Real; var E3 :Array of Real; var E4 :Array of Real; var R :Array of Real; var R0 :Array of Real; var R1 :Array of Real; var R2 :Array of Real; var R3 :Array of Real; var YD :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 - | количество уравнений в системе (тип: целый); |
JSTART - | целый указатель режима использования подпрограммы, имеющий следующие значения: |
0 - | первое обращение к подпрограмме должно быть выполнено с нулевым значением JSTART; при этом значение параметра в качестве матрицы A0 принимается матрица ∂f / ∂y в точке [ x = xn, y = yn ]; вычисленное значение матрицы A0 будет использоваться в дальнейшем для значений JSTART = 1, 2, 3; |
1 - | выполнить один шаг интегрирования системы дифференциальных уравнений для значений независимой и зависимой переменных, заданных параметрами YX и X соответственно; при этом само значение величины шага интегрирования H, на который предполагается продолжить решение системы, должно совпадать с тем значением шага, который был фактически выполнен подпрограммой при предыдущем обращении к ней, а матрица A0 остается той же, что и на предыдущем шаге; |
2 - | то же, что и для JSTART = 1, но только с той разницей, что величина шага интегрирования, на который предполагается продолжить решение, в два раза больше того значения шага, который был фактически выполнен при предыдущем обращении к подпрограмме; матрица A0 остается той же, что и на предыдущем шаге; |
3 - | то же, что и для JSTART = 1, но только с той разницей, что шаг интегрирования может принимать произвольное значение, матрица A0 остается той же, что и на предыдущем шаге. |
-1 - | повторить последний шаг интегрирования с новыми значениями параметров H и/или HMIN; при этом значении JSTART в качестве матрицы A0 принимается матрица ∂f / ∂y в точке [ x = XP, y = YP ] таким образом, до тех пор, пока JSTART принимает значения 1, 2 или 3, сохраняется одно и то же значение матрицы A0 , равное значению матрицы Якоби, вычисленному при последнем обращении к подпрограмме с параметром JSTART = 0 или JSTART = - 1; если требуется изменить матрицу A0 , то следует обратиться к подпрограмме со значением JSTART = 0 или - 1; при выходе из подпрограммы параметр JSTART полагается равным 2, если выполнив заданный в H шаг, подпрограмма рекомендовала для интегрирования вдвое большеe его значение, и 1 в противном случае, т.е. в том случае, когда рекомендованное значение шага равно только что выполненному шагу; рекомендованное значение шага на выходе из подпрограммы запоминается в переменной H; |
HMIN - | минимальное значение абсолютной величины шага, которое разрешается использовать при интегрировании данной системы уравнений (тип: вещественный); |
EPS - | допустимая мера погрешности, с которой требуется вычислить все компоненты решения (тип: вещественный); |
P - | граница перехода, используемая при оценке меры погрешности решения (тип: вещественный); |
YX, X - | заданные вещественные значения решения и соответствующее ему значение аргумента; в результате работы подпрограммы в X получается новое значение аргумента, в YX - соответствующее значение решения; в случае системы уравнений т.е. когда M ≠ 1, YX задается одномерным массивом длины M; |
H - | вещественная переменная, содержащая значение шага интегрирования; если для этого значения шага точность приближенного решения достигается, то именно он и реализуется подпрограммой, иначе этот шаг уменьшается подпрограммой до тех пор, пока не будет достигнута заданная точность EPS; на выходе из подпрограммы H содержит рекомендуемое подпрограммой значение следующего шага, определяемое ею с целью достижения более экономного способа интегрирования; |
BUL - | логическая переменная, значение которой при обращении к подпрограмме полагается равным TRUE, если заданный в H шаг выводит в конец интервала интегрирования, и FALSE в противном случае; в результате работы подпрограммы BUL равно FALSE, если вместо исходного шага интегрирования был реализован меньший шаг; в противном случае, т.е. когда был выполнен именно заданный при обращении в H шаг, значение параметра BUL не меняется; |
XP, YP - | вещественная рабочая переменная и одномерный рабочий массив длины M соответственно; значения параметров XP, YP на выходе из подпрограммы равны тем значениям, которые имели параметры X, YX при входе в нее (т.е. предыдущий узел и решение в нем); |
A, E1, E2 - E3, E4 | вещественные двумерные рабочие массивы размера M*M; |
R, R0 - R1, R2 R3, YD | вещественные одномерные рабочие массивы длины M; |
IERR - | целая переменная, значение которой в результате работы подпрограммы полагается равным 65, если какая - нибудь компонента решения не может быть вычислена с требуемой точностью EPS; в этом случае последний шаг интегрирования системы можно повторить обращением к подпрограмме с новыми значениями параметров H, HMIN и значением JSTART = - 1. |
Версии
DE00E - | выполнение одного шага численного интегрирования системы обыкновенных дифференциальных уравнений первого порядка с большой константой Липшица методом Лоусона с удвоенным числом значащих цифр. При этом параметры HMIN, EPS, P, YX, X, H, XP, YP, A, E1, E2, E3, E4, R, R0, R1, R2, R3, YD и параметры X, Y, DY в подпрограмме F и X, Y, DF в подпрограмме FJ должны иметь тип Extended. |
DE84R - |
выполнение одного шага численного интегрирования
устойчивой системы обыкновенных дифференциальных
уравнений первого порядка с большой константой Липшица
методом Лоусона. В отличии от подпрограммы DE00R
первый оператор подпрограммы DE84R не содержит в
списке формальных параметров имени подпрограммы
вычисления матрицы Якоби и имеет следующий вид:procedure DE84R(F :Proc_F_DE; M :Integer; var JSTART :Integer; HMIN :Real; EPS :Real; P :Real; var YX :Array of Real; var X :Real; var H :Real; var BUL :Boolean; var XP :Real; var YP :Array of Real; var A :Array of Real; var E1 :Array of Real; var E2 :Array of Real; var E3 :Array of Real; var E4 :Array of Real; var R :Array of Real; var R0 :Array of Real; var R1 :Array of Real; var R2 :Array of Real; var R3 :Array of Real; var YD :Array of Real; var IERR :Integer); implementation. При использовании этой подпрограммы пользователь не составляет подпрограмму вычисления матрицы Якоби. Все параметры подпрограммы DE84R имеют тот же смысл, что и одноименные параметры подпрограммы DE00R. |
DE84E - | выполнение одного шага численного интегрирования устойчивой системы обыкновенных дифференциальных уравнений первого порядка с большой константой Липшица методом Лоусона с удвоенным числом значащих цифр. Первый оператор подпрограммы имеет тот же вид, что и в подпрограмме DE84R, при этом параметры HMIN, EPS, P, YX, X, H, XP, YP, A, E1, E2, E3, E4, R, R0, R1, R2, R3, YD и параметры X, Y, DY в подпрограмме F должны иметь тип Extended. |
Вызываемые подпрограммы
AME2R - | подпрограмма вычисления матричной экспоненты; вызывается при работе подпрограммы DE00R. |
AME2E - | подпрограмма вычисления матричной экспоненты; вызывается при работе подпрограммы DE00E. |
UTDE20 - | подпрограмма выдачи диагностических сообщений при работе подпрограммы DE00R; |
UTDE21 - | подпрограмма выдачи диагностических сообщений при работе подпрограммы DE00E. |
Кроме того, при работе подпрограмм DE00R, DE84R и DE00E, DE84D вызываются рабочие подпрограммы DE00RS, DE04RM, DE00RD и DE00ES, DE04EM, DE00ED соответственно. | |
При работе подпрограмм DE84R и DE84E дополнительно вызываются также рабочие подпрограммы DE84RJ и DE84EJ соответственно. |
Замечания по использованию
Данная подпрограмма предназначена для интегрирования таких
нелинейных систем, которые могут быть достаточно хорошо
аппроксимированы линейной однородной системой с постоянными
коэффициентами, т.е. системой вида Y ' = AY , где A - некоторая постоянная матрица. В общем случае заданная точность не гарантируется. При работе подпрограммы значения параметров M, HMIN, EPS, P сохраняются. Между последовательными обращениями к подпрограмме со значениями параметра JSTART = 1, 2, 3 пользователь не должен изменять содержимое массивов A, E1, E2. При работе подпрограмм F и FJ значения параметров M, X, Y не должны изменяться. При обращении к подпрограмме со значением JSTART = - 1 в качестве исходных значений аргумента и решения принимаются значения параметров XP и YP соответственно, т.е. те значения, которые эти параметры получили после самого последнего обращения к подпрограмме с неотрицательным значением JSTART. После работы подпрограммы в массиве R1 содержится значение оценки абсолютной погрешности на шаге, вычисленной по правилу Рунге. Данная подпрограмма и ее версия предназначены также для . |
y1' = (- 500 + 2 x) y1 + (1 - x / 10 )y2 + (1 + 1 / ( x+1 ) ) 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 TDE00R_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc, UtRes_p, FDE00R_p, FJDE00R_p, DE00R_p; function TDE00R: String; implementation function TDE00R: String; var M,JSTART,IH,IERR :Integer; X,HMIN,EPS,P,H,ХР :Real; BUL :Boolean; YX :Array [0..1] of Real; YP :Array [0..1] of Real; A :Array [0..3] of Real; E1 :Array [0..3] of Real; E2 :Array [0..3] of Real; E3 :Array [0..3] of Real; E4 :Array [0..3] of Real; R :Array [0..1] of Real; R0 :Array [0..1] of Real; R1 :Array [0..1] of Real; R2 :Array [0..1] of Real; R3 :Array [0..1] of Real; YD :Array [0..1] of Real; label _100,_101,_102,_103,_104,_105,_106; begin Result := ''; { результат функции } M := 2; X := 1.0; YX[0] := 49.0; YX[1] := 50.0; HMIN := 1.E-10; EPS := 1.E-8; P := 1.E2; JSTART := 0; H := 0.01; IH := 0; _100: IH := IH+1; DE00R (FDE00R,FJDE00R,M,JSTART,HMIN,EPS,P,YX,X,H,BUL,XP,YP,A,E1, E2,E3,E4,R,R0,R1,R2,R3,YD,IERR); Result := Result + Format(' %20.16f %20.16f %20.16f ', [X,YX[0],YX[1]]) + #$0D#$0A; Result := Result + Format('%s',['-']) + #$0D#$0A; Result := Result + Format(' %20.16f %20.16f %20.16f ', [H,R1[0],R1[1]]) + #$0D#$0A; Result := Result + Format('%s',['**']) + #$0D#$0A; case IH of 1: goto _101; 2: goto _102; 3: goto _103; 4: goto _104; 5: goto _105; 6: goto _106; end; _101: H := 1.0; JSTART := 3; goto _100; _102: EPS := 1.E-2; goto _100; _103: JSTART := -1; EPS := 1.E-8; goto _100; _104: EPS := 1.E-2; H := 1.E-8; JSTART := 3; goto _100; _105: H := -1.E-3; EPS := 1.E-8; JSTART := 0; goto _100; _106: UtRes('TDE00R',Result); { вывод результатов в файл TDE00R.res } exit; end; end. Unit FDE00R_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc; procedure FDE00R(X :Real; var Y :Array of Real; var DY :Array of Real; M :Integer); implementation procedure FDE00R(X :Real; var Y :Array of Real; var DY :Array of Real; M :Integer); var E2,E,E3,E1 :Real; begin DY[1-1] := (2.0*X-5.E2)*Y[1-1]+(1.0-X*1.E-1)*Y[2-1]+ (1.0+1./(1.0+X))*Sin(Y[1-1]); DY[2-1] := (-1.E3-1.E1*X)*Y[1-1]+(1.0+X*1.E-1)*Y[2-1]+ (2.0+1./(2.0+X))*Cos(Y[2-1]); end; end. Unit FJDE00R_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc; procedure FJDE00R(X :Real; var Y :Array of Real; var DF :Array of Real; M :Integer); implementation procedure FJDE00R(X :Real; var Y :Array of Real; var DF :Array of Real; M :Integer); var E2,E,E3,E1 :Real; begin DF[(1-1)+(1-1)*2] := 2.0*X-5.E2+(1.0+1./(1.0+X))*Cos(Y[1-1]); DF[(1-1)+(2-1)*2] := 1.0-X*1.E-1; DF[(2-1)+(1-1)*2] := -1.E3-1.E1*X; DF[(2-1)+(2-1)*2] := 1.0+X*1.E-1-(2.0+1./(2.0+X))*Sin(Y[2-1]); end; end. Результаты: После первого обращения к подпрограмме X YX(1) YX(2) 1.000039062499+00 4.895766071531+00 4.808757932455+00 H R1(1) R1(2) 3.906250000002-05 9.597251282538-10 -7.233271996176-09 После второго обращения к подпрограмме X YX(1) YX(2) 1.000069580077+00 4.733408100787+01 4.661901490984+01 H R1(1) R1(2) 3.051757812500-05 1.319373647371-10 6.946114202335-02 После третьего обращения к подпрограмме X YX(1) YX(2) 1.000100097655+00 4.662140584405+01 4.517257692956+01 H R1(1) R1(2) 6.103515625000-05 -6.208817164108-11 1.830362084864-09 После четвертого обращения к подпрограмме X YX(1) YX(2) 1.000100097655+00 4.662140584411+01 4.517257692973+01 H R1(1) R1(2) 3.051757812500-05 -5.820766091346-11 1.851003617047-09 После пятого обращения к подпрограмме X YX(1) YX(2) 1.000100107654+00 4.662117408356+01 4.517210655950+01 H R1(1) R1(2) 2.000000000004-08 0.000000000000 + 00 0.000000000000 + 00 После шестого обращения к подпрограмме X YX(1) YX(2) 1.000068857653+00 4.735108317091+01 4.665352269082+01 H R1(1) R1(2) -3.125000000004-05 3.880510727560-11 -2.250696221985-09