|
Документ взят из кэша поисковой машины. Адрес
оригинального документа
: http://num-anal.srcc.msu.ru/lib_na/cat/zf_htm_p/zf30r_p.htm
Дата изменения: Fri Nov 6 14:30:53 2015 Дата индексирования: Sun Apr 10 03:41:13 2016 Кодировка: Windows-1251 |
|
Текст подпрограммы и версий 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