Текст подпрограммы и версий
zf14r_c.zip  zf14d_c.zip 
Тексты тестовых примеров
tzf14r_c.zip  tzf14d_c.zip 

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

Назначение

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

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

zf14r_c вычисляет  N вещественных нулей вещественной функции Y = F (Х), когда начальное приближение нулей ROOT (1), ROOT (2), ..., ROOT (N) хорошее, используя метод Ньютона.

Алгоритм, реализованный в подпрограмме, предполагает, что у функции  F (X) существует  N различных вещественных нулей, при этом ни один изолированный нуль не может быть получен из двух различных элементов вектоpа ROOT, содержащего начальные приближения.

Для достижения этой цели, а также для того, чтобы избежать нахождения кратных нулей, после вычисления очередного  I - го нуля производится проверка, не слишком ли он близок к уже вычисленным нулям:

(1)       | ROOT( I ) - ROOT( J ) | < | EPS1 |  ,       J = 1, 2,..., I - 1  , 

где EPS1 задается перед обращением к подпрограмме. Если условие (1) выполнено для какого - нибудь  J, вычисление  I - го нуля возобновляется с начальным приближением ROOT ( I ) + EPS2, где ЕРS2 также задается перед обращением к подпрограмме. Таким образом, EPS1 и EPS2 определяют критерий отделения кратных нулей.

Алгоритм предполагает достаточную близость начальных приближений к искомым нулям для обеспечения сходимости метода Ньютона.

И.С.Березин, Н.П.Жидков, Методы вычислений, т.1, "Hаука", M., 1966.

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

    int zf14r_c (R_fp f, integer *n, real *eps, integer *ndig,
            real *eps1, real *eps2, real *root, integer *itmax, integer *ierr)

Параметры

f - имя вещественной подпрограммы - функции вычисления  F (x);
n - заданное число искомых нулей функции (тип: целый);
eps - первый критерий сходимости: заданная абсолютная погрешность вычисления нулей функции (тип: вещественный);
ndig - второй критерий сходимости: заданное число значащих цифр, с которыми предполагается вычислить нули функции (тип: целый);
eps1 -
eps2  
определяют критерий отделения кратных корней (тип: вещественный);
root - вещественный вектоp длины  n, в который в pезультате работы подпрограммы помещаются вычисленные нули функции; перед началом работы подпрограммы вектоp root содержит начальные приближения к искомым нулям;
itmax - целая переменная, значение которой перед началом работы подпрограммы должно быть положено равным максимальному числу итераций, ориентировочно требуемых для обеспечения сходимости; в pезультате работы подпрограммы ее значение полагается равным числу итераций, проводившихся при нахождении последнего нуля;
ierr - целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы: при этом:
ierr= 1 - когда хотя бы один нуль не может быть посчитан в пределах заданного числа итераций; соответствующая компонента вектоpа root полагается равной 3.4e38;
ierr= 2 - когда производная функции при нахождении хотя бы одного нуля становится слишком малой; соответствующая компонента вектоpа root полагается равной 3.4e38;
ierr= 3 - когда несколько описанных выше ошибочных ситуаций имело место; соответствующие компоненты вектоpа root полагаются равными либо 3.4e38, либо - 3.4e38.

Версии

zf14d_c - вычисление нулей вещественной функции методом Ньютона с повышенной точностью, когда начальное приближение нулей хорошее. При этом eps, eps1, eps2, а также вектоp root должны иметь тип double.

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

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

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

 

При обращении к подпрограмме может быть задан только первый критерий сходимости (тогда ndig задается равным 0), либо только второй критерий (тогда eps задается равным 0), либо оба критерия одновременно.

Пусть  xi - 1 и  xi являются двумя последовательными приближениями к  j - му нулю функции, то  xi принимается за искомый нуль, если выполнен один из двух критериев сходимости

       | F(xi) | ≤ | eps |   или   | xi-1 - xi | < | xi | * 10 (- ndig ) . 
B zf14d_c при ierr ≠ 0 соответствующие компоненты вектоpа root полагаются равными 1.7e308 или - 1.7e308.

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

int main(void)
{
    /* Local variables */
    static int ndig, ierr;
    extern int zf14r_c(R_fp, int *, float *, int *, float *, float *,
                       float *, int *, int *);
    static float root[3];
    extern float f_c();
    static int n, itmax;
    static float eps, eps1, eps2;

    itmax = 100;
    n = 3;
    eps = 1e-5f;
    eps1 = eps;
    eps2 = .01f;
    ndig = 5;
    root[0] = -.72f;
    root[1] = .723f;
    root[2] = 0.f;
    zf14r_c((R_fp)f_c, &n, &eps, &ndig, &eps1, &eps2, root, &itmax, &ierr);

    printf("\n %5i \n", n);
    printf("\n %16.7e \n", eps);
    printf("\n %16.7e \n", eps1);
    printf("\n %16.7e \n", eps2);
    printf("\n %5i %5i %5i \n", ndig, itmax, ierr);
    printf("\n %16.7e %16.7e %16.7e \n", root[0], root[1], root[2]);
    return 0;
} /* main */

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

/* Computing 3rd power */
    r__1 = *x;
    ret_val = r__1 * (r__1 * r__1) * -4.f + *x * 3.f;
    return ret_val;
} /* f_c */


Результаты:  

       root(1)  =  - 0.866025 ,  root(2)  =  0.866025 ,  root(3)  =  0.0 ,
       itmax  =  1 ,   ierr  =  0