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

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

Назначение

Построение интерполирующего сплайна  k - го порядка с произвольными узлами интерполяции.

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

Пусть задана сетка узлов (yзлы cплайна):

     t1 ≤ t2 ≤ ... ≤ tk < tk + 1 < ... < tn < tn + 1 ≤ tn + 2 ≤ ... ≤ tn + k  , 

определяющая для  i = 1, 2, ..., n нормированные  В - сплайны  Ni k (x) порядка  k, соответствующие узлам

     ti , ti + 1 , ... , ti + k . 

Строится сплайн - функция

                     n                   
        f (x)  =  ∑  a i Ni k (x)  ,     t1 ≤ x ≤ tn + 1  ,
                   i = 1 

коэффициенты  ai,  i = 1, 2, ..., n, которой определяются условиями интерполяции

        n                   
       ∑  a i Ni k ( z j ) = bj  ,     j = 1, 2, ... , n  ,
     i = 1 

где  Z1 < Z2 < ... < Zn узлы интерполяции, такие что  [Z1, Zn [ t1, tn + 1 ] , а  bj - заданные значения.

C.de Boor, Package for Calculating with B - splines, SIAM J. Numerical Analysis, 14 (3), 1977, pp. 441 - 472.

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

    int ii21r_c (integer *n, integer *k, real *t, real *z,
            real *a, real *b, real *r, real *r1, real *r2, integer *ierr)

Параметры

n - заданное число узлов интерполяции (тип: целый);
k - заданный порядок  B - сплайна (тип: целый);
t - вещественный вектоp длины  n + k значений узлов сплайна:
t (1) ≤ t (2) ≤ ... ≤ t (k) < t (k + 1) < t (k + 2) < t (n) < t (n + 1) ≤ t (n + 2) ≤ ... ≤ t (n + k);
z - вещественный вектоp длины  n значений узлов интерполяции:  t (1) ≤ z (1) < z (2) < ... < z (n) ≤ t (n + k);
a - вещественный вектоp длины  n:  ai = a (i),  i = 1, 2, ..., n;
b - вещественный вектоp длины  n:  bi = b (i),  i = 1, 2, ..., n;
r - вещественный двумерный рабочий массив размера  n * (2*k - 1);
r1 - вещественный рабочий вектоp длины  k;
r2 - вещественный двумерный рабочий массив размера  n*k;
ierr - целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом:
ierr=65 - когда какой - то узел  z (i) не принадлежит [t (1), t (n + 1)];
ierr=66 - когда матрица для определения коэффициентов вырождена.

Версии: нет

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

uti i10_c - подпрограмма выдачи диагностических сообщений при работе подпрограммы i i21r_c ;
asb1r_c - подпрограмма решения системы с ленточной матрицей, заданной в компактной форме, с выбором ведущего элемента по столбцу;
i i21r1_c - служебная подпрограмма;
i i21r2_c - служебная подпрограмма;

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

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

int main(void)
{
    /* Initialized data */
    static float t[9] = { 0.f,0.f,0.f,2.f,4.f,6.f,8.f,8.f,8.f };
    static float z__[6] = { 1.f,3.f,4.f,5.f,6.f,7.f };

    /* Local variables */
    extern int ii21r_c(int *, int *, float *, float *, float *, float *,
                       float *, float *, float *, int *);
    static int ierr;
    static float a[6], b[6];
    static int i__, k, n;
    static float r__[30] /* was [6][5] */, r1[3],
                  r2[18] /* was [6][3] */, zx;
    int i__1, i;

    n = 6;
    k = 3;
    i__1 = n;
    for (i__ = 1; i__ <= i__1; ++i__) {
        zx = z__[i__ - 1];
        b[i__ - 1] = zx * zx * zx;
/* l5: */
    }
    ii21r_c(&n, &k, t, z__, a, b, r__, r1, r2, &ierr);

    printf("\n %5i \n",ierr);
    for (i = 1; i <= 6; ++i) {
        printf("\n %16.7e \n",a[i-1]);
    }
    return 0;
} /* main */


Результаты:  ierr = 0 ,    a  =  0., -2., 18., 110., 322., 512.