Текст подпрограммы и версий de47r_p.zip , de47e_p.zip |
Тексты тестовых примеров tde47r_p.zip , tde47e_p.zip |
Вычисление решения задачи Коши для системы обыкновенных дифференциальных уравнений второго порядка с правой частью, зависящей от производной, в конце интервала интегрирования методом Штермера с контролем точности.
Решается задача Коши для системы M обыкновенных дифференциальных уравнений второго порядка
Y '' = F ( X, Y, Y ' ) , Y = ( y1, ..., yM ) , F = ( f1 ( X, y1, ..., yM, y1', ..., yM' ), ..., fM ( X, y1, ..., yM, y '1, ..., y 'M ) ) ,
с начальными условиями, заданными в точке XN:
Y (XN) = YN , YN = ( y10, ..., yM0 ) , Y ' (XN) = DYN , DYN = ( y10', ..., yM0' ) , -
многозначным предсказывающе - исправляющим методом. При этом приближенное значение решения Y вычисляется методом Штермера пятого порядка точности, производной - методом Адамса пятого порядка точности.
Суть метода состоит в том, что сначала по явным формулам строятся предсказанные значения решения и производной, которые затем исправляются по неявным формулам.
Решение и производная вычисляются в одной точке XK, которая является концом интервала интегрирования.
Bсе компоненты решения проверяются на точность по меpе погрешности, т.е. если некоторая компонента приближенного решения по абсолютной величине не меньше некоторой заданной константы P, то контроль точности для этой компоненты ведется по относительной погрешности, иначе - по абсолютной.
Бахвалов H.C., Численные методы, т.1, "Hаука", 1975.
procedure DE47R(F :Proc_F2_DE; M :Integer; XN :Real; var YN :Array of Real; var DYN :Array of Real; XK :Real; HMIN :Real; HMAX :Real; EPS :Real; P :Real; var H :Real; var Y :Array of Real; var DY :Array of Real; var Z :Array of Real; var DELTY :Array of Real; var DF :Array of Real; var RFN :Array of Real; var RF :Array of Real; var YP :Array of Real; var DYP :Array of Real; var ZP :Array of Real; var IERR :Integer);
Параметры
F - | имя подпрограммы вычисления значений правой части системы. Первый оператор подпрограммы должен иметь вид: |
procedure F (X :Real; var Y :Array of Real; var DY :Array of Real; var D2Y :Array of Real; M :Integer); Здесь: X, Y, DY - значения независимой, зависимой переменных и производной решения, соответственно; вычисленное значение правой части должно быть помещено в D2Y. B случае системы уравнений, т.е. когда M ≠ 1 - параметры Y, DY, D2Y представляют одномерные массивы длины M (тип параметров X, Y, DY и D2Y: вещественный); |
M - | количество уравнений в системе (тип: целый); |
XN, YN - DYN | начальные значения аргумента, решения и его производной; в случае системы уpавнений (т.е. M ≠ 1) YN и DYN представляют одномерные массивы длины M (тип: вещественный); |
XK - | значение аргумента, при котоpом требуется вычислить решение задачи Коши (конец интервала интегрирования); XK может быть больше, меньше или pавно XN (тип: вещественный); |
HMIN - | минимальное значение абсолютной величины шага, котоpое разрешается использовать при интегрировании данной системы уравнений (тип: вещественный); |
HMAX - | максимальное значение абсолютной величины шага, котоpое разрешается использовать при интегрировании данной системы уравнений (тип: вещественный); |
EPS - | допустимая меpа погрешности, с которой требуется вычислить все компоненты решения (тип: вещественный); |
P - | граница перехода, используемая при оценке меры погрешности решения (тип: вещественный); |
H - | вещественная переменная, содержащая начальное значение шага интегрирования; может задаваться с учетом направления интегрирования, т.е. положительным, если XN < XK, отрицательным, если XN > XK, или без такого учета в виде абсолютной величины; |
Y, DY - | искомое решение задачи Коши и его производная, вычисленные подпрограммой для значения аргумента XK; для системы уравнений задаютсся одномерными массивами длины M; в случае совпадения значений параметров XN и XK значения Y и DY полагаются равными начальным значениям YN и DYN, соответственно (тип: вещественный); |
Z - DELTY RFN, RF YP, DYP ZP | одномерные вещественные рабочие массивы длины M; |
DF - | двумерный вещественный рабочий массив размеpа M * 5; |
IERR - | целая переменная, служащая для сообщения об ошибках, обнаруженных в процессе работы подпрограммы; при этом: |
IERR=65 | и IERR=66 - когда какая - нибудь компонента решения не может быть вычислена с требуемой точностью EPS при заданных начальном шаге H и его минимальном значении HMIN; при этом IERR = 66 указывает, что требуемая точность не может быть достигнута при разгоне, а IERR=65 - после разгона; при желании интегрирование системы можно повторить обращением к подпрограмме с новыми значениями параметров H и HMIN. |
Версии
DE47E - | вычисление решения задачи Коши для системы обыкновенных дифференциальных уравнений второго порядка с правой частью, зависящей от производной, методом Штермера с удвоенным числом значащих цифр. При этом параметры XN, YN, DYN, XK, HMIN, HMAX, EPS, P, H, Y, DY, Z, DELTY, DF, RFN, RF, YP, DYP, ZP и параметры X, Y, DY и D2Y в подпрограмме F должны иметь тип Extended. |
Вызываемые подпрограммы
DE46R - DE46E | выполнение одного шага численного интегрирования системы обыкновенных дифференциальных уравнений второго порядка с правой частью, зависящей от производной, методом Штермера с контролем точности. |
UTDE16 - UTDE17 | подпрограммы выдачи диагностических сообщений. |
Подпрограммы DE46R и UTDE16 вызываются при работе подпрограммы DE47R, а подпрограммы DE46E и UTDE17 - при работе подпрограммы DE47E. |
Замечания по использованию
B общем случае заданная точность решения не гарантируется. Приближенное значение производной на точность не проверяется. При работе подпрограммы и ее версии значения параметров M, XN, YN, DYN, XK, HMIN, HMAX, EPS, P сохраняются. Значение параметра HMAX не должно быть слишком большим, т.к. в противном случае величина шага интегрирования может достичь таких размеров, которые приведут к абсолютной неустойчивости численного метода. Если после работы подпрограммы нет необходимости иметь начальные значения решения YN и/или производной DYN, то параметры YN и Y, а в случае производной, параметры DYN и DY при обращении к ней можно совместить. При этом следует иметь в виду, что в случае аварийного выхода из подпрограммы, т.е. со значением IERR = 65 или 66, значения параметров YN и DYN будут испорчены. Tак как при интегрировании уравнений с помощью подпрограмм DE47R и DE47E используются глобальные записи (структуры данных) с именами _COM48R и _COM48D, соответственно, то пользователю не рекомендуется использовать для своих целей глобальные записи (структуры данных) с указанными именами. |
y1'' = 0.5 ( y2 - y1 + y1' + y2' ) - 0.5 , y1 (0) = 1 , y1' (0) = 1.5 , y2 = y1'' - 0.5 x , y2 (0) = - 1 , y2 (0) = - 0.5 .Unit TDE47R_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc, UtRes_p, FDE47R_p, DE47R_p; function TDE47R: String; implementation function TDE47R: String; var M,_i,IERR :Integer; XN,XK,HMIN,HMAX,EPS,P,H,Y1,Y2,DY1,DY2 :Real; YN :Array [0..1] of Real; DYN :Array [0..1] of Real; Y :Array [0..1] of Real; DY :Array [0..1] of Real; DELTY :Array [0..1] of Real; DF :Array [0..9] of Real; RFN :Array [0..1] of Real; RF :Array [0..1] of Real; YP :Array [0..1] of Real; DYP :Array [0..1] of Real; Z :Array [0..1] of Real; ZP :Array [0..1] of Real; begin Result := ''; { результат функции } M := 2; XN := 0.0; YN[0] := 1.0; YN[1] := -1.0; DYN[0] := 1.5; DYN[1] := -0.5; ХК := 5.0; HMIN := 1.E-10; НМАХ := 0.1; EPS := 0.0001; P := 100.0; H := 0.01; DE47R(FDE47R,M,XN,YN,DYN,XK,HMIN,HMAX,EPS,P,H, Y,DY,Z,DELTY,DF,RFN,RF,YP,DYP,ZP,IERR); Result := Result + Format('%s',[' IERR=']); Result := Result + Format('%3d ',[IERR]) + #$0D#$0A; Result := Result + Format('%20.16f',[XK]) + #$0D#$0A; Result := Result + #$0D#$0A; for _i:=0 to 1 do begin Result := Result + Format('%20.16f ',[Y[_i]]); if ( ((_i+1) mod 1)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; Result := Result + #$0D#$0A; for _i:=0 to 1 do begin Result := Result + Format('%20.16f ',[DY[_i]]); if ( ((_i+1) mod 1)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; Y1 := Sin(XK)+Cos(XK)+0.5*XK; Y2 := -Y1+XK; DY1 := Cos(XK)-Sin(XK)+0.5; DY2 := -DY1+1.0; Result := Result + Format('%20.16f %20.16f %20.16f %20.16f %20.16f ', [XK,Y1,Y2,DY1,DY2]) + #$0D#$0A; UtRes('TDE47R',Result); { вывод результатов в файл TDE47R.res } exit; end; end. Unit FDE47R_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc; procedure FDE47R(X :Real; var Y :Array of Real; var DY :Array of Real; var Z :Array of Real; M :Integer); implementation procedure FDE47R(X :Real; var Y :Array of Real; var DY :Array of Real; var Z :Array of Real; M :Integer); begin Z[0] := 0.5*(Y[1]+DY[0]-Y[0]+DY[1])-0.5; Z[1] := Y[0]-0.5*X; end; end. Результаты: IERR = 0 XK Y(1) Y(2) 5.000000000000 + 00 1.824737966524 + 00 3.175262014483 + 00 Y1 Y2 1.824737910809 + 00 3.175262089189 + 00 DY(1) DY(2) 1.742586640374 + 00 - 7.425866599151 - 01 DY1 DY2 1.742586460128 + 00 - 7.425864601282 - 01