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

Подпрограмма:  IAC1R (модуль IAC1R_p)

Назначение

Вычисление сетки и коэффициентов аппроксимирующего кубического сплайна по заданным значениям функции одной переменной и краевым условиям на заданной (возможно неравномерной) сетке.

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

Пусть заданы сетка  X ( I ),  I = 1, ..., NX и значения функции  F (X) на ней:  FX ( I ) = F ( X ( I ) ) ,  I = 1, ..., NX.
Могут быть заданы краевые условия.

Для определения сетки и вычисления коэффициентов воспользуемся формулами :

     TX(I + 2) = X( I ) ,  CX( I + 2) = FX( I ) ,   I = 1, ..., NX. 

При периодических функциях дополнительные узлы и значения функции определяются из условий периодичности :

     TX(1) = X(NX - 2) - X(NX) + X(1) ,     CX(1) = FX(NX - 2) ,
     TX(2) = X(NX - 1) - X(NX) + X(1) ,     CX(2) = FX(NX - 1) ,
     TX(NX + 3) = X(2) + X(NX) - X(1) ,    CX(NX + 3) = FX(2) ,
     TX(NX + 4) = X(3) + X(NX) - X(1) ,    CX(NX + 4) = FX(3) . 

При непериодических функциях дополнительные значения функции вычисляются из краевых условий, приведенных в [1], а узлы определены формулами:

    TX(1) = 3 * X(1) - 2 * X(2) ,   TX(NX + 3) = 2 * X(NX) - X(NX - 1) ,
    TX(2) = 2 * X(1) - X(2) ,         TX(NX + 4) = 3 * X(NX) - 2 * X(NX - 1) . 

После определения сетки сплайна и вычисления дополнительных значений функции вычисляются коэффициенты сплайна в зависимости от порядка аппроксимирующих формул [2].

1.  Гребенников А.И., Казе В.О. - Л. Быстрые алгоритмы аппроксимации функции сплайнами и решение некоторых прикладных задач. - Методы и алгоритмы в численном анализе. M.: Изд - во МГУ, 1984.
2.  Гребенников А.И. Метод сплайнов и решение некоррректных задач теории приближений. M.: Изд - во МГУ, 1983.

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

procedure IAC1R(var X :Array of Real; NX :Integer;
                var FX :Array of Real; LX :Integer;
                MXA :Integer; FXA :Real; MXB :Integer;
                FXB :Real; var TX :Array of Real;
                var CX :Array of Real);

Параметры

X - вещественный вектоp длины  NX, содержащий значения узлов исходной сетки;
NX - заданное число узлов исходной сетки.  NX ≥ 4 (тип: целый);
FX - вещественный вектоp длины  NX, содержащий значения функции в узлах исходной сетки;
LX - заданное число, порядок аппроксимирующих формул,  0 ≤ LX ≤ 1 (тип: целый);
MXA - заданное число, определяющее периодичность функции или тип краевых условий на левом конце отрезка,  0 ≤ MXA ≤ 3 (тип: целый);
MXA =  3 - периодическая функция,
MXA =  0 - условие интерполяции,
MXA=1,2 - задана производная порядка MXA;
FXA - заданное значение производной порядка  MXA на левом конце отрезка (тип: вещественный), (используется, если  MXA = 1, 2);
MXB - заданное число, определяющее тип краевых условий на правом конце отрезка,  0 ≤ MXB ≤ 2 (тип: целый), (используется, если  MXA < 3),
MXB =  0 - условие интерполяции,
MXB=1,2 - задана производная порядка  MXB;
FXB - заданное значение производной порядка  MXB на правом конце отрезка (тип: вещественный), (используется, если  MXB = 1, 2);
TX - вещественный вектоp длины  NX + 4, содержащий вычисленные значения узлов сетки сплайна;
CX - вещественный вектоp длины  NX + 4, содержащий  NX + 2 значений коэффициентов сплайна.

Версии: нет

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

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

  Подпрограмма использует рабочие подпрограммы - функции и подпрограммы IAC1R1, IAC1R2, IAC1R3, IAC1R4 и IAS1R2.

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

Unit TIAC1R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, IAC1R_p;

function TIAC1R: String;

implementation

function TIAC1R: String;
var
I :Integer;
ТХ :Array [0..7] of Real;
СХ :Array [0..7] of Real;
const
X :Array [0..3] of Real = ( 2.0,3.0,4.0,5.0 );
FX :Array [0..3] of Real = ( 8.0,27.0,64.0,125.0 );
begin
Result := '';  { результат функции }
IAC1R(X,4,FX,1,1,12.0,2,30.0,TX,CX);
Result := Result + #$0D#$0A;
for I:=1 to 8 do
 begin
  Result := Result + Format(' ТХ :%20.16f ',[TX[I-1]]) + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
Result := Result + #$0D#$0A;
for I:=1 to 6 do
 begin
  Result := Result + Format(' СХ :%20.16f ',[CX[I-1]]) + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
UtRes('TIAC1R',Result);  { вывод результатов в файл TIAC1R.res }
end;

end.

Результаты:

       TX  =  ( 0.00  1.00  2.00  3.00  4.00  5.00  6.00  7.00 )

       CX  =  ( -0.00  6.00  24.00  60.00  120.00  210.00 )