Текст подпрограммы и версий
iis5r_p.zip
Тексты тестовых примеров
tiis5r_p.zip

Подпрограмма:  IIS5R (модуль IIS5R_p)

Назначение

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

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

Вычисляются значения натурального бикубического сплайна  S (x, y), соответствующего двумерной сетке {x i, yj},  i = 1, 2, ..., NX,  j = 1, 2, ..., NY, и интерполирующего заданные значения  f i j = f (x i, yj) в узлах сетки на множестве точек (xl m, yl n),  m = 1, 2, ..., NXL,  n = 1, 2, ..., NYL.

Для этого библиотечные подпрограммы I IS3R и I IS4R вызываются NY раз для интерполяции в направлении оси  x в точках   (xl i, y j),  i = 1, 2, ..., NXL,  j = 1, 2, ..., NY, а затем  NXL раз для интерполяции в направлении оси  Y в точках (xl i, yl j),  i = 1, 2, ..., NXL,  j = 1, 2, ..., NYL.

Дж.Алберг, Э.Нильсон, Дж.Уолш, Теория сплайнов и ее приложения, M., Мир, 1972.

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

procedure IIS5R(var F :Array of Real; var X :Array of Real;
                NX :Integer; var Y :Array of Real;
                NY :Integer; var XL :Array of Real;
                NXL :Integer; var YL :Array of Real; NYL :Integer;
                var FL :Array of Real; var WK :Array of Real;
                var IERR :Integer);

Параметры

F - вещественный двумерный массив размера  NX * NY, содержащий заданные в узлах двумерной сетки значения интерполируемой функции;
X - вещественный вектоp длины  NX, содержащий заданные значения узлов одномерной сетки по оси  x, и упорядоченный так, что  X (1) < X (2) < ... < X (NX);
NX - заданное число узлов одномерной сетки по оси  x, NX ≥ 2 (тип: целый);
Y - вещественный вектоp длины  NY, содержащий заданные значения узлов одномерной сетки по оси  Y, и упорядоченный так, что  Y (1) < Y (2) < ... < Y (NY);
NY - заданное число узлов одномерной сетки по оси  y,   NY ≥ 2 (тип: целый);
XL - вещественный вектоp длины  NXL, содержащий заданные абсциссы точек, в которых вычисляются значения интерполяционного натурального бикубического сплайна;
NXL - заданное число элементов вектоpа  XL (тип: целый);
YL - вещественный вектоp длины  NYL, содержащий заданные ординаты точек, в которых вычисляются значения интерполяционного натурального бикубического сплайна;
NYL - заданное число элементов вектоpа  YL (тип: целый);
FL - вещественный двумерный массив размера  NXL * MAX (NYL, NY), содержащий вычисленные значения интерполяционного натурального бикубического сплайна;
WK - вещественный вектоp длины  MAX ((NX - 1) * 3, (NY - 1) * 3 + NY), используемый подпрограммой как рабочий;
IERR - целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом:
IERR = 1 - когда одна или несколько заданных точек сетки  XL меньше  X (1) или больше  X (NX);
IERR = 2 - когда одна или несколько заданных точек сетки  YL меньше  Y (1) или больше  Y (NY);
IERR=65 - когда заданное число узлов сетки по  X меньше 2;
IERR=66 - когда заданное число узлов сетки по  Y меньше 2;
IERR=67 - когда элементы вектоpа  X не упорядочены по возрастанию;
IERR=68 - когда элементы вектоpа  Y не упорядочены по возрастанию.

Версии: нет

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

I IS3R - интерполяция кубическим сплайном табличной функции от одной переменной на неравномерной сетке при известных краевых условиях на вторые производные.
I IS4R - вычисление значений интерполяционного кубического сплайна в заданных точках.
UTI I10 - подпрограмма выдачи диагностических сообщений при работе подпрограммы IIS5R.

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

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

Unit tiis5r_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, IIS5R_p;

function tiis5r: String;

implementation

function tiis5r: String;
var
NX,NY,NXL,NYL,I,JJ,IERR :Integer;
FL :Array [0..5] of Real;
WK :Array [0..8] of Real;
const
X :Array [0..2] of Real = ( 1.0,3.0,5.0 );
Y :Array [0..2] of Real = ( 1.0,3.0,5.0 );
F :Array [0..8] of Real = ( 2.0,4.0,3.0,0.5,1.0,0.75,1.0,2.0,1.5 );
XL :Array [0..1] of Real = ( 1.0,1.5 );
YL :Array [0..1] of Real = ( 1.5,2.0 );
label
_15;
begin
Result := '';  { результат функции }
NX := 3;
NY := 3;
NXL := 2;
NYL := 2;
IIS5R(F,X,NX,Y,NY,XL,NXL,YL,NYL,FL,WK,IERR);
Result := Result + Format('%3d ',[IERR]) + #$0D#$0A;
for I:=1 to 2 do
 begin
_15:
  Result := Result + #$0D#$0A;
  for JJ:=1 to 2 do
   begin
    Result := Result + Format('%20.16f ',
 [FL[(I-1)+(JJ-1)*2]]) + #$0D#$0A;
   end;
  Result := Result + #$0D#$0A;
 end;
UtRes('tiis5r',Result);  { вывод результатов в файл tiis5r.res }
exit;
end;

end.


Результаты:

       IERR  =  0

                   | 1.508   1.062 |
       FL  =   |                       |
                   | 2.017   1.422 |

       S (1., 1.5)   =  1.508
       S (1.5, 1.5)  =  2.017
       S (1., 2.)    =  1.062
       S (1.5, 2.)   =  1.422