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

Подпрограмма:  iac1r_c

Назначение

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

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

Пусть заданы сетка  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.

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

    int iac1r_c (real *x, integer *nx, real *fx, integer *lx,
            integer *mxa, real *fxa, integer *mxb, real *fxb, real *tx, real *cx)

Параметры

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_c, iac1r2_c, iac1r3_c, iac1r4_c и ias1r2_c.

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

int main(void)
{
    /* Initialized data */
    static float x[4] = { 2.f,3.f,4.f,5.f };
    static float fx[4] = { 8.f,27.f,64.f,125.f };

    /* Local variables */
    extern int iac1r_c(float *, int *, float *, int *, int *, float *,
                       int *, float *, float *, float *);
    static float cx[8], tx[8];

    iac1r_c(x, &c__4, fx, &c__1, &c__1, &c_b4, &c__2, &c_b6, tx, cx);

    printf("\n  tx = %6.2f %6.2f %6.2f %6.2f %6.2f %6.2f %6.2f %6.2f \n",
                tx[0], tx[1], tx[2], tx[3], tx[4], tx[5], tx[6], tx[7]);
    printf("\n  cx = %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f \n",
                cx[0], cx[1], cx[2], cx[3], cx[4], cx[5]);
    return ;
} /* main */


Результаты:

       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 )