Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Коршунов лабораторные / ЛинАлгбр алгол-пргр.rtf
Скачиваний:
19
Добавлен:
26.04.2015
Размер:
392.72 Кб
Скачать

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

Соседние файлы в папке Коршунов лабораторные