Текст подпрограммы и версий zf30r_p.zip zf30e_p.zip |
Тексты тестовых примеров tzf30r_p.zip tzf30e_p.zip |
Решение системы 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