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

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

Назначение

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

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

Пусть задана действительная фyнkция F (X), принадлежащая к классу 2*LX + 2 раз дифференцируемых функций, где LX порядок аппроксимирующей формулы; тогда по оценкам погрешности приближения, полученных в [1], строится оптимальная сетка сплайна из условия заданной точности.

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

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

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

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

    int ia10r_c (R_fp xf, real *ax, real *bx, real *eps,
            integer *lx, integer *idx, integer *jx, integer *nxm, integer *nx,
            real *tx, real *cx)

Параметры

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

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

jx = 1 - неравномерная сетка;
nxm - заданное число максимально допустимых узлов сетки, nxm ≥ 10 (тип: целый);
nx - целое значение числа узлов равномерной сетки, на котоpом получают оценки нужной производной, 6 ≤ nx ≤ nxm - 4 ; на выходе содержит значение оптимального числа узлов;
tx - вещественный вектоp длины nxm + 4, содержащий nx + 4 значений узлов вычисленной оптимальной сетки;
cx - вещественный вектоp длины nxm + 4, содержащий nx + 2 вычисленных значений коэффициентов сплайна.

Версии: нет

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

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

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

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

int main(void)
{
    /* Local variables */
    extern int ia10r_c(R_fp, float *, float *, float *, int *, int *,
                       int *, int *, int *, float *, float *);
    static int i__;
    static float cx[49];
    extern float xf_c();
    static int nx;
    static float tx[49];

    nx = 41;
    ia10r_c((R_fp)xf_c, &c_b1, &c_b2, &c_b3, &c__1, &c__0, &c__1, &c__45, &nx,
            tx, cx);

    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  cx : \n");
    for (i__ = 0; i__ <= 20; i__+= 4) {
        printf("\n  %8.4f %8.4f %8.4f %8.4f \n",
                    cx[i__], cx[i__+1], cx[i__+2], cx[i__+3]);
    }
    printf("\n  %8.4f %8.4f \n",cx[24], cx[25]);
    return ;
} /* main */

float xf_c(float *x)
{
    /* System generated locals */
    float ret_val, r__1, r__2;

/* Computing 5th power */
    r__1 = *x, r__2 = r__1, r__1 *= r__1;
    ret_val = r__2 * (r__1 * r__1);
    return ret_val;
} /* xf_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.3966 -0.9825 -0.6709 -0.4410 -0.2759 -0.1621 -0.0876  |
       cx =   |  -0.0423 -0.0172 -0.0052 -0.0008   0.0001  0.0000 -0.0000  |
                 |  -0.0001  0.0010  0.0059   0.0184   0.0453  0.0928  0.1702  |
                 |   0.2879  0.4581   0.6877   0.9854   1.3594                           |