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

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

Назначение

Интерполяция кубическим квази - эрмитовым сплайном табличной функции от одной переменной на неравномерной сетке.

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

Вычисляются коэффициенты  C ( I, 3 ), C ( I, 2 ), C ( I, 1 ) кубического квази - эрмитова сплайна

  S (x) = C ( I, 3 ) ( x - x I )3 + C ( I, 2 ) ( x - x I)2 + C ( I, 1 ) ( x - x I) + yI  , 

где  x  [x I, x I + 1],  I =1, 2, ..., N - 1, интерполирующего заданные значения табличной функции   yI = y (x I),  I = 1, 2, ..., N в узлах сетки  {x ( I )}.

Коэффициенты сплайна на отрезке  [xI, x I + 1] определяются значениями  yI, yI + 1, yI - yI - 1, yI + 2 - yI + 1 и выбираются так, что функция  S (x) непрерывна вместе со своей первой производной на всем отрезке  [x 1, x N].

Akima H., "A New Method of Interpolation and Smooth Curve Fitting Based on Local Procedures", JACM, 17 (4), 1970, 589 - 602.

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

    int iis9r_c (real *x, real *y, integer *nx, real *c,
            integer *ierr)

Параметры

x - вещественный вектоp длины  n, содержащий заданные узлы сетки, при этом  x ( i ) < x ( i + 1);
y - вещественный вектоp длины  n, содержащий заданные значения интерполируемой функции в узлах сетки:  f ( i ) = y ( i );
n - заданное количество узлов сетки,  n ≥ 4 (тип: целый);
c - вещественный двумерный массив размерности  n * 3, содержащий вычисленные коэффициенты кубического квази - эрмитова сплайна;
ierr - целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом:
ierr=65 - когда заданное количество  n узлов сетки меньше четырех;
ierr=66 - когда  x ( i ) ≥ x ( i + 1) хотя бы для одного  i.

Версии: нет

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

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

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

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

int main(void)
{
    /* Local variables */
    static int ierr;
    extern int iis9r_c(float *, float *, int *, float *, int *);
    static float c__[15] /* was [5][3] */;
    static int i__, i, n;
    static float x[5], y[5];
    int i__1;

#define c___ref(a_1,a_2) c__[(a_2)*5 + a_1 - 6]

    n = 5;
    i__1 = n;
    for (i__ = 1; i__ <= i__1; ++i__) {
        x[i__ - 1] = (float) i__;
/* l2: */
        y[i__ - 1] = ((x[i__ - 1] - 2.f) * x[i__ - 1] - 3.f) * x[i__ - 1] + 
                4.f;
    }
    iis9r_c(x, y, &n, c__, &ierr);

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


Результаты:

       ierr  =  0

                 |   0.0   |
                 |  -2.0  |
       y  =    |   4.0   |
                 |  24.0  |
                 |  64.0  |

                 |  -6.0               5.090909    -1.090909  |
                 |   0.909091      6.181818    -1.090909  |
    c__  =   |  10.0             11.764706    -1.764706  |
                 |  28.235294   13.592412    -1.764706  |
                 |   5.0                0.0                0.0           |