Текст подпрограммы и версий
am02e_p.zip , am02c_p.zip
Тексты тестовых примеров
tam02e_p.zip , tam02c_p.zip

Подпрограмма:  AM02E (модуль AM02E_p)

Назначение

Вычисление нормированного вектора невязки системы линейных алгебраических уравнений.

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

Вычисляется вектор R = r / S, где  r = b - Аx,  b - заданный вектор длины  N,  x - заданный вектор длины  М,  A - заданная матрица размера N * М,  S = || r || ∞.

Нормировка вектора невязки  r  необходима при решении системы линейных алгебраических уравнений Аx = b  с уточнением.

В.В.Воеводин, Вычислительные основы линейной алгебры, "Наука", М., 1977.

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


Параметры

A - двумерный массив размера N * М, в котором задается матрица системы (тип: вещественный расширенной (Extended) точности);
B - вектор длины  N, в котором запоминается правая часть системы (тип: вещественный расширенной (Extended) точности);
X - вектор длины  М, в котором задается решение системы (тип: вещественный расширенной (Extended) точности);
R - одномерный массив длины  N, в котором запоминается вычисленный нормированный вектор невязки (тип: вещественный расширенной (Extended) точности);
S - переменная, в которой запоминается бесконечная норма вычисленного вектора невязки (тип: вещественный расширенной (Extended) точности);
N, M - число строк и столбцов матрицы системы (тип: целый).

Версии

AM02C - вычисление нормированного вектора невязки комплексной системы линейных алгебраических уравнений.

Вызываемые подпрограммы: нет.

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

  1. 

В подпрограмме AM02C параметры А, B, X, R имеют тип Complex.

  2.  Подпрограммы АМ02E, AM02C целесообразно использовать при решении системы линейных алгебраических уравнений с уточнением (см. пример использования).

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

Unit tam02e_p;
interface
uses
SysUtils, Math, { Delphi }
LStruct, Lfunc, UtRes_p, ASH0E_p, AM02E_p;

function tam02e: String; 

implementation

function tam02e: String;
var
N,I,J,K,_i :Integer;
S0,Z,F,S :Extended;
X1 :Array [0..6] of Extended;
A :Array [0..48] of Extended;
A1 :Array [0..48] of Extended;
X :Array [0..6] of Extended;
D :Array [0..6] of Extended;
R :Array [0..6] of Extended;
S1 :Array [0..6] of Extended;
const
B :Array [0..6] of Extended = ( 0.e0,0.e0,0.e0,0.e0,0.e0,0.e0,0.e0 );
label
_4,_3,_2,_5,_9,_6;
begin
Result := '';
N := 7;
for I:=1 to N do
 begin
  for J:=1 to N do
   begin
    A[(I-1)+(J-1)*7] := 360360.e0/(I+J-1);
_4:
    A1[(I-1)+(J-1)*7] := A[(I-1)+(J-1)*7];
   end;
 end;
B[4] := 360360.e0;
ASH0E(A,B,X,S1,N,1);
S0 := 0.e0;
for I:=1 to N do
 begin
  X1[I-1] := X[I-1];
  if ( Abs(X[I-1]) <= S0 )
   then goto _3;
  S0 := Abs(X[I-1]);
_3:
 end;
for K:=1 to 6 do
 begin
  Result := Result + #$0D#$0A;
  for _i:=0 to 6 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;
  AM02E(A1,B,X,R,S,N,N);
  Result := Result + #$0D#$0A;
  for _i:=0 to 6 do
   begin
    Result := Result + Format('%20.16f ',[R[_i]]);
    if ( ((_i+1) mod 1)=0 )
     then Result := Result + #$0D#$0A;
   end;
  Result := Result + #$0D#$0A;
  Result := Result + Format(' %20.16f ',[S]) + #$0D#$0A;
  ASH0E(A,R,D,S1,N,2);
  Result := Result + #$0D#$0A;
  for _i:=0 to 6 do
   begin
    Result := Result + Format('%20.16f ',[D[_i]]);
    if ( ((_i+1) mod 1)=0 )
     then Result := Result + #$0D#$0A;
   end;
  Result := Result + #$0D#$0A;
  for I:=1 to N do
   begin
_2:
    X[I-1] := X[I-1]+D[I-1]*S;
   end;
  Z := 0.e0;
  for I:=1 to N do
   begin
    F := Abs(X[I-1]-X1[I-1]);
    X1[I-1] := X[I-1];
    if ( F <= Z )
     then goto _5;
    Z := F;
_5:
   end;
  if ( S0+Z = S0 )
   then goto _6;
_9:
 end;
_6:
Result := Result + #$0D#$0A;
for _i:=0 to 6 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('tam02e',Result);  { вывод результатов в файл tam02e.res }
exit;
end;

end.

Подпрограмма АSН0E (А, В, Х, S, N, Р) находит решение системы Аx = b, причем при повторном решении системы с той же матрицей и другой правой частью параметр  Р полагают отличным от единицы. Проводится два шага уточнения решения системы с матрицей Гильберта 7 порядка и правой частью  b = (0, 0, 0, 0, 1, 0, 0).

Результат:

                X1                                X2                                X3
    4.85115043411 + 04     4.85099999532 + 04    4.85100000000 + 04
  - 1.94046009606 + 06  - 1.94039999813 + 06  - 1.94040000000 + 06
    1.87115797099 + 07     1.87109999819 + 07    1.87110000000 + 07
  - 7.27672565200 + 07  - 7.27649999300 + 07  - 7.27650000001 + 07
    1.33406641488 + 08     1.33402499871 + 08    1.33402500000 + 08
  - 1.15263342213 + 08  - 1.15259759888 + 08  - 1.15259760000 + 08
    3.78389772248 + 07     3.78377999634 + 07    3.78378000000 + 07

где   X1 - решение системы без уточнения;
        X2 - решение системы после 1-ого шага уточнения;
        X3 - решение системы после 2-ого шага уточнения.