Текст подпрограммы и версий am02e_p.zip , am02c_p.zip |
Тексты тестовых примеров tam02e_p.zip , tam02c_p.zip |
Вычисление нормированного вектора невязки системы линейных алгебраических уравнений.
Вычисляется вектор 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-ого шага уточнения.