Текст подпрограммы и версий
iib8r_p.zip , iib8e_p.zip
Тексты тестовых примеров
tiib8r_p.zip , tiib8e_p.zip

Подпрограмма:  IIB8R (модуль IIB8R_p)

Назначение

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

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

Пусть заданы узлы неравномерной прямоугольной сетки:

   X1A  =  { x1(1), x2(1), ...,xM(1) } ;   X2A  =  { x1(2), x2(2), ..., xN(2) } ,
 а также значения интерполируемой функции    f (x(1), x(2))

 и ее второй частной  производной    ∂2 f (x(1), x(2)) / ∂x(2) 2
 в узлах этой сетки:
 YA(I, J)  =  f (X1A(I), X2A(J)) ;   Y2A(I, J)  =  ∂2 f (X1A(I), X2A(J)) / ∂x(2) 2 ,

   I = 1, 2, ..., M ;   J = 1, 2, ..., N . 

Подпрограмма I IB8R вычисляет значение Y функции  f (x(1), x(2)) в заданной точке с координатами (X1, X2), лежащей внутри сеточного прямоугольника, методом бикубических сплайнов.

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

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

procedure IIB8R(var X1A :Array of Real; var X2A :Array of Real;
                var YA :Array of Real; var Y2A :Array of Real;
                M :Integer; N :Integer; X1 :Real;
                X2 :Real; var Y :Real; var YT :Array of Real;
                var Y2T :Array of Real; var YYT :Array of Real;
                var U :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)) двух переменных в узлах заданной сетки;
Y2A - вещественный двумерный массив размеров M на N, содержащий значения второй частной производной функции  f по второй переменной в узлах заданной сетки;
M, N - длины векторов X1A и X2A соответственно (тип: целый);
X1, X2 - координаты заданной точки внутри сеточного прямоугольника, в которой ищется значение интерполируемой функции  f (тип: вещественный);
Y - вещественная переменная, содержащая вычисленное значение интерполируемой функции  f в точке (X1, X2);
YT - вещественный вектор длины N, используемый в подпрограмме в качестве рабочего;
Y2T - вещественный вектор длины max (M, N), используемый в подпрограмме в качестве рабочего;
YYT, U - вещественные векторы длины M, используемые в подпрограмме в качестве рабочих.

Версии

I IB8E - вычисление значения в заданной точке интерполируемой функции двух переменных, определенной на прямоугольной неравномерной сетке, по известным значениям на этой сетке ее второй частной производной по второй переменной методом бикубических сплайнов режиме расширенной (Extended) точности.

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

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

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

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

Unit tiib8r_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, IIB8R_p;

function tiib8r: String;

implementation

function tiib8r: String;
var
M,N,I,J :Integer;
R,X1,X2,YT1,Y :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..4] of Real;
YYT :Array [0..4] of Real;
U :Array [0..4] of Real;
label
_1,_2,_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
  for J:=1 to N do
   begin
    YA[(I-1)+(J-1)*5] := Sin(X1A[I-1])*Sin(X2A[J-1]);
_4:
    Y2A[(I-1)+(J-1)*5] := -YA[(I-1)+(J-1)*5];
   end;
 end;
X1 := 0.55;
X2 := 0.65;
IIB8R(X1A,X2A,YA,Y2A,M,N,X1,X2,Y,YT,Y2T,YYT,U);
YT1 := Sin(X1)*Sin(X2);
Result := Result + Format(' %20.16f %20.16f ',[Y,YT1]) + #$0D#$0A;
UtRes('tiib8r',Result);  { вывод результатов в файл tiib8r.res }
exit;
end;

end.
      

Результат:    Y=0.321498