|
Текст подпрограммы и версий de54r_p.zip , de54e_p.zip , de56r_p.zip , de56e_p.zip |
Тексты тестовых примеров tde54r_p.zip , tde54e_p.zip , tde56r_p.zip , tde56e_p.zip |
Вычисление решения двухточечной краевой задачи для линейного дифференциального уравнения второго порядка на равномерной сетке методом прогонки A.A.Абрамова с контролем точности.
Решается двухточечная краевая задача для линейного дифференциального уравнения второго порядка
(1) y '' + f(x) y ' + g(x) y = r(x)
c заданными на концах xN и xК отрезка интегрирования граничными условиями вида:
(2) aN y '(xN) + bN y(xN) = cN , a2N + b2N ≠ 0 (3) aK y '(xK) + bK y(xK) = cK , a2K + b2K ≠ 0
- методом прогонки А.А.Абрамова. Решение вычисляется на заданной на отрезке интегрирования равномерной сетке с заданной мерой погрешности EPS. Контроль точности по меpе погрешности заключается в следующем: если численное решение по абсолютной величине не меньше некоторой заданной константы P, то контроль точности ведется по относительной погрешности, иначе - по абсолютной.
А.А.Абрамов. Вариант метода прогонки. Ж. вычисл. матем. и матем. физ., 1961, 1, N 2, 349 - 351.
procedure DE54R(FF :Func_F_DE; FG :Func_F_DE; FR :Func_F_DE; XN :Real;
XK :Real; var CN :Array of Real;
var CK :Array of Real; NX :Integer; X0 :Real;
HX :Real; BULDY :Boolean; HMIN :Real;
EPS :Real; P :Real; var H :Real;
var Y :Array of Real; var DY :Array of Real;
var NX1 :Integer; var IERR :Integer);
Параметры
|
FF, FG - FR | имена вещественных подпрограмм - функций вычисления значений коэффициентов уравнения (1) f (x), g (x) и r (x), соответственно. Эти подпрограммы - функции должны иметь по одному паpаметpу, представляющему вещественное значение независимой переменной x; |
| XN, XK - | концы отрезка интегрирования, в которых заданы граничные условия (2) и (3), соответственно; XK > XN или XK < XN (тип: вещественный); |
| CN, CK - |
одномерные вещественные массивы длины 3, в
которых помещаются коэффициенты граничных
условий (2) и (3), т.е. CN (1) = aN , CN (2) = bN , CN (3) = cN , CK (1) = aK , CK (2) = bK , CK (3) = cK ; коэффициенты граничных условий должны удовлетворять неpавенствам: a2N + b2N ≠ 0 и a2K + b2K ≠ 0 ; |
| NX - | число узлов равномерной сетки на отрезке интегрирования, в которых требуется вычислить решение задачи; NX ≥ 1 (тип: целый); |
| XO - | начальный узел равномерной сетки; XO должен находиться между XN и XK или совпадать с каким-нибудь концом (тип: вещественный); |
| HX - | шаг равномерной сетки; HX > 0, если XK > XN и HX < 0, если XK < XN (тип: вещественный); |
| BULDY - | логическая переменная или константа, принимающая при входе в подпрограмму значение TRUE, если вместе с решением задачи требуется вычислить и его производную, и FALSE - в противном случае, т.е. когда необходимо иметь только решение задачи; |
| HMIN - | минимальное значение абсолютной величины шага интегрирования, котоpое разрешается использовать при численном решении воспомагательных задач Коши, к которым сводится данная краевая задача (тип: вещественный); |
| EPS - | допустимая меpа погрешности, с которой тpебуется вычислить решение краевой задачи (тип: вещественный); |
| P - | граница перехода, используемая при оценке меры погрешности решения (тип: вещественный); |
| H - | вещественная переменная, содержащая начальное значение шага интегрирования, используемое при численном решении воспомагательных задач Коши; |
| NX1 - | целая переменная, указывающая на выходе из подпрограммы число узлов сетки, в которых вычислено решение данной краевой задачи; NX1 ≤ NX; |
| Y, DY - | одномерные вещественные массивы длины не более NX1, в которых запоминаются значения pешения и его производной, вычисленные в NX1 узлах сетки, при этом элементы Y (I) и DY (I) содержат значения решения и производной в узле XO + (I - 1) * H, причем производная вычисляется только тогда, когда BULDY=TRUE (таким образом, предполагается, что узлы сетки занумерованы в направлении от XN до XK); |
| IERR - | целая переменная, служащая для сообщения об ошибках, обнаруженных в процессе работы подпрограммы; при этом: |
| IERR=1 - | когда последний узел сетки XO + (N - 1) * H выходит за конец XK интервала интегрирования, а предпоследний узел XO + (N - 2) * H является внутренним узлом, т.е. лежит внутри интервала интегрирования; |
| IERR=3 - | когда несколько узлов сетки (больше одного) выходят за конец XK интервала интегрирования, а самый последний узел, принадлежащий отрезку интегрирования, является внутренним узлом; |
| IERR=2 - | когда один из узлов сетки совпадает с концом XK интервала интегрирования, а все последующие узлы не попадают в интервал интегрирования; |
| во всех указанных выше случаях решение и его производная вычисляются только в тех узлах сетки, которые принадлежат отрезку интегрирования, а в случае IERR = 1 и IERR = 3 они вычисляются также в конце XK отрезка и запоминаются в Y (NX1) и DY (NX1), соответственно; |
| IERR=65 - | когда в граничном условии (2) на конце XN коэффициенты aN = bN = 0; |
| IERR=66 - | когда в граничном условии (3) на конце XK коэффициенты aK = bK = 0; |
| IERR=67 - | когда начальный узел XO сетки не принадлежит отрезку интегрирования; |
| IERR=68 и | IERR=70 - когда решение краевой задачи не может быть вычислено с требуемой точностью EPS при заданном минимальном значении HMIN шага интегрирования, при этом IERR = 68 указывает, что точность не достигается при прямой прогонке Абрамова, а IERR=70 - при обратной прогонке; |
| при IERR = 65, 66, 67, 68, 70 интегрирование уравнения прекращается; в случае IERR = 68 и IERR = 70 интегрирование можно повторить обращением к подпрограмме с новыми значениями H и HMIN; |
| IERR=69 - | когда данная краевая задача не может быть решена методом прогонки А.А.Абрамова. |
Версии
| DE54E - | вычисление решения двухточечной краевой задачи для линейного дифференциального уравнения второго порядка на равномерной сетке методом прогонки А.А.Абрамова с расширенной (Extended) точностью. При этом параметры FF, FG, FR, XN, XK, CN, CK, XO, HX, HMIN, EPS, P, H, Y, DY и формальный параметp в подпрограммах - функциях FF, FG и FR должны иметь тип Extended. |
| DE56R - | вычисление решения двухточечной краевой задачи для линейного дифференциального уравнения второго порядка на неравномерной сетке методом прогонки А.А.Абрамова с контролем точности. Первый оператор подпрограммы имеет вид: |
procedure DE56R(FF :Func_F_DE; FG :Func_F_DE; FR :Func_F_DE; XN :Real;
XK :Real; var CN :Array of Real;
var CK :Array of Real; NX :Integer;
var X :Array of Real; BULDY :Boolean; HMIN :Real;
EPS :Real; P :Real; var H :Real;
var Y :Array of Real; var DY :Array of Real;
var NX1 :Integer; var IERR :Integer);
Здесь: X - одномерный вещественный массив длины NX, представляющий узлы неравномерной сетки, в которых требуется вычислить решение задачи, при этом узлы сетки располагаются в X в направлении от XN до XK. Остальные параметры подпрограммы DE56R имеют тот же смысл, что и одноименные параметры подпрограммы DE54R. При этом выход из подпрограммы DE56R со значением IERR = 67 указывает на то, что не принадлежит интервалу интегрирования. |
| DE56E - | вычисление решения двухточечной краевой задачи для линейного дифференциального уравнения второго порядка на неравномерной сетке методом прогонки А.А.Абрамова с расширенной (Extended) точностью. Первый оператор подпрограммы имеет тот же вид, что и в подпрограмме DE56R; при этом параметры FF, FG, FR, XN, XK, CN, CK, X, HMIN, EPS, P, H, Y, DY и формальный параметр в подпрограммах - функциях FF, FG, FR должны иметь тип Extended. |
Вызываемые подпрограммы
| UTDE12 - | подпрограмма выдачи диагностических сообщений при работе подпрограмм DE54R и DE56R. |
| UTDE13 - | подпрограмма выдачи диагностических сообщений при работе подпрограмм DE54E и DE56E. |
| Kpоме того, подпрограммы DE54R, DE56R и подпрограммы DE54E, DE56E используют рабочие подпрограммы DE54RU и DE54EU, соответственно. |
Замечания по использованию
|
B общем случае заданная точность приближенного решения не гарантируется. Значения параметров XN, XK, CN, CK, NX, XO, HX, BULDY, HMIN, EPS, P, X сохраняются. |
y '' + x2 y ' + xy = 10e- x*x (2x2 - 1) (2 - X) , - 1≤ x≤ 1
y ' - 2y = 0 при x = - 1 ,
y ' + 2y = 0 при x = 1
( точное решение задачи y (x) = 10e- x*x )
Unit TDE54R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, FDE54R_p, FGDE54R_p, FRDE54R_p, DE54R_p;
function TDE54R: String;
implementation
function TDE54R: String;
var
NX,I,NX1,IERR :Integer;
XN,XK,X0,HX,P,HMIN,EPS,H :Real;
BULDY :Boolean;
Y :Array [0..10] of Real;
DY :Array [0..10] of Real;
const
CN :Array [0..2] of Real = ( +1.0,-2.0,0.0 );
СК :Array [0..2] of Real = ( 1.0,2.0,0.0 );
begin
Result := ''; { результат функции }
XN := -1.0;
ХК := 1.0;
NX := 11;
X0 := XN;
НХ := 0.01;
P := 11.0;
НХ := 2.0/199.0;
X0 := 1.0-10.0*HX;
BULDY := True;
HMIN := 1.E-10;
EPS := 0.00001;
H := 0.01;
DE54R(FDE54R,FGDE54R,FRDE54R,XN,XK,CN,CK,NX,X0,HX,BULDY,HMIN,EPS,P,
H,Y,DY,NX1,IERR);
Result := Result + Format('%s',[' IERR=']);
Result := Result + Format('%3d ',[IERR]) + #$0D#$0A;
Result := Result + Format('%s',[' NX1=']);
Result := Result + Format('%5d ',[NX1]);
Result := Result + Format('%s',[' Y']);
Result := Result + Format('%s',[' DY' + #$0D#$0A]);
Result := Result + #$0D#$0A;
for I:=1 to 11 do
begin
Result := Result + Format('%20.16f %20.16f ',
[Y[I-1],DY[I-1]]) + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
UtRes('TDE54R',Result); { вывод результатов в файл TDE54R.res }
exit;
end;
end.
Unit fde54r_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc;
function fde54r(X :Real): Real;
implementation
function fde54r(X :Real): Real;
begin
{ Result - прототип имени функции F на FORTRANe }
Result := X*X;
exit;
end;
end.
Unit fgde54r_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc;
function fgde54r(X :Real): Real;
implementation
function fgde54r(X :Real): Real;
begin
{ Result - прототип имени функции G на FORTRANe }
Result := X;
exit;
end;
end.
Unit frde54r_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc;
function frde54r(X :Real): Real;
implementation
function frde54r(X :Real): Real;
var
X2 :Real;
begin
{ Result - прототип имени функции R на FORTRANe }
X2 := X*X;
Result := 10.0*Exp(-X2)*(2.0*X2-1.0)*(2.0-X);
exit;
end;
end.
Результаты:
IERR = 0
NX1 = 11
Y DY
4.45260617314 + 00 - 8.01021606015 + 00
4.37238323319 + 00 - 7.95378250048 + 00
4.29273839036 + 00 - 7.89518713214 + 00
4.21369299696 + 00 - 7.83450451556 + 00
4.13526765439 + 00 - 7.77180951660 + 00
4.05748221040 + 00 - 7.70717722605 + 00
3.98035575729 + 00 - 7.64068288024 + 00
3.90390663078 + 00 - 7.57240178309 + 00
3.82815240978 + 00 - 7.50240922954 + 00
3.75310991678 + 00 - 7.43078043029 + 00
3.67879521918 + 00 - 7.35759043838 + 00