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

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

Назначение

Вычисление значения некоторой производной функции, линейно представленной через B - сплайн  k - го порядка, в заданной точке.

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

Пусть функция
                 n
     f(x)  =  ∑  aj Nj k(x) ,
                j=1 

где aj - заданные коэффициенты, а Nj k (x) - нормированные B - сплайны  k - го порядка, соответствующие сетке узлов

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

Вычисляется значение i - ой производной функции  f в заданной точке  x  [t1, tn + 1]  для некоторого  i:  0 ≤ i ≤ k .

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

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

    real id22r_c (real *t, real *a, integer *n, integer *k, real *x, integer *id,
            real *r)

Параметры

t - вещественный вектоp длины n + k, значений узлов сплайна  t (1) ≤ t (2) ≤ ...≤ t (k) < t (k + 1) <  ...< t (n) < t (n + 1) ≤ ...≤ t (n + k);
a - вещественный вектоp длины n заданных значений коэффициентов  aj = A (j),  j = 1, 2,..., n;
n - заданное число B - сплайнов, n ≥ 2*k (тип: целый);
k - порядок  B - сплайна (тип: целый);
x - заданное значение точки, в которой вычисляется производная  f ( i ) (x), порядка  i = id;  t (1) ≤ x ≤ t (n + 1) (тип: вещественный);
id - заданный порядок вычисляемой производной 0 ≤ id ≤ k (тип: целый);
r - вещественный рабочий двумерный массив размерности 3k.

Версии: нет

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

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 a[6] = { 0.f,-2.f,18.f,110.f,322.f,512.f };

    /* Local variables */
    extern float id22r_c(float *, float *, int *, int *, float *, int *,
                         float *);
    static int i__, k, n;
    static float r__[9]  /* was [3][3] */, s, x;
    static int id;

    n = 6;
    x = 5.f;
    k = 3;
    id = 0;
    for (i__ = 1; i__ <= 3; ++i__) {
        id = i__;
        s = (float)id22r_c(t, a, &n, &k, &x, &id, r__);
        printf("\n id = %2i   s = %16.7e \n",id, s);
/* l5: */
    }
    return 0;
} /* main */


Результаты:    s  =  76., 30., 0.