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

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

Назначение

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

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

Вычисляются значения натypaльнoго бикубического сплайна  S (x, y), соответствующего двумерной сетке {x i, yi} и интерполирующего заданные значения табличной функции  f i j = f (x i, yj),   i = 1, 2, ..., NX,  j = 1, 2, ..., NY, в заданной точке  (x l, yl) элементарного прямоугольника

 R = [x lx, x lx + 1] * [yly, yly + 1]   по формуле :
                         4       4            
     S (x l, yl)  =  ∑     ∑   CRm n ( x l - x lx )m -1 ( yl - yly )n - 1 ;
                       m = 1  n = 1
         1 ≤ lx ≤ NX  ,   1 ≤ ly ≤ NY  , 

где  lx, ly - заданные индексы, а  CRm n,   n, m = 1, 2, 3, 4 - заданные коэффициенты, определяющие натуральный бикубический сплайн в этом прямоугольнике.

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

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

    int iis7r_c (real *x, integer *nx, real *y, integer *ny,
            integer *lx, integer *ly, real *c, real *xl, real *yl, real *fl, 
            integer *ierr)

Параметры

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 (тип: целый);
lx - заданное число, определяющее элементарный прямоугольник  R по оси  x, 1 ≤ lx < nx (тип: целый);
ly - заданное число, определяющее элементарный прямоугольник  R по оси  y, 1 ≤ ly < ny (тип: целый);
c - вещественный двумерный массив размера 4 * 4,  содержащий  заданные  в  элементарном  прямоугольнике  R = [x lx, x lx + 1] * [yly, yly + 1]  коэффициенты сплайна;
xl - заданная абсцисса точки, в которой вычисляется значение интерполяционного натурального бикубического сплайна,  x (lx) ≤ xl ≤ x (lx + 1) (тип: вещественный);
yl - заданная ордината точки, в которой вычисляется значение интерполяционного натурального бикубибического сплайна,  y (ly) ≤ yl ≤ y (ly + 1) (тип: вещественный);
fl - вычисленное значение интерполяционного натурального бикубического сплайна в точке  (xl, yl) (тип: вещественный);
ierr - целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом:
ierr= 1 - когда абсцисса  xl заданной точки  (xl, yl) меньше  x (lx) или больше  x (lx + 1);
ierr= 2 - когда ордината  yl заданной точки  (xl, yl) меньше  y (ly) или больше  y (ly + 1);
ierr=65 - когда заданное число узлов сетки по  x меньше 2;
ierr=66 - когда заданное число узлов сетки по  y меньше 2;
ierr=67 - когда элементы вектоpа  x не упорядочены по возрастанию;
ierr=68 - когда элементы вектоpа  y не упорядочены по возрастанию;
ierr=69 - когда  lx ≥ nx или  lx < 1;
ierr=70 - когда  ly ≥ ny или  ly < 1.

Версии: нет

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

uti i10_c - подпрограмма выдачи диагностических сообщений при работе подпрограммы i is7r_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 };

    /* Local variables */
    static int ierr;
    extern int iis6r_c(float *, float *, int *, float *, int *, int *,
                       int *, float *, float *, int *),
               iis7r_c(float *, int *, float *, int *, int *, int *, float *,
                       float *, float *, float *, int *);
    static float c__[16] /* was [4][4] */, fl, wk[26];
    static int lx, ly, nx, ny;
    static float xl, yl;

    nx = 3;
    ny = 3;
    lx = 1;
    ly = 1;
    iis6r_c(f, x, &nx, y, &ny, &lx, &ly, c__, wk, &ierr);
    xl = 1.5f;
    yl = 1.5f;
    iis7r_c(x, &nx, y, &ny, &lx, &ly, c__, &xl, &yl, &fl, &ierr);

    printf("\n %5i \n",ierr);
    printf("\n %16.7e \n",fl);
    return 0;
} /* main */


Результаты:    ierr  =  0 ,    fl    =  2.017