|
Документ взят из кэша поисковой машины. Адрес
оригинального документа
: http://num-anal.srcc.msu.su/lib_na/cat/zf_htm_c/zf12c_c.htm
Дата изменения: Mon Mar 16 16:01:40 2015 Дата индексирования: Sun Apr 10 02:00:18 2016 Кодировка: Windows-1251 |
|
Текст подпрограммы и версий 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)