Текст подпрограммы и версий
zf19r_c.zip  zf19d_c.zip 
Тексты тестовых примеров
tzf19r_c.zip  tzf19d_c.zip 

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

Назначение

Выделение заданного числа интервалов, на которых вещественная функция меняет знак.

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

zf19r_c внутри заданного интервала (A, B) выделяет NB интервалов, на которых вещественная функция  y = F (x) меняет знаки. Интервал (A, B) делится на  N частей, после чего на границах каждого из полученных интервалов проверяются знаки  F (x). Границы интервалов, на которых функция меняет знаки, запоминаются в одномерных массивах  A1 и  B1, а их число помещается в переменную NROOT.

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

    int zf19r_c (R_fp f, real *a, real *b, integer *n, real *a1,
            real *b1, integer *nb, integer *nroot)

Параметры

f - имя вещественной подпрограммы - функции вычисления  F (x);
a, b - границы интервала, внутри которого выделяются искомые интервалы (тип: вещественный);
n - заданное количество разбиений исходного интервала (a, b) (тип: целый);
a1, b1 - вещественные вектора длины nb, в которых помещаются левые и правые границы выделенных интервалов, соответственно;
nb - заданное количество искомых интервалов (тип: целый);
nroot - целая переменная, значение которой полагается равным количеству выделенных интервалов.

Версии

zf19d_c - выделение заданного числа интервалов, на которых вещественная функция меняет знак, в режиме вычислений с удвоенной точностью. При этом параметры a, b, a1 и b1 должны иметь тип double, а подпрограмма - функция вычисления  F (x) должна быть оформлена как double.

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

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

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

int main(void)
{
    /* System generated locals */
    int i__1;

    /* Local variables */
    extern int zf19r_c(R_fp, float *, float *, int *, float *, float *,
                       int *, int *);
    static float a, b;
    extern float f_c();
    static int i__, n;
    static float a1[50], b1[50];
    static int nroot, nb;

    a = -6.2999999999999998f;
    b = 6.2999999999999998f;
    n = 100;
    nb = 50;
    zf19r_c((R_fp)f_c, &a, &b, &n, a1, b1, &nb, &nroot);

    i__1 = nroot;
    for (i__ = 1; i__ <= i__1; ++i__) {
         printf("\n %13.3e \n", a1[i__ - 1]);
    }
    i__1 = nroot;
    for (i__ = 1; i__ <= i__1; ++i__) {
         printf("\n   %13.3e \n", b1[i__ - 1]);
    }
    printf("\n %5i \n", nroot);
    return 0;
} /* main */

float f_c(float *x)
{
    /* System generated locals */
    float ret_val;

    /* Builtin functions */
    double sin(double);

    ret_val = (float)sin(*x);
    return ret_val;
} /* f_c */


Результаты:

       a1  =  ( - 6.3, - 3.15, - 0.235*10 - 5, 3.02, 6.17 ) 
       b1  =  ( - 6.17, - 3.02, 0.126, 3.15, 6.3 ) 

       nroot = 5