Текст подпрограммы и версий
zf18r_c.zip  zf18d_c.zip 
Тексты тестовых примеров
tzf18r_c.zip  tzf18d_c.zip 

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

Назначение

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

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

zf18r_c определяет границы интервала (A, B), на котором вещественная функция  y = F (x) меняет знак. На входе в подпрограмму задаются предположительные границы интервала (A, B), длина которого увеличивается в FACT раз до тех пор, пока не будет получен интервал (A, B), на котором  F (x) меняет знак, либо пока не будет превзойдено заданное количество итераций.

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

    int zf18r_c (R_fp f, real *a, real *b, real *fact, integer *n,
            integer *ierr)

Параметры

f - имя вещественной подпрограммы - функции вычисления  F (x);
a, b - вещественные переменные, содержащие на входе в подпрограмму предположительные границы интервала, а на выходе - найденные границы интервала, на котором  F (x) меняет знак;
fact - множитель, определяющий, во сколько раз должен увеличиваться текущий интервал (a, b) на каждом шаге итерации, fact > 1 (тип: вещественный);
n - заданное максимальное количество увеличений первоначального интервала (a, b) (тип: вещественный);
ierr - целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом
ierr=65 - когда границы первоначального интервала совпадают;
ierr=66 - когда интервал, на котором  F (x) меняет знак, не найден за заданное количество итераций  n .

Версии

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

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

utzf10_c - подпрограмма выдачи диагностических сообщений при работе подпрограммы zf18r_c
utzf11_c - подпрограмма выдачи диагностических сообщений при работе подпрограммы zf18d_c

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

  В подпрограммах zf18r_c и zf18d_c имеется внешняя структура с именем zf18rr_ , содержащая элемент целого типа nreal. Переменная nreal полагается равной выполненному количеству увеличений первоначального интервала (a, b) .

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

struct {
    int nreal;
} zf18rr_;

#define zf18rr_1 zf18rr_

int main(void)
{
    /* Local variables */
    static float fact;
    static int ierr;
    extern int zf18r_c(R_fp, float *, float *, float *, int *, int *);
    static float a, b;
    extern float f_c();
    static int n;

    fact = 1.1f;
    n = 50;
    a = 1.f;
    b = 1.1f;
    zf18r_c((R_fp)f_c, &a, &b, &fact, &n, &ierr);

    printf("\n %16.7e %16.7e \n", a, b);
    printf("\n %5i %5i \n", zf18rr_1.nreal, ierr);
    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 */


Результаты: 

       a = - 0.8448105 
       b = 1.1 
       nreal = 5 

       ierr = 0