Текст подпрограммы и версий asg2r_p.zip , asg2e_p.zip , asg2c_p.zip |
Тексты тестовых примеров tasg2r_p.zip , tasg2e_p.zip , tasg2c_p.zip |
Решение вещественной системы линейных алгебраических уравнений А*x = b с матрицей A и вектором правой части b методом Гаусса с выбором ведущего элемента по всей матрице. При повторном решении системы с той же матрицей и другой правой частью эффективно используется выполненная ранее факторизация матрицы.
Матрица системы А N - го порядка приводится к верхнетреугольному виду U последовательностью элементарных преобразований Гаусса L1, L2, ...LN - 1 и матрицами перестановок Q и Т так, чтO
LN-1*LN-2...L1*Q*A*T = U ,
и затем решается система с треугольной матрицей U и правой частью
LN - 1*LN - 2...L1*Q*b .
Вычисленное решение y преобразуется в решение исходной
системы x по правилу x = Т*y. Матрицы
Li ,
i = 1, 2, ...N - 1, имеют единичные
диагональные элементы, матрицы Q и Т осуществляют соответственно
перестановку строк и столбцов матрицы А и обеспечивают стратегию
выбора ведущего элемента по всей матрице.
В.В.Воеводин, Р.В.Петрина, Комплекс алгоритмов, основанных на преобразованиях типа Гаусса, в пакете линейной алгебры, Сб. "Численный анализ на ФОРТРАНе", вып.3, Изд-во МГУ, 1973.
procedure ASG2R(var A :Array of Real; var B :Array of Real; var X :Array of Real; var S :Array of Integer; N :Integer; L :Integer);
Параметры
A - | двумерный N на N массив, в котором задается исходная матрица (тип: Real); по окончании работы подпрограммы в массиве А на соответствующих местах запоминаются элементы матрицы U и векторы-столбцы, порождающие матрицы Li ; |
B - | вектор длины N, в котором задается вектор правой части системы (тип: вещественный); |
X - | вектор длины N, в котором запоминается вектор вычисленного решения системы (тип: вещественный); |
S - | двумерный N на 2 массив , в столбцах которого запоминаются векторы, порождающие матрицы перестановок Q и Т соответственно; при этом в S (К, 1) и S (К, 2) запоминаются соответственно номера строки и столбца переставленных на К - ом шаге с К - ой строкой и К - ым столбцом (тип: целый); |
N - | заданный порядок матрицы системы (тип: целый); |
L - | признак решаемой задачи (тип: целый), причем |
L = 1 - | если система с данной матрицей решается впервые; |
L ≠ 1 - | если система с данной матрицей решается повторно. |
Версии
ASG2E - | решение системы линейных алгебраических уравнений А*x = b методом Гаусса с выбором ведущего элемента по всей матрице для вещественных А и b, заданных с расширенной (Extended) точностью. |
ASG2C - | решение системы линейных алгебраических уравнений А*x = b методом Гаусса с выбором ведущего элемента по всей матрице для комплексных А и b. |
Вызываемые подпрограммы: нет
Замечания по использованию
1. |
В подпрограмме АSG2E массивы А, В, Х имеют тип Extended. | |
2. |
В подпрограмме АSG2С массивы А, В, Х имеют тип Complex. | |
3. |
Поскольку факторизация Гаусса требует N - 1 шагов, то S (N, i)=0, i = 1, 2. | |
4. | Подпрограммы АSG2R, АSG2E, АSG2С позволяют помещать вычисленное решение Х на место правой части В. |
Unit TASG2R_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc, UtRes_p, ASG2R_p; function TASG2R: String; implementation function TASG2R: String; var I,_i :Integer; B :Array [0..3] of Real; B3 :Array [0..3] of Real; X3 :Array [0..3] of Real; S3 :Array [0..7] of Integer; const РС :Array [0..15] of Real = ( 7.9,8.5,4.3,3.2,5.6,-4.8,4.2,-1.4,5.7,0.8,-3.2, -8.9,-7.2,3.5,9.3,3.3 ); label _3,_11; begin Result := ''; { результат функции } for I:=1 to 4 do begin _3: B[I-1] := 0.0; end; B[0] := 1.0; for I:=1 to 4 do begin _11: B3[I-1] := B[I-1]; end; ASG2R(PC,B3,X3,S3,4,1); Result := Result + #$0D#$0A; for _i:=0 to 15 do begin Result := Result + Format('%20.16f ',[PC[_i]]); if ( ((_i+1) mod 4)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; Result := Result + #$0D#$0A; for _i:=0 to 3 do begin Result := Result + Format('%20.16f ',[B3[_i]]); if ( ((_i+1) mod 4)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; Result := Result + #$0D#$0A; for _i:=0 to 3 do begin Result := Result + Format('%20.16f ',[X3[_i]]); if ( ((_i+1) mod 4)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; UtRes('TASG2R',Result); { вывод результатов в файл TASG2R.res } end; end. Результат: | 0.000136 | | -0.003263 | | 0.024476 | X = | -0.081585 | | 0.134615 | | -0.107692 | | 0.033333 |