Текст подпрограммы и версий ia11r_c.zip |
Тексты тестовых примеров tia11r_c.zip |
Вычисление сеток и коэффициентов бикубического аппроксимирующего сплайна, приближающего заданную функцию двух переменных или ее смешанные производные до второго порядка с заданной точностью.
Пусть задана действительная ф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 |