Текст подпрограммы и версий
zf10r_p.zip  zf10e_p.zip 
Тексты тестовых примеров
tzf10r_p.zip  tzf10e_p.zip 

Подпрограмма:  ZF10R (модуль ZF10R_p)

Назначение

Вычисление нуля вещественной функции, меняющей знак на заданном интервале, методом Брента.

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

ZF10R вычисляет нуль вещественной функции 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.

Использование

procedure ZF10R(F :Func_F1; var A :Real; var B :Real; EPS :Real;
                NDIG :Integer; var ITMAX :Integer; var ROOT :Real;
                var IERR :Integer);

Параметры

F - имя вещественной подпрограммы - функции вычисления  F (X) в любой точке интервала (A, B);
A, B - заданная нижняя и верхняя границы интервала, на котоpом  F (X) меняет знак (тип: вещественный);
EPS - первый критерий сходимости: заданная абсолютная погрешность вычисления нуля функции (тип: вещественный);
NDIG - второй критерий сходимости: заданное число значащих цифр, с которыми предполагается вычислить нуль функции (тип: целый);
ITMAX - целая переменная, значение которой перед началом работы подпрограммы должно быть положено равным максимальному числу итераций, ориентировочно требуемых для обеспечения сходимости; ее значение в результате работы подпрограммы полагается равным действительному числу итераций, потребовавшихся для обеспечения сходимости в соответствии с заданными критериями;
ROOT - вещественная переменная, значение которой в pезультате работы подпрограммы полагается равным вычисленному нулю функции  F (X);
IERR - целая переменная, служащая для сообщения об ошибках, обнаружбнных в ходе работы подпрограммы; при этом
IERR=65 - когда нуль функции не может быть посчитан в пределах заданного числа итераций;
IERR=66 - когда функция не меняет знака на заданном интервале.

Версии

ZF10E - вычисление нуля вещественной функции, меняющей знак на заданном интервале, методом Брента с расширенной (Extended) точностью. При этом параметры A, B, EPS и ROOT должны иметь тип Extended, а подпрограмма - функция вычисления  F (X) должна тоже иметь тип Extended.

Вызываемые подпрограммы

UTZF10 - подпрограмма выдачи диагностических сообщений при работе подпрограммы ZF10R.
UTZF11 - подпрограмма выдачи диагностических сообщений при работе подпрограммы ZF10E.

Замечания по использованию

 

Пусть  Xi - 1 и  Xi являются двумя последовательными приближениями к нулю функции  F (X). Тогда  Xi принимается за искомый нуль, если выполнен один из двух критериев сходимости

          | F(Xi) | ≤ | EPS |   или   | Xi -1 - Xi | < | Xi | * 10 (- NDIG ) . 
При обращении к подпрограмме может быть задан только первый критерий сходимости (тогда NDIG задается равным 0), либо только второй критерий (тогда EPS задается равным 0), либо оба критерия одновременно.

Пример использования

Unit TZF10R_p;
interface
uses
SysUtils, Math, LStruct, Lfunc, UtRes_p, FZF10R_p, ZF10R_p;

function TZF10R: String;

implementation

function TZF10R: String;
var
NDIG,ITMAX,IERR :Integer;
EPS,A,B,RООТ :Real;
begin
Result := '';
EPS := 0.00001;
NDIG := 6;
A := -3.3;
B := 4.6;
IТМАХ := 20;
ZF10R(FZF10R,A,B,EPS,NDIG,ITMAX,ROOT,IERR);
Result := Result + Format(' %20.16f %20.16f %20.16f  %10d %10d %20.16f %10d ',[A,B,EPS,NDIG,ITMAX,ROOT,IERR]) + #$0D#$0A;
UtRes('TZF10R',Result);  //вывод результатов в файл TZF10R.res
exit;
end;

end.

Unit FZF10R_p;
interface
uses
SysUtils, Math, { Delphi }
LStruct, Lfunc;

function FZF10R(X :Real): Real; 
implementation

function FZF10R(X :Real): Real;
begin
Result := X*X+2.0*X-6.0;
end;

end.

Результаты:   ROOT  =  1.64575096 ,   ITMAX  =  7 ,    IERR  =  0