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

Подпрограмма:  IDS6R (модуль IDS6R_p)

Назначение

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

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

Пусть в узлах сетки  x1,  x2,  ...,xN заданы значения циклической функции  yK = y(xK), причем  x1 = xN,  y1 = yN. Предположим, что  xi = x (ti),  yi = y (ti),  i = 1, 2, ..., N, где величины  ti определяются соотношениями:

     ti  =  ti-1 + di ,  для   i = 2, 3, ..., N    и   t1 = 0 . 

Шаги  di по параметру  ti могут определяться одной из следующих формул:

          а)  di  =  ( (Δxi)2  +  (Δyi)2 )1/2

          б)  di  =  ( Δxi )2  +  ( Δyi )2

          в)  di  =  | Δxi |  +  | Δyi | ,    i = 2, ..., N-1 , 

где  Δ xi = xi + 1 - xi ,  Δ yi = yi + 1 - yi.

Значения вторых производных  xi,  yi определяются по парам значений  (ti, xi),  (ti, yi),  i = 1, 2, ..., N методом интерполирующих кубических сплайнов.

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

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

procedure IDS6R(N :Integer; NPAR :Integer; var T :Array of Real;
                var X :Array of Real; var X2 :Array of Real;
                var Y :Array of Real; var Y2 :Array of Real;
                var F :Array of Real; var G :Array of Real;
                var H :Array of Real);

Параметры

N - заданное число узлов сетки, N ≥ 3 (тип: целый);
NPAR - характеризует способ параметризации заданной функции (тип: целый); при этом:
NPAR=1 - если величины  di определяются по формуле а);
NPAR=2 - если величины  di определяются по формуле б);
NPAR=3 - если величины  di определяются по формуле в);
T - вещественный одномерный массив значений  ti размерности N;
X - вещественный одномерный массив значений  xi размерности N, причем X (1) = X (N);
X2 - вещественный одномерный массив размерности N вычисляемых значений вторых производных  x (t) в узлах сетки  ti;
Y - вещественный одномерный массив значений  yi размерности N, причем Y (1) = Y (N);
Y2 - вещественный одномерный массив размерности N вычисляемых значений вторых производных  y (t) в узлах сетки  ti;
F, G, H - вещественные одномерные рабочие массивы размерности N.

Версии: нет

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

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

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

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

На единичной окружности были взяты 17 точек. Вычислялись значения  x''i и  y''i,  i = 1, 2, ..., 17.

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

function tids6r: String;

implementation

function tids6r: String;
var
N,NPAR,_i :Integer;
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.6614,-0.8660,-0.9682,-1.0,-0.9682,
-0.8660,-0.6614,0.0,0.6614,0.8660,0.9682,1.0,
0.9682,0.8660,0.6614,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;
UtRes('tids6r',Result);  { вывод результатов в файл tids6r.res }
exit;
end;

end.


Результаты:

       X2  =  ( 1.10,  0.77,  0.5,  0.25,  -0.0002,  -0.25,  -0.5,  -0.76, 
                   -0.11,  -0.76,  -0.5,  -0.25,  -0.0019,  0.26,  0.48,  0.85, 1.1 )
       Y2  =  ( 0.041,  0.73,  0.87,  0.98,  1.,  0.98,  0.086,  0.074, 
                   0.00001,  -0.74,  -0.86,  -0.99,  -1.,  -1.,  -0.82,  -0.89, 0.041 )