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

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

Назначение

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

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

Вычисляются значения кубичeckoгo сплайна  S (x), соответствующего сетке  {xi} и интерполирующего заданные значения табличной функции  yi = y (xi),  i = 1, 2, ..., N, в точках  uk,  k = 1, 2, ..., M по формуле:

   S (uk) = yj + c1 j ( uk - xj ) + c2 j ( uk - xj )2 + c3 j ( uk - xj )3  , 

где индекс  j такой, что  uk содержится в отрезке  [xj, xj + 1], а  c1 j, c2 j, c3 j,  j = 1, 2, ..., N - 1, - заданные коэффициенты кубического сплайна.

Дж.Алберг, Э.Нильсон, Дж.Уолш, Теория сплайнов и ее приложения, M., Мир, 1972.

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

    int iis4r_c (real *x, real *y, integer *nx, real *c, real *u,
             real *s, integer *m, integer *ierr)

Параметры

x - вещественный вектоp длины  nx, содержащий заданные значения узлов сетки и упорядоченный так, что  x (1) < x (2) < ... < x (nx);
y - вещественный вектоp длины  nx, содержащий заданные в узлах сетки значения интерполируемой функции;
nx - заданное число узлов сетки,  nx ≥ 2 (тип: целый);
c - вещественный двумерный массив размера  3 * (nx - 1), содержащий заданные коэффициенты интерполяционного кубического сплайна;
u - вещественный вектоp длины  m, содержащий заданные точки, в которых вычисляются значения интерполяционного кубического сплайна,  x (1) ≤ u (k) ≤ x (nx),   k = 1, 2, ..., m;
s - вещественный вектоp длины  m, содержащий вычисленные значения интерполяционного кубического сплайна;
m - заданное число точек, в которых вычисляются значения интерполяционного кубического сплайна (тип: целый);
ierr - целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом:
ierr= 1 - когда одна или несколько заданных точек меньше  x (1);
ierr= 2 - когда одна или несколько заданных точек больше  x (nx);
ierr=65 - когда заданное число узлов сетки меньше 2;
ierr=66 - когда элементы вектоpа  x не упорядочены по возрастанию.

Версии: нет

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

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

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

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

int main(void)
{
    /* Initialized data */
    static float x[5] = { 1.f,2.f,3.f,4.f,5.f };
    static float u[8] = { 1.5f,4.5f,3.f,4.9f,2.1f,4.f,2.7f,1.8f };

    /* Local variables */
    static float bpar[4];
    static int ierr;
    extern int iis3r_c(float *, float *, int *, float *, float *, int *),
               iis4r_c(float *, float *, int *, float *, float *, float *,
                       int *, int *);
    static float c__[12] /* was [3][4] */;
    static int i__, m;
    static float s[8], y[5];
    static int nx;
    int i__1, i;

    nx = 5;
    i__1 = nx;
    for (i__ = 1; i__ <= i__1; ++i__) {
        y[i__ - 1] = ((x[i__ - 1] - 4.f) * x[i__ - 1] - 1.f) * x[i__ - 1] + 
                5.f;
/* l5: */
    }
    bpar[0] = 1.f;
    bpar[1] = 6.f / (x[1] - x[0]) * ((y[1] - y[0]) / (x[1] - x[0]) + 6.f);
    bpar[2] = 1.f;
    bpar[3] = 6.f / (x[4] - x[3]) * (34.f - (y[4] - y[3]) / (x[4] - x[3]));
    iis3r_c(x, y, &nx, bpar, c__, &ierr);

    m = 8;
    iis4r_c(x, y, &nx, c__, u, s, &m, &ierr);

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


Результаты:  

      ierr =0  

      s(1)  =    -2.125         s(5)  =  -5.479
      s(2)  =   10.625         s(6)  =   1.000
      s(3)  =    -7.000         s(7)  =  -7.177
      s(4)  =   21.709         s(8)  =  -3.928