Текст подпрограммы и версий zf12c_c.zip |
Тексты тестовых примеров tzf12c_c.zip |
Вычисление нулей комплексной функции методом Мюллера.
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)