Вторая пачка часть 10
Описанный алгоритм, как и алгоритм метода Гବ¬¬ус¬са, представленный в п. 3.1, имеет множество про¬грам¬мных р嬬¬ализаций и всегда есть в биб¬ли¬о¬те¬ках стан¬¬дар¬т¬ных про¬грамм. Один из относительно эф¬фек¬тив¬ных ал¬го¬рит-мов есть в БСП на ЕС ЭВМ для тран¬слятора FORT¬RAN-77. Он ре¬а¬ли¬зо¬ван в в謬¬де про¬цедуры SINQ. Пе¬ревод на язык PASCAL вы¬¬пол¬нен ав-торами.
Формальные параметры процедуры. Входные: n (тип in¬¬te¬ger) - целое положительное число, рав¬ное п¬рядку ис¬¬ходной системы; aa (тип real) - массив из n?n дейс¬т¬ви¬тель¬ных чисел, содержащий мат¬ри¬цу кэф¬фи¬циентов сис¬те¬мы (aa[1] = а11; aa[2] = а21; aa[3] = a31; ...; aa[n]= an1; aa[n +1]= =a12; aa[n + 2] = a22; ...; aa[2*n] = аn2; ...; aa[n*n] = аnn); b (тип real) - мас¬сив из n действительных чисел, со¬дер¬жа¬щий стол¬бец сво¬бодных членов исходной системы (b[1] = =b1; b[2] = b2; ...; b[n] = bn). Выходные: b (тип real) - мас¬¬сив из n действительных чисел (он же был вход¬ным) при выходе из подпрограммы, со¬дер-жа¬щий ре¬ше¬ния ис¬ход¬ной системы (b[1]= x1; b[2] = x2; ...; b[n] = xn); ks (тип in¬¬te¬ger) - признак пра-виль¬нос¬ти р嬬ше¬ния или код ошиб¬ки: если ks = =0, то в ма¬с¬си¬ве b со¬дер¬жится р嬬шение ис¬ход-ной сис¬те¬мы; если ks = 1, то исход¬ная сис¬тема не име¬ет ре¬ше¬ния (глав¬ный опре¬де¬ли¬тель ее равен нулю).
PROCEDURE SINQ (VAR A: MAS11; VAR B : MAS1;
VAR KS : INTEGER; N : INTEGER);
VAR TOL, BIGA, AA, SAVE : REAL;
JJ,JY,IJ,IT,J,I, I1, IMAX, K, IQS, IXJ, IXJX : INTEGER;
JJX, NY, IA, IB, IO, I2, IX, JX, KY : INTEGER;
LABEL CONT10;
BEGIN TOL := 0.0;
KS := 0;
JJ := -N;
FOR J := 1 TO N DO
BEGIN JY := J + 1;
JJ := JJ + N + 1;
BIGA := 0.0;
IT := JJ - J;
FOR I := J TO N DO
BEGIN
IJ := IT + I;
AA := ABS (A[IJ]);
IF (ABS(BIGA)-AA) < 0.0 THEN
BEGIN
BIGA := A[IJ];
IMAX := I; END;
END;
IF (ABS(BIGA)-TOL) <= 0.0 THEN
BEGIN
KS := 1;
EXIT;
END;
I1 := J + N*(J-2);
IT := IMAX - J;
FOR K := J TO N DO
BEGIN
INC (I1,N);
I2:= I1 + IT;
SAVE := A[I1];
A[I1] := A[I2];
A[I2] := SAVE;
A[I1] := A[I1] / BIGA;
END;
SAVE := B[IMAX];
B[IMAX] := B[J];
B[J] := SAVE / BIGA;
IF J=N THEN GOTO CONT10;
IQS := N*(J-1);
FOR IX := JY TO N DO
BEGIN
IXJ := IQS + IX;
IT := J - IX;
FOR JX := JY TO N DO
BEGIN
IXJX := N*(JX-1) + IX;
JJX := IXJX + IT;
A[IXJX] := A[IXJX] - A[IXJ]*A[JJX];
END;
B[IX] := B[IX] - B[J]*A[IXJ];
END;
END;
CONT10: NY := N - 1;
IT := N*N;
I := 1;
J :=1;
FOR KY := 1 TO NY DO
BEGIN IA := IT - KY;
IB := N - KY;
IO := N;
FOR K := 1 TO KY DO
BEGIN
B[IB] := B[IB] - A[IA]*B[IO];
DEC (IA,N);
DEC (IO);
END;
END;
END
Индекс
Элементарные функции
Линейные уравнения
Нелинейные уравнения
Случайные числа