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

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

Назначение

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

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

Вычисляются значения натypaльнoго бикубического сплайна  S (x, y), соответствующего двумерной сетке {x i, yj},  i = 1, 2, ..., NX,  j = 1, 2, ..., NY, и интерполирующего заданные значения  f i j = f (x i, yj) в узлах сетки на множестве точек (xl m, yl n),  m = 1, 2, ..., NXL,  n = 1, 2, ..., NYL.

Для этого библиотечные подпрограммы i is3r_c и i is4r_c вызываются NY раз для интерполяции в направлении оси  x в точках   (xl i, y j),  i = 1, 2, ..., NXL,  j = 1, 2, ..., NY, а затем  NXL раз для интерполяции в направлении оси  Y в точках (xl i, yl j),  i = 1, 2, ..., NXL,  j = 1, 2, ..., NYL.

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

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

    int iis5r_c (real *f, real *x, integer *nx, real *y,
            integer *ny, real *xl, integer *nxl, real *yl, integer *nyl, real *fl,
            real *wk, integer *ierr)

Параметры

f - вещественный двумерный массив размера  nx * ny, содержащий заданные в узлах двумерной сетки значения интерполируемой функции;
x - вещественный вектоp длины  nx, содержащий заданные значения узлов одномерной сетки по оси  x, и упорядоченный так, что  x (1) < x (2) < ... < x (nx);
nx - заданное число узлов одномерной сетки по оси  x, nx ≥ 2 (тип: целый);
y - вещественный вектоp длины  ny, содержащий заданные значения узлов одномерной сетки по оси  y, и упорядоченный так, что  y (1) < y (2) < ... < y (ny);
ny - заданное число узлов одномерной сетки по оси  y,   ny ≥ 2 (тип: целый);
xl - вещественный вектоp длины  nxl, содержащий заданные абсциссы точек, в которых вычисляются значения интерполяционного натурального бикубического сплайна;
nxl - заданное число элементов вектоpа  xl (тип: целый);
yl - вещественный вектоp длины  nyl, содержащий заданные ординаты точек, в которых вычисляются значения интерполяционного натурального бикубического сплайна;
nyl - заданное число элементов вектоpа  yl (тип: целый);
fl - вещественный двумерный массив размера  nxl * max (nyl, ny), содержащий вычисленные значения интерполяционного натурального бикубического сплайна;
wk - вещественный вектоp длины  max ((nx - 1) * 3, (ny - 1) * 3 + ny), используемый подпрограммой как рабочий;
ierr - целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом:
ierr = 1 - когда одна или несколько заданных точек сетки  xl меньше  x (1) или больше  x (nx);
ierr = 2 - когда одна или несколько заданных точек сетки  yl меньше  y (1) или больше  y (ny);
ierr=65 - когда заданное число узлов сетки по  x меньше 2;
ierr=66 - когда заданное число узлов сетки по  y меньше 2;
ierr=67 - когда элементы вектоpа  x не упорядочены по возрастанию;
ierr=68 - когда элементы вектоpа  y не упорядочены по возрастанию.

Версии: нет

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

i is3r_c - интерполяция кубическим сплайном табличной функции от одной переменной на неравномерной сетке при известных краевых условиях на вторые производные.
i is4r_c - вычисление значений интерполяционного кубического сплайна в заданных точках.
uti i10_c - подпрограмма выдачи диагностических сообщений при работе подпрограммы iis5r_c.

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

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

int main(void)
{
    /* Initialized data */
    static float x[3] = { 1.f,3.f,5.f };
    static float y[3] = { 1.f,3.f,5.f };
    static float f[9] /* was [3][3] */ = { 2.f,4.f,3.f,.5f,1.f,.75f,1.f,2.f,
                                          1.5f };
    static float xl[2] = { 1.f,1.5f };
    static float yl[2] = { 1.5f,2.f };

    /* Local variables */
    static int ierr;
    extern int iis5r_c(float *, float *, int *, float *, int *, float *,
                       int *, float *, int *, float *, float *, int *);
    static int i__;
    static float fl[6]  /* was [2][3] */;
    static float wk[9];
    static int nx, ny, nxl, nyl;

#define fl_ref(a_1,a_2) fl[(a_2)*2 + a_1 - 3]

    nx = 3;
    ny = 3;
    nxl = 2;
    nyl = 2;
    iis5r_c(f, x, &nx, y, &ny, xl, &nxl, yl, &nyl, fl, wk, &ierr);

    printf("\n %5i \n",ierr);
/* l15: */
    for (i__ = 1; i__ <= 2; ++i__) {
        printf("\n  %16.7e %16.7e \n",
               fl_ref(i__, 1), fl_ref(i__, 2));
    }
    return 0;
} /* main */


Результаты:

       ierr  =  0

                   | 1.508   1.062 |
       fl  =      |                       |
                   | 2.017   1.422 |

       S (1., 1.5)    =  1.508
       S (1.5, 1.5)  =  2.017
       S (1., 2.)      =  1.062
       S (1.5, 2.)    =  1.422