|
Текст подпрограммы и версий iis5r_p.zip |
Тексты тестовых примеров tiis5r_p.zip |
Вычисление значений интерполяционного натурального бикубического сплайна на заданном множестве точек.
Вычисляются значения натурального бикубического сплайна 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