Подпрограмма: 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 )