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

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

Назначение

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

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

Пусть на равномерной сетке  xi :  x1 < x2 < ...< xM с шагом H заданы значения функции  fi = f (xi). По аргументу Х, при котоpом требуется провести вычисления, определяется номер K такой, чтo X  [xK, xK + 1], и строятся  В - сплайны  si, 2N (Х) порядка 2N для  i = K- N+1,..., K+N (см. [1]). Значение производной порядка P: 0 ≤ P ≤ 2N- 2 вычисляется по формулам:

S(P)(X) =  φK,P(X)  =
                       K+N
           =  CN   ∑         fi s(P)i,2N(X) ,     при   X  [xK,xK+1] ,   N ≤K≤ M-N ;
                      i=K-N+1

S(P)(X) = φN,P(xN) + [φN+1,P(xN+1) - φN,P(xN)] (X-xN) /H ,   при X  [x1,xN];

S(P)(X) = φM-N,P(xM-N) + [φM-N,P(xM-N) - φM-N-1,P(xM-N-1)] (X-xM-N) /H ,
                при  X  [xM-N,xM] ; 

где C1 = 1,  C2 = 2/3,  C3 = 11/20,  C4 = 151/315,  и считается, что M ≥ 2N.

1.  А.И.Гребенников. O простом алгоритме аппроксимации функций с помощью  В - сплайнов на равномерной сетке. "Численный анализ на ФОРТРАНе", вып.15, Изд-во Mоск. ун-та, 1976.

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

    int idb7r_c (integer *p, integer *n1, integer *m, real *a,
            real *h, real *x, real *f, real *s, integer *ierr)

Параметры

p - параметр, значение которого на единицу больше порядка вычисляемой производной (при p = 1 вычисляется просто значение сплайна, при p = 2 вычисляется значение первой производной и т.д.), 1 ≤ p ≤ 2*n - 1 (тип: целый);
n1 - порядок сплайна, n1 = 2*n, 1 ≤ n ≤ 4 (тип: целый);
m - число узлов сетки (тип: целый);
a - первый узел сетки (тип: вещественный);
h - шаг сетки, h > 0 (тип: вещественный);
x - значение аргумента функции, при котоpом необходимо вычислить производную (тип: вещественный);
f - вещественный вектоp длины m значений заданной функции на равномерной сетке;
s - вещественная переменная, представляющая результат вычисления производной порядка (p - 1) от аппроксимирующего сплайна;
ierr - целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом:
ierr=65 - когда шаг сетки слишком мал;
ierr=66 - когда зафиксирована ошибка в задании n1 (n1 < 2);
ierr=67 - когда аргумент x лежит вне рассматриваемого отрезка [x1, xm].

Версии: нет

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

uti i12_c - подпрограмма выдачи диагностических сообщений при работе подпрограммы idb7r_c.

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

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

int main(void)
{
    /* Builtin functions */
    double exp(double);

    /* Local variables */
    extern int idb7r_c(int *, int *, int *, float *, float *, float *,
                       float *, float *, int *);
    static float f[11];
    static int i__;
    static float s, x[11];
    static int ir;

    for (i__ = 1; i__ <= 11; ++i__) {
        x[i__ - 1] = (i__ - 1) * .1f;
/* l5: */
        f[i__ - 1] = (float)exp((float)(-x[i__ - 1] * x[i__ - 1]));
    }
    idb7r_c(&c__3, &c__4, &c__11, &c_b5, &c_b6, &c_b7, f, &s, &ir);

    printf("\n %16.7e \n",s);
    return 0;
} /* main */


Результат:    s  =  -1.32