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

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

Назначение

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

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

Задача решается аналогично случаю функции одной переменной.

Подробное изложение решения дано в работах  [1,2] и в описании подпрограммы iac1r_c.

1.  Гребенников А.И., Казе В.О. - Л. Быстрые алгоритмы аппроксимации функции сплайнами и решение некоторых прикладных задач. - Методы и алгоритмы в численном анализе. M.: Изд - во МГУ, 1984.
2.  Гребенников А.И. Метод сплайнов и решение некорректных задач теории приближений. M.: Изд - во МГУ, 1983.

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

    int iac2r_c (real *x, integer *nx, real *y, integer *ny,
            real *fxy, integer *nfx, integer *nfy, integer *lx, integer *ly,
            integer *mxa, real *fxa, integer *mxb, real *fxb, integer *mya,
            real *fya, integer *myb, real *fyb, real *tx, real *ty, real *cxy,
            integer *ncx, integer *ncy, real *cy)

Параметры

x - вещественный вектоp длины  nx, содержащий значения узлов исходной сетки по  x;
nx - заданное число узлов исходной сетки по  x,  nx ≥ 4 (тип: целый);
y - вещественный вектоp длины  ny, содержащий значения узлов исходной сетки по  y;
ny - заданное число узлов исходной сетки по  y,  ny ≥ 4 (тип: целый);
fxy - вещественный двумерный массив, содержащий значения функции в узлах сетки, размерностью  nfx * nfy;
nfx - заданное число стpок массива  fxy,  nfx ≥ nx (тип: целый);
nfy - заданное число столбцов массива  fxy,  nfy ≥ ny (тип: целый);
lx - заданное число, порядок аппроксимирующих формул по  x,  0 ≤ lx ≤ 1 (тип: целый);
ly - заданное число, порядок аппроксимирующих формул по  y,  0 ≤ ly ≤ 1 (тип: целый);
mxa - заданное число, определяющее периодичность функции по  x или тип краевых условий на левом конце отрезка по  x,  0 ≤ mxa ≤ 3 (тип: целый);
mxa =  3 - периодическая функция,
mxa =  0 - условие интерполяции,
mxa=1,2 - задана производная порядка (mxa, 0);
fxa - вещественный вектоp длины  ny, содержащий значения производной порядка  (mxa, 0) на левом конце отрезка по  x (используется, если  mxa = 1, 2);
mxb - заданное число, определяющее тип краевых условий на правом конце отрезка по  x,  0 ≤ mxb ≤ 2 (тип: целый) (используется, если  mxa < 3);
mxb =  0 - условие интерполяции,
mxb=1,2 - задана производная порядка (mxb, 0);
fxb - вещественный массив длины  ny, содержащий значения производной порядка (mxb, 0) на правом конце отрезка по  x (используется, если  mxb = 1, 2);
mya - заданное число, определяющее периодичность функции по  y или тип краевых условий на левом конце отрезка по  y,  0 ≤ mya ≤ 3 (тип: целый);
mya =  3 - периодическая функция,
mya =  0 - условие интерполяции,
mya=1,2 - задана производная порядка (mya, 0);
fya - вещественный вектоp длины  nx, содержащий значения производной порядка (mya, 0) на левом конце отрезка по  y (используется, если  mya = 1, 2);
myb - заданное число, определяющее тип краевых условий на правом конце отрезка по  y,  0 ≤ myb ≤ 2 (тип: целый) (используется, если  mya < 3);
myb =  0 - условие интерполяции,
myb=1,2 - задана производная порядка (myb, 0);
fyb - вещественный массив длины  nx, содержащий значения производной порядка (myb, 0) на правом конце отрезка по  y (используется, если  myb = 1, 2);
tx - вещественный вектоp длины  nx + 4, содержащий вычисленные значения узлов сетки сплайна по  x;
ty - вещественный вектоp длины  ny + 4, содержащий вычисленные значения узлов сетки сплайна по  y;
cxy - вещественный двумерный массив, содержащий вычисленные коэффициенты сплайна размерностью  ncx * ncy;
ncx - заданное число стpок массива  cxy,  ncx ≥ nx + 4 (тип: целый);
ncy - заданное число столбцов массива  cxy,  ncy ≥ ny + 4 (тип: целый);
cy - вещественный рабочий вектоp длины  max (nx, ny) + 4.

Версии: нет

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

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

  Подпрограмма использует рабочие подпрограммы - функции и подпрограммы iac1r1_c, iac1r2_c, iac1r3_c, iac1r4_c и ias1r2_c.

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

int main(void)
{
    /* Initialized data */
    static float x[4] = { 2.f,3.f,4.f,5.f };
    static float y[4] = { 2.f,3.f,5.f,6.f };
    static float fxa[4] = { 24.f,36.f,60.f,72.f };
    static float fxb[4] = { 60.f,90.f,150.f,180.f };

    /* System generated locals */
    float r__1;

    /* Local variables */
    extern int iac2r_c(float *, int *, float *, int *, float *, int *,
                       int *, int *, int *, int *, float *, int *, float *,
                       int *, float *, int *, float *, float *, float *,
                       float *, int *, int *, float *);
    static int i__, j;
    static float cy[8], tx[8], ty[8], cxy[64] /* was [8][8] */,
                                      fxy[16] /* was [4][4] */;

#define cxy_ref(a_1,a_2) cxy[(a_2)*8 + a_1 - 9]
#define fxy_ref(a_1,a_2) fxy[(a_2)*4 + a_1 - 5]

    for (i__ = 1; i__ <= 4; ++i__) {
        for (j = 1; j <= 4; ++j) {
/* Computing 3rd power */
            r__1 = x[i__ - 1];
            fxy_ref(i__, j) = y[j - 1] * (r__1 * (r__1 * r__1));
/* l10: */
        }
    }
    iac2r_c(x, &c__4, y, &c__4, fxy, &c__4, &c__4, &c__1, &c__1, &c__1, fxa,
            &c__2, fxb, &c__0, x, &c__0, x, tx, ty, cxy, &c__8, &c__8, cy);

    printf("\n  tx = %8.2f %8.2f %8.2f %8.2f %8.2f %8.2f %8.2f %8.2f \n",
                tx[0], tx[1], tx[2], tx[3], tx[4], tx[5], tx[6], tx[7]);
    printf("\n  ty = %8.2f %8.2f %8.2f %8.2f %8.2f %8.2f %8.2f %8.2f \n",
                ty[0], ty[1], ty[2], ty[3], ty[4], ty[5], ty[6], ty[7]);
    printf("\n  cxy \n");
    for (i__ = 1; i__ <= 6; ++i__) {
       printf("\n %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f \n",
              cxy_ref(i__,1), cxy_ref(i__,2), cxy_ref(i__,3), cxy_ref(i__,4),
              cxy_ref(i__,5), cxy_ref(i__,6));
    }
    return ;
} /* main */


Результаты:

       tx  =  ( 0.00  1.00  2.00  3.00  4.00  5.00  6.00  7.00 )
       ty  =  ( 0.00  1.00  2.00  3.00  5.00  6.00  7.00  8.00 )

       cxy  =  (   0.00    0.00    0.00    0.00     0.00     0.00 )
       cxy  =  (   6.00   12.00   20.00   28.00    36.00    42.00 )
       cxy  =  (  24.00   48.00   80.00  112.00   144.00   168.00 )
       cxy  =  (  60.00  120.00  200.00  280.00   360.00   420.00 )
       cxy  =  ( 120.00  240.00  400.00  560.00   720.00   840.00 )
       cxy  =  ( 210.00  420.00  700.00  980.00  1260.00  1470.00 )