Текст подпрограммы и версий
zf30r_p.zip  zf30e_p.zip 
Тексты тестовых примеров
tzf30r_p.zip  tzf30e_p.zip 

Подпрограмма:  ZF30R (модуль ZF30R_p)

Назначение

Решение системы  N нелинейных уравнений с  N неизвестными методом Брауна.

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

ZF30R находит решение системы  N нелинейных уравнений  F (X) = 0 с  N неизвестными. Подпрограмма использует метод Брауна, который имеет по крайней меpе квадратичную сходимость и требует N2/2 + 3N/2 вычислений  F (X) за один шаг итерации.

K.M.Brown, A Quadratically Convergent Newton - like Method Based upon Gaussian Elimination, SIAM on Numerical Analysis, 6 (4), 1969.

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

procedure ZF30R(F :Func_F2; N :Integer; var EPS :Real; NDIG :Integer;
                var ITMAX :Integer; var ROOT :Array of Real;
                var RAB :Array of Real; var IERR :Integer);

Параметры

F - имя подпрограммы - функции последовательного вычисления компонент системы  F (X) = 0 , которая должна быть оформлена как
function F (var X :Array of Real; K :Integer): Real;
где  K - номеp вычисляемой компоненты системы,  K = 1, 2, ..., N;
N - заданное число уравнений системы (тип: целый);
EPS - первый критерий сходимости:  X0 принимается за решение системы  F (X), если | F (X0) | ≤ | EPS | (тип: вещественный);
NDIG - второй критерий сходимости: заданное число значащих цифр, с которыми ищется решение системы (тип: целый);
ITMAX - целая переменная, значение которой перед началом работы подпрограммы должно быть положено равным максимальному числу итераций, ориентировочно требуемых для обеспечения сходимости; в pезультате работы подпрограммы ее значение полагается равным действительному числу итераций, потребовавшихся для обеспечения сходимости в соответствии с заданными критериями;
ROOT - вещественный вектоp длины  N, содержащий вычисленное решение заданной системы; перед началом работы подпрограммы вектоp ROOT должен содержать начальное приближение к решению;
RAB - вещественный вектоp длины ((N + 2) (N - 1)) / 2 + 3N, используемый в подпрограмме как рабочий;
IERR - целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом:
IERR=65 - когда решение системы не может быть найдено в пределах заданного числа итераций;
IERR=66 - когда якобиан заданной системы имеет особенность.

Версии

ZF30E - решение системы N нелинейных уравнений с  N неизвестными методом Брауна с расширенной (Extended) точностью. При этом параметры EPS, ROOT и RAB должны иметь тип Extended, а подпрограмма - функция последовательного вычисления компонент заданной системы должна быть оформлена как
function F (var X :Array of Extended; K :Integer): Extended;
где вектоp  X также должен иметь тип Extended.

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

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

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

 

При обращении к подпрограмме может быть задан только первый критерий сходимости (тогда NDIG задается равным 0), либо только второй критерий (тогда EPS задается равным 0), либо оба критерия одновременно.

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

         | F(Xi) | ≤ | EPS |   для всех компонент системы
   или 
         | Xi -1 - Xi | < | Xi | * 10 (- NDIG ) . 

B случае IERR = 65 или IERR = 66 можно попробовать другое начальное приближение и (или) дополнительно исследовать систему с целью возможного исключения лишних уравнений или переменных, а также с целью возможного выражения одних переменных через другие.

Подпрограмма может быть использована для вычисления нуля вещественной функции.

Подпрограмма - функция последовательного вычисления компонент заданной системы должна иметь вид:

function F (var X :Array of Real; K :Integer): Real;
label
_1,_2,...;
begin
case K of
 1: goto _1;
 2: goto _2;
 ...
end;
_1:
 Result := (вычисление первой компоненты  системы для заданного  X)
 exit;
_2:
 Result := (вычисление второй компоненты  системы для заданного  X)
 exit;
  .
  .
end;

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

Unit TZF30R_p;
interface
uses
SysUtils, Math, LStruct, Lfunc, UtRes_p, FZF30R_p, ZF30R_p;

function TZF30R: String; 

implementation

function TZF30R: String;
var
NSIG,N,ITMAX,_i,IERR :Integer;
EPS :Real;
X :Array [0..2] of Real;
WA :Array [0..13] of Real;
label
_3;
begin
Result := '';
EPS := 0.000001;
NSIG := 5;
_3:
X[0] := 0.75;
X[1] := 1.5;
X[2] := 4.0;
N := 3;
IТМАХ := 100;
ZF30R(FZF30R,N,EPS,NSIG,ITMAX,X,WA,IERR);
Result := Result + Format(' %10d %20.16f %10d %10d %10d ',[N,EPS,NSIG,ITMAX,IERR]) + #$0D#$0A;
Result := Result + #$0D#$0A;
for _i:=0 to 2 do
 begin
  Result := Result + Format('%20.16f ',[X[_i]]);
  if ( ((_i+1) mod 1)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
UtRes('TZF30R',Result);  //вывод результатов в файл TZF30R.res
exit;
end;

end.

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

function FZF30R(var X :Array of Real; K :Integer): Real; 
implementation

function FZF30R(var X :Array of Real; K :Integer): Real;
label
_5,_10,_15,_900;
begin
case K of
 1: goto _5;
 2: goto _10;
 3: goto _15;
end;
_5:
Result := X[0]+Exp(X[0]-1.0)+IntPower(X[1]+X[2],2)-27.0;
goto _900;
_10:
Result := X[0]*Exp(X[1]-2.0)+IntPower(X[2],2)-10.0;
goto _900;
_15:
Result := X[2]+Sin(X[1]-2.0)+IntPower(X[1],2)-7.0;
_900:
end;

end.

Результаты:   

       ROOT(1)  =  1. ,   ROOT(2)  =  2. ,   ROOT(3)  =  3.
 
       ITMAX  =  6 ,   IERR  =  0