Текст подпрограммы и версий
idb8r_p.zip , idb8e_p.zip
Тексты тестовых примеров
tidb8r_p.zip , tidb8e_p.zip

Подпрограмма:  IDB8R (модуль IDB8R_p)

Назначение

Вычисление второй частной производной функции двух переменных, заданной на прямоугольной неравномерной сетке, по второй переменной методом одномерных кубических сплайнов при известных значениях первой частной производной этой функции по второй переменной, заданных на нижней и верхней сторонах сеточного прямоугольника.

Математическое описание

Пусть заданы узлы неравномерной прямоугольной сетки:
X1A = { x1 ( 1 ), x2 ( 1 ),..., xM ( 1 )}; X2A = { x1 ( 2 ), x2 ( 2 ),..., xN ( 2 )}, значения функции  f (x ( 1 ), x ( 2 )) в узлах этой сетки: YA ( I, J ) = f (X1A ( I ), X2A( J )), I = 1, 2,..., M;  J = 1, 2,..., N, а также значения первой частной производной  ∂ f (x ( 1 ), x ( 2 )) / ∂ x ( 2 ) на нижней стороне сеточного прямоугольника:
YP1 ( I ) = ∂ f (X1A ( I ), X2A (1)) / ∂ x ( 2 ), I = 1, 2,..., M
и на верхней стороне сеточного прямоугольника:
YPN ( I ) = ∂ f (X1A ( I ), X2A (N)) / ∂ x ( 2 ),  I = 1, 2,..., M.

Подпрограмма   IDB8R   вычисляет  вторые  частные  производные  ∂2 f (x ( 1 ), x ( 2 )) / ∂x ( 2 ) 2 в узлах заданной сетки методом одномерных кубических сплайнов по направлению  x ( 2 ).

Н.С.Бахвалов. Численные методы. Изд - во "Наука", 1973.

Использование

procedure IDB8R(var X1A :Array of Real; var X2A :Array of Real;
                var YA :Array of Real; M :Integer; N :Integer;
                var YP1 :Array of Real; var YPN :Array of Real;
                var Y2A :Array of Real; var YT :Array of Real;
                var Y2T :Array of Real; var RAB :Array of Real);

Параметры

         X1A -
         X2A  
вещественные векторы длины  M и  N, содержащие узлы { x1 ( 1 ), x2 ( 1 ),..., xM ( 1 )} и { x1 ( 2 ), x2 ( 2 ),..., xN ( 2 )} соответственно;
YA - вещественный двумерный массив размеров M на N, содержащий значения функции  f (x ( 1 ), x ( 2 )) двух переменных в узлах заданной сетки;
M, N - длины векторов X1A и X2A соответственно (тип: целый);
            YP1 -
            YPN  
вещественные векторы длины M, содержащие значения первой частной производной функции  f по второй переменной на нижней и верхней сторонах сеточного прямоугольника соответственно;
Y2A - вещественный двумерный массив размеров M на N, содержащий вычисленные значения второй частной производной функции  f по второй переменной в узлах заданной сетки;
         YT, Y2T -
         RAB  
вещественные векторы длины N, используемые в подпрограмме в качестве рабочих.

Версии

IDB8E - выполняет те же вычисления, что и IDB8R, но с расширенной (Extended) точностью (формат Extended).

Вызываемые подпрограммы

       IDS8R -
       IDS8E  
вычисление вторых производных таблично - заданной функции в узлах неравномерной сетки методом кубических или натуральных кубических сплайнов при заданных первых производных функции в концевых узлах сетки в режимах одинарной и расширенной (Extended) точности соответственно; используются в подпрограммах IDB8R и IDB8E.

Замечания по использованию: нет

Пример использования

Unit TIDB8R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, IDB8R_p;

function TIDB8R: String;

implementation

function TIDB8R: String;
var
M,N,I,J,_i :Integer;
R :Real;
X1A :Array [0..4] of Real;
X2A :Array [0..3] of Real;
YA :Array [0..19] of Real;
Y2A :Array [0..19] of Real;
YT :Array [0..3] of Real;
Y2T :Array [0..3] of Real;
RАВ :Array [0..3] of Real;
Y2АТ :Array [0..19] of Real;
YP1 :Array [0..4] of Real;
YPN :Array [0..4] of Real;
label
_1,_2,_3,_4;
begin
Result := '';  { результат функции }
M := 5;
N := 4;
R := 0.0;
for I:=1 to M do
 begin
  X1A[I-1] := R;
_1:
  R := R+0.1;
 end;
R := 0.0;
for I:=1 to N do
 begin
  X2A[I-1] := R;
_2:
  R := R+0.1;
 end;
for I:=1 to M do
 begin
  YP1[I-1] := Sin(X1A[I-1])*Cos(X2A[0]);
_3:
  YPN[I-1] := Sin(X1A[I-1])*Cos(X2A[N-1]);
 end;
for I:=1 to M do
 begin
  for J:=1 to N do
   begin
    YA[(I-1)+(J-1)*5] := Sin(X1A[I-1])*Sin(X2A[J-1]);
_4:
    Y2AT[(I-1)+(J-1)*5] := -YA[(I-1)+(J-1)*5];
   end;
 end;
IDB8R(X1A,X2A,YA,M,N,YP1,YPN,Y2A,YT,Y2T,RAB);
Result := Result + #$0D#$0A;
for _i:=0 to 19 do
 begin
  Result := Result + Format('%20.16f ',[Y2A[_i]]);
  if ( ((_i+1) mod 3)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
Result := Result + #$0D#$0A;
for _i:=0 to 19 do
 begin
  Result := Result + Format('%20.16f ',[Y2AT[_i]]);
  if ( ((_i+1) mod 3)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
UtRes('TIDB8R',Result);  { вывод результатов в файл TIDB8R.res }
exit;
end;

end.

Результаты:      

                     |   0.0                     0.0                    0.0                    0.0
                     |  -0.19949E-05   -0.99745E-02   -0.19551E-01   -0.29526E-01
       Y2A  =  |  -0.37802E-05   -0.19849E-01   -0.39504E-01   -0.58755E-01
                     |  -0.57844E-05   -0.29525E-01   -0.58763E-01   -0.87398E-01
                     |  -0.85849E-05   -0.38906E-01   -0.77433E-01   -0.11517