Главная Промышленная автоматика.

begin

if 1#=рД i=7q then

begin intl: = a[i,p]; mu: = aO,ql;

a[q,i]: = ali.q]: = intl X sint+mu X cost;

a[p,i]: = a[i,p]: = int 1X cost-mu X sint end;

intl: = s[i,p]; mu:=s[i,q]; s[i,q]: = intl Xsint+muXcost; S[i,p]: = intl Xcost-muXsint end i;

mu: = sintf2; omega: = costf2; intl:=sintXcost; a[p,p]:=vlXomega + v3xmu-2Xv2Xintl; a q,q]:=vlXmu+v3Xomega+2Xv2Xintl; alp.q]-==a[q>p]:= (vl-v3) Xintl + v2x (omega-mu) end p;

comment Теперь проверка достижения конечной точности; if ind=l then begin ind:=0; go to mainl end; if thr>norm2 then go to main; fin: end jacobi;

Свидетельство к алгоритму 856

Алгоритм 856 получен из алгоритма 85а путем внесения в него поправки, предложенной В. Ф. Дейкиным в нижеследующем его «Замечании к алгоритму 85а», и модификации, предложенной П. Науром в нижеследующем его «Подтве:рждении к алгоритму 85». Кроме того, было сделано несколько тождественных преобразований для экономии машинного времени.

Свидетельство к алгоритму 85а

Алгоритм 85а получен в результате исправления, некоторого сокращения и ординарной переработки алгоритма 85 (Evans Т. G. «САСМ», 1962, Яо 4).

Более подробные сведения о методе Якоби можно получить, например, в работе Д. К. Фаддеева и В. Н. Фаддеевой [4, § 81].

Алгоритм 85а транслирован с исходными данными п=4, rho= = 10-8 и

Результаты трансляции:

0.579642502 0.459996665 0.433459111 0.514325614 2.32274880

1.00 0.42 0.54 0.66

0.42 1.00 0.32

0.44

0.54 0.32 1.00

0.22

0.66

0.44 0.22 1.00

- 0.0503284495 0.237226458

- 0.812846170 0.529595844

- 0.718845953

- 0.0956989810 0.387435463 0.569206432

0.100051435,0-11 0.479925056,0-14

0.100051435,0-11 0.796706689 0.000000000

0.479925056,0-14 0.000000000 0.242260708

0.000000000 0.179516047,0-14 0.000000000

0.380449881 0.850275473 0.0358896058 0.361941215

0.000000000

0.179516047,0-14

0.000000000

0.638283803



С-оглашо работе Фаддеева Д. ¥ч. -и Фаддеевой Ь. R. \4, с. Ъ1Ъ- исходная матрица должна иметь собственные значения 2.32274884, 0.63828379, 0.79670672, 0.24226073 и третий собственный вектор (-0.71884900, -0.09569928, 0.38743715, 0.5692089).

Замечание к алгоритму 85а

Г. Г. Дядюша, Киев, октябрь 1966

Алгоритм 85а может быть существенно усовершенствован, если учесть следующие обязательства.

1. Для вычисления тригонометрических функций угла элементарного вращения ф достаточно двух операций извлечения квадратного корня.

2. Вместо sin ф можно применять tg ф, который удобно вычисляется по формуле

tg (p-aij/iix+signin+HP)) щ],

0. iO.

где V={и - 0.11)12; i*. = Yv- + оц; 8(1*) =

1, 1л = 0.

3 Диагональные элементы преобразованной матрицы удобно вычисляются по формулам aii, а]з = ац +n±ix,i.

4. Элемент aij должен быть равен нулю.

5. Целесообразно при каждой итерации выбирать преграду чуть ниже среднего квадратичного недиагональных элементов.

6. Достаточно хранить в памяти машины только верхнюю половину симметричной матрицы («ак в алгоритме 67а).

7. Для многих программирующих программ удобно применять только одномерные массивы.

В приводимой ниже процедуре jacobi2 исходная матрица занисы-вается в массиве а[1:пХ{п+1)/2] в следующем порядке: в первых п ячейках - диагональные элементы, в последующих - элементы над-диагональной верхней треугольной матрицы построчно. Матрица s записывается в массиве s[l:nXn] по столбцам, procedure jacobi2(n,rho)dataresult: (a)result: (s);

value n.pho; real rho;integer n; array a,s; begin real norml,norm2,mu,mul,t,cost,d;

Integer i,j,k,p,q,r,il,kl,rl,nl,n2,n3; Boolean g;

p:=0;

for i:= 1 step 1 until n do for j: = 1 step 1 until n do begin p:=:p+l;

s[p]:= if i=j then 1 else 0 end i;

nl: = n-1; n2:=nl-1; n3:-=nx (n-f l)/2; g:= false; thr: norml:=0;

for i: = n+l step 1 until n3 do norml:==norml-l-a[i]f2;

norm 1: = sqrt (2 X norm 1) /n;

if g then g:- false else norm2:=norml Xrho;

if normKnorm2 then norml:=norm2;

k: = n;

for q:=:0 step 1 until n2 do begin d: = a[q-i-l];



for p:=q +1 step 1 until nl do begin k: = k+l; if abs(a[k])>norml then

begin t: = alk]; a[k]:=0; g:= true; mu:= (a[p+l]-d)/2; mul:=sqrt(tf2+muf2); if mu<0 then mul:=-mul; mu:=mu+mul; t:=t/mu; a[p+l]: = d: = d+mu; mul:=2Xmul; d: = d-mul; cost:=sqrt(mu/mul); i:=q+n; r:=p+n; il:=nxq; rl:=nXp; for j:=0 step 1 until nl do begin

if j=7q AJ=5P then begin mu: = costXa[i]; mul:=costXa[r];

a[r]:=muXt+mul; a[i]:=:mu-tXmul end ifj;

il:=il + l; rl:=rl + l; kl: = n2-j; mu:=costXs[il]; mul: = costXs[rl]; s[r 1]: =:mu Xt+mu 1; s[i 1]:=mu-tXmu 1; i:= if j<q then i+kl else i+l; r:= if ]<p then r+kl else r+1 end j; end ifabs end p; a[q+l]: = d end q; if g then go to thr end jacobi2; *

Подтверждение к алгоритму 85a

Г. Г. Дядюша, Киев, октябрь 1967

Алгоритм 85а в разных вариантах неоднократно транслировался с помощью транслятора ТА-2 в виде составной части программ, предназначенных для кнантово-химических расчетов, и всегда работал безотказно.

Кроме ординарной переработки на входной язык транслятора ТА-2 эти варианты отличались от процедуры jacobi2, дриведенной в преды дущем «Замечании», следующими деталями.

1. Конструкции «...:=...:=...» и «if... Д... then) расписывались подробнее из-за того, что транслятор ТА-2 переводит их недостаточно экономно.

2. погт2 не вычислялась, а задавалась вместо rho.

3. norml вычислялась по другим формулам, например,

шгт1 = [1-{-ЯX (« - 1)2]- 2 «г/

»

ТТроцедура jacobi2, приведениая выше, отличается от представленной Г. Дядю-£ией тем, что а ней исправлены некоторые очевидные ошибки. После исправления процедура jacobi2 была транслирована в системе TA-LM и для примера, яриведенного в «Свидетельстве к алгоритму 85а», дала точно такие же результаты, как и процедура jacobi. {Прим. ред.)





0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 [21] 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43

0.0034