Текст подпрограммы и версий ( Фортран ) de94r.zip, de94d.zip, de96r.zip, de96d.zip, de90r.zip, de90d.zip, de92r.zip, de92d.zip |
Тексты тестовых примеров ( Фортран ) tde94r.zip, tde94d.zip, tde96r.zip, tde96d.zip , tde90r.zip, tde90d.zip, tde92r.zip, tde92d.zip |
Текст подпрограммы и версий ( Си ) de94r_c.zip, de94d_c.zip, de96r_c.zip, de96d_c.zip, de90r_c.zip, de90d_c.zip, de92r_c.zip, de92d_c.zip |
Тексты тестовых примеров ( Си ) tde94r_c.zip, tde94d_c.zip, tde96r_c.zip, tde96d_c.zip , tde90r_c.zip, tde90d_c.zip, tde92r_c.zip, tde92d_c.zip |
Текст подпрограммы и версий ( Паскаль ) de94r_p.zip, de94e_p.zip, de96r_p.zip, de96e_p.zip, de90r_p.zip, de90e_p.zip, de92r_p.zip, de92e_p.zip |
Тексты тестовых примеров ( Паскаль ) tde94r_p.zip, tde94e_p.zip, tde96r_p.zip, tde96e_p.zip , tde90r_p.zip, tde90e_p.zip, tde92r_p.zip, tde92e_p.zip |
Выполнение одного шага численного интегрирования жесткой системы обыкновенных дифференциальных уравнений первого порядка методом типа Розенброка четвертого порядка.
Выполняется один шаг численного интегрирования системы M обыкновенных дифференциальных уравнений первого порядка
Y ' = F( X, Y ) , Y = ( y1, ..., yM ) , F = ( f1 ( X, y1, ..., yM ), ..., fM ( X, y1, ..., yM ) )
методом типа Розенброка четвертого порядка.
По заданному значению YX решения в узле Xn вычисляется значение этого решения в узле Xn + H. Все компоненты решения вычисляются с контролем точности по мере погрешности, который заключается в следующем. Если некоторая компонента приближенного решения по абсолютной величине не меньше некоторой заданной константы P (называемой границей перехода), то контроль точности для этой компоненты ведется по относительной погрешности, иначе - по абсолютной. Значение H может быть меньше или равно значению шага интегрирования, задаваемому пользователем при обращении к подпрограмме.
Артемьев С.С., Демидов Г.В. A - устойчивый метод типа Розенброка четвертого порядка точности решения задачи Коши для жестких систем обыкновенных дифференциальных уравнений// Некоторые проблемы вычислительной и прикладной математики. Новосибирск: "Наука", 1975.
Современные численные методы решения обыкновенных дифференциальных уравнений/ Под ред. Дж.Холла и Дж.Уатта. М.: "Мир", 1979.
SUBROUTINE DE94R (F, FJ, FX, M, JSTART, HMIN, EPS, P, YX, X, H, BUL, XP, YP, A, A1, A2, RAB, R1, R2, R3, R4, YD, IERR)
Параметры
F - |
имя подпрограммы вычисления значений правой
части дифференциальных уравнений. Первый оператор
подпрограммы должен иметь вид: SUBROUTINE F (X, Y, DY, M). Здесь X, Y - значения независимой и зависимой переменных, соответственно. Вычисленное значение правой части должно быть помещено в DY; в случае системы уравнений, т.е. когда M ≠ 1, параметры Y и DY представляют одномерные массивы длиной M (тип параметров X, Y и DY: вещественный); |
FJ - |
имя подпрограммы вычисления значений элементов матрицы Якоби
∂f / ∂y
правой части системы. Первый оператор подпрограммы должен иметь вид: SUBROUTINE FJ (X, Y, Z, M). Здесь X, Y - значения независимой и зависимой переменных, соответственно. В случае системы уравнений, т.е. когда M ≠ 1, параметр Y представляет собой одномерный массив длины M, а параметр Z - двумерный массив размера M * M. Значения элементов матрицы Якоби ∂f / ∂y правой части системы должны быть помещены в массив Z, при этом частная производная от правой части I - го уравнения по J - ой переменной Y ( J ) запоминается в элементе Z ( I, J )(тип параметров X, Y и Z: вещественный); |
FX - |
имя подпрограммы вычисления значений частных
производных по X правой части системы
∂f / ∂x.
Первый оператор подпрограммы должен иметь вид: SUBROUTINE FX (X, Y, Z1, M). Здесь: X, Y - значения независимой и зависимой переменных, соответственно. В случае системы уравнений, т.е. когда M ≠ 1, параметры Y и Z1 представляют собой одномерные массивы длиной M. Значения частных производных по X правой части системы ∂f / ∂x должны быть помещены в массив Z1; при этом частная производная от правой части I - го уравнения запоминается в элементе Z1 ( I ) (тип параметров X, Y и Z1: вещественный); |
M - | количество уравнений в системе (тип: целый); |
JSTART - | целый указатель режима использования подпрограммы, имеющий следующие значения: |
0,+1 - | выполнить один шаг интегрирования системы дифференциальных уравнений для значений независимой и зависимой переменных и шага интегрирования, заданных параметрами X, YX и H, соответственно; |
-1 - | повторить последний шаг интегрирования с новыми значениями параметров H и/или HMIN; |
на выходе из подпрограммы JSTART равен + 1; | |
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 - A1, A2 | вещественные двумерные рабочие массивы размера M * M; |
RAB - | вещественный одномерный рабочий массив длины 5 * M; на выходе из подпрограммы в первых M элементах этого массива содержится погрешность вычисленного приближенного решения, полученная по правилу Рунге; |
R1, R2 - R3, R4 YD | вещественные одномерные рабочие массивы длины M; |
IERR - | целая переменная, значение которой в результате работы подпрограммы полагается равным 65, если какая - нибудь компонента решения не может быть вычислена с требуемой точностью EPS; в этом случае последний шаг интегрирования системы можно повторить обращением к подпрограмме с новыми значениями параметров H, HMIN и значением JSTART = - 1 . |
Версии
DE96R - |
выполнение одного шага численного интегрирования
жесткой системы обыкновенных дифференциальных уравнений
первого порядка методом типа Розенброка четвертого
порядка. Отличие подпрограммы DE96R от подпрограммы
DE94R состоит в том, что при обращении к подпрограмме
DE96R не требуется задавать подпрограмму вычисления
матрицы Якоби системы и подпрограмму вычисления
частных производных правой части системы по x . Все
частные производные от правой части вычисляются в
подпрограмме DE96R с помощью разностных отношений.
Первый оператор подпрограммы DE96R имеет вид:
SUBROUTINE DE96R (F, M, JSTART, HMIN, EPS, P, YX, X, H, BUL, XP, YP, A, A1, A2, RAB, R1, R2, R3, R4, YD, IERR)Список формальных параметров подпрограммы DE96R отличается от списка параметров подпрограммы DE94R отсутствием параметров FJ и FX. Параметры подпрограммы DE96R имеют тот же смысл, что и одноименные параметры подпрограммы DE94R. |
DE90R - |
выполнение одного шага численного интегрирования
автономной жесткой системы обыкновенных дифференциальных
уравнений первого порядка методом типа Розенброка четвертого порядка.
Данная подпрограмма предназначена для интегрирования
систем уравнений, в правые части которых не входит
независимая переменная x ,
т.е. систем вида y' = f (y) .
Первый оператор подпрограммы DE90R имеет вид:
SUBROUTINE DE90R (F, FJ, M, JSTART, HMIN, EPS, P, YX, X, H, BUL, XP, YP, A, A1, A2, RAB, R1, R2, YD, IERR)Список формальных параметров подпрограммы DE90R отличается от списка параметров DE94R отсутствием параметров FX, R3, R4. Параметры подпрограммы DE90R имеют тот же смысл, что и одноименные параметры подпрограммы DE94R, кроме параметра RAB. В подпрограмме DE90R параметр RAB представляет одномерный вещественный рабочий массив длины 4 * M. |
DE92R - |
выполнение одного шага численного интегрирования
жесткой автономной системы обыкновенных дифференциальных
уравнений первого порядка методом типа Розенброка
четвертого порядка. Данная подпрограмма предназначена
для интегрирования систем уравнений, в правые части
которых не входит независимая переменная X, т.е.
систем вида y' = f (y) .
Отличие подпрограммы DE92R от
подпрограммы DE94R состоит в том, что при обращении
к подпрограмме DE92R не требуется задавать подпрограмму
вычисления матрицы Якоби системы
∂f / ∂y
и подпрограмму вычисления частных производных
∂f / ∂x .
Первый оператор подпрограммы DE92R имеет вид:
SUBROUTINE DE92R (F, M, JSTART, HMIN, EPS, P, YX, X, H, BUL, XP, YP, A, A1, A2, RAB, R1, R2, YD, IERR)Список формальных параметров подпрограммы DE92R отличается от списка параметров подпрограммы DE94R отсутствием параметров FJ, FX, R3, R4. Параметры подпрограммы имеют тот же смысл, что и в подпрограмме DE94R, кроме параметра RAB. В подпрограмме DE92R параметр RAB представляет одномерный вещественный рабочий массив длины 4 * M. |
DE94D - | выполнение одного шага численного интегрирования жесткой системы обыкновенных дифференциальных уравнений первого порядка методом типа Розенброка четвертого порядка с повышенной точностью. Первый оператор подпрограммы имеет тот же вид, что и в подпрограмме DE94R; при этом параметры HMIN, EPS, P, YX, X, H, XP, YP, A, A1, A2, RAB, R1, R2, R3, R4, YD и параметры X, Y, DY, Z, Z1 в подпрограммах F, FJ, FX должны иметь тип DOUBLE PRECISION. |
DE96D - | выполнение одного шага численного интегрирования жесткой системы обыкновенных дифференциальных уравнений первого порядка методом типа Розенброка четвертого порядка с повышенной точностью. Первый оператор подпрограммы имеет тот же вид, что и в подпрограмме DE96R; при этом параметры HMIN, EPS, P, YX, X, H, XP, YP, A, A1, A2, RAB, R1, R2, R3, R4, YD и параметры X, Y, DY в подпрограмме F должны иметь тип DOUBLE PRECISION. |
DE90D - | выполнение одного шага численного интегрирования автономной жесткой системы обыкновенных дифференциальных уравнений первого порядка методом типа Розенброка четвертого порядка с повышенной точностью. Первый оператор подпрограммы имеет тот же вид, что и в подпрограмме DE90R; при этом параметры HMIN, EPS, P, YX, X, H, XP, YP, A, A1, A2, RAB, R1, R2, YD и параметры X, Y, DY, Z в подпрограммах F, FJ должны иметь тип DOUBLE PRECISION. |
DE92D - | выполнение одного шага численного интегрирования жесткой автономной системы обыкновенных дифференциальных уравнений первого порядка методом типа Розенброка четвертого порядка с повышенной точностью. Первый оператор подпрограммы имеет тот же вид, что и в подпрограмме DE92R; при этом параметры HMIN, EPS, P, YX, X, H, XP, YP, A, A1, A2, RAB, R1, R2, YD и параметры X, Y, DY в подпрограмме F должны иметь тип DOUBLE PRECISION. |
Вызываемые подпрограммы
AIG2R - | обращение вещественной матрицы методом Жордана с выбором ведущего элемента по всей матрице. Вызывается при работе подпрограмм DE90R, DE92R, DE94R, DE96R. |
AIG2D - | обращение вещественной матрицы, заданной с удвоенной точностью, методом Жордана с выбором ведущего элемента по всей матрице. Вызывается при работе подпрограмм DE90D, DE92D, DE94D, DE96D. |
UTDE20 - | подпрограмма выдачи диагностических сообщений при работе подпрограмм DE90R, DE92R, DE94R, DE96R. |
UTDE21 - | подпрограмма выдачи диагностических сообщений при работе подпрограмм DE90D, DE92D, DE94D, DE96D. |
Кроме того, при работе подпрограммы DE90R вызываются рабочие подпрограммы DE92RS, DE92RK; при работе подпрограммы DE92R вызываются рабочие подпрограммы DE92RS, DE92RK, DE84RJ; при работе подпрограммы DE94R выэываются рабочие подпрограммы DE96RS, DE92RK; при работе подпрограммы DE96R вызываются рабочие подпрограммы DE96RS, DE92RK, DE84RJ, DE96RX; при работе подпрограммы DE90D вызываются рабочие подпрограммы DE92DS, DE92DK; при работе подпрограммы DE92D вызываются подпрограммы DE92DS, DE92DK, DE84DJ; при работе подпрограммы DE94D вызываются подпрограммы DE94DS, DE92DK; при работе подпрограммы DE96D вызываются подпрограммы DE96DS, DE92DK, DE84DJ, DE96DX. |
Замечания по использованию
В общем случае заданная точность не гарантируется. При работе подпрограммы и ее версий значения параметров M, HMIN, EPS, P сохраняются. При работе подпрограмм F, FJ, FX значения параметров M, X, Y не должны изменяться. При выполнении из точки xn одного шага H метода типа Розенброка в подпрограмме DE94R и ее версиях вычисляются четыре значения правой части системы дифференциальных уравнений. Среди этих значений есть одно, которое должно вычисляться при значении независимой переменной x, равном xn - H. Это значение аргумента xn находится слева от точки xn при H > 0 и справа от точки xn при H < 0. Это следует учитывать при составлении подпрограммы F вычисления правой части системы. Если правая часть системы дифференциальных уравнений не определена для x < xn при интегрировании слева направо (H > 0) или для x < xn при интегрировании справа налево (H < 0), то попытка вычислить правую часть для указанного значения аргумента x может привести к авосту.Если при решении системы дифференциальных уравнений не задаются подпрограммы FJ вычисления матрицы Якоби и FX вычисления частных производных по x правой части системы (т.е. производится обращение к подпрограммам DE92R, DE96R, DE92D, DE96D), то все частные производные по y и по x в этих подпрограммах аппроксимируются центральными разностными отношениями. Замена точных значений производных разностными аппроксимациями может привести к росту погрешности приближенного решения системы дифференциальных уравнений по сравнению с тем, что было бы, если бы все частные производные вычислялись точно с помощью подпрограмм FJ и FX. Даже если будет мала погрешность аппроксимации частных производных (например, если правая часть системы является линейной функцией своих аргументов, то погрешность аппроксимации частных производных равна нулю), может оказаться значительной вычислительная погрешность, особенно, когда вычисления выполняются с одинарной точностью. При этом вычислительная погрешность может даже превосходить верхний предел погрешности приближенного решения, заданный при обращении к подпрограмме параметром EPS. В этом случае целесообразно использовать не подпрограммы DE92R, DE96R, а их версии, выполняющие вычисления с удвоенным числом значащих цифр, т.е. подпрограммы DE92D, DE96D. Если частные производные по x от правой части системы вычисляются с помощью центральных разностных отношений (т.е. когда производится обращение к подпрограммам DE96R, DE96D), то значения правой части системы, необходимые для аппроксимации этой производной, будут вычисляться с помощью подпрограммы F при значениях аргумента X, находящихся по разные стороны от точки Xn, а именно, при Xn - Δ, Xn + Δ где Δ - значение, задаваемое параметром EPS. Если правая часть системы дифференциальных уравнений не определена для x < xn при интегрировании слева направо или для x > xn при интегрировании справа налево, то попытка вычислить правую часть для указанного значения аргумента x может привести к авосту. |
Пример 1. Решается задача Коши y1' = - 100y1 y2' = - 100y1 - 2y2 + 20e - 100x + 2e - x cos x y3' = - 100y1 + 9998y2 - 9990y3 - 10y4 + 20e - 100x + 2e - x cos x y4' = - 100y1 + 9988y2 + 20y3 - 10010y4 + 20e - 100x + 2e - x cos x x = 0 , y1(0) = 10 , y2(0) = 11 , y3(0) = 111 , y4(0) = 111 . Точное решение задачи имеет вид: y1 = 10e - 100x y2 = 10e - 100x + e - x cos x + e - x sin x y3 = y2 + 100e - 10000x cos 10x y4 = y3 + 100e - 10000x sin 10x Матрица Якоби правой части системы имеет вид: - 100 0 0 0 - 100 - 2 0 0 - 100 9998 - 9990 - 10 - 100 9988 20 - 10010 Частные производные по x правой части системы имеют вид: 0 - 2000e - 100x - 2e - x (cos x + sin x) - 2000e - 100x - 2e - x (cos x + sin x) - 2000e - 100x - 2e - x (cos x + sin x)
Ниже приводятся фрагмент вызывающей программы для DE94R, подпрограммы F, FJ, FX и результаты счета, полученные после нескольких обращений к подпрограмме DE94R.
DIMENSION YX(4), YP(4), A(4, 4), A1(4, 4), A2(4, 4), RAB(20), * R1(4), R2(4), R3(4), R4(4), YD(4) LOGICAL BUL EXTERNAL F, FJ, FX M = 4 X = 0. YX(1) = 10. YX(2) = 11. YX(3) = 111. YX(4) = 111. HMIN = 1.E - 10 EPS = 1.E - 8 P = 1.E3 JSTART = 0 H = 0.01 IH = 0 10 IH = IH + 1 CALL DE94R (F, FJ, FX, M, JSTART, HMIN, EPS, P, YX, X, H, BUL, * XP, YP, A, A1, A2, RAB, R1, R2, R3, R4, YD, IERR) C BЫЧИCЛEHИE TOЧHOГO PEШEHИЯ CИCTEMЫ: Y1 = 10.*EXP(- 100.*X) Y2 = Y1 + EXP(- X)*(COS(X) + SIN(X)) Y3 = Y2 + 100.*EXP(- 1.E4*X)*COS(10.*X) Y4 = Y3 + 100.*EXP(- 1.E4*X)*SIN(10.*X) GO TO (11, 12, 13, 14, 15, 16), IH 11 H = 1.E - 8 GO TO 10 12 H = - 1.E - 8 GO TO 10 13 JSTART = - 1 GO TO 10 14 JSTART = - 1 H = - 1.E - 8 GO TO 10 15 H = 0.01 GO TO 10 16 CONTINUE SUBROUTINE F (X, Y, DY, M) DIMENSION Y(4), DY(4) DY(1) = - 100.*Y(1) T1 = 20.*EXP(- 100.*X) + 2.*EXP(- X)*COS(X) DY(2) = DY(1) - 2.*Y(2) + T1 DY(3) = DY(1) + 9998.*Y(2) - 9990.*Y(3) - 10.*Y(4) + T1 DY(4) = DY(1) + 9988.*Y(2) + 20.*Y(3) - 10010.*Y(4) + T1 RETURN END SUBROUTINE FJ (X, Y, DF, M) DIMENSION Y(4), DF(4, 4) DF(1, 1) = - 100. DF(1, 2) = 0. DF(1, 3) = 0. DF(1, 4) = 0. DF(2, 1) = - 100. DF(2, 2) = - 2. DF(2, 3) = 0. DF(2, 4) = 0. DF(3, 1) = - 100. DF(3, 2) = 9998. DF(3, 3) = - 9990. DF(3, 4) = - 10. DF(4, 1) = - 100. DF(4, 2) = 9988. DF(4, 3) = 20. DF(4, 4) = - 10010. RETURN END SUBROUTINE FX (X, Y, DX, M) DIMENSION Y(4), DX(4) DX(1) = 0. DX(2) = - 2.E3*EXP(- 1.E2*X) - 2.*EXP(- X)*(COS(X) + SIN(X)) DX(3) = DX(2) DX(4) = DX(2) RETURN END Результаты:
после первого обращения к подпрограмме -
Y1 Y2 9.997558891759 + 00 1.099755889174 + 01 Y3 Y4 1.085857138761 + 02 1.085880963993 + 02 YX(1) YX(2) 9.997558891700 + 00 1.099755889169 + 01 YX(3) YX(4) 1.085857138677 + 02 1.085880963909 + 02 X H 2.441406250001 - 06 2.441406250001 - 06
Распечатка контрольного члена погрешности:
RAB(1) RAB(2) - 9.701276818918 - 13 - 2.910383045670 - 12 RAB(3) RAB(4) 7.823109626764 - 09 7.784304519497 - 09
после второго обращения к подпрограмме -
Y1 Y2 9.997548894156 + 00 1.099754889414 + 01 Y3 Y4 1.085759455506 + 02 1.085783375935 + 02 YX(1) YX(2) 9.997548894098 + 00 1.099754889408 + 01 YX(3) YX(4) 1.085759455420 + 02 1.085783375847 + 02 X H 2.451406249999 - 06 2.000000000004 - 08
Распечатка контрольного члена погрешности:
RAB(1) RAB(2) 0.000000000000 + 00 0.000000000000 + 00 RAB(3) RAB(4) - 7.761021455135 - 12 - 1.552204291027 - 11
после третьего обращения к подпрограмме -
Y1 Y2 9.997558891759 + 00 1.099755889174 + 01 Y3 Y4 1.085857138761 + 02 1.085880963993 + 02 YX(1) YX(2) 9.997558891613 + 00 1.099755889160 + 01 YX(3) YX(4) 1.085857138667 + 02 1.085880963901 + 02 X H 2.441406249998 - 06 - 2.000000000004 - 08
Распечатка контрольного члена погрешности:
RAB(1) RAB(2) - 9.701276818918 - 13 - 9.701276818918 - 13 RAB(3) RAB(4) - 2.328306436536 - 11 - 1.552204291027 - 11
после четвертого обращения к подпрограмме -
Y1 Y2 9.997568889303 + 00 1.099756888929 + 01 Y3 Y4 1.085954831772 + 02 1.085978561790 + 02 YX(1) YX(2) 9.997568889157 + 00 1.099756888914 + 01 YX(3) YX(4) 1.085954831680 + 02 1.085978561698 + 02 X H 2.431406249996 - 06 - 4.000000000008 - 08
Распечатка контрольного члена погрешности:
RAB(1) RAB(2) - 1.940255363783 - 12 - 1.940255363783 - 12 RAB(3) RAB(4) - 1.552204291027 - 11 - 1.552204291027 - 11
после пятого обращения к подпрограмме -
Y1 Y2 9.997558891759 + 00 1.099755889174 + 01 Y3 Y4 1.085857138761 + 02 1.085880963993 + 02 YX(1) YX(2) 9.997558891613 + 00 1.099755889160 + 01 YX(3) YX(4) 1.085857138667 + 02 1.085880963901 + 02 X H 2.441406249998 - 06 - 2.000000000004 - 08
Распечатка контрольного члена погрешности:
RAB(1) RAB(2) - 9.701276818918 - 13 - 9.701276818918 - 13 RAB(3) RAB(4) - 2.328306436536 - 11 - 1.552204291027 - 11
после шестого обращения к подпрограмме -
Y1 Y2 9.995118379389 + 00 1.099511837936 + 01 Y3 Y4 1.062995982552 + 02 1.062342483763 + 02 YX(1) YX(2) 9.995118379200 + 00 1.099511837916 + 01 YX(3) YX(4) 1.062995982379 + 02 1.062342483588 + 02 X H 4.882812499996 - 06 2.441406250001 - 06
Распечатка контрольного члена погрешности:
RAB(1) RAB(2) - 1.940255363783 - 12 - 2.910387045670 - 12 RAB(3) RAB(4) 7.644606133297 - 09 7.590278983110 - 09
Пример 2.
Решается задача Коши из примера 1. Приводятся фрагмент вызывающей
программы для DE96R, подпрограмма F и результаты счета,
полученные после нескольких обращений к подпрограмме DE96R.
DIMENSION YX(4), YP(4), A(4, 4), A1(4, 4), A2(4, 4), RAB(20), * R1(4), R2(4), R3(4), R4(4), YD(4) LOGICAL BUL EXTERNAL F M = 4 X = 0. YX(1) = 10. YX(2) = 11. YX(3) = 111. YX(4) = 111. HMIN = 1.E - 10 EPS = 1.E - 8 P = 1.E3 JSTART = 0 H = 0.01 IH = 0 10 IH = IH + 1 CALL DE96R (F, M, JSTART, HMIN, EPS, P, YX, X, H, BUL, * XP, YP, A, A1, A2, RAB, R1, R2, R3, R4, YD, IERR) C BЫЧИCЛEHИE TOЧHOГO PEШEHИЯ CИCTEMЫ: Y1 = 10.*EXP(- 100.*X) Y2 = Y1 + EXP(-X)*(COS(X) + SIN(X)) Y3 = Y2 + 100.*EXP(- 1.E4*X)*COS(10.*X) Y4 = Y3 + 100.*EXP(- 1.E4*X)*SIN(10.*X) GO TO (11, 12, 13, 14, 15, 16), IH 11 H = 1.E - 8 GO TO 10 12 H = - 1.E - 8 GO TO 10 13 JSTART = - 1 GO TO 10 14 JSTART = - 1 H = - 1.E - 8 GO TO 10 15 H = 0.01 GO TO 10 16 CONTINUE SUBROUTINE F (X, Y, DY, M) DIMENSION Y(4), DY(4) DY(1) = - 100.*Y(1) T1 = 20.*EXP(- 100.*X) + 2.*EXP(- X)*COS(X) DY(2) = DY(1) - 2.*Y(2) + T1 DY(3) = DY(1) + 9998.*Y(2) - 9990.*Y(3) - 10.*Y(4) + T1 DY(4) = DY(1) + 9988.*Y(2) + 20.*Y(3) - 10010.*Y(4) + T1 RETURN END Результаты:
после первого обращения к подпрограмме -
Y1 Y2 9.999961853100 + 00 1.099996185309 + 01 Y3 Y4 1.109618221549 + 02 1.109618602874 + 02 YX(1) YX(2) 9.999961853042 + 00 1.099996185304 + 01 YX(3) YX(4) 1.109618221468 + 02 1.109618602339 + 02 X H 3.814697265626 - 08 3.814697265626 - 08
Распечатка контрольного члена погрешности:
RAB(1) RAB(2) - 1.940255363783 - 12 - 1.940255363783 - 12 RAB(3) RAB(4) - 1.777273913224 - 09 3.523503740628 - 09
после второго обращения к подпрограмме -
Y1 Y2 9.999951853111 + 00 1.099995185310 + 01 Y3 Y4 1.109518164690 + 02 1.109518645927 + 02 YX(1) YX(2) 9.999951853039 + 00 1.099995185304 + 01 YX(3) YX(4) 1.109518164597 + 02 1.109518645362 + 02 X H 4.814697265626 - 08 2.000000000004 - 08
Распечатка контрольного члена погрешности:
RAB(1) RAB(2) - 9.701276818918 - 13 - 9.701276818918 - 13 RAB(3) RAB(4) 1.862645149229 - 10 - 1.552204291027 - 11
после третьего обращения к подпрограмме -
Y1 Y2 9.999961853100 + 00 1.099996185309 + 01 Y3 Y4 1.109618221549 + 02 1.109618602874 + 02 YX(1) YX(2) 9.999961852940 + 00 1.099996185294 + 01 YX(3) YX(4) 1.109618221460 + 02 1.109618602293 + 02 X H 3.814697265621 - 08 - 2.000000000004 - 08
Распечатка контрольного члена погрешности:
RAB(1) RAB(2) - 1.940255363783 - 12 - 1.940255363783 - 12 RAB(3) RAB(4) - 6.208817164108 - 11 6.984919309620 - 11
после четвертого обращения к подпрограмме -
Y1 Y2 9.999971853074 + 00 1.099997185306 + 01 Y3 Y4 1.109718288408 + 02 1.109718569798 + 02 YX(1) YX(2) 9.999971852914 + 00 1.099997185291 + 01 YX(3) YX(4) 1.109718288386 + 02 1.109718569178 + 02 X H 2.814697265622 - 08 - 2.000000000004 - 08
Распечатка контрольного члена погрешности:
RAB(1) RAB(2) 0.000000000000 + 00 0.000000000000 + 00 RAB(3) RAB(4) 1.396983861924 - 10 3.182018796603 - 10
после пятого обращения к подпрограмме -
Y1 Y2 9.999961853100 + 00 1.099996185309 + 01 Y3 Y4 1.109618221549 + 02 1.109618602874 + 02 YX(1) YX(2) 9.999961852940 + 00 1.099996185294 + 01 YX(3) YX(4) 1.109618221460 + 02 1.109618602293 + 02 X H 3.814697265621 - 08 - 2.000000000004 - 08
Распечатка контрольного члена погрешности:
RAB(1) RAB(2) - 1.940255363783 - 12 - 1.940255363783 - 12 RAB(3) RAB(4) - 6.208817164108 - 11 6.984919309620 - 11
после шестого обращения к подпрограмме -
Y1 Y2 9.999923706346 + 00 1.099992370633 + 01 Y3 Y4 1.109236588570 + 02 1.109237350927 + 02 YX(1) YX(2) 9.999923706127 + 00 1.099992370613 + 01 YX(3) YX(4) 1.109236588565 + 02 1.109237350506 + 02 X H 7.629394531243 - 08 3.814697265626 - 08
Распечатка контрольного члена погрешности:
RAB(1) RAB(2) - 1.940255363783 - 12 - 1.940255363783 - 12 RAB(3) RAB(4) 4.020209113755 - 09 3.554547826448 - 09
Пример 3.
Решается задача Коши
y1' = - 10000y1 + 100y2 - 10y3 + y4 y2' = - 1000y2 + 10y3 -10y4 y3' = - y3 + 10y4 y4' = - 0.1y4 x = 0 , y1(0) = 1 , y2(0) = 1 , y3(0) = 1 , y4(0) = 1 Точное решение задачи имеет вид: y1 = (1 - d - f - g) t3 + d t2 + f t1 + g y4 y2 = (1 - a - b) t2 + a t1 + b y4 y3 = (- 9.1 / 0.9) t1 + (10 / 0.9) y4 y4 = e - 0.1 x где t = e - x , t = e - 1000x , t = e - 10000x , a = - 91 / (0.9*999) , b = 91 / (0.9*999.9) , d = (1 - a - b) / 90 , f = [100 a + (91/0.9)] / 9999 , g = [100 b - (100/0.9) + 1] / 9999.9 . Матрица Якоби правой части системы имеет вид: - 10000 100 - 10 1 0 - 1000 10 - 10 0 0 - 1 10 0 0 0 - 0.1
Ниже приводятся фрагмент вызывающей программы для DE90R, подпрограммы F и FJ и результаты счета, полученные после нескольких обращений к подпрограмме DE90R.
DIMENSION YX(4), YP(4), A(4, 4), A1(4, 4), A2(4, 4), RAB(16), * R1(4), R2(4), YD(4) LOGICAL BUL EXTERNAL F, FJ M = 4 X = 0. YX(1) = 1. YX(2) = 1. YX(3) = 1. YX(4) = 1. HMIN = 1.E - 10 EPS = 1.E - 8 P = 1.E3 JSTART = 0 H = 0.01 IH = 0 10 IH = IH + 1 CALL DE90R (F, FJ, M, JSTART, HMIN, EPS, P, YX, X, H, BUL, * XP, YP, A, A1, A2, RAB, R1, R2, YD, IERR) C BЫЧИCЛEHИE TOЧHOГO PEШEHИЯ CИCTEMЫ Y4 = EXP(- 0.1*X) T1 = EXP(- X) Y3 = -(9.1/0.9)*T1 + (10./0.9)*Y4 T2 = EXP(- 1.E3*X) AA = -91./(0.9*999.) BB = 91./(0.9*999.9) C = 1. - AA - BB Y2 = C*T2 + AA*T1 + BB*Y4 T3 = EXP(- 1.E4*X) DD = C/90. FF = (100.*AA + 91./0.9)/9999. GG = (100.*BB - 100./0.9 + 1.)/9999.9 QQ = 1. - DD - FF - GG Y1 = QQ*T3 + DD*T2 + FF*T1 + GG*Y4 GO TO (11, 12, 13, 14, 15, 16), IH 11 H = 1.E - 8 GO TO 10 12 EPS = 1.E - 2 GO TO 10 13 JSTART = - 1 EPS = 1.E - 8 GO TO 10 14 JSTART = - 1 H = - 1.E - 8 GO TO 10 15 H = 0.01 GO TO 10 16 CONTINUE SUBROUTINE F (X, Y, DY, M) DIMENSION Y(4), DY(4) DY(1) = - 1.E4*Y(1) + 1.E2*Y(2) - 10.*Y(3) + Y(4) DY(2) = - 1.E3*Y(2) + 10.*Y(3) - 10.*Y(4) DY(3) = -Y(3) + 10.*Y(4) DY(4) = - 0.1*Y(4) RETURN END SUBROUTINE FJ (X, Y, DF, M) DIMENSION Y(4), DF(4, 4) DF(1, 1) = - 1.E4 DF(1, 2) = 1.E2 DF(1, 3) = - 10. DF(1, 4) = 1. DF(2, 1) = 0. DF(2, 2) = - 1.E3 DF(2, 3) = 10. DF(2, 4) = - 10. DF(3, 1) = 0. DF(3, 2) = 0. DF(3, 3) = - 1. DF(3, 4) = 10. DF(4, 1) = 0. DF(4, 2) = 0. DF(4, 3) = 0. DF(4, 4) = - 0.1 RETURN END Результаты:
после первого обращения к подпрограмме -
Y1 Y2 9.527772901474 - 01 9.951290901317 - 01 Y3 Y4 1.000043945169 + 00 9.999995117187 - 01 YX(1) YX(2) 9.527772877191 - 01 9.951290901299 - 01 YX(3) YX(4) 1.000043945183 + 00 9.999995117150 - 01 X H 4.882812500002 - 06 4.882812500002 - 06
Распечатка контрольного члена погрешности:
RAB(1) RAB(2) 2.270887004367 - 09 - 1.212659602364 - 13 RAB(3) RAB(4) -3.637978807088 - 13 - 1.818989403544 - 13
после второго обращения к подпрограмме -
Y1 Y2 9.526829222541 - 01 9.951191388946 - 01 Y3 Y4 1.000044035131 + 00 9.999995107200 - 01 YX(1) YX(2) 9.526829198239 - 01 9.951191388900 - 01 YX(3) YX(4) 1.000044035176 + 00 9.999995107109 - 01 X H 4.892812499997 - 06 2.000000000004 - 08
Распечатка контрольного члена погрешности:
RAB(1) RAB(2) - 1.818989403544 - 13 - 1.212659602364 - 13 RAB(3) RAB(4) - 2.425319204729 - 13 - 1.212659602364 - 13
после третьего обращения к подпрограмме -
Y1 Y2 9.524942147509 - 01 9.950992367185 - 01 Y3 Y4 1.000044215194 + 00 9.999995087192 - 01 YX(1) YX(2) 9.524942123180 - 01 9.950992367112 - 01 YX(3) YX(4) 1.000044215169 + 00 9.999995087064 - 01 X H 4.912812499994 - 06 4.000000000008 - 08
Распечатка контрольного члена погрешности:
RAB(1) RAB(2) - 1.212659602364 - 13 - 1.212659602364 - 13 RAB(3) RAB(4) - 1.212659602364 - 13 - 1.818989403544 - 13
после четвертого обращения к подпрограмме -
Y1 Y2 9.523055449436 - 01 9.950793349426 - 01 Y3 Y4 1.000044395201 + 00 9.999995067164 - 01 YX(1) YX(2) 9.523055425125 - 01 9.950793349353 - 01 YX(3) YX(4) 1.000044395165 + 00 9.999995067074 - 01 X H 4.932812499997 - 06 8.000000000017 - 08
Распечатка контрольного члена погрешности:
RAB(1) RAB(2) - 6.063298011824 - 14 - 6.063298011824 - 14 RAB(3) RAB(4) - 3.637978807088 - 13 - 6.063298011824 - 14
после пятого обращения подпрограмме -
Y1 Y2 9.527772901474 - 01 9.951290901317 - 01 Y3 Y4 1.000043945169 + 00 9.999995117187 - 01 YX(1) YX(2) 9.527772877100 - 01 9.951290901245 - 01 YX(3) YX(4) 1.000043945169 + 00 9.999995117078 - 01 X H 4.882812499996 - 06 - 2.000000000004 - 08
Распечатка контрольного члена погрешности:
RAB(1) RAB(2) - 1.818989403544 - 13 - 6.063298011824 - 14 RAB(3) RAB(4) - 2.425319204729 - 13 - 1.212659602364 - 13
после шестого обращения к подпрограмме -
Y1 Y2 9.078026703492 - 01 9.902819081972 - 01 Y3 Y4 1.000087890148 + 00 9.999990234382 - 01 YX(1) YX(2) 9.078026657144 - 01 9.902819081881 - 01 YX(3) YX(4) 1.000087890114 + 00 9.999990234237 - 01 X H 9.765624999991 - 06 4.882812500002 - 06
Распечатка контрольного члена погрешности:
RAB(1) RAB(2) 2.162717767836 - 09 0.000000000000 + 00 RAB(3) RAB(4) - 3.637978807088 - 13 - 6.063298011824 - 14
Пример 4.
Решается задача Коши из примера 3. Приводятся фрагмент вызывающей
программы для DE92R, подпрограмма F и результаты счета, полученные
после нескольких обращений к подпрограмме DE92R.
DIMENSION YX(4), YP(4), A(4, 4), A1(4, 4), A2(4, 4), RAB(16), * R1(4), R2(4), YD(4) LOGICAL BUL EXTERNAL F M = 4 X = 0. YX(1) = 1. YX(2) = 1. YX(3) = 1. YX(4) = 1. HMIN = 1.E - 10 EPS = 1.E - 8 P = 1.E3 JSTART = 0 H = 0.01 IH = 0 10 IH = IH + 1 CALL DE92R (F, M, JSTART, HMIN, EPS, P, YX, X, H, BUL, * XP, YP, A, A1, A2, RAB, R1, R2, YD, IERR) C BЫЧИCЛEHИE TOЧHOГO PEШEHИЯ CИCTEMЫ: Y4 = EXP(- 0.1*X) T1 = EXP(- X) Y3 = -(9.1/0.9)*T1 + (10./0.9)*Y4 T2 = EXP(- 1.E3*X) AA = - 91./(0.9*999.9) BB = 91./(0.9*999.9) C = 1. - AA - BB Y2 = C*T2 + AA*T1 + BB*Y4 T3 = EXP(- 1.E4*X) DD = C/90. FF = (100.*AA + 91./0.9)/9999. GG = (100.*BB - 100./0.9 + 1.)/9999.9 QQ = 1. - DD - FF - GG Y1 = QQ*T3 + DD*T2 + FF*T1 + GG*Y4 GO TO (11, 12, 13, 14, 15, 16), IH 11 H = 1.E - 8 GO TO 100 12 EPS = 1.E - 2 GO TO 100 13 JSTART = - 1 EPS = 1.E - 8 GO TO 100 14 JSTART = - 1 H = - 1.E - 8 GO TO 100 15 H = 0.01 GO TO 100 16 CONTINUE SUBROUTINE F (X, Y, DY, M) DIMENSION Y(4), DY(4) DY(1) = - 1.E4*Y(1) + 1.E2*Y(2) - 10.*Y(3) + Y(4) DY(2) = - 1.E3*Y(2) + 10.*Y(3) - 10.*Y(4) DY(3) = -Y(3) + 10.*Y(4) DY(4) = - 0.1*Y(4) RETURN END Результаты:
после первого обращения к подпрограмме -
Y1 Y2 9.527772901474 - 01 9.951298901317 - 01 Y3 Y4 1.000043945169 + 00 9.999995117187 - 01 YX(1) YX(2) 9.527772906931 - 01 9.951290903537 - 01 YX(3) YX(4) 1.000043945183 + 00 9.999995117150 - 01 X H 4.882812500002 - 06 4.882812500002 - 06
Распечатка контрольного члена погрешности:
RAB(1) RAB(2) - 7.571846557159 - 10 - 1.412748436753 - 11 RAB(3) RAB(4) - 3.637978807088 - 13 - 1.818989403544 - 13
после второго обращения к подпрограмме -
Y1 Y2 9.526829222541 - 01 9.951191388946 - 01 Y3 Y4 1.000044035231 + 00 9.999995107200 - 01 YX(1) YX(2) 9.526829227989 - 01 9.951191391137 - 01 YX(3) YX(4) 1.000044035176 + 00 9.999995107109 - 01 X H 4.892812499997 - 06 2.000000000004 - 08
Распечатка контрольного члена погрешности:
RAB(1) RAB(2) - 1.212259602364 - 13 - 1.212659602364 - 13 RAB(3) RAB(4) - 2.425319204729 - 13 - 1.212659602364 - 13
после третьего обращения к подпрограмме -
Y1 Y2 9.524942147509 - 01 9.950992367185 - 01 Y3 Y4 1.000044215194 + 00 9.999995087192 - 01 YX(1) YX(2) 9.524942152921 - 01 9.950992369349 - 01 YX(3) YX(4) 1.000044215169 + 00 9.999995087064 - 01 X H 4.912812499994 - 06 4.000000000008 - 08
Распечатка контрольного члена погрешности:
RAB(1) RAB(2) - 1.212659602364 - 13 - 1.212659602364 - 13 RAB(3) RAB(4) - 1.212659602364 - 13 - 1.818989403544 - 13
после четвертого обращения к подпрограмме -
Y1 Y2 9.523055449436 - 01 9.950793349426 - 01 Y3 Y4 1.000044395201 + 01 9.999995067164 - 01 YX(1) YX(2) 9.523055454865 - 01 9.950793351591 - 01 YX(3) YX(4) 1.000044395165 + 00 9.999995067074 - 01 X H 4.932812499997 - 06 8.000000000017 - 08
Распечатка контрольного члена погрешности:
RAB(1) RAB(2) - 6.063298011814 - 13 0.000000000000 + 00 RAB(3) RAB(4) - 3.637978807088 - 13 - 6.063298011824 - 14
после пятого обращения к подпрограмме -
Y1 Y2 9.527772901474 - 01 9.951290901317 - 01 Y3 Y4 1.000043945169 + 00 9.999995117187 - 01 YX(1) YX(2) 9.527772906868 - 01 9.951290903482 - 01 YX(3) YX(4) 1.000043945169 + 00 9.999995117078 - 01 X H 4.882812499996 - 06 - 2.000000000004 - 08
Распечатка контрольного члена погрешности:
RAB(1) RAB(2) - 1.212659602364 - 13 - 6.063298011824 - 14 RAB(3) RAB(4) - 2.425319204729 - 13 - 1.212659602364 - 13
после шестого обращения к подпрограмме -
Y1 Y2 9.078026703492 - 01 9.902819081972 - 01 Y3 Y4 1.000087890148 + 00 9.999990234382 - 01 YX(1) YX(2) 9.078026512007 - 01 9.902819086356 - 01 YX(3) YX(4) 1.000087890114 + 00 9.999990234237 - 01 X H 9.765624999991 - 06 4.882812500002 - 06
Распечатка контрольного члена погрешности:
RAB(1) RAB(2) 3.313774262397 - 09 - 1.552204291027 - 11 RAB(3) RAB(4) - 3.637978807088 - 13 - 6.063298011824 - 14