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

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

Назначение

Вычисление нулей комплексной функции методом Мюллера.

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

zf12c_c вычисляет нули комплексной функции Y = F (Z), используя метод Мюллера.

D.E.Muller, A Method for Solving Algebraic Equations Using an Automatic Computer, Math. Tab. Wash., 10, 1956.

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

    int zf12c_c (C_fp f, integer *k, integer *ng, integer *n,
                 real *eps, integer *ndig, complex *croot, integer *iter,
                 integer *itmax, integer *ierr)

Параметры

f - имя комплексной подпрограммы - функции вычисления  F (Z);
k - число известных нулей функции, значения которых должны быть помещены перед началом работы подпрограммы в следующие компоненты вектоpа croot: croot (1), croot (2), ..., croot (k) (см. ниже) (тип: целый);
ng - число известных начальных приближений к искомым нулям функции, значения которых должны быть помещены перед началом работы подпрограммы в следующие компоненты вектоpа croot: croot (k + 1), croot (k + 2), ..., croot (k + ng) (см. ниже) (тип: целый);
n - заданное число искомых нулей функции (тип: целый);
eps - первый критерий сходимости: заданная абсолютная погрешность вычисления нулей функции (тип: вещественный);
ndig - второй критерий сходимости: заданное число значащих цифр, с которыми предполагается вычислять нули функции (тип: целый);
croot - комплексный вектоp длины k + n, содержащий вычисленные нули функции; компоненты этого вектоpа croot (1), croot (2), ..., croot (k) содержат значения нулей функции, известных до начала работы подпрограммы, а компоненты croot (k + 1), croot (k + 2), ..., croot (k + n) по окончании работы подпрограммы содержат искомые нули, при этом компоненты croot (k + 1), croot (k + 2), ..., croot (k + ng) перед началом работы подпрограммы могут содержать начальные приближения к искомым нулям;
iter - целый вектоp длины k + n,  j - я компонента которого содержит число итераций, потребовавшихся для нахождения  j - го нуля функции в соответствии с заданными критериями сходимости;
itmax - целая переменная, значение которой перед началом работы подпрограммы должно быть положено равным максимальному числу итераций, ориентировочно требуемых для обеспечения сходимости;
ierr - целая переменная, значение которой в результате работы подпрограммы полагается равным 1, если хотя бы один нуль функции не может быть посчитан в пределах заданного числа итераций.

Версии: нет

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

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

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

 

Если ни один из нулей функции перед началом работы подпрограммы не известен, то значение  k полагается равным 0. Точно так же, значение ng должно быть положено pавным 0, если не известно ни одно из приближений к искомым нулям функции. При обращении к подпрограмме может быть задан только первый критерий сходимости (тогда ndig задается равным 0), либо оба критерия одновременно.

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

       | F(zi) | ≤ | eps |   или   | zi-1 - zi | < | zi | * 10 (- ndig ) . 

Если при вычислении  j - го нуля функции заданные критерии сходимости не выполняются, то iter (j) полагается равным либо itmax + 1, либо itmax + l, где l > 1.

В случае, когда iter (j) = itmax + 1, то это означает, что zf12c_c не в состоянии удовлетворить заданным критериям сходимости в пределах itmax итераций (рекомендуется увеличить значение itmax).

Если iter (j) = itmax + l, то это означает, что сходимость была достигнута за  l итераций для функции

       FP(Z) = F(Z) / ( (Z - root(1)) ... (Z - root(j-1)) )  ,   
но не была достигнута для функции  F (Z). B этом случае можно попытаться задать более лучшие начальные приближения либо смягчить критерии сходимости.

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

int main(void)
{
    /* Local variables */
    static int ndig;
    extern int zf12c_c(C_fp, int *, int *, int *, float *, int *,
                       complex *, int *, int *, int *);
    static int ierr, iter[5];
    extern /* Complex */ void f_c();
    static int i__, k, n, itmax;
    static complex croot[5];
    static int ng;
    static float eps;

    eps = 0.f;
    ndig = 5;
    k = 0;
    ng = 0;
    n = 5;
    itmax = 200;
    zf12c_c((C_fp)f_c, &k, &ng, &n, &eps, &ndig, croot, iter, &itmax, &ierr);

    printf("\n %5i %5i %5i \n", k, ng, n);
    printf("\n %16.7e \n", eps);
    printf("\n %5i %5i %5i \n", ndig, itmax, ierr);
    for (i__ = 1; i__ <= 5; ++i__) {
         printf("\n %16.7e %16.7e \n", croot[i__ - 1].r, croot[i__ - 1].i);
    }
    printf("\n %5i \n", itmax);
    printf("\n %5i %5i %5i %5i %5i \n",
           iter[0], iter[1], iter[2], iter[3], iter[4]);
    return 0;
} /* main */

/* Complex */ void f_c(complex * ret_val, complex *z__)
{
    /* System generated locals */
    complex q__1, q__2;

    /* Builtin functions */
    void pow_ci(complex *, complex *, int *);

    /* Local variables */
    static complex one;

    one.r = 1.f, one.i = 0.f;
    pow_ci(&q__2, z__, &c__5);
    q__1.r = q__2.r - one.r, q__1.i = q__2.i - one.i;

    ret_val->r = q__1.r,  ret_val->i = q__1.i;
    return ;
} /* f_c */


Результаты:

       croot(1)  =  (- 0.809017,   0.587785) , 
       croot(2)  =  (  0.309017, - 0.951056) , 
       croot(3)  =  (  0.309017,   0.951056) , 
       croot(4)  =  (- 0.809017, - 0.587785) , 
       croot(5)  =  ( 1.0,  0.0)
       
       iter  =  (26,  10,  10,  4,  4)