|
Текст подпрограммы и версий 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 |