Документ взят из кэша поисковой машины. Адрес
оригинального документа
: http://num-anal.srcc.msu.ru/lib_na/cat/as_htm_p/asp0r_p.htm
Дата изменения: Fri Dec 4 10:43:53 2015 Дата индексирования: Sun Apr 10 04:04:47 2016 Кодировка: Windows-1251 |
Текст подпрограммы и версий asp0r_p.zip , asp0e_p.zip , asp0c_p.zip |
Тексты тестовых примеров tasp0r_p.zip , tasp0e_p.zip , tasp0c_p.zip |
Нахождение нормального псевдорешения переопределенной системы линейных алгебраических уравнений полного ранга методом отражений.
Находится нормальное псевдорешение системы АX = B, где А - матрица полного ранга размера N на М (N ≥ М), В - заданный вектор длины N. Для решения используется нормализованное приведение матрицы системы к верхней треугольной форме R с помощью последовательности преобразований отражения
(1) QMQM-1...Q1AS = R ,
где Qi - соответствующие матрицы отражения, S - результирующая матрица перестановок, R - верхняя треугольная матрица размера N на М.
Из полученной треугольной системы
RY = QMQM-1...Q1B
находится нормальное псевдорешение Y, по которому затем определяется искомое решение Х = SY.
Д.К.Фадеев, В.Н.Фадеева, В.Н.Кублановская, О решении линейных алгебраических систем с прямоугольными матрицами. Тp. Мат. ин-та АН СССР, 1968, 96.
procedure ASP0R(var A :Array of Real; var B :Array of Real; var X :Array of Real; var T :Array of Real; var S :Array of Integer; N :Integer; M :Integer; L :Integer);
Параметры
A - | вещественный двумерный массив размера N на М (N ≥ М), в котором задается исходная матрица А; в результате работы подпрограммы в массиве А на соответствующих местах запоминаются наддиагональные элементы вычисленной верхней треугольной матрицы R; в остальной части массива А в последовательных столбцах запоминаются векторы, порождающие соответствующие матрицы отражения; |
B - | вещественный вектор длины N, в котором задается правая часть системы; |
X - | вещественный вектор длины М, в котором запоминается найденное псевдорешение системы; |
T - | вещественный вектор длины N, используемый подпрограммой как рабочий; в результате работы подпрограммы в первых М компонентах массива Т запоминаются диагональные элементы верхней треугольной матрицы R; |
IS - | целый вектор длины М, в котором запоминаются перестановки столбцов при проведении нормализованного процесса (1); в IS (k) запоминается номер столбца переставленного с k - ым столбцом на k - ом шаге преобразования; |
N, M - | число строк и столбцов исходной матрицы А, N ≥ М (тип: целый); |
L - | задает режим работы подпрограммы (тип: целый); при этом: |
L = 1 - | если система с данной матрицей А решается в первый раз; |
L ≠ 1 - | если система решается повторно с той же матрицей А, но с другой правой частью; в этом случае разложение (1) матрицы А не выполняется. |
Версии
ASP0E - | нахождение нормального псевдорешения переопределенной системы линейных алгебраических уравнений полного ранга, заданной с расширенной (Extended) точностью, методом отражений. |
ASP0C - | нахождение нормального псевдорешения комплексной переопределенной системы линейных алгебраических уравнений полного ранга методом отражений. |
Вызываемые подпрограммы: нет
Замечания по использованию
1. |
В подпрограмме АSР0С параметры А, В, Х, Т имеют тип Complex. | |
2. |
В подпрограмме АSР0E параметры А, В, Х, Т имеют тип Extended. | |
3. | При повторном решении системы с той же матрицей, информация, полученная ранее в массивах А, Т, IS, не должна портиться. |
Unit TASP0R_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc, UtRes_p, ASP0R_p; function TASP0R: String; implementation function TASP0R: String; var P,I,J,K,_i :Integer; DАТАВ :Real; B :Array [0..4] of Real; X :Array [0..3] of Real; T :Array [0..4] of Real; S :Array [0..3] of Integer; A1 :Array [0..19] of Real; const A :Array [0..19] of Real = ( 2520.0,1260.0,840.0,630.0,504.0,1260.0,840.0, 630.0,504.0,420.0,840.0,630.0,504.0,420.0,360.0, 630.0,504.0,420.0,360.0,315.0 ); B1 :Array [0..4] of Real = ( 5250.0,3234.0,2394.0,1914.0,1599.0 ); label _92,_91,_9; begin Result := ''; { результат функции } for I:=1 to 5 do begin for J:=1 to 4 do begin _92: A1[(I-1)+(J-1)*5] := A[(I-1)+(J-1)*5]; end; end; for K:=1 to 2 do begin Result := Result + Format('%s', [' РЕШЕНИЕ ПЕРЕОПРЕДЕЛЕННОЙ СИСТЕМЫ AX=B ПОЛНОГО PAHГA' + #$0D#$0A + ' МЕТОДОМ ОТРАЖЕНИЙ ДЛЯ ВЕЩЕСТВЕННЫХ A И B' + #$0D#$0A]) + #$0D#$0A; Result := Result + Format('%s',[' ИСХОДНЫЕ ДAHHЫE']) + #$0D#$0A; Result := Result + #$0D#$0A; Result := Result + Format('%s',[' A' + #$0D#$0A]); for I:=1 to 5 do begin for J:=1 to 4 do begin Result := Result + Format('%20.16f ', [A[(I-1)+(J-1)*5]]) + #$0D#$0A; end; end; Result := Result + #$0D#$0A; Result := Result + Format('%s',[' B' + #$0D#$0A]); Result := Result + #$0D#$0A; for _i:=0 to 4 do begin Result := Result + Format('%20.16f ',[B[_i]]); if ( ((_i+1) mod 4)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; Result := Result + Format('%s',[' PEЗYЛЬTAT:' + #$0D#$0A]) + #$0D#$0A; P := 1; ASP0R(A,B,X,T,S,5,4,P); Result := Result + #$0D#$0A; Result := Result + Format('%s',[' A' + #$0D#$0A]); for I:=1 to 5 do begin for J:=1 to 4 do begin Result := Result + Format('%20.16f ', [A[(I-1)+(J-1)*5]]) + #$0D#$0A; end; end; Result := Result + #$0D#$0A; Result := Result + Format('%s',[' T' + #$0D#$0A]); Result := Result + #$0D#$0A; for _i:=0 to 4 do begin Result := Result + Format('%20.16f ',[T[_i]]); if ( ((_i+1) mod 4)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; Result := Result + Format('%s',[#$0D#$0A + ' S ']); Result := Result + #$0D#$0A; for _i:=0 to 3 do begin Result := Result + Format('%4d ',[S[_i]]); if ( ((_i+1) mod 4)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; Result := Result + Format('%s',[' B' + #$0D#$0A]); Result := Result + #$0D#$0A; for _i:=0 to 4 do begin Result := Result + Format('%20.16f ',[B[_i]]); if ( ((_i+1) mod 4)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; Result := Result + Format('%s',[#$0D#$0A + ' X' + #$0D#$0A]); Result := Result + #$0D#$0A; for _i:=0 to 3 do begin Result := Result + Format('%20.16f ',[X[_i]]); if ( ((_i+1) mod 4)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; for I:=1 to 5 do begin B[I-1] := B1[I-1]; for J:=1 to 4 do begin _91: A[(I-1)+(J-1)*5] := A1[(I-1)+(J-1)*5]; end; end; _9: end; UtRes('TASP0R',Result); { вывод результатов в файл TASP0R.res } exit; end; end. Результат: X = (1.00000000005, 0.500000000016, 0.3333333334, 0.25000000003, 0.20000000001)