Документ взят из кэша поисковой машины. Адрес
оригинального документа
: http://num-anal.srcc.msu.su/lib_na/cat/zf_htm_c/zf10r_c.htm
Дата изменения: Tue Apr 28 08:30:16 2015 Дата индексирования: Sun Apr 10 02:00:08 2016 Кодировка: Windows-1251 |
Текст подпрограммы и версий zf10r_c.zip zf10d_c.zip |
Тексты тестовых примеров tzf10r_c.zip tzf10d_c.zip |
Вычисление нуля вещественной функции, меняющей знак на заданном интервале, методом Брента.
zf10r_c вычисляет нуль вещественной функции Y = F (X), меняющей знак на заданном интервале (A, B), т.е. F (A) * F (B) < 0, используя метод Брента.
R.P.Brent, An Algorithm with Guaranteed Convergence for Finding a Zero of a Function, The Computer Journal, 14 (4), 1971.
int zf10r_c (R_fp f, real *a, real *b, real *eps, integer *ndig, integer *itmax, real *root, integer *ierr)
Параметры
f - | имя вещественной подпрограммы - функции вычисления F (x) в любой точке интервала (a, b); |
a, b - | заданная нижняя и верхняя границы интервала, на котоpом F (x) меняет знак (тип: вещественный); |
eps - | первый критерий сходимости: заданная абсолютная погрешность вычисления нуля функции (тип: вещественный); |
ndig - | второй критерий сходимости: заданное число значащих цифр, с которыми предполагается вычислить нуль функции (тип: целый); |
itmax - | целая переменная, значение которой перед началом работы подпрограммы должно быть положено равным максимальному числу итераций, ориентировочно требуемых для обеспечения сходимости; ее значение в результате работы подпрограммы полагается равным действительному числу итераций, потребовавшихся для обеспечения сходимости в соответствии с заданными критериями; |
root - | вещественная переменная, значение которой в pезультате работы подпрограммы полагается равным вычисленному нулю функции F (x); |
ierr - | целая переменная, служащая для сообщения об ошибках, обнаружбнных в ходе работы подпрограммы; при этом |
ierr=65 - | когда нуль функции не может быть посчитан в пределах заданного числа итераций; |
ierr=66 - | когда функция не меняет знака на заданном интервале. |
Версии
zf10d_c - | вычисление нуля вещественной функции, меняющей знак на заданном интервале, методом Брента с повышенной точностью. При этом параметры a, b, eps и root должны иметь тип double, а подпрограмма - функция вычисления F (x) должна быть оформлена как double. |
Вызываемые подпрограммы
utzf10_c - | подпрограмма выдачи диагностических сообщений при работе подпрограммы zf10r_c. |
utzf11_c - | подпрограмма выдачи диагностических сообщений при работе подпрограммы zf10d_c. |
Замечания по использованию
Пусть xi - 1 и xi являются двумя последовательными приближениями к нулю функции F (x). Тогда xi принимается за искомый нуль, если выполнен один из двух критериев сходимости | F(xi) | ≤ | eps | или | xi -1 - xi | < | xi | * 10 (- ndig ) .При обращении к подпрограмме может быть задан только первый критерий сходимости (тогда ndig задается равным 0), либо только второй критерий (тогда eps задается равным 0), либо оба критерия одновременно. |
int main(void) { /* Local variables */ static int ndig, ierr; extern int zf10r_c(R_fp, float *, float *, float *, int *, int *, float *, int *); static float root, a, b; extern float f_c(); static int itmax; static float eps; eps = 1e-5f; ndig = 6; a = -3.3f; b = 4.6f; itmax = 20; zf10r_c((R_fp)f_c, &a, &b, &eps, &ndig, &itmax, &root, &ierr); printf("\n %16.7e %16.7e %16.7e \n", a, b, eps); printf("\n %5i %5i \n", ndig, itmax); printf("\n %16.7e \n", root); printf("\n %5i \n", ierr); 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.64575096 , itmax = 7 , ierr = 0