|
Документ взят из кэша поисковой машины. Адрес
оригинального документа
: http://num-anal.srcc.msu.su/lib_na/cat/ac_htm_p/acp1r_p.htm
Дата изменения: Mon Nov 9 14:35:55 2015 Дата индексирования: Sun Apr 10 02:11:26 2016 Кодировка: Windows-1251 |
|
Текст подпрограммы и версий acp1r_p.zip , acp1e_p.zip |
Тексты тестовых примеров tacp1r_p.zip , tacp1e_p.zip |
Сингулярное разложение прямоугольной матрицы размера M на N (M ≥ N).
Подпрограмма ACP1R осуществляет разложение прямоугольной матрицы A размера M на N (M ≥ N) в произведение А = UDVT, где U, V - ортогональные матрицы порядка М и N соответственно, D - прямоугольная матрица размера M на N, у которой все элементы, кpоме диагональных элементов dk = dkk, k = 1, 2, ..., N, равны нулю.
Последние M - N столбцов матрицы U, соответствующие заведомо нулевым собственным значениям матрицы AAT, обычно не используются и потому в данной подпрограмме не вычисляются.
Forsythe G.E., Malcolm M.A., Moler C.B. Computer Methods for Mathematical Computation. Prentice-Hall, 1977.
procedure ACP1R(NM :Integer; M :Integer; N :Integer;
var A :Array of Real; var W :Array of Real;
MATU :Boolean; var U :Array of Real; MATV :Boolean;
var V :Array of Real; var RV1 :Array of Real;
var IERR :Integer);
Параметры
| NM - | число стpок в двумерных массивах A, U, V, причем NM ≥ M (тип: целый); |
| M - | число стpок матриц A и U (тип: целый); |
| N - | число столбцов матриц A и U и порядок матрицы V (тип: целый); |
| A - | вещественный двумерный массив размера NM на N, в первых M стpоках которого задается исходная матрица; |
| W - | вещественный вектоp длины N значений W(k) = dk вычисленных сингулярных чисел матрицы A; |
| MATU - | признак необходимости вычисления матрицы U: при MATU = TRUE матрица U вычисляется, при MATU = FALSE - нет (тип: логический); |
| U - | вещественный двумерный массив размера NM на N, в котоpом при MATU = TRUE содержатся вычисленные первые N столбцов матрицы U; при MATU = FALSE массив U используется как рабочий; |
| MATV - | признак необходимости вычисления матрицы V: при MATV = TRUE матрица V вычисляется, при MATV = FALSE - нет (тип: логический); |
| V - | вещественный двумерный массив размера NM на N, в котоpом при MATV = TRUE содержится вычисленная матрица V; при MATV = FALSE массив V не используется; |
| R - | вещественный рабочий вектоp длины N; |
| IERR - | целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом: |
|
IERR = K, если для вычисления К - го сингулярного числа потребовалось более 30 итераций; в этом случае правильно вычислены лишь сингулярные числа и сингулярные векторы с индексами K+1, K+2, ..., N. |
Версии
| ACP1E - | сингулярное разложение прямоугольной матрицы размера M на N (M ≥ N), заданной с расширенной (Extended) точностью. |
Вызываемые подпрограммы
| UTAC10 - | подпрограмма выдачи диагностических сообщений при работе подпрограмм ACP1R и ACP1E. |
Замечания по использованию
| 1. |
При обращении к подпрограмме ACP1E параметры A, W, U, V, R должны иметь тип Extended. | |
| 2. |
B результате работы подпрограммы массив A сохраняется. | |
| 3. |
Допустимо совпадение параметров U или V с параметром A. |
Unit TACP1R_p;
interface
uses
SysUtils, Math, { Delphi }
LStruct, Lfunc, UtRes_p, ACP1R_p;
function TACP1R: String;
implementation
function TACP1R: String;
var
I,IERR,J,M,N,NM :Integer;
A :Array [0..14] of Real;
U :Array [0..14] of Real;
V :Array [0..14] of Real;
SIGМА :Array [0..2] of Real;
WORK :Array [0..4] of Real;
label
_1,_3,_4,_5;
begin
Result := '';
NM := 5;
M := 5;
N := 3;
for I:=1 to M do
begin
for J:=1 to N do
begin
A[(I-1)+(J-1)*5] := I + (J-1)*M;
_1:
end;
end;
ACP1R(NM,M,N,A,SIGMA,True,U,True,V,WORK,IERR);
if ( IERR <> 0 )
then begin
Result := Result + Format('%s',[' IERR=']);
Result := Result + Format('%4d',[IERR]) + #$0D#$0A;
end;
for J:=1 to N do
begin
Result := Result + Format('%20.16f ',[SIGMA[J-1]]) + #$0D#$0A;
_3:
end;
Result := Result + Format('%s',[' ']) + #$0D#$0A;
for I:=1 to M do
begin
Result := Result + #$0D#$0A;
for J:=1 to N do
begin
Result := Result + Format('%20.16f ',[U[(I-1)+(J-1)*5]]) + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
_4:
end;
Result := Result + Format('%s',[' ']) + #$0D#$0A;
for I:=1 to N do
begin
Result := Result + #$0D#$0A;
for J:=1 to N do
begin
Result := Result + Format('%20.16f ',[V[(I-1)+(J-1)*5]]) + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
_5:
end;
UtRes('TACP1R',Result); { вывод результатов в файл TACP1R.res }
exit;
end;
end.
Результаты:
IERR = 0,
| 35.127 |
W = | 2.465 | ,
| 1.587E-11 |
| -0.202 0.890 0.408 |
V = | -0.517 0.257 -0.816 | ,
| -0.832 -0.376 0.408 |
| -0.355 -0.689 0.602 |
| -0.399 -0.376 -0.517 |
U = | -0.443 -0.062 -0.306 |
| -0.487 0.251 -0.244 |
| -0.531 0.564 0.466 |