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

Подпрограмма:  IIS9R (модуль IIS9R_p)

Назначение

Интерполяция кубическим квази - эрмитовым сплайном табличной функции от одной переменной на неравномерной сетке.

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

Вычисляются коэффициенты  C ( I, 3 ), C ( I, 2 ), C ( I, 1 ) кубического квази - эрмитова сплайна

  S (x) = C ( I, 3 ) ( x - x I )3 + C ( I, 2 ) ( x - x I)2 + C ( I, 1 ) ( x - x I) + yI  , 

где  x  [x I, x I + 1],  I =1, 2, ..., N - 1, интерполирующего заданные значения табличной функции   yI = y (x I),  I = 1, 2, ..., N в узлах сетки  {x ( I )}.

Коэффициенты сплайна на отрезке  [xI, x I + 1] определяются значениями  yI, yI + 1, yI - yI - 1, yI + 2 - yI + 1 и выбираются так, что функция  S (x) непрерывна вместе со своей первой производной на всем отрезке  [x 1, x N].

Akima H., "A New Method of Interpolation and Smooth Curve Fitting Based on Local Procedures", JACM, 17 (4), 1970, 589 - 602.

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

procedure IIS9R(var X :Array of Real; var Y :Array of Real;
                NX :Integer; var C :Array of Real; var IERR :Integer);

Параметры

X - вещественный вектоp длины  N, содержащий заданные узлы сетки, при этом  X ( I ) < X ( I + 1);
Y - вещественный вектоp длины  N, содержащий заданные значения интерполируемой функции в узлах сетки:  F ( I ) = Y ( I );
N - заданное количество узлов сетки,  N ≥ 4 (тип: целый);
C - вещественный двумерный массив размерности  N * 3, содержащий вычисленные коэффициенты кубического квази - эрмитова сплайна;
IERR - целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом:
IERR=65 - когда заданное количество  N узлов сетки меньше четырех;
IERR=66 - когда  X ( I ) ≥ X ( I + 1) хотя бы для одного  I.

Версии: нет

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

UTI I10 - подпрограмма выдачи диагностических сообщений при работе подпрограммы I IS9R.

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

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

Unit tiis9r_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, IIS9R_p;

function tiis9r: String;

implementation

function tiis9r: String;
var
N,I,_i,J,IERR :Integer;
X :Array [0..4] of Real;
C :Array [0..14] of Real;
Y :Array [0..4] of Real;
label
_2;
begin
Result := '';  { результат функции }
N := 5;
for I:=1 to N do
 begin
  X[I-1] := I;
_2:
  Y[I-1] := ((X[I-1]-2.0)*X[I-1]-3.0)*X[I-1]+4.0;
 end;
IIS9R(X,Y,N,C,IERR);
Result := Result + Format('%s',['  IIS9R' + #$0D#$0A +
 '  Y']) + #$0D#$0A; 
Result := Result + #$0D#$0A;
for _i:=0 to 4 do
 begin
  Result := Result + Format('%20.16f ',[Y[_i]]);
  if ( ((_i+1) mod 3)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
Result := Result + Format(' %5d ',[IERR]) + #$0D#$0A;
Result := Result + Format('%s',['  C' + #$0D#$0A]) + #$0D#$0A; 
Result := Result + #$0D#$0A;
for I:=1 to 5 do
 begin
  for J:=1 to 3 do
   begin
    Result := Result + Format('%20.16f ',[C[(I-1)+(J-1)*5]]) + #$0D#$0A;
   end;
 end;
Result := Result + #$0D#$0A;
UtRes('tiis9r',Result);  { вывод результатов в файл tiis9r.res }
exit;
end;

end.


Результаты:

       IERR  =  0

                 |   0.0   |
                 |  -2.0  |
       Y  =   |   4.0   |
                 |  24.0  |
                 |  64.0  |

                 |  -6.0               5.090909    -1.090909  |
                 |   0.909091      6.181818    -1.090909  |
       C  =   |  10.0             11.764706    -1.764706  |
                 |  28.235294   13.592412    -1.764706  |
                 |   5.0                0.0                0.0           |