|
Документ взят из кэша поисковой машины. Адрес
оригинального документа
: http://num-anal.srcc.msu.ru/lib_na/cat/zf_htm_c/zf13r_c.htm
Дата изменения: Tue Apr 28 08:30:21 2015 Дата индексирования: Sun Apr 10 02:39:37 2016 Кодировка: Windows-1251 |
|
Текст подпрограммы и версий zf13r_c.zip zf13d_c.zip |
Тексты тестовых примеров tzf13r_c.zip tzf13d_c.zip |
Вычисление нулей вещественной функции методом Мюллера, когда начальное приближение нулей плохое.
zf13r_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 ) + ЕРS2, где EPS2 также задается перед обращением к подпрограмме. Таким образом, EPS1 и EPS2 определяют критерий отделения кратных нулей.
B.Leavenworth, Algorithm 25: Real Zeros of an Arbitrary Function, Comm. of the A.C.M, 3 (11), 1960.
int zf13r_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 - | целая переменная, значение которой в результате работы подпрограммы полагается равным 1, если хотя бы один нуль не может быть посчитан в пределах заданного числа итераций; соответствующая компонента вектоpа root полагается равной 3.4e38. |
Версии
| zf13d_c - | вычисление нулей вещественной функции методом Мюллера с повышенной точностью, когда начальное приближение нулей плохое. При этом eps, eps1, eps2, а также вектоp root должны иметь тип double. |
Вызываемые подпрограммы
| utzf10_c - | подпрограмма выдачи диагностических сообщений при работе подпрограммы zf13r_c. |
| utzf11_c - | подпрограмма выдачи диагностических сообщений при работе подпрограммы zf13d_c. |
Замечания по использованию
|
При обращении к подпрограмме может быть задан только первый критерий сходимости (тогда ndig задается равным 0), либо только второй критерий (тогда eps задается равным 0), либо оба критерия одновременно. Пусть xi - 1 и xi являются двумя последовательными приближениями к j - му нулю функции, то xi принимается за искомый нуль, если выполнен один из двух критериев сходимости | F(xi) | ≤ | eps | или | xi-1 - xi | < | xi | * 10 (- ndig ) .Если в zp13d_c хотя бы один нуль не может быть посчитан в пределах заданного числа итераций, то соответствующая компонента вектоpа root полагается равной 1.7e308 и ierr = 1. |
int main(void)
{
/* Local variables */
static int ndig, ierr;
extern int zf13r_c(R_fp, int *, float *, int *, float *, float *,
float *, int *, int *);
static float root[2];
extern float f_c();
static int n, itmax;
static float eps, eps1, eps2;
ndig = 5;
eps1 = 1e-5f;
itmax = 100;
eps = eps1;
eps2 = .01f;
root[0] = 4.6f;
root[1] = -193.3f;
n = 2;
zf13r_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 \n", root[0], root[1]);
return 0;
} /* main */
float f_c(float *x)
{
/* System generated locals */
float ret_val;
ret_val = *x * *x + *x * 2.f - 6.f;
return ret_val;
} /* f_c */
Результаты: root(1) = 1.645751 , root(2) = - 3.645751 ,
itmax = 4