Текст подпрограммы и версий zf14r_p.zip zf14e_p.zip |
Тексты тестовых примеров tzf14r_p.zip tzf14e_p.zip |
Вычисление нулей вещественной функции методом Ньютона, когда начальное приближение нулей хорошее.
ZF14R вычисляет 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.
procedure ZF14R(F :Func_F1; N :Integer; EPS :Real; NDIG :Integer; EPS1 :Real; EPS2 :Real; var ROOT :Array of Real; var ITMAX :Integer; var IERR :Integer);
Параметры
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. |
Версии
ZF14E - | вычисление нулей вещественной функции методом Ньютона с расширенной (Extended) точностью, когда начальное приближение нулей хорошее. При этом EPS, EPS1, EPS2, а также вектоp ROOT должны иметь тип Extended. |
Вызываемые подпрограммы
UTZF10 - | подпрограмма выдачи диагностических сообщений при работе подпрограммы ZF14R. |
UTZF11 - | подпрограмма выдачи диагностических сообщений при работе подпрограммы ZF14E. |
Замечания по использованию
При обращении к подпрограмме может быть задан только первый критерий сходимости (тогда NDIG задается равным 0), либо только второй критерий (тогда EPS задается равным 0), либо оба критерия одновременно. Пусть Xi - 1 и Xi являются двумя последовательными приближениями к j - му нулю функции, то Xi принимается за искомый нуль, если выполнен один из двух критериев сходимости | F(Xi) | ≤ | EPS | или | Xi-1 - Xi | < | Xi | * 10 (- NDIG ) .B ZF14E при IERR ≠ 0 соответствующие компоненты вектоpа ROOT полагаются равными 1.7E308 или - 1.7E308. |
Unit TZF14R_p; interface uses SysUtils, Math, LStruct, Lfunc, UtRes_p, FZF14R_p, ZF14R_p; function TZF14R: String; implementation function TZF14R: String; var ITMAX,N,NDIG,_i,IERR :Integer; EPS,EPS1,EPS2 :Real; RООТ :Array [0..2] of Real; begin Result := ''; IТМАХ := 100; N := 3; EPS := 0.00001; EPS1 := EPS; EPS2 := 0.01; NDIG := 5; ROOT[0] := -0.72; ROOT[1] := 0.723; ROOT[2] := 0.0; ZF14R(FZF14R,N,EPS,NDIG,EPS1,EPS2,ROOT,ITMAX,IERR); Result := Result + Format('%10d %20.16f %20.16f %20.16f %10d %10d %10d',[N,EPS,EPS1,EPS2,NDIG,ITMAX,IERR]) + #$0D#$0A; Result := Result + #$0D#$0A; for _i:=0 to 2 do begin Result := Result + Format('%20.16f ',[ROOT[_i]]); if ( ((_i+1) mod 1)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; UtRes('TZF14R',Result); //вывод результатов в файл TZF14R.res exit; end; end. Unit FZF14R_p; interface uses SysUtils, Math, { Delphi } LStruct, Lfunc; function FZF14R(X :Real): Real; implementation function FZF14R(X :Real): Real; begin Result := -4.0*IntPower(X,3)+3.0*X; end; end. Результаты: ROOT(1) = - 0.866025 , ROOT(2) = 0.866025 , ROOT(3) = 0.0 , ITMAX = 1 , IERR = 0