Текст подпрограммы и версий zf14r_c.zip zf14d_c.zip |
Тексты тестовых примеров tzf14r_c.zip tzf14d_c.zip |
Вычисление нулей вещественной функции методом Ньютона, когда начальное приближение нулей хорошее.
zf14r_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 ) + EPS2, где ЕРS2 также задается перед обращением к подпрограмме. Таким образом, EPS1 и EPS2 определяют критерий отделения кратных нулей.
Алгоритм предполагает достаточную близость начальных приближений к искомым нулям для обеспечения сходимости метода Ньютона.
И.С.Березин, Н.П.Жидков, Методы вычислений, т.1, "Hаука", M., 1966.
int zf14r_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 - | целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы: при этом: |
ierr= 1 - | когда хотя бы один нуль не может быть посчитан в пределах заданного числа итераций; соответствующая компонента вектоpа root полагается равной 3.4e38; |
ierr= 2 - | когда производная функции при нахождении хотя бы одного нуля становится слишком малой; соответствующая компонента вектоpа root полагается равной 3.4e38; |
ierr= 3 - | когда несколько описанных выше ошибочных ситуаций имело место; соответствующие компоненты вектоpа root полагаются равными либо 3.4e38, либо - 3.4e38. |
Версии
zf14d_c - | вычисление нулей вещественной функции методом Ньютона с повышенной точностью, когда начальное приближение нулей хорошее. При этом eps, eps1, eps2, а также вектоp root должны иметь тип double. |
Вызываемые подпрограммы
utzf10_c - | подпрограмма выдачи диагностических сообщений при работе подпрограммы zf14r_c. |
utzf11_c - | подпрограмма выдачи диагностических сообщений при работе подпрограммы zf14d_c. |
Замечания по использованию
При обращении к подпрограмме может быть задан только первый критерий сходимости (тогда ndig задается равным 0), либо только второй критерий (тогда eps задается равным 0), либо оба критерия одновременно. Пусть xi - 1 и xi являются двумя последовательными приближениями к j - му нулю функции, то xi принимается за искомый нуль, если выполнен один из двух критериев сходимости | F(xi) | ≤ | eps | или | xi-1 - xi | < | xi | * 10 (- ndig ) .B zf14d_c при ierr ≠ 0 соответствующие компоненты вектоpа root полагаются равными 1.7e308 или - 1.7e308. |
int main(void) { /* Local variables */ static int ndig, ierr; extern int zf14r_c(R_fp, int *, float *, int *, float *, float *, float *, int *, int *); static float root[3]; extern float f_c(); static int n, itmax; static float eps, eps1, eps2; itmax = 100; n = 3; eps = 1e-5f; eps1 = eps; eps2 = .01f; ndig = 5; root[0] = -.72f; root[1] = .723f; root[2] = 0.f; zf14r_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 %16.7e \n", root[0], root[1], root[2]); return 0; } /* main */ float f_c(float *x) { /* System generated locals */ float ret_val, r__1; /* Computing 3rd power */ r__1 = *x; ret_val = r__1 * (r__1 * r__1) * -4.f + *x * 3.f; return ret_val; } /* f_c */ Результаты: root(1) = - 0.866025 , root(2) = 0.866025 , root(3) = 0.0 , itmax = 1 , ierr = 0