- •2. Применение алгоритма
- •3. Список формальных параметров
- •2. Применение алгоритма
- •3. Список формальных параметров
- •4. Программы на языке алгол
- •5. Организация процедур и обозначения
- •6. Оценка точности решения
- •7. Примеры использования процедур и результаты их проверки
- •1. Теоретические предпосылки
- •2. Применение алгоритма
- •3. Список формальных параметров
- •4. Алгол- Программа
- •Integer p, 0, /, /;
3. Список формальных параметров
Входные параметры процедуры jacobi: п — порядок исходной матрицы А; eivec — логическая переменная, имеющая значение true, если необходимо вычислить собственные векторы, и false в противном случае; а — массив а [1 : гс, 1 : и] элементов матрицы А. При работе процедуры будут использованы только диагональные и наддиагональные элементы (a [i, k], k^ i).
Выходные параметры процедуры jacobi:а — массив а [1 : п, 1 : п]. Наддиатональные элементы этого массива использованы при работе процедуры для записи других переменных, однако диагональные и поддиагональные элементы оставлены без изменения (поэтому в массиве а будет содержаться полная информация об исходной матрице А, если поддиагональные элементы были введены в память); d — массив d [1 : п] диагональных элементов матриии D, т. е. Массив вычисленных собственных значений матрицы А;
v — массив v [1 : п, 1 : п], содержащий (если eivec = true) элементы матрицы V, /г-ый столбец которой есть нормированный собственный вектор, соответствующий собственному значению d [k] **; rot — параметр, фиксирующий количество проведенных плоских вращений при приведении исходной матрицы к диагональному виду.
После выполнения процедуры jacobi расположение собственных значений не упорядочено. Если это необходимо, то можно вставить следующий блок:
comment — параметры п и a[i, k] считаются заданными;
begin integer aux\ integer array r [I ;/г];
jacobi (/г, true, a, d, v, ro/);
for k : = 1 step 1 until n do r [k]: = /г;
что л Правильным критерием окончания работы процедуры может служить условие,-чир улевск°е выражение a -\- eps =з а имеет значение true; где eps — неотрицательное norm определяемое с точностью используемого вычислителя. Для ЭВМ, в которых нельзя выполнить это условие, окончание алгоритма может затянуться.
язы /пЖе Если собственные векторы вычислять не нужно (eivec =& false), по правилам Л ОЛ необходимо, чтобы при обращении к процедуре jacobi формальному параметру ^ v соответствовал фактический двумерный массив; например, обращение может иметь вид; jacobi (16, false, a, d, а, rot), где о « а.
183
for k : = 1 step 1 until n— 1 do
for /: = k + 1 step 1 until n do
\ld[r[k]}<d[r[l}] then
begin aux : = r [k]: r \k]: = r [I] : /•[/]:= aux end;
comment — теперь элемент d[r[k]] есть k-oe из собственных значений*расположенных в порядке уменьшения, av[j,r[k}\ — /-ая компонента соответствующего ему собственного вектора.
4. Алгол- Программа
procedure jacobi (n, eivec) trans : (a) res : (d, vt rot);
value n, eivec;
integer я, rot; boolean eivec; array a, d, v;
begin
real sm, c, s, /, h, g, tau, theta, tresh;
Integer p, 0, /, /;
array 6, 2 [1 : л]; program:
if ешес then
for p : = 1 step 1 until /г do
for q: = 1 step 1 until n do
t, [p, 0] : = if p = 0 then 1.0 else 0.0;
for p : = 1 step 1 until n do
begin 6 [p] : =- d [p\ : = a [p, p]; г [p] : = 0 end;
rot: = 0;
for i : — 1 step 1 until 50 do
swp: begin
sm : = 0;
for p : = 1 step 1 until n — I do
for q : = p + 1 step 1 until n do
sm : — sm + a6s (a [p, «7]);
if sm = 0 then go to out;
tresh : = if t < 4 then 0.2 X sm/n f 2 else 0.0;
for p : = 1 step 1 until n — 1 do
for q : = p + 1 step 1 until n do
begin
g: = /## x abs (a [pt я]);
!1 'м r4!^ ?6s (d lpj};f g = abs (d^ a
flfts (d [q]) + g = abs (d [q]) then a [p, 0] : = 0 else
if abs(a[p, q}) > //-^/z then rotate: begin
if ate (/i) -j- g = abs (h) then t : = a [p, <7J//z
else
begin
//zeta : = 0.5 X й/я [p, q];
t : = l/(ate (//и?/я) + s0r/ (1 + theta f 2));
if /Ыя < 0 then t: = — t end вычисления тангенса угла вращения;
s : = t X с; tau: = s/(l +c); /z : = / X a[p, q];
d[q]:=d[q]+h; a [p, q] : = 0;
for / : = 1 step 1 until p — 1 do begin
g: = a[/, p]; /i: = a[y, 0];
a[/. Pl:=5 —s X (/i + g>. я [у, ^/]: = /г + s X (g — h X tau) end варианта 1 ^ / < p;
for / : = p + 1 step 1 until q— 1 do
begin
g: = a[p, /]; /i: = a[/, 0]; a [p. Л : =g — sx (h + gx tau)\ a [/, p]: = Л + s x (g — Л x tow) end варианта p < / < g;
for j[ : = 0 + 1 step 1 until n do
begin g : = a [p, /]; /i: = a [—0, /];
a [p» /I : = g ~ s X (h + g X tau); a[q, /] : = Л + s X (g — Л X 'Л'Л end варианта q < j^ n;
if eiaec then
for /: = 1 step 1 until n do
begin g:=v[j, p]; h:=v [/, 0];
v[i. p] : ==g-S * (tan/iH-gX
v [i, q]:=/i + sx (g-'/iX
end вычисления массива v;
rot: =rot+i
end rotate;
end;
for p : = 1 step 1 until n do
begin d[p]: =b[p]: = b[p] + z[p]
z [p] : = 0
end p
end svp;
out:
end Jacobi;.
5. Организация процедур и обозначения .следующих операторов:
for p : = 1 step I until /г — 1 do for a : = n -h 1 step 1 until n do
184
по окончании одного цикла начинается следующий и так далее, пока не будет закончен процесс диагонализации.
Предлагаемый алгоритм имеет следующие особенности. ия для
1. В течение первых трех циклов осуществляются только те вращения, для которых выполнено условие
abs (a [p, q]) > tresh = 0.2 X sm/n t 2,
где sm - сумма модулей всех наддиагональных элементов. В последующих циклах величине tresh присваивают нулевое значение. . . fn „1 и a \0 0]
2. Если текущий элемент a (p, q] мал по сравнению с а [р, Р\ и a ; I?, 9J, то элемент a [p, Vl полагают равным нулю и соответствующее плоское ; вращение не производятРЭто удобный прием, так как получаемая ошибка не больше возни кающей при выполнении соответствующего плоского вРаЩ~ннОыДхН^^0ерС0ЛвИ необходимо использовать процедуру jacobi для вычисления собственных векторов,
185