Текст подпрограммы и версий
zf14r_p.zip  zf14e_p.zip 
Тексты тестовых примеров
tzf14r_p.zip  tzf14e_p.zip 

Подпрограмма:  ZF14R (модуль ZF14R_p)

Назначение

Вычисление нулей вещественной функции методом Ньютона, когда начальное приближение нулей хорошее.

Математическое описание

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