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

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

Назначение

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

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

Пусть задана действительная фyнkция F (X, Y), принадлежащая к классу (2*LX + 2, 2*LY + 2) раз дифференцируемых функций, где LХ и LY порядки аппроксимирующих формул по X и по Y.

Задача приводится к решению двух одномерных задач с точностью EPS/2, используя оценки погрешности приближения, приведенные в [1].

Единственным требованием является то, что область определения функции должна быть шире области, в которой ищутся оптимальные сетки.

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

1. Завьялов Ю.С., Kвасов Б.И., Мирошниченко В.Л. Методы сплайн - функций. M.: Hаука, 1980.

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

    int ia11r_c (R_fp xyf, real *ax, real *bx, real *ay,
            real *by, real *eps, integer *lx, integer *ly, integer *idx,
            integer *idy, integer *jx, integer *jy, integer *nx, integer *ny,
            real *tx, real *ty, real *cxy, integer *ncx, integer *ncy, real *cx,
            real *cy)

Параметры

xyf - имя вещественной подпрограммы - функции, вычисляющей значения аппроксимируемой функции;
ax - заданное число, начало отрезка по x (тип: вещественный);
bx - заданное число, конец отрезка по x, bx > ax (тип: вещественный);
ay - заданное число, начало отрезка по y (тип: вещественный);
by - заданное число, конец отрезка по y, by > ay (тип: вещественный);
eps - заданное число, требуемая точность приближения, eps ≥ 2* (10 - 6), (тип: вещественный);
lx - заданное число, порядок аппроксимирующей формулы по x, 0 ≤ lx ≤ 1 (тип: целый);
ly - заданное число, порядок аппроксимирующей функции по y, 0 ≤ ly ≤ 1 (тип: целый);
idx - заданное число, порядок приближаемой производной по x, 0 ≤ idx ≤ lx + 1 (тип: целый);
idy - заданное число, порядок приближаемой производной по y, 0 ≤ idy ≤ ly + 1 (тип: целый);
jx - заданное число, признак формируемой сетки по x, 0 ≤ jx ≤ 1 (тип: целый);
 

jx = 0 - равномерная сетка ;

jx = 1 - неравномерная сетка ;
jy - заданное число, признак формируемой сетки по y, 0 ≤ jy ≤ 1 (тип: целый);
 

jy = 0 - равномерная сетка ;

jy = 1 - неравномерная сетка;
nx - целое число узлов равномерной сетки по x, на котоpом получают оценки нужных производных, 6 ≤ nx ≤ ncx - 8; на выходе содержит значение оптимального числа узлов по x;
ny - целое число узлов равномерной сетки по y, на котоpом получают оценки нужных производных, 6≤ny≤ncy-8; на выходе содержит значение оптимального числа узлов по y;
tx - вещественный вектоp длины ncx, содержащий nx + 4 вычисленных значений узлов сетки по x;
ty - вещественный вектоp длины ncy, содержащий ny + 4 вычисленных значений узлов сетки по y;
cxy - вещественный двумерный массив, содержащий вычисленные коэффициенты сплайна размерностью ncx*ncy;
ncx - заданное число стpок массива cxy, ncx ≥ 14 (тип: целый);
ncy - заданное число стpок массива cxy, ncy ≥ 14 (тип: целый);
cx - вещественный рабочий вектоp длины ncx;
cy - вещественный рабочий вектоp длины ncy.

Версии: нет

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

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

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

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

int main(void)
{
    /* Local variables */
    extern int ia11r_c(R_fp, float *, float *, float *, float *, float *,
                       int *, int *, int *, int *, int *, int *, int *,
                       int *, float *, float *, float *, int *, int *,
                       float *, float *);
    static int i__;
    static float cx[49], cy[49];
    static int nx, ny;
    static float tx[49], ty[49], cxy[2401]  /* was [49][49] */;
    extern float xyf_c();

    nx = 41;
    ny = 41;
    ia11r_c((R_fp)xyf_c, &c_b1, &c_b2, &c_b1, &c_b2, &c_b5, &c__1, &c__1,
             &c__0, &c__0, &c__1, &c__1, &nx, &ny, tx, ty, cxy, &c__49,
             &c__49, cx, cy);

    printf("\n  tx : \n");
    for (i__ = 0; i__ <= 24; i__+= 4) {
        printf("\n  %12.4e %12.4e %12.4e %12.4e \n",
                    tx[i__], tx[i__+1], tx[i__+2], tx[i__+3]);
    }
    printf("\n  ty : \n");
    for (i__ = 0; i__ <= 24; i__+= 4) {
        printf("\n  %12.4e %12.4e %12.4e %12.4e \n",
                    ty[i__], ty[i__+1], ty[i__+2], ty[i__+3]);
    }
    return 0;
} /* main */

float xyf_c(float *x, float *y)
{
    /* System generated locals */
    float ret_val, r__1, r__2, r__3, r__4;

/* Computing 5th power */
    r__1 = *x, r__2 = r__1, r__1 *= r__1;
/* Computing 5th power */
    r__3 = *y, r__4 = r__3, r__3 *= r__3;
    ret_val = r__2 * (r__1 * r__1) + r__4 * (r__3 * r__3);
    return ret_val;
} /* xyf_c */


Результаты:

                |  -1.1447 -1.0724 -1.0000 -0.9276 -0.8539 -0.7786 -0.7016  |
       tx =   |  -0.6225 -0.5410 -0.4566 -0.3686 -0.2757 -0.1759 -0.0641  |
                |   0.0744   0.1848   0.2840   0.3764  0.4640  0.5481   0.6294  |
                |   0.7083   0.7852   0.8603   0.9339  1.0000  1.0661   1.1322  |

                |  -1.1447 -1.0724 -1.0000 -0.9276 -0.8539 -0.7786 -0.7016  |
       ty =   |  -0.6225 -0.5410 -0.4566 -0.3686 -0.2757 -0.1759 -0.0641  |
                |   0.0744   0.1848   0.2840   0.3764  0.4640  0.5481   0.6294  |
                |   0.7083   0.7852   0.8603   0.9339  1.0000  1.0661   1.1322  |