Текст подпрограммы и версий ias2r_c.zip |
Тексты тестовых примеров tias2r_c.zip |
Вычисление значения бикубического аппроксимирующего сплайна или его смешанных производных до третьего порядка при заданных значениях аргументов на заданных (возможно неравномерных) сетках при заданных коэффициентах.
B силу свойств бикубических сплайнов решение этой задачи приводится к решению пяти одномерных задач, решение которых изложено в описании подпрограммы - функции ias1r_c.
Hа первых четырех этапах фиксируется индекс по Y, а на пятом этапе используются четыре полученных значения.
real ias2r_c (real *tx, integer *nx, real *ty, integer *ny, real *cxy, integer *ncx, integer *ncy, integer *idx, integer *idy, real *xx, real *yy)
Параметры
tx - | вещественный вектоp длины nx + 4, содержащий значения узлов сетки сплайна по x; |
nx - | заданное число узлов исходной сетки по x, nx ≥ 4 (тип: целый); |
ty - | вещественный вектоp длины ny + 4, содержащий значения узлов сетки сплайна по y; |
ny - | заданное число узлов исходной сетки по y, ny ≥ 4 (тип: целый); |
cxy - | вещественный двумерный массив, содержащий значения коэффициентов сплайна, размерностью ncx * ncy; |
ncx - | заданное число стpок массива cxy, ncx ≥ nx + 2 (тип: целый); |
ncy - | заданное число столбцов массива cxy, ncy ≥ ny + 2 (тип: целый); |
idx - | заданный порядок вычисляемой производной по x, 0 ≤ idx ≤ 3 (тип: целый); |
idy - | заданный порядок вычисляемой производной по y, 0 ≤ idy ≤ 3 (тип: целый); |
xx - | заданное значение аргумента по x, при котоpом производятся вычисления, tx (3) ≤ xx ≤ tx (nx + 2) (тип: вещественный); |
yy - | заданное значение аргумента по y, при котоpом производятся вычисления, ty (3) ≤ yy ≤ ty (ny + 2) (тип: вещественный). |
Версии: нет
Вызываемые подпрограммы: нет
Замечания по использованию
Подпрограмма - функция использует рабочие подпрограммы-функции ias1r1_c и ias1r2_c. Для вычисления сеток и коэффициентов сплайна рекомендуется воспользоваться подпрограммой iac2r_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 }; /* 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 *); extern float ias2r_c(float *, int *, float *, int *, float *, int *, int *, int *, int *, float *, float *); static int i__, j; static float s, cy[8], tx[8], ty[8], cxy[64] /* was [8][8] */, fxy[16] /* was [4][4] */; float r__1; #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); s = (float)ias2r_c(tx, &c__4, ty, &c__4, cxy, &c__8, &c__8, &c__2, &c__0, &c_b20, &c_b21); printf("\n %16.7e \n",s); return ; } /* main */ Результат: s = 51.840