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

Подпрограмма:  IIS1R (модуль IIS1R_p)

Назначение

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

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

Пусть в узлах неравномерной ceтки t1 < t2 ... < tN известны значения параметрически заданной циклической функции x = x(t) и y = y(t) и ее вторых производных x'' = x''(t) и y'' = y''(t). Требуется найти значение этой функции в некоторой точке  t0: t1 < t0 ≤ tN. Эта задача интерполяции решается в I IS1R посредством построения кубических полиномов по значениям ( ti, xi ) ,  ( ti, x''i ) ,  ( ti + 1, xi + 1 ) ,   ( ti + 1, x''i + 1 ) и  ( ti, yi ) ,  ( ti, y''i ) ,   ( ti + 1, yi + 1 ) ,  ( ti + 1, y''i + 1 ) как интерполяционных полиномов Эрмита [1], [2].

1. 

И.С.Березин, Н.П.Жидков, Методы вычислений, т.1, Физматгиз, 1962.

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

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

procedure IIS1R(T0 :Real; N :Integer; var T :Array of Real;
                var X :Array of Real; var Y :Array of Real;
                var X2 :Array of Real; var Y2 :Array of Real;
                var X0 :Real; var Y0 :Real; var IERR :Integer);

Параметры

TO - значение t0, в котоpом ищется параметрически заданная циклическая функция (тип: вещественный);
N - заданное число узлов сетки,  N ≥ 3 (тип: целый);
T - вещественный одномерный массив значений  ti размерности  N;
X - вещественный одномерный массив значений  xi размерности  N;
X2 - вещественный одномерный массив вторых производных  x''i размерности  N;
Y - вещественный одномерный массив значений  yi размерности  N;
Y2 - вещественный одномерный массив вторых производных  y''i размерности  N;
XO - вещественная переменная, содержащая вычисленное значение  x (t0);
YO - вещественная переменная, содержащая вычисленное значение  y (t0);
IERR - целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом:
IERR=65 - когда заданное значение  TO не принадлежит полуинтервалу (t1, tN].

Версии: нет

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

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

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

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

На единичной окружности были взяты 17 точек. Значения векторов T, X, Y, X2 и Y2 определены в примере использования подпрограммы IDS6R.

Unit tiis1r_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, IDS6R_p, IIS1R_p;

function tiis1r: String;

implementation

function tiis1r: String;
var
N,NPAR,_i,IERR :Integer;
T0,X0,Y0 :Real;
T :Array [0..16] of Real;
X2 :Array [0..16] of Real;
Y2 :Array [0..16] of Real;
F :Array [0..16] of Real;
G :Array [0..16] of Real;
H :Array [0..16] of Real;
const
X :Array [0..16] of Real = ( -1.0,-0.75,-0.5,-0.25,0.0,0.25,0.5,0.75,1.0,
0.75,0.5,0.25,0.0,-0.25,-0.5,-0.75,1.0 );
Y :Array [0..16] of Real = ( 0.0,-0.66143775,-0.8660253,-0.9682457,-1.0,
-0.9682457,-0.8660253,-0.66143775,0.0,0.66143775,
0.8660253,0.9682457,1.0,0.9682457,0.8660253,
0.66143775,0.0 );
begin
Result := '';  { результат функции }
N := 17;
NPAR := 1;
IDS6R(N,NPAR,T,X,X2,Y,Y2,F,G,H);
Result := Result + #$0D#$0A;
for _i:=0 to 16 do
 begin
  Result := Result + Format('%20.16f ',[X2[_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 16 do
 begin
  Result := Result + Format('%20.16f ',[Y2[_i]]);
  if ( ((_i+1) mod 3)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
T0 := 1.0;
N := 17;
IIS1R(T0,N,T,X,Y,X2,Y2,X0,Y0,IERR);
Result := Result + Format('%5d ',[IERR]) + #$0D#$0A;
Result := Result + Format(' %20.16f %20.16f ',[X0,Y0]) + #$0D#$0A;
UtRes('tiis1r',Result);  { вывод результатов в файл tiis1r.res }
exit;
end;

end.


Результаты:

       XO  = - 0.526 ,     YO  = - 0.8505 ,

       IERR  =  0