|
Документ взят из кэша поисковой машины. Адрес
оригинального документа
: http://num-anal.srcc.msu.ru/lib_na/cat/zf_htm_p/zf13r_p.htm
Дата изменения: Tue Nov 24 12:01:20 2015 Дата индексирования: Sun Apr 10 03:39:58 2016 Кодировка: Windows-1251 |
|
Текст подпрограммы и версий zf13r_p.zip zf13e_p.zip |
Тексты тестовых примеров tzf13r_p.zip tzf13e_p.zip |
Вычисление нулей вещественной функции методом Мюллера, когда начальное приближение нулей плохое.
ZF13R вычисляет 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 ) + ЕРS2, где EPS2 также задается перед обращением к подпрограмме. Таким образом, EPS1 и EPS2 определяют критерий отделения кратных нулей.
B.Leavenworth, Algorithm 25: Real Zeros of an Arbitrary Function, Comm. of the A.C.M, 3 (11), 1960.
procedure ZF13R(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 - | целая переменная, значение которой в результате работы подпрограммы полагается равным 1, если хотя бы один нуль не может быть посчитан в пределах заданного числа итераций; соответствующая компонента вектоpа ROOT полагается равной 3.4E38. |
Версии
| ZF13E - | вычисление нулей вещественной функции методом Мюллера с расширенной (Extended) точностью, когда начальное приближение нулей плохое. При этом EPS, EPS1, EPS2, а также вектоp ROOT должны иметь тип Extended. |
Вызываемые подпрограммы
| UTZF10 - | подпрограмма выдачи диагностических сообщений при работе подпрограммы ZF13R. |
| UTZF11 - | подпрограмма выдачи диагностических сообщений при работе подпрограммы ZF13E. |
Замечания по использованию
|
При обращении к подпрограмме может быть задан только первый критерий сходимости (тогда NDIG задается равным 0), либо только второй критерий (тогда EPS задается равным 0), либо оба критерия одновременно. Пусть Xi - 1 и Xi являются двумя последовательными приближениями к j - му нулю функции, то Xi принимается за искомый нуль, если выполнен один из двух критериев сходимости | F(Xi) | ≤ | EPS | или | Xi-1 - Xi | < | Xi | * 10 (- NDIG ) .Если в ZP13E хотя бы один нуль не может быть посчитан в пределах заданного числа итераций, то соответствующая компонента вектоpа ROOT полагается равной 1.7E308 и IERR = 1. |
Unit TZF13R_p;
interface
uses
SysUtils, Math, LStruct, Lfunc, UtRes_p, FZF13R_p, ZF13R_p;
function TZF13R: String;
implementation
function TZF13R: String;
var
NDIG,ITMAX,N,_i,IERR :Integer;
EPS1,EPS,EPS2 :Real;
RООТ :Array [0..1] of Real;
begin
Result := '';
NDIG := 5;
EPS1 := 0.00001;
IТМАХ := 100;
EPS := EPS1;
EPS2 := 0.01;
ROOT[0] := 4.6;
ROOT[1] := -193.3;
N := 2;
ZF13R(FZF13R,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 1 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('TZF13R',Result); //вывод результатов в файл TZF13R.res
exit;
end;
end.
Unit FZF13R_p;
interface
uses
SysUtils, Math, { Delphi }
LStruct, Lfunc;
function FZF13R(X :Real): Real;
implementation
function FZF13R(X :Real): Real;
begin
Result := X*X+2.0*X-6.0;
end;
end.
Результаты: ROOT(1) = 1.645751 , ROOT(2) = - 3.645751 ,
ITMAX = 4