|
Текст подпрограммы и версий zf31r_p.zip zf31e_p.zip |
Тексты тестовых примеров tzf31r_p.zip tzf31e_p.zip |
Решение системы N нелинейных уравнений с N неизвестными методом Ньютона.
Пусть дана система N нелинейных уравнений с N неизвестными.
fi ( x1, x2, ..., xN ) = 0 , i = 1, 2, ..., N
Для решения заданной системы подпрограмма ZF31R на k - м шаге итерационного процесса Ньютона вычисляет решение следующей линейной системы методом Гаусса с выбором ведущего элемента по столбцу:
N
∑ αi j δx j( k ) = β i ,
j =1
где αi j = ∂fi /∂xj - якобиан системы, и βi = - fi, а затем вычисляет (k + 1) - е приближение к вектору решения на основе ранее найденного k - го приближения:
x ik+1 = x i(k) + δx i(k) , i = 1, 2, ..., N
Итерационный процесс по k повторяется до тех пор, пока не будет выполнен один из двух критериев сходимости:
N
(1) ∑ | δx i(k) | ≤ EPSX
i =1
N
(2) ∑ | f i ( x1(k+1), x2(k+1), ..., xN(k+1)) | ≤ EPSF
i =1
Если же ни одно из этих двух условий не выполнено за ITMAX итераций, то ZF31R прекращает свою работу и выдает диагностическое сообщение.
Н.С.Бахвалов. Численные методы. Изд - во "Наука", 1979.
procedure ZF31R(FUN :Proc_F3A; var ROOT :Array of Real; N :Integer;
EPSX :Real; EPSF :Real; ITMAX :Integer;
var ALPHA :Array of Real; var BETA :Array of Real;
var NLEAD :Array of Integer; var IERR :Integer);
Параметры
| FUN - |
имя подпрограммы вычисления
fi (x1, x2,
..., xN) и ∂fi /∂xj ǀ (x1, x2, ..., xN) , i=1,2,...,N, j=1,2,...,N; оформляется в виде подпрограммы с тремя формальными параметрами: |
| X - | вещественный вектор длины N, содержащий текущее приближение к решению исходной системы; |
| ALPHA - |
двумерный вещественный вектор размеров N на
N , в который помещаются значения элементов
Якобиана системы в точке X, т.е. ∂fi /∂xj ǀ (x1, x2, ..., xN) ; |
| BETA - | вещественный вектор длины N, в который помещаются значения - f i ( x1, x2, ..., xN ); |
| ROOT - | вещественный вектор длины N, содержащий вычисленное решение системы; перед началом работы подпрограммы вектор ROOT должен содержать начальное приближение к решению; |
| N - | заданное число уравнений системы (тип: целый); |
| EPSX - | первый критерий сходимости (1) (тип: вещественный); |
| EPSF - | второй критерий сходимости (2) (тип: вещественный); |
| ITMAX - | целая переменная, значение которой перед началом работы подпрограммы должно быть положено равным максимальному числу итераций, ориентировочно требуемых для обеспечения сходимости в соответствии с заданными критериями; |
| ALPHA - | двумерный вещественный массив размеров N на N, используемый в качестве рабочего; |
| BETA - | вещественный вектор длины N, используемый в качестве рабочего; |
| NLEAD - | целый вектор длины N, используемый в качестве рабочего; |
| IERR - | целая переменная, служащая для сообщения об ошибках, обнаруженный в ходе работы подпрограммы; при этом: |
| IERR=65 - | когда решение системы не может быть найдено в пределах заданного числа итераций; |
| IERR=66 - | когда якобиан заданной системы имеет особенность. |
Версии
| ZF31E - | решение системы N нелинейных уравнений с N неизвестными методом Ньютона в режиме расширенной (Extended) точности; при этом параметры ROOT, EPSX, EPSF, ALPHA, BETA и формальные параметры подпрограммы FUN должны иметь тип Extended. |
Вызываемые подпрограммы
|
ASG9R - ASG9E | решение системы Ax = b или ATx = b методом Гаусса с выбором ведущего элемента по столбцу; используются в подпрограммах ZF31R и ZF31E соответственно; |
|
UTZF10 - UTZF11 | подпрограммы выдачи диагностических сообщений при работе подпрограмм ZF31R и ZF31E соответственно. |
Замечания по использованию
| В подпрограммах ZF31R и ZF31E имеется глобальная запись (структура данных) _ZF31RR с элементом elm1, который полагается равным количеству итераций, выполненных при решении системы. |
Unit TZF31R_p;
interface
uses
SysUtils, Math, LStruct, Lfunc, UtRes_p, FZF31R_p, ZF31R_p;
function TZF31R: String;
implementation
function TZF31R: String;
var
N,ITMAX,_i,IERR :Integer;
EPSX,EPSF :Real;
ALРНА :Array [0..8] of Real;
ВЕТА :Array [0..2] of Real;
NLEAD :Array [0..2] of Integer;
const
RООТ :Array [0..2] of Real = ( 1.0,1.0,1.0 );
begin
Result := '';
N := 3;
EPSX := 1.E-5;
EPSF := 1.E-5;
IТМАХ := 30;
ZF31R(FZF31R,ROOT,N,EPSX,EPSF,ITMAX,ALPHA,BETA,NLEAD,IERR);
Result := Result + #$0D#$0A;
for _i:=0 to 2 do
begin
Result := Result + Format('%15.6f ',[ROOT[_i]]);
if ( ((_i+1) mod 3)=0 )
then Result := Result + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
Result := Result + Format('%5d %5d ',[_ZF31RR.elm1,IERR]) + #$0D#$0A;
UtRes('TZF31R',Result); //вывод результатов в файл TZF31R.res
exit;
end;
end.
Unit FZF31R_p;
interface
uses
SysUtils, Math, { Delphi }
LStruct, Lfunc;
procedure FZF31R(X :Array of Real; var ALPHA :Array of Real;
var BETA :Array of Real);
implementation
procedure FZF31R(X :Array of Real; var ALPHA :Array of Real;
var BETA :Array of Real);
begin
BETA[0] := -(X[0]+Exp(X[0]-1)+IntPower(X[1]+X[2],2)-27);
BETA[1] := -(X[0]*Exp(X[1]-2)+IntPower(X[2],2)-10);
BETA[2] := -(X[2]+Sin(X[1]-2)+IntPower(X[1],2)-7);
ALPHA[0] := 1+Exp(X[0]-1);
ALPHA[3] := 2*(X[1]+X[2]);
ALPHA[6] := 2*(X[1]+X[2]);
ALPHA[1] := Exp(X[1]-2);
ALPHA[4] := X[0]*Exp(X[1]-2);
ALPHA[7] := 2*X[2];
ALPHA[2] := 0.0;
ALPHA[5] := Cos(X[1]-2)+2*X[1];
ALPHA[8] := 1.0;
end;
end.
Результаты: ROOT = ( 1.0, 2.0, 3.0 )
ITER = 7 , IERR = 0