|
Документ взят из кэша поисковой машины. Адрес
оригинального документа
: http://num-anal.srcc.msu.su/lib_na/cat/as_htm_p/asp0r_p.htm
Дата изменения: Fri Dec 4 10:43:53 2015 Дата индексирования: Sun Apr 10 02:40:50 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)