Текст подпрограммы и версий de28r_p.zip , de28e_p.zip |
Тексты тестовых примеров tde28r_p.zip , tde28e_p.zip |
Выполнение одного шага численного интегрирования системы обыкновенных дифференциальных уравнений первого порядка методом Адамса с контролем точности.
Выполняется один шаг численного интегрирования системы М обыкновенных дифференциальных уравнений первого порядка
Y ' = F (X, Y) , Y = ( y1, ..., yM ) , F = ( f1 (X, y1,..., yM), ... , fM (X, y1,..., yM) )
многошаговым предсказывающе - исправляющим методом пятого порядка точности. Суть метода состоит в том, что сначала по явной формуле Адамса строятся предсказанные значения приближенного решения, которые затем исправляются по неявной формуле Адамса.
По заданному значению YX решения в узле Xn вычисляется значение этого решения в узле Xn + H. Все компоненты решения вычисляются с контролем точности по меpе погрешности, который заключается в следующем. Если некоторая компонента приближенного решения по абсолютной величине не меньше некоторой заданной константы P (называемой границей перехода), то контроль точности для этой компоненты ведется по относительной погрешности, иначе - по абсолютной. Значение H может быть меньше или pавно значению шага интегрирования, задаваемому пользователем при обращении к подпрограмме.
Березин И.С., Жидков Н.П. Методы вычислений, т.2, Физматгиз, М., 1960.
Беленький В.З. Стандартная программа для интегрирования системы дифференциальных уравнений методом Адамса. Сб. "Вычислительные методы и программирование", вып. 3, Изд-во МГУ, 1965.
procedure DE28R(F :Proc_F_DE; M :Integer; var JSTART :Integer; HMIN :Real; HMAX :Real; EPS :Real; P :Real; var YX :Array of Real; var X :Real; var H :Real; var BUL :Boolean; var DELTY :Array of Real; var DF :Array of Real; var RF :Array of Real; var YP :Array of Real; var RY :Array of Real; var RFN :Array of Real; var IERR :Integer);
Параметры
F - |
имя подпрограммы вычисления значений правой
части дифференциального уравнения. Первый
оператоp подпрограммы должен иметь вид: procedure F (X :Real; var Y :Array of Real; var DY :Array of Real; M :Integer); Здесь: X, Y - значения независимой и зависимой переменных, соответственно. Вычисленное значение правой части должно быть помещено в DY. B случае системы уравнений, т.е. когда M ≠ 1, параметры Y и DY представляют массивы длины M (тип параметров X, Y и DY: вещественный); имя подпрограммы вычисления значений правой части системы. |
M - | количество уравнений в системе (тип: целый); |
JSTART - | целый указатель режима использования подпрограммы, имеющий следующие значения: |
0 - | первое обращение к подпрограмме должно быть выполнено с нулевым значением JSTART; |
+ 1 - | выполнить один шаг интегрирования системы дифференциальных уравнений для значений независимой и зависимой переменных и шага интегрирования, заданных параметрами X, YX и H, соответственно; |
- 1 - | повторить последний шаг интегрирования с новыми значениями параметров H и/или HMIN; |
на выходе из подпрограммы JSTART полагается равным + 1; |
HMIN - | минимальное значение абсолютной величины шага, котоpое разрешается использовать при интегрировании данной системы уравнений (тип: вещественный); |
HMAX - | максимальное значение абсолютной величины шага, котоpое разрешается использовать при интегрировании данной системы уравнений (тип: вещественный); |
EPS - | допустимая меpа погрешности, с которой тpебуется вычислить все компоненты решения (тип: вещественный); |
P - | граница перехода, используемая при оценке меры погрешности решения (тип: вещественный); |
X, YX - | заданные вещественные значения аргумента и решения уравнения в нем; в результате работы подпрограммы в X получается новое значение аргумента, а в YX - соответствующее значение решения; в случае системы уpавнений, т.е. когда M ≠ 1, YX задается одномерным массивом длины M; |
H - | вещественная переменная, содержащая значение шага интегрирования; если для этого значения шага точность приближенного решения достигается, то именно он и реализуется подпрограммой, иначе этот шаг уменьшается подпрограммой до тех пор, пока не будет достигнута заданная точность EPS; на выходе из подпрограммы H содержит рекомендуемое подпрограммой значение следущего шага интегрирования, определяемое ею с целью достижения более экономного способа интегрирования; |
BUL - | логическая переменная, значение которой при обращении к подпрограмме полагается равным TRUE, если заданный в H шаг выводит в конец интервала интегрирования, и FALSE в противном случае; в результате работы подпрограммы BUL pавно FALSE, если вместо исходного шага интегрирования был реализован меньший шаг; в противном случае, т.е. когда был выполнен именно заданный при обращении в H шаг, значение параметра BUL не меняется; |
DF - | двумерный вещественный рабочий массив размеpа M*5, в котоpом запоминаются значения правой части системы и ее разностей до четвертого порядка включительно (так называемый "фронт Адамса"); |
DELTY - RF, YP RFN | одномерные вещественные рабочие массивы длины M; |
RY - | двумерный вещественный рабочий массив размера M*5; |
IERR - | целая переменная, служащая для сообщения об ошибках, обнаруженных в процессе работы подпрограммы; при этом: |
IERR=65 - | когда интегрирование системы выполнено с заданным в HMIN минимальным шагом, но требуемая точность полученного при этом значения YX решения не достигнута; в этом случае последний шаг интегрирования системы можно повторить обращением к подпрограмме с новыми значениями параметров H и HMIN и со значением JSTART = - 1; |
IERR=66 - | когда решение не может быть вычислено с требуемой точностью EPS при первом обращении к подпрограмме (т.е. со значением JSTART = 0); в этом случае интегрирование системы можно начать сначала обращением к подпрограмме с новыми значениями параметров H и HMIN и со значением JSTART = 0 . |
Версии
DE28E - | выполнение одного шага численного интегрирования системы обыкновенных дифференциальных уpавнений первого порядка методом Адамса с расширенной (Extended) точностью. При этом параметры HMIN, HMAX, EPS, P, YX, X, H, DELTY, DF, RF, YP, RY, RFN и параметры X, Y и DY в подпрограмме F должны иметь тип Extended. |
Вызываемые подпрограммы
DE32R - | построение начальных значений при интегрировании системы обыкновенных дифференциальных уравнений первого порядка методом Адамса с контролем точности. |
DE32E - | построение начальных значений с расширенной (Extended) точностью при интегрировании системы обыкновенных дифференциальных уравнений первого порядка методом Адамса с контролем точности. |
UTDE12 - UTDE13 | подпрограммы выдачи диагностических сообщений. |
Подпрограммы DE32R и UTDE12 вызываются при работе подпрограммы DE28R, а подпрограммы DE32E и UTDE13 - при работе подпрограммы DE28E. Kpоме того, DE28R и DE28E используют рабочие подпрограммы DE28RP, DE28RS и DE28EP, DE28ES, соответственно. |
Замечания по использованию
B общем случае заданая точность не гарантируется. При работе подпрограммы и ее версии значения параметров M, HMIN, HMAX, EPS, P сохраняются. При многократном использовании подпрограммы или ее веpсии для вычисления решения системы уравнений на отрезке значения параметров M, YX, X и значения рабочих массивов, задаваемых параметрами DF, YP, не должны изменяться в вызывающей программе между последовательными обращениями к подпрограмме. |
y1' = y2 y2' = -y1 y1 (3/4 π) = √2 /2 , y2 (3/4 π) = -√2 /2
Приводятся подпрограмма вычисления значений правой части и фрагмент вызывающей программы, выполняющей несколько шагов из одной и той же точки, а также результаты счета.
Unit TDE28R_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc, UtRes_p, FDE28R_p, DE28R_p; function TDE28R: String; implementation function TDE28R: String; var M,JSTART,IH,IERR :Integer; XN,H,P,HMAX,HMIN,X,EPS,Y1,Y2 :Real; BUL :Boolean; RFN :Array [0..1] of Real; YN :Array [0..1] of Real; Y :Array [0..1] of Real; DELTY :Array [0..1] of Real; DF :Array [0..9] of Real; RF :Array [0..1] of Real; YP :Array [0..1] of Real; RY :Array [0..9] of Real; label _6,_7,_20; begin Result := ''; { результат функции } M := 2; X := 0.75e0*3.14159265358979323846264e0; H := 0.01e0; Y[0] := Sqrt(2.e0)/2.e0; Y[1] := -Y[0]; HMIN := 1.e-18; JSTART := 0; EPS := 1.e-8; P := 100.e0; BUL := False; IH := 0; НМАХ := 1.e0; _6: DE28R(FDE28R,M,JSTART,HMIN,HMAX,EPS,P,Y,X,H,BUL,DELTY, DF,RF,YP,RY,RFN,IERR); IH := IH+1; if ( IH = 1 ) then goto _6; Y1 := Sin(X); Y2 := Cos(X); Result := Result + Format(' %20.16f %20.16f %20.16f %20.16f %20.16f %20.16f ', [X,Y[0],Y[1],H,Y1,Y2]) + #$0D#$0A; if ( IH = 4 ) then goto _20; JSTART := -1; if ( IH = 3 ) then goto _7; H := 0.005e0; goto _6; _7: H := 0.02e0; goto _6; _20: UtRes('TDE28R',Result); { вывод результатов в файл TDE28R.res } exit; end; end. Unit fde28r_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc; procedure fde28r(X :Real; var Y :Array of Real; var DY :Array of Real; M :Integer); implementation procedure fde28r(X :Real; var Y :Array of Real; var DY :Array of Real; M :Integer); begin DY[0] := Y[1]; DY[1] := -Y[0]; end; end. Результаты: после второго обращения к подпрограмме - X Y(1) Y(2) 2.376194490+00 6.928241717-01 -7.211065574-01 H Y1 Y2 1.000000000-02 6.928241717-01 -7.211065574-01 после третьего обращения к подпрограмме - X Y(1) Y(2) 2.371194490+00 6.964210292-01 -7.176334371-01 H Y1 Y2 5.000000000-03 6.964210292-01 -7.176334371-01 после четвертого обращения к подпрограмме - X Y(1) Y(2) 2.386194490+00 6.855785854-01 -7.279986286-01 H Y1 Y2 2.000000000-02 6.855785854-01 -7.279986286-01