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

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

Назначение

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

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

Пусть в узлах равномерной ceтkи  x K:  x1 < x2 < ... < x M с шагом  H:  x K + 1 = x K + H заданы значения  yK = y (x K) , а узлы  t K сетки, на которой строятся аппроксимирующие сплайны, таковы, что  t K = x K - H / 2.

Значение аппроксимирующего квадратичного сплайна вычисляется по формулам:

  S (x) = y2 + ( y2 - y1 ) ( x - x2 ) / H ,               x  [x1, t3]
                i+1
  S (x) =    ∑  y K s K-1 ( x ) ,                            x  [t i , t i + 1] ,  i = 3, ..., M-3 
              k = i-1
  S (x) = yM-1 + ( yM - yM-1 ) ( x - x M ) / H ,    x   [t M - 2, x M] , 

где  s K (x) - квадратичный  В - сплайн [1], построенный по узлам  t K, t K + 1, t K + 2.

А.И.Гребенников. Аппроксимация квадратичными сплайнами, Численный анализ на ФОРТРАНе, вып.15, Изд - во МГУ, 1976.

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

    int iib2r_c (real *f, integer *m, real *a, real *h, real *x,
            real *s, integer *ierr)

Параметры

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

Версии: нет

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

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

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

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

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

    /* Local variables */
    extern int iib2r_c(float *, int *, float *, float *, float *, float *,
                       int *);
    static float f[6];
    static int k;
    static float s, x[6], pi;
    static int ir;

    pi = .62831853059999998f;
    for (k = 1; k <= 6; ++k) {
        x[k - 1] = (k - 1) * pi;
        f[k - 1] = (float)cos(x[k - 1]);
/* l1: */
    }
    iib2r_c(f, &c__6, &c_b3, &pi, &x[2], &s, &ir);

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


Результатат:    s  =  0.29