comment ================== 34010 ================= ; real procedure VECVEC(L, U, SHIFT, A, B); value L, U, SHIFT; integer L, U, SHIFT; array A, B; begin integer K; real S; S := 0; for K := L step 1 until U do S := A[K] × B[SHIFT + K] + S; VECVEC := S end VECVEC; comment ================== 34011 ================= ; real procedure MATVEC(L, U, I, A, B); value L, U, I; integer L, U, I; array A, B; begin integer K; real S; S := 0; for K := L step 1 until U do S := A[I, K] × B[K] + S; MATVEC := S end MATVEC; comment ================== 34012 ================= ; real procedure TAMVEC(L, U, I, A, B); value L, U, I; integer L, U, I; array A, B; begin integer K; real S; S := 0; for K := L step 1 until U do S := A[K, I] × B[K] + S; TAMVEC := S end TAMVEC; comment ================== 34013 ================= ; real procedure MATMAT(L, U, I, J, A, B); value L, U, I, J; integer L, U, I, J; array A, B; begin integer K; real S; S := 0; for K := L step 1 until U do S := A[I, K] × B[K, J] + S; MATMAT := S end MATMAT; comment ================== 34014 ================= ; real procedure TAMMAT(L, U, I, J, A, B); value L, U, I, J; integer L, U, I, J; array A, B; begin integer K; real S; S := 0; for K := L step 1 until U do S := A[K, I] × B[K, J] + S; TAMMAT := S end TAMMAT; comment ================== 34015 ================= ; real procedure MATTAM(L, U, I, J, A, B); value L, U, I, J; integer L, U, I, J; array A, B; begin integer K; real S; S := 0; for K := L step 1 until U do S := A[I, K] × B[J, K] + S; MATTAM := S end MATTAM; comment ================== 34016 ================= ; real procedure SEQVEC(L, U, IL, SHIFT, A, B); value L, U, IL, SHIFT; integer L, U, IL, SHIFT; array A, B; begin real S; S := 0; for L := L step 1 until U do begin S := A[IL] × B[L + SHIFT] + S; IL := IL + L end; SEQVEC := S end SEQVEC; comment ================== 34017 ================= ; real procedure SCAPRD1(LA, SA, LB, SB, N, A, B); value LA, SA, LB, SB, N; integer LA, SA, LB, SB, N; array A, B; begin real S; integer K; S := 0; for K := 1 step 1 until N do begin S := A[LA] × B[LB] + S; LA := LA + SA; LB := LB + SB end; SCAPRD1 := S end SCAPRD1; comment ================== 34018 ================= ; real procedure SYMMATVEC(L, U, I, A, B); value L, U, I; integer L, U, I; array A, B; begin integer K, M; real procedure VECVEC(L, U, SHIFT, A, B); code 34010; real procedure SEQVEC(L, U, IL, SHIFT, A, B); code 34016; M := if L > I then L else I; K := M × (M - 1) ÷ 2; SYMMATVEC := VECVEC(L, if I ≤ U then I-1 else U, K, B, A) + SEQVEC(M, U, K + I, 0, A, B) end SYMMATVEC; comment ================== 31500 ================= ; procedure FULMATVEC(LR, UR, LC, UC, A, B, C); value LR, UR, LC, UC, B; integer LR, UR, LC, UC; array A, B, C; begin real procedure MATVEC(L, U, I, A, B); code 34011; for LR := LR step 1 until UR do C[LR] := MATVEC(LC, UC, LR, A, B); end FULMATVEC; comment ================== 31501 ================= ; procedure FULTAMVEC(LR, UR, LC, UC, A, B, C); value LR, UR, LC, UC, B; integer LR, UR, LC, UC; array A, B, C; begin real procedure TAMVEC(L, U, I, A, B); code 34012; for LC := LC step 1 until UC do C[LC] := TAMVEC(LR, UR, LC, A, B); end FULTAMVEC; comment ================== 31502 ================= ; procedure FULSYMMATVEC(LR, UR, LC, UC, A, B, C); value LR, UR, LC, UC, B; integer LR, UR, LC, UC; array A, B, C; begin real procedure SYMMATVEC(L, U, I, A, B); code 34018; for LR := LR step 1 until UR do C[LR] := SYMMATVEC(LC, UC, LR, A, B) end FULSYMMATVEC; comment ================== 31503 ================= ; procedure RESVEC(LR, UR, LC, UC, A, B, C, X); value LR, UR, LC, UC, X; integer LR, UR, LC, UC; real X; array A, B, C; begin real procedure MATVEC(L, U, I, A, B); code 34011; for LR := LR step 1 until UR do C[LR] := MATVEC(LC, UC, LR, A, B) + C[LR] × X end RESVEC; comment ================== 31504 ================= ; procedure SYMRESVEC(LR, UR, LC, UC, A, B, C, X); value LR, UR, LC, UC, X; integer LR, UR, LC, UC; real X; array A, B, C; begin real procedure SYMMATVEC(L, U, I, A, B); code 34018; for LR := LR step 1 until UR do C[LR] := SYMMATVEC(LC, UC, LR, A, B) + C[LR] × X end SYMRESVEC; comment ================== 34214 ================= ; real procedure RNK1MIN(N, X, G, H, FUNCT, IN, OUT); value N; integer N; array X, G, H, IN, OUT; real procedure FUNCT; begin integer I, IT, N2, CNTL, CNTE, EVL, EVLMAX; Boolean OK; real F, F0, FMIN, MU, DG, DG0, GHG, GS, NRMDELTA, ALFA, MACHEPS, RELTOL, ABSTOL, EPS, TOLG, ORTH, AID; array V, DELTA, GAMMA, S, P[1:N]; real procedure VECVEC(L, U, SHIFT, A, B); code 34010; real procedure MATVEC(L, U, I, A, B); code 34011; real procedure TAMVEC(L, U, I, A, B); code 34012; procedure ELMVEC(L, U, SHIFT, A, B, X); code 34020; real procedure SYMMATVEC(L, U, I, A, B); code 34018; procedure INIVEC(L, U, A, X); code 31010; procedure INISYMD(LR, UR, SHIFT, A, X); code 31013; procedure MULVEC(L, U, SHIFT, A, B, X); code 31020; procedure DUPVEC(L, U, SHIFT, A, B); code 31030; procedure EIGSYM1(A, N, NUMVAL, VAL, VEC, EM); code 34156; procedure LINEMIN(N, X, D, ND, A, G, F, F0, F1, DFO, DF1, E, S, IN); code 34210; procedure RNK1UPD(H, N, V, C); code 34211; procedure DAVUPD(H, N, V, W, C1, C2); code 34212; procedure FLEUPD(H, N, V, W, C1, C2); code 34213; MACHEPS := IN[0]; RELTOL := IN[1]; ABSTOL := IN[2]; MU := IN[3]; TOLG := IN[4]; FMIN := IN[5]; IT := 0; ALFA := IN[6]; EVLMAX := IN[7]; ORTH := IN[8]; N2 := N × (N + 1) ÷ 2; CNTL := CNTE := 0; if ALFA > 0 then begin INIVEC(1, N2, H, 0); INISYMD(1, N, 0, H, ALFA) end; F := FUNCT(N, X, G); EVL := 1; DG := SQRT(VECVEC(1, N, 0, G, G)); for I := 1 step 1 until N do DELTA[I] := - SYMMATVEC(1, N, I, H, G); NRMDELTA := SQRT(VECVEC(1, N, 0, DELTA, DELTA)); DG0 := VECVEC(1, N, 0, DELTA, G); OK := DG0 < 0; EPS := SQRT(VECVEC(1, N, 0, X, X)) × RELTOL + ABSTOL; for IT := IT + 1 while (NRMDELTA > EPS ∨ DG > TOLG ∨ ¬OK) ∧ EVL < EVLMAX do begin if ¬OK then begin array VEC[1:N, 1:N], TH[1:N2], EM[0:9]; EM[0] := MACHEPS; EM[2] := AID := SQRT(MACHEPS × RELTOL); EM[4] := ORTH; EM[6] := AID × N; EM[8] := 5; CNTE := CNTE + 1; DUPVEC(1, N2, 0, TH, H); EIGSYM1(TH, N, N, V, VEC, EM); for I := 1 step 1 until N do begin AID := - TAMVEC(1, N, I, VEC, G); S[I] := AID × ABS(V[I]); V[I] := AID × SIGN(V[I]) end; for I := 1 step 1 until N do begin DELTA[I] := MATVEC(1, N, I, VEC, S); P[I] := MATVEC(1, N, I, VEC, V) end; DG0 := VECVEC(1, N, 0, DELTA, G); NRMDELTA := SQRT(VECVEC(1, N, 0, DELTA, DELTA)) end CALCULATING GREENSTADTS DIRECTION; DUPVEC(1, N, 0, S, X); DUPVEC(1, N, 0, V, G); if IT > N then ALFA := 1 else begin if IT ≠ 1 then ALFA := ALFA / NRMDELTA else begin ALFA := 2 × (FMIN - F) / DG0; if ALFA > 1 then ALFA := 1 end end; ELMVEC(1, N, 0, X, DELTA, ALFA); F0 := F; F := FUNCT(N, X, G); EVL := EVL + 1 ; DG := VECVEC(1, N, 0, DELTA, G); if IT = 1 ∨ F0 - F < -MU × DG0 × ALFA then begin I := EVLMAX - EVL; CNTL := CNTL + 1 ; LINEMIN(N, S, DELTA, NRMDELTA, ALFA, G, FUNCT, F0, F, DG0, DG, I, false, IN); EVL := EVL + I; DUPVEC(1, N, 0, X, S); end LINEMINIMIZATION; DUPVEC(1, N, 0, GAMMA, G); ELMVEC(1, N, 0, GAMMA, V, -1); if ¬OK then MULVEC(1, N, 0, V, P, -1); DG := DG - DG0; if ALFA ≠ 1 then begin MULVEC(1, N, 0, DELTA, DELTA, ALFA); MULVEC(1, N, 0, V, V, ALFA); NRMDELTA := NRMDELTA × ALFA; DG := DG × ALFA end; DUPVEC(1, N, 0, P, GAMMA); ELMVEC(1, N, 0, P, V, 1); for I := 1 step 1 until N do V[I] := SYMMATVEC(1, N, I, H, GAMMA); DUPVEC(1, N, 0, S, DELTA); ELMVEC(1, N, 0, S, V, -1); GS := VECVEC(1, N, 0, GAMMA, S); GHG := VECVEC(1, N, 0, V, GAMMA); AID := DG / GS; if VECVEC(1, N, 0, DELTA, P) ⭡ 2 > VECVEC(1, N, 0, P, P) × (ORTH × NRMDELTA) ⭡ 2 then RNK1UPD(H, N, S, 1 / GS) else if AID ≥ 0 then FLEUPD(H, N, DELTA, V, 1 / DG, (1 + GHG / DG) / DG) else DAVUPD(H, N, DELTA, V, 1 / DG, 1 / GHG); for I := 1 step 1 until N do DELTA[I] := -SYMMATVEC(1, N, I, H, G); ALFA := NRMDELTA; NRMDELTA := SQRT(VECVEC(1, N, 0, DELTA, DELTA)); EPS := SQRT(VECVEC(1, N, 0, X, X)) × RELTOL + ABSTOL; DG := SQRT(VECVEC(1, N, 0, G, G)); DG0 := VECVEC(1, N, 0, DELTA, G); OK := DG0 ≤ 0 end ITERATION; OUT[0] := NRMDELTA; OUT[1] := DG; OUT[2] := EVL; OUT[3] := CNTL; OUT[4] := CNTE; RNK1MIN := F end RNK1MIN; comment ================== 34215 ================= ; real procedure FLEMIN(N, X, G, H, FUNCT, IN, OUT); value N; integer N; array X, G, H, IN, OUT; real procedure FUNCT; begin integer I, IT, CNTL, EVL, EVLMAX; real F, F0, FMIN, MU, DG, DG0, NRMDELTA, ALFA, RELTOL, ABSTOL, EPS, TOLG, AID; array V, DELTA, S[1:N]; real procedure VECVEC(L, U, SHIFT, A, B); code 34010; procedure ELMVEC(L, U, SHIFT, A, B, X); code 34020; real procedure SYMMATVEC(L, U, I, A, B); code 34018; procedure INIVEC(L, U, A, X); code 31010; procedure INISYMD(LR, UR, SHIFT, A, X); code 31013; procedure MULVEC(L, U, SHIFT, A, B, XB); code 31020; procedure DUPVEC(L, U, SHIFT, A, B); code 31030; procedure LINEMIN(N, X, D, ND, A, G, F, F0, F1, DF0, DF1, E, S, IN); code 34210; procedure DAVUPD(H, N, V, W, C1, C2); code 34212; procedure FLEUPD(H, N, V, W, C1, C2); code 34213; RELTOL := IN[1]; ABSTOL := IN[2]; MU := IN[3]; TOLG := IN[4]; FMIN := IN[5]; ALFA := IN[6]; EVLMAX := IN[7]; OUT[4] := 0; IT := 0; F := FUNCT(N, X, G); EVL := 1; CNTL := 0; if ALFA > 0 then begin INIVEC(1, N × (N + 1) ÷ 2, H, 0); INISYMD(1, N, 0, H, ALFA) end; for I := 1 step 1 until N do DELTA[I] := - SYMMATVEC(1, N, I, H, G); DG := SQRT(VECVEC(1, N, 0, G, G)); NRMDELTA := SQRT(VECVEC(1, N, 0, DELTA, DELTA)); EPS := SQRT(VECVEC(1, N, 0, X, X)) × RELTOL + ABSTOL; DG0 := VECVEC(1, N, 0, DELTA, G); for IT := IT + 1 while (NRMDELTA > EPS ∨ DG > TOLG ) ∧ EVL < EVLMAX do begin DUPVEC(1, N, 0, S, X); DUPVEC(1, N, 0, V, G); if IT ≥ N then ALFA := 1 else begin if IT ≠ 1 then ALFA := ALFA / NRMDELTA else begin ALFA := 2 × (FMIN - F) / DG0; if ALFA > 1 then ALFA := 1 end end; ELMVEC(1, N, 0, X, DELTA, ALFA); F0 := F; F := FUNCT(N, X, G); EVL := EVL + 1 ; DG := VECVEC(1, N, 0, DELTA, G); if IT = 1 ∨ F0 - F < - MU × DG0 × ALFA then begin I := EVLMAX - EVL; CNTL := CNTL + 1 ; LINEMIN(N, S, DELTA, NRMDELTA, ALFA, G, FUNCT, F0, F, DG0, DG, I, false, IN); EVL := EVL + I; DUPVEC(1, N, 0, X, S); end LINEMINIMIZATION; if ALFA ≠ 1 then MULVEC(1, N, 0, DELTA, DELTA, ALFA); MULVEC(1, N, 0, V, V, -1); ELMVEC(1, N, 0, V, G, 1); for I := 1 step 1 until N do S[I] := SYMMATVEC(1, N, I, H, V); AID := VECVEC(1, N, 0, V, S); DG := (DG - DG0) × ALFA; if DG > 0 then begin if DG ≥ AID then FLEUPD(H, N, DELTA, S, 1 / DG, (1 + AID / DG) / DG) else DAVUPD(H, N, DELTA, S, 1 / DG, 1 / AID) end UPDATING; for I := 1 step 1 until N do DELTA[I] := -SYMMATVEC(1, N, I, H, G); ALFA := NRMDELTA × ALFA; NRMDELTA := SQRT(VECVEC(1, N, 0, DELTA, DELTA)); EPS := SQRT(VECVEC(1, N, 0, X, X)) × RELTOL + ABSTOL; DG := SQRT(VECVEC(1, N, 0, G, G)); DG0 := VECVEC(1, N, 0, DELTA, G); if DG0 > 0 then begin OUT[4] := -1 ; goto EXIT end end ITERATION; EXIT: OUT[0] := NRMDELTA; OUT[1] := DG; OUT[2] := EVL; OUT[3] := CNTL; FLEMIN := F end FLEMIN; comment ================== 34352 ================= ; procedure COMCOLCST(L, U, J, AR, AI, XR, XI); value L, U, J, XR, XI; integer L, U, J; real XR, XI; array AR, AI; begin procedure COMMUL(AR, AI, BR, BI, RR, RI); code 34341; for L := L step 1 until U do COMMUL(AR[L, J], AI[L, J], XR, XI, AR[L, J], AI[L, J]); end COMCOLCST; comment ================== 34353 ================= ; procedure COMROWCST(L, U, I, AR, AI, XR, XI); value L, U, I, XR, XI; integer L, U, I; real XR, XI; array AR, AI; begin procedure COMMUL(AR, AI, BR, BI, RR, RI); code 34341; for L := L step 1 until U do COMMUL(AR[I, L], AI[I, L], XR, XI, AR[I, L], AI[I, L]); end COMROWCST; comment ================== 34354 ================= ; procedure COMMATVEC(L, U, I, AR, AI, BR, BI, RR, RI); value L, U, I; integer L, U, I; real RR, RI; array AR, AI, BR, BI; begin real procedure MATVEC(L, U, I, A, B); code 34011; real MV; MV := MATVEC(L, U, I, AR, BR) - MATVEC(L, U, I, AI, BI); RI := MATVEC(L, U, I, AI, BR) + MATVEC(L, U, I, AR, BI); RR := MV end COMMATVEC; comment ================== 34355 ================= ; Boolean procedure HSHCOMCOL(L, U, J, AR, AI, TOL, K, C, S, T); value L, U, J, TOL; integer L, U, J; real TOL, K, C, S, T; array AR, AI; begin real VR, DEL, MOD, H, ARLJ, AILJ; procedure CARPOL(AR, AI, R, C, S); code 34344; real procedure TAMMAT(L, U, I, J, A, B); code 34014; VR := TAMMAT(L + 1, U, J, J, AR, AR) + TAMMAT(L + 1, U, J, J, AI, AI); ARLJ := AR[L, J]; AILJ := AI[L, J]; CARPOL(ARLJ, AILJ, MOD, C, S); if VR > TOL then begin VR := VR + ARLJ ⭡ 2 + AILJ ⭡ 2; H := K := SQRT(VR); T := VR + MOD × H; if ARLJ = 0 ∧ AILJ = 0 then AR[L, J] := H else begin AR[L, J] := ARLJ + C × K; AI[L, J] := AILJ + S × K; S := - S end; C := - C; HSHCOMCOL := true end else begin HSHCOMCOL := false; K := MOD; T := - 1 end end HSHCOMCOL; comment ================== 34356 ================= ; procedure HSHCOMPRD(I, II, L, U, J, AR, AI, BR, BI, T); value I, II, L, U, J, T; integer I, II, L, U, J; real T; array AR, AI, BR, BI; begin procedure ELMCOMCOL(L, U, I, J, AR, AI, BR, BI, XR, XI); code 34377; real procedure TAMMAT(L, U, I, J, A, B); code 34014; for L := L step 1 until U do ELMCOMCOL(I, II, L, J, AR, AI, BR, BI, ( - TAMMAT(I, II, J, L, BR, AR) - TAMMAT(I, II, J, L, BI, AI)) / T, (TAMMAT(I, II, J, L, BI, AR) - TAMMAT(I, II, J, L, BR, AI)) / T); end HSHCOMPRD; comment ================== 34376 ================= ; procedure ELMCOMVECCOL(L, U, J, AR, AI, BR, BI, XR, XI); value L, U, J, XR, XI; integer L, U, J; real XR, XI; array AR, AI, BR, BI; begin procedure ELMVECCOL(L, U, I, A, B, X); code 34021; ELMVECCOL(L, U, J, AR, BR, XR); ELMVECCOL(L, U, J, AR, BI, -XI); ELMVECCOL(L, U, J, AI, BR, XI); ELMVECCOL(L, U, J, AI, BI, XR) end ELMCOMVECCOL; comment ================== 34377 ================= ; procedure ELMCOMCOL(L, U, I, J, AR, AI, BR, BI, XR, XI); value L, U, I, J, XR, XI; integer L, U, I, J; real XR, XI; array AR, AI, BR, BI; begin procedure ELMCOL(L, U, I, J, A, B, X); code 34023; ELMCOL(L, U, I, J, AR, BR, XR); ELMCOL(L, U, I, J, AR, BI, -XI); ELMCOL(L, U, I, J, AI, BR, XI); ELMCOL(L, U, I, J, AI, BI, XR) end ELMCOMCOL; comment ================== 34378 ================= ; procedure ELMCOMROWVEC(L, U, I, AR, AI, BR, BI, XR, XI); value L, U, I, XR, XI; integer L, U, I; real XR, XI; array AR, AI, BR, BI; begin procedure ELMROWVEC(L, U, I, A, B, X); code 34027; ELMROWVEC(L, U, I, AR, BR, XR); ELMROWVEC(L, U, I, AR, BI, -XI); ELMROWVEC(L, U, I, AI, BR, XI); ELMROWVEC(L, U, I, AI, BI, XR) end ELMCOMROWVEC; comment ================== 34360 ================= ; procedure SCLCOM(AR, AI, N, N1, N2); value N, N1, N2; integer N, N1, N2; array AR, AI; begin integer I, J, K; real S, R; procedure COMCOLCST(L, U, J, AR, AI, XR, XI); code 34352; for J := N1 step 1 until N2 do begin S := 0; for I := 1 step 1 until N do begin R := AR[I, J] ⭡ 2 + AI[I, J] ⭡ 2; if R > S then begin S := R; K := I end end; if S ≠ 0 then COMCOLCST(1, N, J, AR, AI, AR[K, J] / S, - AI[K, J] / S) end end SCLCOM; comment ================== 34359 ================= ; real procedure COMEUCNRM(AR, AI, LW, N); value N, LW; integer N, LW; array AR, AI; begin integer I, L; real procedure MATTAM(L, U, I, J, A, B); code 34015; real R; R := 0; for I := 1 step 1 until N do begin L := if I > LW then I - LW else 1; R := MATTAM(L, N, I, I, AR, AR) + MATTAM(L, N, I, I, AI, AI) + R; end; COMEUCNRM := SQRT(R) end COMEUCNRM; comment ================== 34340 ================= ; real procedure COMABS(XR, XI); value XR, XI; real XR, XI; begin XR := ABS(XR); XI := ABS(XI); COMABS := if XI > XR then SQRT((XR/XI)⭡2 + 1) × XI else if XI = 0 then XR else SQRT((XI/XR)⭡2 + 1) × XR end COMABS; comment ================== 34343 ================= ; procedure COMSQRT(AR, AI, PR, PI); value AR, AI; real AR, AI, PR, PI; if AR = 0 ∧ AI = 0 then PR := PI := 0 else begin real BR, BI, H; BR := ABS(AR); BI := ABS(AI); H := if BI < BR then (if BR < 1 then SQRT((SQRT((BI/BR)⭡2 + 1) × .5 + .5) × BR) else SQRT((SQRT((BI/BR)⭡2 + 1) × .125 + .125) × BR) × 2) else if BI < 1 then SQRT((SQRT((BR/BI)⭡2 + 1) × BI + BR) × 2) × .5 else if BR + 1 = 1 then SQRT(BI × .5) else SQRT(SQRT((BR/BI)⭡2 + 1) × BI × .125 + BR × .125) × 2; if AR ≥ 0 then begin PR := H; PI := AI/H × .5 end else begin PI := if AI ≥ 0 then H else -H; PR := BI/H × .5 end end COMSQRT; comment ================== 34342 ================= ; procedure COMDIV(XR, XI, YR, YI, ZR, ZI); value XR, XI, YR, YI; real XR, XI, YR, YI, ZR, ZI; begin real H, D; if ABS(YI) < ABS(YR) then begin if YI = 0 then begin ZR := XR/YR; ZI := XI/YR end else begin H := YI/YR; D := H × YI + YR; ZR := (XR + H × XI)/D; ZI := (XI-H × XR)/D end end else begin H := YR/YI; D := H × YR + YI; ZR := (XR × H + XI)/D; ZI := (XI × H - XR)/D end end COMDIV; comment ================== 34301 ================= ; procedure DECSOL(A, N, AUX, B); value N; integer N; array A, AUX, B; begin integer array P[1:N]; procedure SOL(A, N, P, B); code 34051; procedure DEC(A, N, AUX, P); code 34300; DEC(A, N, AUX, P); if AUX[3] = N then SOL(A, N, P, B) end DECSOL; comment ================== 34061 ================= ; procedure SOLELM(A, N, RI, CI, B); value N; integer N; array A, B; integer array RI, CI; begin integer R, CIR; real W; procedure SOL(A, N, P, B); code 34051; SOL(A, N, RI, B); for R := N step - 1 until 1 do begin CIR := CI[R]; if CIR ≠ R then begin W := B[R]; B[R] := B[CIR]; B[CIR] := W end end end SOLELM; comment ================== 34243 ================= ; procedure GSSSOLERB(A, N, AUX, B); value N; integer N; array A, AUX, B; begin integer array RI, CI[1:N]; procedure SOLELM(A, N, RI, CI, B); code 34061; procedure GSSERB(A, N, AUX, RI, CI); code 34242; GSSERB(A, N, AUX, RI, CI); if AUX[3] = N then SOLELM(A, N, RI, CI, B) end GSSSOLERB; comment ================== 34302 ================= ; procedure DECINV(A, N, AUX); value N; integer N; array A, AUX; begin integer array P[1:N]; procedure DEC(A, N, AUX, P); code 34300; procedure INV(A, N, P); code 34053; DEC(A, N, AUX, P); if AUX[3] = N then INV(A, N, P) end DECINV; comment ================== 34236 ================= ; procedure GSSINV(A, N, AUX); value N; integer N; array A, AUX; begin integer array RI, CI[1:N]; procedure GSSELM(A, N, AUX, RI, CI); code 34231; real procedure INV1(A, N, RI, CI, WITHNORM); code 34235; GSSELM(A, N, AUX, RI, CI); if AUX[3] = N then AUX[9] := INV1(A, N, RI, CI, true) end GSSINV; comment ================== 34244 ================= ; procedure GSSINVERB(A, N, AUX); value N; integer N; array A, AUX; begin integer array RI, CI[1:N]; procedure GSSELM(A, N, AUX, RI, CI); code 34231; real procedure INV1(A, N, RI, CI, WITHNORM); code 34235; procedure ERBELM(N, AUX, NRMINV); code 34241; GSSELM(A, N, AUX, RI, CI); if AUX[3] = N then ERBELM(N, AUX, INV1(A, N, RI, CI, true)) end GSSINVERB; comment ================== 34251 ================= ; procedure GSSITISOL(A, N, AUX, B); value N; integer N; array A, AUX, B; begin integer I, J; array AA[1:N, 1:N]; integer array RI, CI[1:N]; procedure GSSELM(A, N, AUX, RI, CI); code 34231; procedure ITISOL(A, LU, N, AUX, RI, CI, B); code 34250; procedure DUPMAT(L, U, I, J, A, B); code 31035; DUPMAT(1, N, 1, N, AA, A); GSSELM(A, N, AUX, RI, CI); if AUX[3] = N then ITISOL(AA, A, N, AUX, RI, CI, B) end GSSITISOL; comment ================== 34254 ================= ; procedure GSSITISOLERB(A, N, AUX, B); value N; integer N; array A, AUX, B; begin integer I, J; array AA[1:N, 1:N]; integer array RI, CI[1:N]; procedure GSSNRI(A, N, AUX, RI, CI); code 34252; procedure ITISOLERB(A, LU, N, AUX, RI, CI, B); code 34253; procedure DUPMAT(L, U, I, J, A, B); code 31035; DUPMAT(1, N, 1, N, AA, A); GSSNRI(A, N, AUX, RI, CI); if AUX[3] = N then ITISOLERB(AA, A, N, AUX, RI, CI, B) end GSSITISOLERB; comment ================== 34131 ================= ; procedure LSQSOL(A, N, M, AID, CI, B); value N, M; integer N, M; array A, AID, B; integer array CI; begin integer K, CIK; real W; real procedure MATVEC(L, U, I, A, B); code 34011; real procedure TAMVEC(L, U, I, A, B); code 34012; procedure ELMVECCOL(L, U, I, A, B, X); code 34021; for K := 1 step 1 until M do ELMVECCOL(K, N, K, B, A, TAMVEC(K, N, K, A, B) / (AID[K] × A[K, K])); for K := M step - 1 until 1 do B[K] := (B[K] - MATVEC (K + 1, M, K, A, B)) / AID[K]; for K := M step - 1 until 1 do begin CIK := CI[K]; if CIK ≠ K then begin W := B[K]; B[K] := B[CIK]; B[CIK] := W end end end LSQSOL; comment ================== 34135 ================= ; procedure LSQORTDECSOL(A, N, M, AUX, DIAG, B); value N, M; integer N, M; array A, AUX, DIAG, B; begin array AID[1:M]; integer array CI[1:M]; procedure LSQORTDEC(A, N, M, AUX, AID, CI); code 34134; procedure LSQDGLINV(A, M, AID, CI, DIAG); code 34132; procedure LSQSOL(A, N, M, AID, CI, B); code 34131; LSQORTDEC(A, N, M, AUX, AID, CI); if AUX[3] = M then begin LSQDGLINV(A, M, AID, CI, DIAG); LSQSOL(A, N, M, AID, CI, B) end end LSQORTDECSOL; comment ================== 34280 ================= ; procedure SOLSVDOVR(U, VAL, V, M, N, X, EM); value M, N; integer M, N; array U, VAL, V, X, EM; begin integer I; real MIN; array X1[1:N]; real procedure MATVEC(L, U, I, A, B); value L, U, I; integer L, U, I; array A, B; code 34011; real procedure TAMVEC(L, U, I, A, B); value L, U, I; integer L, U, I; array A, B; code 34012; MIN := EM[6]; for I := 1 step 1 until N do X1[I] := if VAL[I] ≤ MIN then 0 else TAMVEC(1, M, I, U, X) / VAL[I]; for I := 1 step 1 until N do X[I] := MATVEC(1, N, I, V, X1) end SOLSVDOVR; comment ================== 34281 ================= ; integer procedure SOLOVR(A, M, N, X, EM); value M, N; integer M, N; array A, X, EM; begin integer I; array VAL[1:N], V[1:N, 1:N]; integer procedure QRISNGVALDEC(A, M, N, VAL, V, EM); value M, N; integer M, N; array A, VAL, V, EM; code 34273; procedure SOLSVDOVR(U, VAL, V, M, N, X, EM); value M, N; integer M, N; array U, VAL, V, X, EM; code 34280; SOLOVR := I := QRISNGVALDEC(A, M, N, VAL, V, EM); if I = 0 then SOLSVDOVR(A, VAL, V, M, N, X, EM) end SOLOVR; comment ================== 34282 ================= ; procedure SOLSVDUND(U, VAL, V, M, N, X, EM); value M, N; integer M, N; array U, VAL, V, X, EM; begin integer I; real MIN; array X1[1:N]; real procedure MATVEC(L, U, I, A, B); value L, U, I; integer L, U, I; array A, B; code 34011; real procedure TAMVEC(L, U, I, A, B); value L, U, I; integer L, U, I; array A, B; code 34012; MIN := EM[6]; for I := 1 step 1 until N do X1[I] := if VAL[I] ≤ MIN then 0 else TAMVEC(1, N, I, V, X) / VAL[I]; for I := 1 step 1 until M do X[I] := MATVEC(1, N, I, U, X1) end SOLSVDUND; comment ================== 34283 ================= ; integer procedure SOLUND(A, M, N, X, EM); value M, N; integer M, N; array A, X, EM; begin integer I; array VAL[1:N], V[1:N, 1:N]; integer procedure QRISNGVALDEC(A, M, N, VAL, V, EM); value M, N; integer M, N; array A, VAL, V, EM; code 34273; procedure SOLSVDUND(U, VAL, V, M, N, X, EM); value M, N; integer M, N; array U, VAL, V, X, EM; code 34282; SOLUND := I := QRISNGVALDEC(A, M, N, VAL, V, EM); if I = 0 then SOLSVDUND(A, VAL, V, M, N, X, EM) end SOLUND; comment ================== 34285 ================= ; integer procedure HOMSOL(A, M, N, V, EM); value M, N; integer M, N; array A, V, EM; begin integer I; array VAL[1:N]; integer procedure QRISNGVALDEC(A, M, N, VAL, V, EM); value M, N; integer M, N; array A, VAL, V, EM; code 34273; procedure HOMSOLSVD(U, VAL, V, M, N); value M, N; integer M, N; array U, VAL, V; code 34284; HOMSOL := I := QRISNGVALDEC(A, M, N, VAL, V, EM); if I = 0 then HOMSOLSVD(A, VAL, V, M, N) end HOMSOL; comment ================== 34286 ================= ; procedure PSDINVSVD(U, VAL, V, M, N, EM); value M, N; integer M, N; array U, VAL, V, EM; begin integer I, J; real MIN, VALI; array X[1:N]; real procedure MATVEC(L, U, I, A, B); value L, U, I; integer L, U, I; array A, B; code 34011; MIN := EM[6]; for I := 1 step 1 until N do if VAL[I] > MIN then begin VALI := 1 / VAL[I]; for J := 1 step 1 until M do U[J, I] := U[J, I] × VALI end else for J := 1 step 1 until M do U[J, I] := 0; for I := 1 step 1 until M do begin for J := 1 step 1 until N do X[J] := U[I, J]; for J := 1 step 1 until N do U[I, J] := MATVEC(1, N, J, V, X) end end PSDINVSVD; comment ================== 34287 ================= ; integer procedure PSDINV(A, M, N, EM); value M, N; integer M, N; array A, EM; begin integer I; array VAL[1:N], V[1:N, 1:N]; integer procedure QRISNGVALDEC(A, M, N, VAL, V, EM); value M, N; integer M, N; array A, VAL, V, EM; code 34273; procedure PSDINVSVD(U, VAL, V, M, N, EM); value M, N; integer M, N; array U, VAL, V, EM; code 34286; PSDINV := I := QRISNGVALDEC(A, M, N, VAL, V, EM); if I = 0 then PSDINVSVD(A, VAL, V, M, N, EM) end PSDINV; comment ================== 34320 ================= ; procedure DECBND(A, N, LW, RW, AUX, M, P); value N, LW, RW; integer N, LW, RW; integer array P; array A, M, AUX; begin integer I, J, K, KK, KK1, PK, MK, IK, LW1, F, Q, W, W1, W2, NRW, IW, SDET; real R, S, EPS, MIN; array V[1:N]; real procedure VECVEC(A, B, C, D, E); code 34010; procedure ELMVEC(A, B, C, D, E, F); code 34020; procedure ICHVEC(A, B, C, D); code 34030; F := LW; W1 := LW + RW; W := W1 + 1; W2 := W - 2; IW := 0; SDET := 1; NRW := N - RW; LW1 := LW + 1; Q := LW - 1; for I := 2 step 1 until LW do begin Q := Q - 1; IW := IW + W1; for J := IW - Q step 1 until IW do A[J] := 0 end; IW := - W2; Q := - LW; for I := 1 step 1 until N do begin IW := IW + W; if I ≤ LW1 then IW := IW - 1; Q := Q + W; if I > NRW then Q := Q - 1; V[I] := SQRT(VECVEC(IW, Q, 0, A, A)) end; EPS := AUX[2]; MIN := 1; KK := - W1; MK := - LW; if F > NRW then W2 := W2 + NRW - F; for K := 1 step 1 until N do begin if F < N then F := F + 1; IK := KK := KK + W; MK := MK + LW; S := ABS(A[KK]) / V[K]; PK := K; KK1 := KK + 1; for I := K + 1 step 1 until F do begin IK := IK + W1; M[MK + I - K] := R := A[IK]; A[IK] := 0; R := ABS(R) / V[I]; if R > S then begin S := R; PK := I end end; if S < MIN then MIN := S; if S < EPS then begin AUX[3] := K - 1; AUX[5] := S; go to END end; if K + W2 ≥ N then W2 := W2 - 1; P[K] := PK; if PK ≠ K then begin V[PK] := V[K]; PK := PK - K; ICHVEC(KK1, KK1 + W2, PK × W1, A); SDET := - SDET; R := M[MK + PK]; M[MK + PK] := A[KK]; A[KK] := R end else R := A[KK]; if R < 0 then SDET := - SDET; IW := KK1; LW1 := F - K + MK; for I := MK + 1 step 1 until LW1 do begin M[I] := S := M[I] / R; IW := IW + W1; ELMVEC(IW, IW + W2, KK1 - IW, A, A, - S) end end; AUX[3] := N; AUX[5] := MIN; END: AUX[1] := SDET end DECBND; comment ================== 34321 ================= ; real procedure DETERMBND(A, N, LW, RW, SGNDET); value N, LW, RW, SGNDET; integer N, LW, RW, SGNDET; array A; begin integer I, L; real P; L := 1; P := 1; LW := LW + RW + 1; for I := 1 step 1 until N do begin P := A[L] × P; L := L + LW end; DETERMBND := ABS(P) × SGNDET end DETERMBND; comment ================== 34071 ================= ; procedure SOLBND(A, N, LW, RW, M, P, B); value N, LW, RW; integer N, LW, RW; integer array P; array A, B, M; begin integer F, I, K, KK, W, W1, W2, SHIFT; real S; real procedure VECVEC(A, B, C, D, E); code 34010; procedure ELMVEC(A, B, C, D, E, F); code 34020; F := LW; SHIFT := - LW; W1 := LW - 1; for K := 1 step 1 until N do begin if F < N then F := F + 1; SHIFT := SHIFT + W1; I := P[K]; S := B[I]; if I ≠ K then begin B[I] := B[K]; B[K] := S end; ELMVEC(K + 1, F, SHIFT, B, M, - S) end; W1 := LW + RW; W := W1 + 1; KK := (N + 1) × W - W1; W2 := - 1; SHIFT := N × W1; for K := N step - 1 until 1 do begin KK := KK - W; SHIFT := SHIFT - W1; if W2 < W1 then W2 := W2 + 1; B[K] := (B[K] - VECVEC(K + 1, K + W2, SHIFT, B, A)) / A[KK] end end SOLBND; comment ================== 34322 ================= ; procedure DECSOLBND(A, N, LW, RW, AUX, B); value N, LW, RW; integer N, LW, RW; array A, B, AUX; begin integer I, J, K, KK, KK1, PK, IK, LW1, F, Q, W, W1, W2, IW, NRW, SHIFT, SDET; real R, S, EPS, MIN; array M[0:LW], V[1:N]; real procedure VECVEC(A, B, C, D, E); code 34010; procedure ELMVEC(A, B, C, D, E, F); code 34020; procedure ICHVEC(A, B, C, D); code 34030; F := LW; SDET := 1; W1 := LW + RW; W := W1 + 1; W2 := W - 2; IW := 0; NRW := N - RW; LW1 := LW + 1; Q := LW - 1; for I := 2 step 1 until LW do begin Q := Q - 1; IW := IW + W1; for J := IW - Q step 1 until IW do A[J] := 0 end; IW := - W2; Q := - LW; for I := 1 step 1 until N do begin IW := IW + W; if I ≤ LW1 then IW := IW - 1; Q := Q + W; if I > NRW then Q := Q - 1; V[I] := SQRT(VECVEC(IW, Q, 0, A, A)) end; EPS := AUX[2]; MIN := 1; KK := - W1; if F > NRW then W2 := W2 + NRW - F; for K := 1 step 1 until N do begin if F < N then F := F + 1; IK := KK := KK + W; S := ABS(A[KK]) / V[K]; PK := K; KK1 := KK + 1; for I := K + 1 step 1 until F do begin IK := IK + W1; M[I - K] := R := A[IK]; A[IK] := 0; R := ABS(R) / V[I]; if R > S then begin S := R; PK := I end end; if S < MIN then MIN := S; if S < EPS then begin AUX[3] := K - 1; AUX[5] := S; go to END end; if K + W2 ≥ N then W2 := W2 - 1; if PK ≠ K then begin V[PK] := V[K]; PK := PK - K; ICHVEC(KK1, KK1 + W2, PK × W1, A); SDET := - SDET; R := B[K]; B[K] := B[PK + K]; B[PK + K] := R; R := M[PK]; M[PK] := A[KK]; A[KK] := R end else R := A[KK]; IW := KK1; LW1 := F - K; if R < 0 then SDET := - SDET; for I := 1 step 1 until LW1 do begin M[I] := S := M[I] / R; IW := IW + W1; ELMVEC(IW, IW + W2, KK1 - IW, A, A, - S); B[K + I] := B[K + I] - B[K] × S end end; AUX[3] := N; AUX[5] := MIN; KK := (N + 1) × W - W1; W2 := - 1; SHIFT := N × W1; for K := N step - 1 until 1 do begin KK := KK - W; SHIFT := SHIFT - W1; if W2 < W1 then W2 := W2 + 1; B[K] := (B[K] - VECVEC(K + 1, K + W2, SHIFT, B, A)) / A[KK] end; END: AUX[1] := SDET end DECSOLBND; comment ================== 34423 ================= ; procedure DECTRI(SUB, DIAG, SUPER, N, AUX); value N; integer N; array SUB, DIAG, SUPER, AUX; begin integer I, N1; real D, R, S, U, NORM, NORM1, TOL; TOL := AUX[2]; D := DIAG[1]; R := SUPER[1]; NORM := NORM1 := ABS(D) + ABS(R); if ABS(D) ≤ NORM1 × TOL then begin AUX[3] := 0; AUX[5] := D; goto EXIT end; U := SUPER[1] := R / D; S := SUB[1]; N1 := N - 1; for I := 2 step 1 until N1 do begin D := DIAG[I]; R := SUPER[I]; NORM1 := ABS(S) + ABS(D) + ABS(R); D := DIAG[I] := D - U × S; if ABS(D) ≤ NORM1 × TOL then begin AUX[3] := I - 1; AUX[5] := D; goto EXIT end; U := SUPER[I] := R / D; S := SUB[I]; if NORM1 > NORM then NORM := NORM1 end; D := DIAG[N]; NORM1 := ABS(D) + ABS(S); D := DIAG[N] := D - U × S; if ABS(D) ≤ NORM1 × TOL then begin AUX[3] := N1; AUX[5] := D; goto EXIT end; if NORM1 > NORM then NORM := NORM1; AUX[3] := N; AUX[5] := NORM; EXIT: end DECTRI; comment ================== 34426 ================= ; procedure DECTRIPIV(SUB, DIAG, SUPER, N, AID, AUX, PIV); value N; integer N; array SUB, DIAG, SUPER, AID, AUX; Boolean array PIV; begin integer I, I1, N1, N2; real D, R, S, U, T, Q, V, W, NORM, NORM1, NORM2, TOL; TOL := AUX[2]; D := DIAG[1]; R := SUPER[1]; NORM := NORM2 := ABS(D) + ABS(R); N2 := N - 2; for I := 1 step 1 until N2 do begin I1 := I + 1; S := SUB[I]; T := DIAG[I1]; Q := SUPER[I1]; NORM1 := NORM2; NORM2 := ABS(S) + ABS(T) + ABS(Q); if NORM2 > NORM then NORM := NORM2; if ABS(D) × NORM2 < ABS(S) × NORM1 then begin if ABS(S) ≤ TOL × NORM2 then begin AUX[3] := I - 1; AUX[5] := S; goto EXIT end; DIAG[I] := S; U := SUPER[I] := T / S; V := AID[I] := Q / S; SUB[I] := D; W := SUPER[I1] := -V × D; D := DIAG[I1] := R - U × D; R := W; NORM2 := NORM1; PIV[I] := true end else begin if ABS(D) ≤ TOL × NORM1 then begin AUX[3] := I - 1; AUX[5] := D; goto EXIT end; U := SUPER[I] := R / D; D := DIAG[I1] := T - U × S; AID[I] := 0; PIV[I] := false; R := Q end end; N1 := N - 1; S := SUB[N1]; T := DIAG[N]; NORM1 := NORM2; NORM2 := ABS(S) + ABS(T); if NORM2 > NORM then NORM := NORM2; if ABS(D) × NORM2 < ABS(S) × NORM1 then begin if ABS(S) ≤ TOL × NORM2 then begin AUX[3] := N2; AUX[5] := S; goto EXIT end; DIAG[N1] := S; U := SUPER[N1] := T / S; SUB[N1] := D; D := DIAG[N] := R - U × D; NORM2 := NORM1; PIV[N1] := true end else begin if ABS(D) ≤ TOL × NORM1 then begin AUX[3] := N2; AUX[5] := D; goto EXIT end; U := SUPER[N1] := R / D; D := DIAG[N] := T - U × S; PIV[N1] := false end; if ABS(D) ≤ TOL × NORM2 then begin AUX[3] := N1; AUX[5] := D; goto EXIT end; AUX[3] := N; AUX[5] := NORM; EXIT: end DECTRIPIV; comment ================== 34424 ================= ; procedure SOLTRI(SUB, DIAG, SUPER, N, B); value N; integer N; array SUB, DIAG, SUPER, B; begin integer I; real R; R := B[1] := B[1] / DIAG[1]; for I := 2 step 1 until N do R := B[I] := (B[I] - SUB[I - 1] × R) / DIAG[I]; for I := N - 1 step -1 until 1 do R := B[I] := B[I] - SUPER[I] × R end SOLTRI; comment ================== 34425 ================= ; procedure DECSOLTRI(SUB, DIAG, SUPER, N, AUX, B); value N; integer N; array SUB, DIAG, SUPER, AUX, B; begin procedure DECTRI(SUB, DIAG, SUPER, N, AUX); code 34423; procedure SOLTRI( SUB, DIAG, SUPER, N, B); code 34424; DECTRI(SUB, DIAG, SUPER, N, AUX); if AUX[3] = N then SOLTRI(SUB, DIAG, SUPER, N, B) end DECSOLTRI; comment ================== 34427 ================= ; procedure SOLTRIPIV(SUB, DIAG, SUPER, N, AID, PIV, B); value N; integer N; array SUB, DIAG, SUPER, AID, B; Boolean array PIV; begin integer I, N1; real BI, BI1, R, S, T; N1 := N - 1; for I := 1 step 1 until N1 do begin if PIV[I] then begin BI := B[I + 1]; BI1 := B[I] end else begin BI := B[I]; BI1 := B[I + 1] end; R := B[I] := BI / DIAG[I]; B[I + 1] := BI1 - SUB[I] × R end; R := B[N] := B[N] / DIAG[N]; T := B[N1] := B[N1] - SUPER[N1] × R; for I := N - 2 step -1 until 1 do begin S := R; R := T; T := B[I] := B[I] - SUPER[I] × R - (if PIV[I] then AID[I] × S else 0) end end SOLTRIPIV; comment ================== 34428 ================= ; procedure DECSOLTRIPIV(SUB, DIAG, SUPER, N, AUX, B); value N; integer N; array SUB, DIAG, SUPER, AUX, B; begin integer I, I1, N1, N2; real D, R, S, U, T, Q, V, W, NORM, NORM1, NORM2, TOL, BI, BI1, BI2; Boolean array PIV[1:N]; TOL := AUX[2]; D := DIAG[1]; R := SUPER[1]; BI := B[1]; NORM := NORM2 := ABS(D) + ABS(R); N2 := N - 2; for I := 1 step 1 until N2 do begin I1 := I + 1; S := SUB[I]; T := DIAG[I1]; Q := SUPER[I1]; BI1 := B[I1]; NORM1 := NORM2; NORM2 := ABS(S) + ABS(T) + ABS(Q); if NORM2 > NORM then NORM := NORM2; if ABS(D) × NORM2 < ABS(S) × NORM1 then begin if ABS(S) ≤ TOL × NORM2 then begin AUX[3] := I - 1; AUX[5] := S; goto EXIT end; U := SUPER[I] := T / S; BI1 := B[I] := BI1 / S; BI := BI - BI1 × D; V := SUB[I] := Q / S; W := SUPER[I1] := -V × D; D := DIAG[I1] := R - U × D; R := W; NORM2 := NORM1; PIV[I] := true end else begin if ABS(D) ≤ TOL × NORM1 then begin AUX[3] := I - 1; AUX[5] := D; goto EXIT end; U := SUPER[I] := R / D; BI := B[I] := BI / D; BI := BI1 - BI × S; D := DIAG[I1] := T - U × S; PIV[I] := false; R := Q end end; N1 := N - 1; S := SUB[N1]; T := DIAG[N]; NORM1 := NORM2; BI1 := B[N]; NORM2 := ABS(S) + ABS(T); if NORM2 > NORM then NORM := NORM2; if ABS(D) × NORM2 < ABS(S) × NORM1 then begin if ABS(S) ≤ TOL × NORM2 then begin AUX[3] := N2; AUX[5] := S; goto EXIT end; U := SUPER[N1] := T / S; BI1 := B[N1] := BI1 / S; BI := BI - BI1 × D; D := R - U × D; NORM2 := NORM1 end else begin if ABS(D) ≤ TOL × NORM1 then begin AUX[3] := N2; AUX[5] := D; goto EXIT end; U := SUPER[N1] := R / D; BI := B[N1] := BI / D; BI := BI1 - BI × S; D := T - U × S end; if ABS(D) ≤ TOL × NORM2 then begin AUX[3] := N1; AUX[5] := D; goto EXIT end; AUX[3] := N; AUX[5] := NORM; BI1 := B[N] := BI / D; BI := B[N1] := B[N1] - SUPER[N1] × BI1; for I := N - 2 step -1 until 1 do begin BI2 := BI1; BI1 := BI; BI := B[I] := B[I] - SUPER[I] × BI1 - (if PIV[I] then SUB[I] × BI2 else 0) end; EXIT: end DECSOLTRIPIV; comment ================== 34330 ================= ; procedure CHLDECBND(A, N, W, AUX); value N, W; integer N, W; array A, AUX; begin integer J, K, JMAX, KK, KJ, W1, START; real R, EPS, MAX; real procedure VECVEC(L, U, S, A, B); code 34010; MAX := 0; KK := - W; W1 := W + 1; for J := 1 step 1 until N do begin KK := KK + W1; if A[KK] > MAX then MAX := A[KK] end; JMAX := W; W1 := W + 1; KK := - W; EPS := AUX[2] × MAX; for K := 1 step 1 until N do begin if K + W > N then JMAX := JMAX - 1; KK := KK + W1; START := KK - K + 1; R := A[KK] - VECVEC(if K ≤ W1 then START else KK - W, KK - 1, 0, A, A); if R ≤ EPS then begin AUX[3] := K - 1; go to END end; A[KK] := R := SQRT(R); KJ := KK; for J := 1 step 1 until JMAX do begin KJ := KJ + W; A[KJ] := (A[KJ] - VECVEC(if K + J ≤ W1 then START else KK - W + J, KK - 1, KJ - KK, A, A)) / R end end; AUX[3] := N; END: end CHLDECBND; comment ================== 34331 ================= ; real procedure CHLDETERMBND(A, N, W); value N, W; integer N, W; array A; begin integer J, KK, W1; real P; W1 := W + 1; KK := - W; P := 1; for J := 1 step 1 until N do begin KK := KK + W1; P := A[KK] × P end; CHLDETERMBND := P × P end CHLDETERMBND; comment ================== 34332 ================= ; procedure CHLSOLBND(A, N, W, B); value N, W; integer N, W; array A, B; begin integer I, K, IMAX, KK, W1; real procedure VECVEC(L, U, S, A, B); code 34010; real procedure SCAPRD1(LA, SA, LB, SB, N, A, B); code 34017; KK := - W; W1 := W + 1; for K := 1 step 1 until N do begin KK := KK + W1; B[K] := (B[K] - VECVEC(if K ≤ W1 then 1 else K - W, K - 1, KK - K, B, A)) / A[KK] end; IMAX := - 1; for K := N step - 1 until 1 do begin if IMAX < W then IMAX := IMAX + 1; B[K] := (B[K] - SCAPRD1(KK + W, W, K + 1, 1, IMAX, A, B)) / A[KK]; KK := KK - W1 end end CHLSOLBND; comment ================== 34333 ================= ; procedure CHLDECSOLBND(A, N, W, AUX, B); value N, W; integer N, W; array A, AUX, B; begin procedure CHLDECBND(A, N, W, AUX); code 34330; procedure CHLSOLBND(A, N, W, B); code 34332; CHLDECBND(A, N, W, AUX); if AUX[3] = N then CHLSOLBND(A, N, W, B) end CHLDECSOLBND; comment ================== 34420 ================= ; procedure DECSYMTRI(DIAG, CO, N, AUX); value N; integer N; array DIAG, CO, AUX; begin integer I, N1; real D, R, S, U, TOL, NORM, NORMR; TOL := AUX[2]; D := DIAG[1]; R := CO[1]; NORM := NORMR := ABS(D) + ABS(R); if ABS(D) ≤ NORMR × TOL then begin AUX[3] := 0; AUX[5] := D; goto EXIT end; U := CO[1] := R / D; N1 := N - 1; for I := 2 step 1 until N1 do begin S := R; R := CO[I]; D := DIAG[I]; NORMR := ABS(S) + ABS(D) + ABS(R); D := DIAG[I] := D - U × S; if ABS(D) ≤ NORMR × TOL then begin AUX[3] := I - 1; AUX[5] := D; goto EXIT end; U := CO[I] := R / D; if NORMR > NORM then NORM := NORMR end; D := DIAG[N]; NORMR := ABS(D) + ABS(R); D := DIAG[N] := D - U × R; if ABS(D) ≤ NORMR × TOL then begin AUX[3] := N1; AUX[5] := D; goto EXIT end; if NORMR > NORM then NORM := NORMR; AUX[3] := N; AUX[5] := NORM; EXIT: end DECSYMTRI; comment ================== 34421 ================= ; procedure SOLSYMTRI(DIAG, CO, N, B); value N; integer N; array DIAG, CO, B; begin integer I; real R, S; R := B[1]; B[1] := R / DIAG[1]; for I := 2 step 1 until N do begin R := B[I] - CO[I-1] × R; B[I] := R / DIAG[I] end; S := B[N]; for I := N - 1 step -1 until 1 do S := B[I] := B[I] - CO[I] × S end SOLSYMTRI; comment ================== 34422 ================= ; procedure DECSOLSYMTRI(DIAG, CO, N, AUX, B); value N; integer N; array DIAG, CO, AUX, B; begin procedure DECSYMTRI(DIAG, CO, N, AUX); code 34420; procedure SOLSYMTRI(DIAG, CO, N, B); code 34421; DECSYMTRI(DIAG, CO, N, AUX); if AUX[3] = N then SOLSYMTRI(DIAG, CO, N, B) end DECSOLSYMTRI; comment ================== 34220 ================= ; procedure CONJ GRAD( MATVEC, X, R, L, N, GO ON, ITERATE, NORM2); value L, N; procedure MATVEC; array X, R; Boolean GO ON; integer L, N, ITERATE; real NORM2; begin array P, AP[ L: N]; integer I; real A, B, PRR, RRP; real procedure VECVEC( A, B, C, D, E); code 34010; procedure ELMVEC( A, B, C, D, E, F); code 34020; for ITERATE := 0, ITERATE + 1 while GO ON do begin if ITERATE = 0 then begin MATVEC( X, P); for I := L step 1 until N do P[ I] := R[ I] := R[ I] - P[ I]; PRR := VECVEC( L, N, 0, R, R) end else begin B := RRP / PRR; PRR := RRP; for I := L step 1 until N do P[ I] := R[ I] + B × P[ I] end; MATVEC( P, AP); A := PRR / VECVEC( L, N, 0, P, AP); ELMVEC( L, N, 0, X, P, A); ELMVEC( L, N, 0, R, AP, -A); NORM2 := RRP := VECVEC( L, N, 0, R, R) end end CONJ GRAD; comment ================== 34173 ================= ; comment MCA 2405; procedure EQILBR(A, N, EM, D, INT); value N; integer N; array A, EM, D; integer array INT; begin integer I, IM, I1, P, Q, J, T, COUNT, EXPONENT, NI; real C, R, EPS, OMEGA, FACTOR; procedure MOVE(K); value K; integer K; begin real DI; NI := Q - P; T := T + 1; if K ≠ I then begin ICHCOL(1, N, K, I, A); ICHROW(1, N, K, I, A); DI := D[I]; D[I] := D[K]; D[K] := DI end end MOVE; real procedure TAMMAT(L, U, I, J, A, B); code 34014; real procedure MATTAM(L, U, I, J, A, B); code 34015; procedure ICHCOL(L, U, I, J, A); code 34031; procedure ICHROW(L, U, I, J, A); code 34032; FACTOR := 1 / (2 × LN(2)); comment MORE GENERALLY: LN(BASE); EPS := EM[0]; OMEGA := 1 / EPS; T := P := 1; Q := NI := I := N; COUNT := (N + 1) × N ÷ 2; for J := 1 step 1 until N do begin D[J] := 1; INT[J] := 0 end; for I := if I < Q then I + 1 else P while COUNT > 0 ∧ NI > 0 do begin COUNT := COUNT - 1; IM := I - 1; I1 := I + 1; C := SQRT(TAMMAT(P, IM, I, I, A, A) + TAMMAT(I1, Q, I, I, A, A)); R := SQRT(MATTAM(P, IM, I, I, A, A) + MATTAM(I1, Q, I, I, A, A)); if C × OMEGA ≤ R × EPS then begin INT[T] := I; MOVE(P); P := P + 1 end else if R × OMEGA ≤ C × EPS then begin INT[T] := -I; MOVE(Q); Q := Q - 1 end else begin EXPONENT := LN(R / C) × FACTOR; if ABS(EXPONENT) > 1 then begin NI := Q - P; C := 2 ⭡ EXPONENT; R := 1 / C; D[I] := D[I] × C; for J := 1 step 1 until IM, I1 step 1 until N do begin A[J, I] := A[J, I] × C; A[I, J] := A[I, J] × R end end else NI := NI - 1 end end end EQILBR; comment ================== 34174 ================= ; comment MCA 2406; procedure BAKLBR(N, N1, N2, D, INT, VEC); value N, N1, N2; integer N, N1, N2; array D, VEC; integer array INT; begin integer I, J, K, P, Q; real DI; procedure ICHROW(L, U, I, J, A); code 34032; P := 1; Q := N; for I := 1 step 1 until N do begin DI := D[I]; if DI ≠ 1 then for J := N1 step 1 until N2 do VEC[I, J] := VEC[I, J] × DI; K := INT[I]; if K > 0 then P := P + 1 else if K < 0 then Q := Q - 1 end; for I := P - 1 + N - Q step -1 until 1 do begin K := INT[I]; if K > 0 then begin P := P - 1; if K ≠ P then ICHROW(N1, N2, K, P, VEC) end else begin Q := Q + 1; if -K ≠ Q then ICHROW(N1, N2, -K, Q, VEC) end end end BAKLBR; comment ================== 34361 ================= ; procedure EQILBRCOM(A1, A2, N, EM, D, INT); value N; integer N; array A1, A2, EM, D; integer array INT; begin integer I, P, Q, J, T, COUNT, EXPONENT, NI, IM, I1; real C, R, EPS; procedure ICHCOL(L, U, I, J, A); code 34031; procedure ICHROW(L, U, I, J, A); code 34032; real procedure TAMMAT(L, U, I, J, A, B); code 34014; real procedure MATTAM(L, U, I, J, A, B); code 34015; procedure MOVE(K); value K; integer K; begin real DI; NI := Q - P; T := T + 1; if K ≠ I then begin ICHCOL(1, N, K, I, A1); ICHROW(1, N, K, I, A1); ICHCOL(1, N, K, I, A2); ICHROW(1, N, K, I, A2); DI := D[I]; D[I] := D[K]; D[K] := DI end end MOVE; EPS := EM[0] ⭡ 4; T := P := 1; Q := NI := I := N; COUNT := EM[6]; for J := 1 step 1 until N do begin D[J] := 1; INT[J] := 0 end; for I := if I < Q then I + 1 else P while COUNT > 0 ∧ NI > 0 do begin COUNT := COUNT - 1; IM := I - 1; I1 := I + 1; C := TAMMAT(P, IM, I, I, A1, A1) + TAMMAT(I1, Q, I, I, A1, A1) + TAMMAT(P, IM, I, I, A2, A2) + TAMMAT(I1, Q, I, I, A2, A2); R := MATTAM(P, IM, I, I, A1, A1) + MATTAM(I1, Q, I, I, A1, A1) + MATTAM(P, IM, I, I, A2, A2) + MATTAM(I1, Q, I, I, A2, A2); if C / EPS ≤ R then begin INT[T] := I; MOVE(P); P := P + 1 end else if R / EPS ≤ C then begin INT[T] := - I; MOVE(Q); Q := Q - 1 end else begin EXPONENT := LN(R / C) × 0.36067; if ABS(EXPONENT) > 1 then begin NI := Q - P; C := 2 ⭡ EXPONENT; D[I] := D[I] × C; for J := 1 step 1 until IM, I1 step 1 until N do begin A1[J, I] := A1[J, I] × C; A1[I, J] := A1[I, J] / C; A2[J, I] := A2[J, I] × C; A2[I, J] := A2[I, J] / C end end else NI := NI - 1 end end; EM[7] := EM[6] - COUNT end EQILBRCOM; comment ================== 34362 ================= ; procedure BAKLBRCOM(N, N1, N2, D, INT, VR, VI); value N, N1, N2; integer N, N1, N2; array D, VR, VI; integer array INT; begin procedure BAKLBR(N, N1, N2, D, INT, VEC); code 34174; BAKLBR(N, N1, N2, D, INT, VR); BAKLBR(N, N1, N2, D, INT, VI) end BAKLBRCOM; comment ================== 34140 ================= ; comment MCA 2300; procedure TFMSYMTRI2(A, N, D, B, BB, EM); value N; integer N; array A, B, BB, D, EM; begin integer I, J, R, R1; real W, X, A1, B0, BB0, D0, MACHTOL, NORM; real procedure TAMMAT(L, U, I, J, A, B); code 34014; real procedure MATMAT(L, U, I, J, A, B); code 34013; procedure ELMVECCOL(L, U, I, A, B, X); code 34021; real procedure TAMVEC(L, U, I, A, B); code 34012; procedure ELMCOL(L, U, I, J, A, B, X); code 34023; procedure ELMCOLVEC(L, U, I, A, B, X); code 34022; NORM := 0; for J := 1 step 1 until N do begin W := 0; for I := 1 step 1 until J do W := ABS(A[I, J]) + W; for I := J + 1 step 1 until N do W := ABS(A[J, I]) + W; if W > NORM then NORM := W end; MACHTOL := EM[0] × NORM; EM[1] := NORM; R := N; for R1 := N - 1 step -1 until 1 do begin D[R] := A[R, R]; X := TAMMAT(1, R - 2, R, R, A, A); A1 := A[R1, R]; if SQRT(X) ≤ MACHTOL then begin B0 := B[R1] := A1; BB[R1] := B0 × B0; A[R, R] := 1 end else begin BB0 := BB[R1] := A1 × A1 + X; B0 := if A1 > 0 then -SQRT(BB0) else SQRT(BB0); A1 := A[R1, R] := A1 - B0; W := A[R, R] := 1 / (A1 × B0); for J := 1 step 1 until R1 do B[J] := (TAMMAT(1, J, J, R, A, A) + MATMAT(J + 1, R1, J, R, A, A)) × W; ELMVECCOL(1, R1, R, B, A, TAMVEC(1, R1, R, A, B) × W × .5); for J := 1 step 1 until R1 do begin ELMCOL(1, J, J, R, A, A, B[J]); ELMCOLVEC(1, J, J, A, B, A[J, R]) end; B[R1] := B0 end; R := R1 end; D[1] := A[1, 1]; A[1, 1] := 1; B[N] := BB[N] := 0 end TFMSYMTRI2; comment ================== 34141 ================= ; comment MCA 2301; procedure BAKSYMTRI2(A, N, N1, N2, VEC); value N, N1, N2; integer N, N1, N2; array A, VEC; begin integer I, J, K; real W; real procedure TAMMAT(L, U, I, J, A, B); code 34014; procedure ELMCOL(L, U, I, J, A, B, X); code 34023; for J := 2 step 1 until N do begin W := A[J, J]; if W < 0 then for K := N1 step 1 until N2 do ELMCOL(1, J - 1, K, J, VEC, A, TAMMAT(1, J - 1, J, K, A, VEC) × W) end end BAKSYMTRI2; comment ================== 34142 ================= ; comment MCA 2302; procedure TFMPREVEC(A, N); value N; integer N; array A; begin integer I, J, J1, K; real AB; real procedure TAMMAT(L, U, I, J, A, B); code 34014; procedure ELMCOL(L, U, I, J, A, B, X); code 34023; J1 := 1; for J := 2 step 1 until N do begin for I := 1 step 1 until J1 - 1 , J step 1 until N do A[I, J1] := 0; A[J1, J1] := 1; AB := A[J, J]; if AB < 0 then for K := 1 step 1 until J1 do ELMCOL(1, J1, K, J, A, A, TAMMAT(1, J1, J, K, A, A) × AB); J1 := J end; for I := N - 1 step -1 until 1 do A[I, N] := 0; A[N, N] := 1 end TFMPREVEC; comment ================== 34143 ================= ; comment MCA 2305; procedure TFMSYMTRI1(A, N, D, B, BB, EM); value N; integer N; array A, B, BB, D, EM; begin integer I, J, R, R1, P, Q, TI, TJ; real S, W, X, A1, B0, BB0, D0, NORM, MACHTOL; real procedure VECVEC(L, U, SHIFT, A, B); code 34010; real procedure SEQVEC(L, U, IL, SHIFT, A, B); code 34016; procedure ELMVEC(L, U, SHIFT, A, B, X); code 34020; NORM := 0; TJ := 0; for J := 1 step 1 until N do begin W := 0; for I := 1 step 1 until J do W := ABS(A[I + TJ]) + W; TJ := TJ + J; TI := TJ + J; for I := J + 1 step 1 until N do begin W := ABS(A[TI]) + W; TI := TI + I end; if W > NORM then NORM := W end; MACHTOL := EM[0] × NORM; EM[1] := NORM; Q := (N + 1) × N ÷ 2; R := N; for R1 := N - 1 step -1 until 1 do begin P := Q - R; D[R] := A[Q]; X := VECVEC(P + 1, Q - 2, 0, A, A); A1 := A[Q - 1]; if SQRT(X) ≤ MACHTOL then begin B0 := B[R1] := A1; BB[R1] := B0 × B0; A[Q] := 1 end else begin BB0 := BB[R1] := A1 × A1 + X; B0 := if A1 > 0 then -SQRT(BB0) else SQRT(BB0); A1 := A[Q - 1] := A1 - B0; W := A[Q] := 1 / (A1 × B0); TJ := 0; for J := 1 step 1 until R1 do begin TI := TJ + J; S := VECVEC(TJ + 1, TI, P - TJ, A, A); TJ := TI + J; B[J] := (SEQVEC(J + 1, R1, TJ, P, A, A) + S) × W; TJ := TI end; ELMVEC(1, R1, P, B, A, VECVEC(1, R1, P, B, A) × W × .5); TJ := 0; for J := 1 step 1 until R1 do begin TI := TJ + J; ELMVEC(TJ + 1, TI, P - TJ, A, A, B[J]); ELMVEC(TJ + 1, TI, -TJ, A, B, A[J + P]); TJ := TI end; B[R1] := B0 end; Q := P; R := R1 end; D[1] := A[1]; A[1] := 1; B[N] := BB[N] := 0 end TFMSYMTRI1; comment ================== 34144 ================= ; comment MCA 2306; procedure BAKSYMTRI1(A, N, N1, N2, VEC); value N, N1, N2; integer N, N1, N2; array A, VEC; begin integer J, J1, K, TI, TJ; real W; array AUXVEC[1:N]; real procedure VECVEC(L, U, SHIFT, A, B); code 34010; procedure ELMVEC(L, U, SHIFT, A, B, X); code 34020; for K := N1 step 1 until N2 do begin for J := 1 step 1 until N do AUXVEC[J] := VEC[J, K]; TJ := J1 := 1; for J := 2 step 1 until N do begin TI := TJ + J; W := A[TI]; if W < 0 then ELMVEC(1, J1, TJ, AUXVEC, A, VECVEC(1, J1, TJ, AUXVEC, A) × W); J1 := J; TJ := TI end; for J := 1 step 1 until N do VEC[J, K] := AUXVEC[J] end end BAKSYMTRI1; comment ================== 34170 ================= ; comment MCA 2400; procedure TFMREAHES(A, N, EM, INT); value N; integer N; array A, EM; integer array INT; begin integer I, J, J1, K, L; real S, T, MACHTOL, MACHEPS, NORM; array B[0:N - 1]; real procedure MATVEC(L, U, I, A, B); code 34011; real procedure MATMAT(L, U, I, J, A, B); code 34013; procedure ICHCOL(L, U, I, J, A); code 34031; procedure ICHROW(L, U, I, J, A); code 34032; MACHEPS := EM[0]; NORM := 0; for I := 1 step 1 until N do begin S := 0; for J := 1 step 1 until N do S := S + ABS(A[I, J]); if S > NORM then NORM := S end; EM[1] := NORM; MACHTOL := NORM × MACHEPS; INT[1] := 0; for J := 2 step 1 until N do begin J1 := J - 1; L := 0; S := MACHTOL; for K := J + 1 step 1 until N do begin T := ABS(A[K, J1]); if T > S then begin L := K; S := T end end; if L ≠ 0 then begin if ABS(A[J, J1]) < S then begin ICHROW(1, N, J, L, A); ICHCOL(1, N, J, L, A) end else L := J; T := A[J, J1]; for K := J + 1 step 1 until N do A[K, J1] := A[K, J1] / T end else for K := J + 1 step 1 until N do A[K, J1] := 0; for I := 1 step 1 until N do B[I - 1] := A[I, J] := A[I, J] + (if L = 0 then 0 else MATMAT(J + 1, N, I, J1, A, A))- MATVEC(1, if J1 < I - 2 then J1 else I - 2, I, A, B); INT[J] := L end end TFMREAHES; comment ================== 34171 ================= ; comment MCA 2401; procedure BAKREAHES1(A, N, INT, V); value N; integer N; array A, V; integer array INT; begin integer I, L; real W; array X[1:N]; real procedure MATVEC(L, U, I, A, B); code 34011; for I := 2 step 1 until N do X[I - 1] := V[I]; for I := N step -1 until 2 do begin V[I] := V[I] + MATVEC(1, I - 2, I, A, X); L := INT[I]; if L > I then begin W := V[I]; V[I] := V[L]; V[L] := W end end end BAKREAHES1; comment ================== 34172 ================= ; comment MCA 2402; procedure BAKREAHES2(A, N, N1, N2, INT, VEC); value N, N1, N2; integer N, N1, N2; array A, VEC; integer array INT; begin integer I, L, K; array U[1:N]; real procedure TAMVEC(L, U, I, A, B); code 34012; procedure ICHROW(L, U, I, J, A); code 34032; for I := N step -1 until 2 do begin for K := I - 2 step -1 until 1 do U[K + 1] := A[I, K]; for K := N1 step 1 until N2 do VEC[I, K] := VEC[I, K] + TAMVEC(2 , I - 1, K, VEC, U); L := INT[I]; if L > I then ICHROW(N1, N2, I, L, VEC) end end BAKREAHES2; comment ================== 34363 ================= ; procedure HSHHRMTRI(A, N, D, B, BB, EM, TR, TI); value N; integer N; array A, D, B, BB, EM, TR, TI; begin integer I, J, J1, JM1, R, RM1; real NRM, W, TOL2, X, AR, AI, MOD, C, S, H, K, T, Q, AJR, ARJ, BJ, BBJ; real procedure MATVEC(L, U, I, A, B); code 34011; real procedure TAMVEC(L, U, I, A, B); code 34012; real procedure MATMAT(L, U, I, J, A, B); code 34013; real procedure TAMMAT(L, U, I, J, A, B); code 34014; real procedure MATTAM(L, U, I, J, A, B); code 34015; procedure ELMVECCOL(L, U, I, A, B, X); code 34021; procedure ELMCOLVEC(L, U, I, A, B, X); code 34022; procedure ELMCOL(L, U, I, J, A, B, X); code 34023; procedure ELMROW(L, U, I, J, A, B, X); code 34024; procedure ELMVECROW(L, U, I, A, B, X); code 34026; procedure ELMROWVEC(L, U, I, A, B, X); code 34027; procedure ELMROWCOL(L, U, I, J, A, B, X); code 34028; procedure ELMCOLROW(L, U, I, J, A, B, X); code 34029; procedure CARPOL(AR, AI, R, C, S); code 34344; NRM := 0; for I := 1 step 1 until N do begin W := ABS(A[I, I]); for J := I - 1 step - 1 until 1, I + 1 step 1 until N do W := W + ABS(A[I, J]) + ABS(A[J, I]); if W > NRM then NRM := W end I; TOL2 := (EM[0] × NRM) ⭡ 2; EM[1] := NRM; R := N; for RM1 := N - 1 step - 1 until 1 do begin X := TAMMAT(1, R - 2, R, R, A, A) + MATTAM(1, R - 2, R, R, A, A); AR := A[RM1, R]; AI := - A[R, RM1]; D[R] := A[R, R]; CARPOL(AR, AI, MOD, C, S); if X < TOL2 then begin A[R, R] := - 1; B[RM1] := MOD; BB[RM1] := MOD × MOD end else begin H := MOD × MOD + X; K := SQRT(H); T := A[R, R] := H + MOD × K; if AR = 0 ∧ AI = 0 then A[RM1, R] := K else begin A[RM1, R] := AR + C × K; A[R, RM1] := - AI - S × K; S := - S end; C := - C; J := 1; JM1 := 0; for J1 := 2 step 1 until R do begin B[J] := (TAMMAT(1, J, J, R, A, A) + MATMAT(J1, RM1, J, R, A, A) + MATTAM(1, JM1, J, R, A, A) - MATMAT(J1, RM1, R, J, A, A)) / T; BB[J] := (MATMAT(1, JM1, J, R, A, A) - TAMMAT(J1, RM1, J, R, A, A) - MATMAT(1, J, R, J, A, A) - MATTAM(J1, RM1, J, R, A, A)) / T; JM1 := J; J := J1 end J1; Q := (TAMVEC(1, RM1, R, A, B) - MATVEC(1, RM1, R, A, BB)) / T / 2; ELMVECCOL(1, RM1, R, B, A, - Q); ELMVECROW(1, RM1, R, BB, A, Q); J := 1; for J1 := 2 step 1 until R do begin AJR := A[J, R]; ARJ := A[R, J]; BJ := B[J]; BBJ := BB[J]; ELMROWVEC(J, RM1, J, A, B, - AJR); ELMROWVEC(J, RM1, J, A, BB, ARJ); ELMROWCOL(J, RM1, J, R, A, A, - BJ); ELMROW(J, RM1, J, R, A, A, BBJ); ELMCOLVEC(J1, RM1, J, A, B, - ARJ); ELMCOLVEC(J1, RM1, J, A, BB, - AJR); ELMCOL(J1, RM1, J, R, A, A, BBJ); ELMCOLROW(J1, RM1, J, R, A, A, BJ); J := J1; end J1; BB[RM1] := H; B[RM1] := K; end; TR[RM1] := C; TI[RM1] := S; R := RM1; end RM1; D[1] := A[1, 1]; end HSHHRMTRI; comment ================== 34365 ================= ; procedure BAKHRMTRI(A, N, N1, N2, VECR, VECI, TR, TI); value N, N1, N2; integer N, N1, N2; array A, VECR, VECI, TR, TI; begin integer I, J, R, RM1; real C, S, T, QR, QI; real procedure MATMAT(L, U, I, J, A, B); code 34013; real procedure TAMMAT(L, U, I, J, A, B); code 34014; procedure ELMCOL(L, U, I, J, A, B, X); code 34023; procedure ELMCOLROW(L, U, I, J, A, B, X); code 34029; procedure COMMUL(AR, AI, BR, BI, RR, RI); code 34341; procedure COMROWCST(L, U, I, AR, AI, XR, XI); code 34353; for I := 1 step 1 until N do for J := N1 step 1 until N2 do VECI[I, J] := 0; C := 1; S := 0; for J := N - 1 step - 1 until 1 do begin COMMUL(C, S, TR[J], TI[J], C, S); COMROWCST(N1, N2, J, VECR, VECI, C, S) end J; RM1 := 2; for R := 3 step 1 until N do begin T := A[R, R]; if T > 0 then for J := N1 step 1 until N2 do begin QR := (TAMMAT(1, RM1, R, J, A, VECR) - MATMAT(1, RM1, R, J, A, VECI)) / T; QI := (TAMMAT(1, RM1, R, J, A, VECI) + MATMAT(1, RM1, R, J, A, VECR)) / T; ELMCOL(1, RM1, J, R, VECR, A, - QR); ELMCOLROW(1, RM1, J, R, VECR, A, - QI); ELMCOLROW(1, RM1, J, R, VECI, A, QR); ELMCOL(1, RM1, J, R, VECI, A, - QI) end; RM1 := R; end R; end BAKHRMTRI; comment ================== 34364 ================= ; procedure HSHHRMTRIVAL(A, N, D, BB, EM); value N; integer N; array A, D, BB, EM; begin integer I, J, J1, JM1, R, RM1; real NRM, W, TOL2, X, AR, AI, H, T, Q, AJR, ARJ, DJ, BBJ, MOD2; real procedure MATVEC(L, U, I, A, B); code 34011; real procedure TAMVEC(L, U, I, A, B); code 34012; real procedure MATMAT(L, U, I, J, A, B); code 34013; real procedure TAMMAT(L, U, I, J, A, B); code 34014; real procedure MATTAM(L, U, I, J, A, B); code 34015; procedure ELMVECCOL(L, U, I, A, B, X); code 34021; procedure ELMCOLVEC(L, U, I, A, B, X); code 34022; procedure ELMCOL(L, U, I, J, A, B, X); code 34023; procedure ELMROW(L, U, I, J, A, B, X); code 34024; procedure ELMVECROW(L, U, I, A, B, X); code 34026; procedure ELMROWVEC(L, U, I, A, B, X); code 34027; procedure ELMROWCOL(L, U, I, J, A, B, X); code 34028; procedure ELMCOLROW(L, U, I, J, A, B, X); code 34029; NRM := 0; for I := 1 step 1 until N do begin W := ABS(A[I, I]); for J := I - 1 step - 1 until 1, I + 1 step 1 until N do W := W + ABS(A[I, J]) + ABS(A[J, I]); if W > NRM then NRM := W end I; TOL2 := (EM[0] × NRM) ⭡ 2; EM[1] := NRM; R := N; for RM1 := N - 1 step - 1 until 1 do begin X := TAMMAT(1, R - 2, R, R, A, A) + MATTAM(1, R - 2, R, R, A, A); AR := A[RM1, R]; AI := - A[R, RM1]; D[R] := A[R, R]; if X < TOL2 then BB[RM1] := AR × AR + AI × AI else begin MOD2 := AR × AR + AI × AI; if MOD2 = 0 then begin A[RM1, R] := SQRT(X); T := X end else begin X := X + MOD2; H := SQRT(MOD2 × X); T := X + H; H := 1 + X / H; A[R, RM1] := - AI × H; A[RM1, R] := AR × H; end; J := 1; JM1 := 0; for J1 := 2 step 1 until R do begin D[J] := (TAMMAT(1, J, J, R, A, A) + MATMAT(J1, RM1, J, R, A, A) + MATTAM(1, JM1, J, R, A, A) - MATMAT(J1, RM1, R, J, A, A)) / T; BB[J] := (MATMAT(1, JM1, J, R, A, A) - TAMMAT(J1, RM1, J, R, A, A) - MATMAT(1, J, R, J, A, A) - MATTAM(J1, RM1, J, R, A, A)) / T; JM1 := J; J := J1 end J1; Q := (TAMVEC(1, RM1, R, A, D) - MATVEC(1, RM1, R, A, BB)) / T / 2; ELMVECCOL(1, RM1, R, D, A, - Q); ELMVECROW(1, RM1, R, BB, A, Q); J := 1; for J1 := 2 step 1 until R do begin AJR := A[J, R]; ARJ := A[R, J]; DJ := D[J]; BBJ := BB[J]; ELMROWVEC(J, RM1, J, A, D, - AJR); ELMROWVEC(J, RM1, J, A, BB, ARJ); ELMROWCOL(J, RM1, J, R, A, A, - DJ); ELMROW(J, RM1, J, R, A, A, BBJ); ELMCOLVEC(J1, RM1, J, A, D, - ARJ); ELMCOLVEC(J1, RM1, J, A, BB, - AJR); ELMCOL(J1, RM1, J, R, A, A, BBJ); ELMCOLROW(J1, RM1, J, R, A, A, DJ); J := J1; end J1; BB[RM1] := X; end; R := RM1; end RM1; D[1] := A[1, 1]; end HSHHRMTRIVAL; comment ================== 34366 ================= ; procedure HSHCOMHES(AR, AI, N, EM, B, TR, TI, DEL); value N; integer N; array AR, AI, EM, B, TR, TI, DEL; begin integer R, RM1, I, J, NM1; real TOL, T, XR, XI; real procedure MATMAT(L, U, I, J, A, B); code 34013; procedure ELMROWCOL(L, U, I, J, A, B, X); code 34028; procedure HSHCOMPRD(I, II, L, U, J, AR, AI, BR, BI, T); code 34356; procedure COMCOLCST(L, U, J, AR, AI, XR, XI); code 34352; procedure COMROWCST(L, U, I, AR, AI, XR, XI); code 34353; procedure CARPOL(AR, AI, R, C, S); code 34344; procedure COMMUL(AR, AI, BR, BI, RR, RI); code 34341; Boolean procedure HSHCOMCOL(L, U, J, AR, AI, TOL, K, C, S, T); code 34355; NM1 := N - 1; TOL := (EM[0] × EM[1]) ⭡ 2; RM1 := 1; for R := 2 step 1 until NM1 do begin if HSHCOMCOL(R, N, RM1, AR, AI, TOL, B[RM1], TR[R], TI[R], T) then begin for I := 1 step 1 until N do begin XR := (MATMAT(R, N, I, RM1, AI, AI) - MATMAT(R, N, I, RM1, AR, AR)) / T; XI := ( - MATMAT(R, N, I, RM1, AR, AI) - MATMAT(R, N, I, RM1, AI, AR)) / T; ELMROWCOL(R, N, I, RM1, AR, AR, XR); ELMROWCOL(R, N, I, RM1, AR, AI, XI); ELMROWCOL(R, N, I, RM1, AI, AR, XI); ELMROWCOL(R, N, I, RM1, AI, AI, - XR) end; HSHCOMPRD(R, N, R, N, RM1, AR, AI, AR, AI, T); end; DEL[RM1] := T; RM1 := R end FORR; if N > 1 then CARPOL(AR[N, NM1], AI[N, NM1], B[NM1], TR[N], TI[N]); RM1 := 1; TR[1] := 1; TI[1] := 0; for R := 2 step 1 until N do begin COMMUL(TR[RM1], TI[RM1], TR[R], TI[R], TR[R], TI[R]); COMCOLCST(1, RM1, R, AR, AI, TR[R], TI[R]); COMROWCST(R + 1, N, R, AR, AI, TR[R], - TI[R]); RM1 := R end; end HSHCOMHES; comment ================== 34367 ================= ; procedure BAKCOMHES(AR, AI, TR, TI, DEL, VR, VI, N, N1, N2); value N, N1, N2; integer N, N1, N2; array AR, AI, TR, TI, DEL, VR, VI; begin integer I, R, RM1; real H; procedure HSHCOMPRD(I, II, L, U, J, AR, AI, BR, BI, T); code 34356; procedure COMROWCST(L, U, I, AR, AI, XR, XI); code 34353; for I := 2 step 1 until N do COMROWCST(N1, N2, I, VR, VI, TR[I], TI[I]); R := N - 1; for RM1 := N - 2 step - 1 until 1 do begin H := DEL[RM1]; if H > 0 then HSHCOMPRD(R, N, N1, N2, RM1, VR, VI, AR, AI, H); R := RM1 end end BAKCOMHES; comment ================== 34260 ================= ; procedure HSHREABID(A, M, N, D, B, EM); value M, N; integer M, N; array A, D, B, EM; begin integer I, J, I1; real NORM, MACHTOL, W, S, F, G, H; real procedure TAMMAT(L, U, I, J, A, B); value L, U, I, J; integer L, U, I, J; array A, B; code 34014; real procedure MATTAM(L, U, I, J, A, B); value L, U, I, J; array A, B; code 34015; procedure ELMCOL(L, U, I, J, A, B, X); value L, U, I, J, X; integer L, U, I, J; real X; array A, B; code 34023; procedure ELMROW(L, U, I, J, A, B, X); value L, U, I, J, X; integer L, U, I, J; real X; array A, B; code 34024; NORM := 0; for I := 1 step 1 until M do begin W := 0; for J := 1 step 1 until N do W := ABS(A[I, J]) + W; if W > NORM then NORM := W end; MACHTOL := EM[0] × NORM; EM[1] := NORM; for I := 1 step 1 until N do begin I1 := I + 1; S := TAMMAT(I1, M, I, I, A, A); if S < MACHTOL then D[I] := A[I, I] else begin F := A[I, I]; S := F × F + S; D[I] := G := if F < 0 then SQRT(S) else - SQRT(S); H := F × G - S; A[I, I] := F - G; for J := I1 step 1 until N do ELMCOL(I, M, J, I, A, A, TAMMAT(I, M, I, J, A, A) / H) end; if I < N then begin S := MATTAM(I1 + 1, N, I, I, A, A); if S < MACHTOL then B[I] := A[I, I1] else begin F := A[I, I1]; S := F × F + S; B[I] := G := if F < 0 then SQRT(S) else - SQRT(S); H := F × G - S; A[I, I1] := F - G; for J := I1 step 1 until M do ELMROW(I1, N, J, I, A, A, MATTAM(I1, N, I, J, A, A) / H) end end end end HSHREABID; comment ================== 34261 ================= ; procedure PSTTFMMAT(A, N, V, B); value N; integer N; array A, V, B; begin integer I, I1, J; real H; real procedure MATMAT(L, U, I, J, A, B); value L, U, I, J; integer L, U, I, J; array A, B; code 34013; procedure ELMCOL(L, U, I, J, A, B, X); value L, U, I, J, X; integer L, U, I, J; real X; array A, B; code 34023; I1 := N; V[N, N] := 1; for I := N - 1 step - 1 until 1 do begin H := B[I] × A[I, I1]; if H < 0 then begin for J := I1 step 1 until N do V[J, I] := A[I, J] / H; for J := I1 step 1 until N do ELMCOL(I1, N, J, I, V, V, MATMAT(I1, N, I, J, A, V)) end; for J := I1 step 1 until N do V[I, J] := V[J, I] := 0; V[I, I] := 1; I1 := I end end PSTTFMMAT; comment ================== 34262 ================= ; procedure PRETFMMAT(A, M, N, D); value M, N; integer M, N; array A, D; begin integer I, I1, J; real G, H; real procedure TAMMAT(L, U, I, J, A, B); value L, U, I, J; integer L, U, I, J; array A, B; code 34014; procedure ELMCOL(L, U, I, J, A, B, X); value L, U, I, J, X; integer L, U, I, J; real X; array A, B; code 34023; for I := N step - 1 until 1 do begin I1 := I + 1; G := D[I]; H := G × A[I, I]; for J := I1 step 1 until N do A[I, J] := 0; if H < 0 then begin for J := I1 step 1 until N do ELMCOL(I, M, J, I, A, A, TAMMAT(I1, M, I, J, A, A) / H); for J := I step 1 until M do A[J, I] := A[J, I] / G end else for J := I step 1 until M do A[J, I] := 0; A[I, I] := A[I, I] + 1 end end PRETFMMAT; comment ================== 34151 ================= ; comment MCA 2311; procedure VALSYMTRI(D, BB, N, N1, N2, VAL, EM); value N, N1, N2; integer N, N1, N2; array D, BB, VAL, EM; begin integer K, COUNT; real MAX, X, Y, MACHEPS, NORM, RE, MACHTOL, UB, LB, LAMBDA; real procedure STURM; begin integer P, I; real F; COUNT := COUNT + 1; P := K; F := D[1] - X; for I := 2 step 1 until N do begin if F ≤ 0 then begin P := P + 1; if P > N then goto OUT end else if P < I - 1 then begin LB := X; goto OUT end; if ABS(F) < MACHTOL then F := if F ≤ 0 then - MACHTOL else MACHTOL; F := D[I] - X - BB[I - 1] / F end; if P = N ∨ F ≤ 0 then begin if X < UB then UB := X end else LB := X; OUT: STURM := if P = N then F else (N - P) × MAX end STURM; Boolean procedure ZEROIN(X, Y, FX, TOLX); code 34150; MACHEPS := EM[0]; NORM := EM[1]; RE := EM[2]; MACHTOL := NORM × MACHEPS; MAX := NORM / MACHEPS; COUNT := 0; UB := 1.1 × NORM; LB := - UB; LAMBDA := UB; for K := N1 step 1 until N2 do begin X := LB; Y := UB; LB := -1.1 × NORM; ZEROIN(X, Y, STURM, ABS(X) × RE + MACHTOL); VAL[K] := LAMBDA := if X > LAMBDA then LAMBDA else X; if UB > X then UB := if X > Y then X else Y end; EM[3] := COUNT end VALSYMTRI; comment ================== 34152 ================= ; comment MCA 2312; procedure VECSYMTRI(D, B, N, N1, N2, VAL, VEC, EM); value N, N1, N2; integer N, N1, N2; array D, B, VAL, VEC, EM; begin integer I, J, K, COUNT, MAXCOUNT, COUNTLIM, ORTH, IND; real BI, BI1, U, W, Y, MI1, LAMBDA, OLDLAMBDA, ORTHEPS, VALSPREAD, SPR, RES, MAXRES, OLDRES, NORM, NEWNORM, OLDNORM, MACHTOL, VECTOL; array M, P, Q, R, X[1:N]; Boolean array INT[1:N]; real procedure VECVEC(L, U, SHIFT, A, B); code 34010; procedure ELMVECCOL(L, U, I, A, B, X); code 34021; real procedure TAMVEC(L, U, I, A, B); code 34012; NORM := EM[1]; MACHTOL := EM[0] × NORM; VALSPREAD := EM[4] × NORM; VECTOL := EM[6] × NORM; COUNTLIM := EM[8]; ORTHEPS := SQRT(EM[0]); MAXCOUNT := IND := 0; MAXRES := 0; if N1 > 1 then begin ORTH := EM[5]; OLDLAMBDA := VAL[N1 - ORTH]; for K := N1 - ORTH + 1 step 1 until N1 - 1 do begin LAMBDA := VAL[K]; SPR := OLDLAMBDA - LAMBDA; if SPR < MACHTOL then LAMBDA := OLDLAMBDA - MACHTOL; OLDLAMBDA := LAMBDA end end else ORTH := 1; for K := N1 step 1 until N2 do begin LAMBDA := VAL[K]; if K > 1 then begin SPR := OLDLAMBDA - LAMBDA; if SPR < VALSPREAD then begin if SPR < MACHTOL then LAMBDA := OLDLAMBDA - MACHTOL; ORTH := ORTH + 1 end else ORTH := 1 end; COUNT := 0; U := D[1] - LAMBDA; BI := W := B[1]; if ABS(BI) < MACHTOL then BI := MACHTOL; for I := 1 step 1 until N - 1 do begin BI1 := B[I + 1]; if ABS(BI1) < MACHTOL then BI1 := MACHTOL; if ABS(BI) ≥ ABS(U) then begin MI1 := M[I + 1] := U / BI; P[I] := BI; Y := Q[I] := D[I + 1] - LAMBDA; R[I] := BI1; U := W - MI1 × Y; W := - MI1 × BI1; INT[I] := true end else begin MI1 := M[I + 1] := BI / U; P[I] := U; Q[I] := W; R[I] := 0; U := D[I + 1] - LAMBDA - MI1 × W; W := BI1; INT[I] := false end; X[I] := 1; BI := BI1 end TRANSFORM; P[N] := if ABS(U) < MACHTOL then MACHTOL else U; Q[N] := R[N] := 0; X[N] := 1; goto ENTRY; ITERATE: W := X[1]; for I := 2 step 1 until N do begin if INT[I - 1] then begin U := W; W := X[I - 1] := X[I] end else U := X[I]; W := X[I] := U - M[I] × W end ALTERNATE; ENTRY: U := W := 0; for I := N step -1 until 1 do begin Y := U; U := X[I] := (X[I] - Q[I] × U - R[I] × W) / P[I]; W := Y end NEXT ITERATION; NEWNORM := SQRT(VECVEC(1, N, 0, X, X)); if ORTH > 1 then begin OLDNORM := NEWNORM; for J := K - ORTH + 1 step 1 until K - 1 do ELMVECCOL(1, N, J, X, VEC, -TAMVEC(1, N, J, VEC, X)); NEWNORM := SQRT(VECVEC(1, N, 0, X, X)); if NEWNORM < ORTHEPS × OLDNORM then begin IND := IND + 1; COUNT := 1; for I := 1 step 1 until IND - 1, IND + 1 step 1 until N do X[I] := 0; X[IND] := 1; if IND = N then IND := 0; goto ITERATE end NEW START end ORTHOGONALISATION; RES := 1 / NEWNORM; if RES > VECTOL ∨ COUNT = 0 then begin COUNT := COUNT + 1; if COUNT ≤ COUNTLIM then begin for I := 1 step 1 until N do X[I] := X[I] × RES; goto ITERATE end end; for I := 1 step 1 until N do VEC[I, K] := X[I] × RES; if COUNT > MAXCOUNT then MAXCOUNT := COUNT; if RES > MAXRES then MAXRES := RES; OLDLAMBDA := LAMBDA end; EM[5] := ORTH; EM[7] := MAXRES; EM[9] := MAXCOUNT end VECSYMTRI; comment ================== 34161 ================= ; comment MCA 2321; integer procedure QRISYMTRI(A, N, D, B, BB, EM); value N; integer N; array A, D, B, BB, EM; begin integer I, J, J1, K, M, M1, COUNT, MAX; real BBMAX, R, S, SIN, T, C, COS, OLDCOS, G, P, W, TOL, TOL2, LAMBDA, DK1, A0, A1; procedure ROTCOL(L, U, I, J, A, C, S); code 34040; TOL := EM[2] × EM[1]; TOL2 := TOL × TOL; COUNT := 0; BBMAX := 0; MAX := EM[4]; M := N; IN: K := M; M1 := M - 1; NEXT: K := K - 1; if K > 0 then begin if BB[K] ≥ TOL2 then goto NEXT; if BB[K] > BBMAX then BBMAX := BB[K] end; if K = M1 then M := M1 else begin T := D[M] - D[M1]; R := BB[M1]; if ABS(T) < TOL then S := SQRT(R) else begin W := 2 / T; S := W × R / (SQRT(W × W × R + 1) + 1) end; if K = M - 2 then begin D[M] := D[M] + S; D[M1] := D[M1] - S; T := - S / B[M1]; R := SQRT(T × T + 1); COS := 1 / R; SIN := T / R; ROTCOL(1, N, M1, M, A, COS, SIN); M := M - 2 end else begin COUNT := COUNT + 1; if COUNT > MAX then goto END; LAMBDA := D[M] + S; if ABS(T) < TOL then begin W := D[M1] - S; if ABS(W) < ABS(LAMBDA) then LAMBDA := W end; K := K + 1; T := D[K] - LAMBDA; COS := 1; W := B[K]; P := SQRT(T × T + W × W); J1 := K; for J := K + 1 step 1 until M do begin OLDCOS := COS; COS := T / P; SIN := W / P; DK1 := D[J] - LAMBDA; T := OLDCOS × T; D[J1] := (T + DK1) × SIN × SIN + LAMBDA + T; T := COS × DK1 - SIN × W × OLDCOS; W := B[J]; P := SQRT(T × T + W × W); G := B[J1] := SIN × P; BB[J1] := G × G; ROTCOL(1, N, J1, J, A, COS, SIN); J1 := J end; D[M] := COS × T + LAMBDA; if T < 0 then B[M1] := - G end QRSTEP end; if M > 0 then goto IN; END: EM[3] := SQRT(BBMAX); EM[5] := COUNT; QRISYMTRI := M end QRISYMTRI; comment ================== 34153 ================= ; comment MCA 2313; procedure EIGVALSYM2(A, N, NUMVAL, VAL, EM); value N, NUMVAL; integer N, NUMVAL; array A, VAL, EM; begin array B, BB, D[1:N]; procedure TFMSYMTRI2(A, N, D, B, BB, EM); code 34140; procedure VALSYMTRI(D, BB, N, N1, N2, VAL, EM); code 34151; TFMSYMTRI2(A, N, D, B, BB, EM); VALSYMTRI(D, BB, N, 1, NUMVAL, VAL, EM) end EIGVALSYM2; comment ================== 34154 ================= ; comment MCA 2314; procedure EIGSYM2(A, N, NUMVAL, VAL, VEC, EM); value N, NUMVAL; integer N, NUMVAL; array A, VAL, VEC, EM; begin array B, BB, D[1:N]; procedure TFMSYMTRI2(A, N, D, B, BB, EM); code 34140; procedure VALSYMTRI(D, BB, N, N1, N2, VAL, EM); code 34151; procedure VECSYMTRI(D, B, N, N1, N2, VAL, VEC, EM); code 34152; procedure BAKSYMTRI2(A, N, N1, N2, VEC); code 34141; TFMSYMTRI2(A, N, D, B, BB, EM); VALSYMTRI(D, BB, N, 1, NUMVAL, VAL, EM); VECSYMTRI(D, B, N, 1, NUMVAL, VAL, VEC, EM); BAKSYMTRI2(A, N, 1, NUMVAL, VEC) end EIGSYM2; comment ================== 34155 ================= ; comment MCA 2318; procedure EIGVALSYM1(A, N, NUMVAL, VAL, EM); value N, NUMVAL; integer N, NUMVAL; array A, VAL, EM; begin array B, BB, D[1:N]; procedure TFMSYMTRI1(A, N, D, B, BB, EM); code 34143; procedure VALSYMTRI(D, BB, N, N1, N2, VAL, EM); code 34151; TFMSYMTRI1(A, N, D, B, BB, EM); VALSYMTRI(D, BB, N, 1, NUMVAL, VAL, EM) end EIGVALSYM1; comment ================== 34156 ================= ; comment MCA 2319; procedure EIGSYM1(A, N, NUMVAL, VAL, VEC, EM); value N, NUMVAL; integer N, NUMVAL; array A, VAL, VEC, EM; begin array B, BB, D[1:N]; procedure TFMSYMTRI1(A, N, D, B, BB, EM); code 34143; procedure VALSYMTRI(D, BB, N, N1, N2, VAL, EM); code 34151; procedure VECSYMTRI(D, B, N, N1, N2, VAL, VEC, EM); code 34152; procedure BAKSYMTRI1(A, N, N1, N2, VEC); code 34144; TFMSYMTRI1(A, N, D, B, BB, EM); VALSYMTRI(D, BB, N, 1, NUMVAL, VAL, EM); VECSYMTRI(D, B, N, 1, NUMVAL, VAL, VEC, EM); BAKSYMTRI1(A, N, 1, NUMVAL, VEC) end EIGSYM1; comment ================== 34162 ================= ; comment MCA 2322; integer procedure QRIVALSYM2(A, N, VAL, EM); value N; integer N; array A, VAL, EM; begin array B, BB[1:N]; procedure TFMSYMTRI2(A, N, D, B, BB, EM); code 34140; integer procedure QRIVALSYMTRI(D, BB, N, EM); code 34160; TFMSYMTRI2(A, N, VAL, B, BB, EM); QRIVALSYM2 := QRIVALSYMTRI(VAL, BB, N, EM) end QRIVALSYM2; comment ================== 34163 ================= ; comment MCA 2323; integer procedure QRISYM(A, N, VAL, EM); value N; integer N; array A, VAL, EM; begin array B, BB[1:N]; procedure TFMSYMTRI2(A, N, D, B, BB, EM); code 34140; procedure TFMPREVEC(A, N); code 34142; integer procedure QRISYMTRI(A, N, D, B, BB, EM); code 34161; TFMSYMTRI2(A, N, VAL, B, BB, EM); TFMPREVEC(A, N); QRISYM := QRISYMTRI(A, N, VAL, B, BB, EM) end QRISYM; comment ================== 34164 ================= ; comment MCA 2327; integer procedure QRIVALSYM1(A, N, VAL, EM); value N; integer N; array A, VAL, EM; begin array B, BB[1 : N]; procedure TFMSYMTRI1(A, N, D, B, BB, EM); code 34143; integer procedure QRIVALSYMTRI(D, BB, N, EM); code 34160; TFMSYMTRI1(A, N, VAL, B, BB, EM); QRIVALSYM1 := QRIVALSYMTRI(VAL, BB, N, EM) end QRIVALSYM1; comment ================== 34180 ================= ; comment MCA 2410; integer procedure REAVALQRI(A, N, EM, VAL); value N; integer N; array A, EM, VAL; begin integer N1, I, I1, J, Q, MAX, COUNT; real DET, W, SHIFT, KAPPA, NU, MU, R, TOL, DELTA, MACHTOL, S; procedure ROTCOL(L, U, I, J, A, C, S); code 34040; procedure ROTROW(L, U, I, J, A, C, S); code 34041; MACHTOL := EM[0] × EM[1]; TOL := EM[1] × EM[2]; MAX := EM[4]; COUNT := 0; R := 0; IN: N1 := N - 1; for I := N, I - 1 while (if I ≥ 1 then ABS(A[I + 1, I]) > TOL else false) do Q := I; if Q > 1 then begin if ABS(A[Q, Q - 1]) > R then R := ABS(A[Q, Q - 1]) end; if Q = N then begin VAL[N] := A[N, N]; N := N1 end else begin DELTA := A[N, N] - A[N1, N1]; DET := A[N, N1] × A[N1, N]; if ABS(DELTA) < MACHTOL then S := SQRT(DET) else begin W := 2 / DELTA; S := W × W × DET + 1; S := if S ≤ 0 then -DELTA × .5 else W × DET / (SQRT(S) + 1) end; if Q = N1 then begin VAL[N] := A[N, N] + S; VAL[N1] := A[N1, N1] - S; N := N - 2 end else begin COUNT := COUNT + 1; if COUNT > MAX then goto OUT; SHIFT := A[N, N] + S; if ABS(DELTA) < TOL then begin W := A[N1, N1] - S; if ABS(W) < ABS(SHIFT) then SHIFT := W end; A[Q, Q] := A[Q, Q] - SHIFT; for I := Q step 1 until N - 1 do begin I1 := I + 1; A[I1, I1] := A[I1, I1] - SHIFT; KAPPA := SQRT(A[I, I] ⭡ 2 + A[I1, I] ⭡ 2); if I > Q then begin A[I, I - 1] := KAPPA × NU; W := KAPPA × MU end else W := KAPPA; MU := A[I, I] / KAPPA; NU := A[I1, I] / KAPPA; A[I, I] := W; ROTROW(I1, N, I, I1, A, MU, NU); ROTCOL(Q, I, I, I1, A, MU, NU); A[I, I] := A[I, I] + SHIFT end; A[N, N - 1] := A[N, N] × NU; A[N, N] := A[N, N] × MU + SHIFT end end; if N > 0 then goto IN; OUT: EM[3] := R; EM[5] := COUNT; REAVALQRI := N end REAVALQRI; comment ================== 34181 ================= ; comment MCA 2411; procedure REAVECHES(A, N, LAMBDA, EM, V); value N, LAMBDA; integer N; real LAMBDA; array A, EM, V; begin integer I, I1, J, COUNT, MAX; real M, R, NORM, MACHTOL, TOL; Boolean array P[1:N]; real procedure VECVEC(L, U, SHIFT, A, B); code 34010; real procedure MATVEC(L, U, I, A, B); code 34011; NORM := EM[1]; MACHTOL := EM[0] × NORM; TOL := EM[6] × NORM; MAX := EM[8]; A[1, 1] := A[1, 1] - LAMBDA; GAUSS: for I := 1 step 1 until N - 1 do begin I1 := I + 1; R := A[I, I]; M := A[I1, I]; if ABS(M) < MACHTOL then M := MACHTOL; P[I] := ABS(M) ≤ ABS(R); if P[I] then begin A[I1, I] := M := M / R; for J := I1 step 1 until N do A[I1, J] := (if J > I1 then A[I1, J] else A[I1, J] - LAMBDA) - M × A[I, J] end else begin A[I, I] := M; A[I1, I] := M := R / M; for J := I1 step 1 until N do begin R := (if J > I1 then A[I1, J] else A[I1, J] - LAMBDA); A[I1, J] := A[I, J] - M × R; A[I, J] := R end end end GAUSS; if ABS(A[N, N]) < MACHTOL then A[N, N] := MACHTOL; for J := 1 step 1 until N do V[J] := 1; COUNT := 0; FORWARD: COUNT := COUNT + 1; if COUNT > MAX then goto OUT; for I := 1 step 1 until N - 1 do begin I1 := I + 1; if P[I] then V[I1] := V[I1] - A[I1, I] × V[I] else begin R := V[I1]; V[I1] := V[I] - A[I1, I] × R; V[I] := R end end FORWARD; BACKWARD: for I := N step -1 until 1 do V[I] := (V[I] - MATVEC(I + 1, N, I, A, V)) / A[I, I]; R := 1 / SQRT(VECVEC(1, N, 0, V, V)); for J := 1 step 1 until N do V[J] := V[J] × R; if R > TOL then goto FORWARD; OUT: EM[7] := R; EM[9] := COUNT end REAVECHES; comment ================== 34186 ================= ; comment MCA 2416; integer procedure REAQRI(A, N, EM, VAL, VEC); value N; integer N; array A, EM, VAL, VEC; begin integer M1, I, I1, M, J, Q, MAX, COUNT; real W, SHIFT, KAPPA, NU, MU, R, TOL, S, MACHTOL, ELMAX, T, DELTA, DET; array TF[1:N]; real procedure MATVEC(L, U, I, A, B); code 34011; procedure ROTCOL(L, U, I, J, A, C, S); code 34040; procedure ROTROW(L, U, I, J, A, C, S); code 34041; MACHTOL := EM[0] × EM[1]; TOL := EM[1] × EM[2]; MAX := EM[4]; COUNT := 0; ELMAX := 0; M := N; for I := 1 step 1 until N do begin VEC[I, I] := 1; for J := I + 1 step 1 until N do VEC[I, J] := VEC[J, I] := 0 end; IN: M1 := M - 1; for I := M, I - 1 while (if I ≥ 1 then ABS(A[I + 1, I]) > TOL else false) do Q := I; if Q > 1 then begin if ABS(A[Q, Q - 1]) > ELMAX then ELMAX := ABS(A[Q, Q - 1]) end; if Q = M then begin VAL[M] := A[M, M]; M := M1 end else begin DELTA := A[M, M] - A[M1, M1]; DET := A[M, M1] × A[M1, M]; if ABS(DELTA) < MACHTOL then S := SQRT(DET) else begin W := 2 / DELTA; S := W × W × DET + 1; S := if S ≤ 0 then -DELTA × .5 else W × DET / (SQRT(S) + 1) end; if Q = M1 then begin A[M, M] := VAL[M] := A[M, M] + S; A[Q, Q] := VAL[Q] := A[Q, Q] - S; T := if ABS(S) < MACHTOL then (S + DELTA) / A[M, Q] else A[Q, M] / S; R := SQRT(T × T + 1); NU := 1 / R; MU := -T × NU; A[Q, M] := A[Q, M] - A[M, Q]; ROTROW(Q + 2, N, Q, M, A, MU, NU); ROTCOL(1, Q - 1, Q, M, A, MU, NU); ROTCOL(1, N, Q, M, VEC, MU, NU); M := M - 2 end else begin COUNT := COUNT + 1; if COUNT > MAX then goto END; SHIFT := A[M, M] + S; if ABS(DELTA) < TOL then begin W := A[M1, M1] - S; if ABS(W) < ABS(SHIFT) then SHIFT := W end; A[Q, Q] := A[Q, Q] - SHIFT; for I := Q step 1 until M1 do begin I1 := I + 1; A[I1, I1] := A[I1, I1] - SHIFT; KAPPA := SQRT(A[I, I] ⭡ 2 + A[I1, I] ⭡ 2); if I > Q then begin A[I, I - 1] := KAPPA × NU; W := KAPPA × MU end else W := KAPPA; MU := A[I, I] / KAPPA; NU := A[I1, I] / KAPPA; A[I, I] := W; ROTROW(I1, N, I, I1, A, MU, NU); ROTCOL(1, I, I, I1, A, MU, NU); A[I, I] := A[I, I] + SHIFT; ROTCOL(1, N, I, I1, VEC, MU, NU) end; A[M, M1] := A[M, M] × NU; A[M, M] := A[M, M] × MU + SHIFT end end; if M > 0 then goto IN; for J := N step -1 until 2 do begin TF[J] := 1; T := A[J, J]; for I := J - 1 step -1 until 1 do begin DELTA := T - A[I, I]; TF[I] := MATVEC(I + 1, J, I, A, TF) / (if ABS(DELTA) < MACHTOL then MACHTOL else DELTA) end; for I := 1 step 1 until N do VEC[I, J] := MATVEC(1, J, I, VEC, TF) end; END: EM[3] := ELMAX; EM[5] := COUNT; REAQRI := M end REAQRI; comment ================== 34190 ================= ; comment MCA 2420; integer procedure COMVALQRI(A, N, EM, RE, IM); value N; integer N; array A, EM, RE, IM; begin integer I, J, P, Q, MAX, COUNT, N1, P1, P2, IMIN1, I1, I2, I3; real DISC, SIGMA, RHO, G1, G2, G3, PSI1, PSI2, AA, E, K, S, NORM, MACHTOL2, TOL, W; Boolean B; NORM := EM[1]; MACHTOL2 := (EM[0] × NORM) ⭡ 2; TOL := EM[2] × NORM; MAX := EM[4]; COUNT := 0; W := 0; IN: for I := N, I - 1 while (if I ≥ 1 then ABS(A[I + 1, I]) > TOL else false) do Q := I; if Q > 1 then begin if ABS(A[Q, Q - 1]) > W then W := ABS(A[Q, Q - 1]) end; if Q ≥ N - 1 then begin N1 := N - 1; if Q = N then begin RE[N] := A[N, N]; IM[N] := 0; N := N1 end else begin SIGMA := A[N, N] - A[N1, N1]; RHO := -A[N, N1] × A[N1, N]; DISC := SIGMA ⭡ 2 - 4 × RHO; if DISC > 0 then begin DISC := SQRT(DISC); S := -2 × RHO / (SIGMA + (if SIGMA ≥ 0 then DISC else -DISC)); RE[N] := A[N, N] + S; RE[N1] := A[N1, N1] - S; IM[N] := IM[N1] := 0 end else begin RE[N] := RE[N1] := (A[N1, N1] + A[N, N]) / 2; IM[N1] := SQRT( -DISC) / 2; IM[N] := -IM[N1] end; N := N - 2 end end else begin COUNT := COUNT + 1; if COUNT > MAX then goto OUT; N1 := N - 1; SIGMA := A[N, N] + A[N1, N1] + SQRT(ABS(A[N1, N - 2] × A[N, N1]) × EM[0]); RHO := A[N, N] × A[N1, N1] - A[N, N1] × A[N1, N]; for I := N - 1, I - 1 while (if I - 1 ≥ Q then ABS(A[I, I - 1] × A[I1, I] × (ABS(A[I, I] + A[I1, I1] - SIGMA) + ABS(A[I + 2, I1]))) > ABS(A[I, I] × ((A[I, I] - SIGMA) + A[I, I1] × A[I1, I] + RHO)) × TOL else false) do P1 := I1 := I; P := P1 - 1; P2 := P + 2; for I := P step 1 until N - 1 do begin IMIN1 := I - 1; I1 := I + 1; I2 := I + 2; if I = P then begin G1 := A[P, P] × (A[P, P] - SIGMA) + A[P, P1] × A[P1, P] + RHO; G2 := A[P1, P] × (A[P, P] + A[P1, P1] - SIGMA); if P1 ≤ N1 then begin G3 := A[P1, P] × A[P2, P1]; A[P2, P] := 0 end else G3 := 0 end else begin G1 := A[I, IMIN1]; G2 := A[I1, IMIN1]; G3 := if I2 ≤ N then A[I2, IMIN1] else 0 end; K := if G1 ≥ 0 then SQRT(G1 ⭡ 2 + G2 ⭡ 2 + G3 ⭡ 2) else -SQRT(G1 ⭡ 2 + G2 ⭡ 2 + G3 ⭡ 2); B := ABS(K) > MACHTOL2; AA := if B then G1 / K + 1 else 2; PSI1 := if B then G2 / (G1 + K) else 0; PSI2 := if B then G3 / (G1 + K) else 0; if I ≠ Q then A[I, IMIN1] := if I = P then -A[I, IMIN1] else -K; for J := I step 1 until N do begin E := AA × (A[I, J] + PSI1 × A[I1, J] + (if I2 ≤ N then PSI2 × A[I2, J] else 0)); A[I, J] := A[I, J] - E; A[I1, J] := A[I1, J] - PSI1 × E; if I2 ≤ N then A[I2, J] := A[I2, J] - PSI2 × E end; for J := Q step 1 until (if I2 ≤ N then I2 else N) do begin E := AA × (A[J, I] + PSI1 × A[J, I1] + (if I2 ≤ N then PSI2 × A[J, I2] else 0)); A[J, I] := A[J, I] - E; A[J, I1] := A[J, I1] - PSI1 × E; if I2 ≤ N then A[J, I2] := A[J, I2] - PSI2 × E end; if I2 ≤ N1 then begin I3 := I + 3; E := AA × PSI2 × A[I3, I2]; A[I3, I] := -E; A[I3, I1] := -PSI1 × E; A[I3, I2] := A[I3, I2] - PSI2 × E end end end; if N > 0 then goto IN; OUT: EM[3] := W; EM[5] := COUNT; COMVALQRI := N end COMVALQRI; comment ================== 34191 ================= ; comment MCA 2421; procedure COMVECHES(A, N, LAMBDA, MU, EM, U, V); value N, LAMBDA, MU; integer N; real LAMBDA, MU; array A, EM, U, V; begin integer I, I1, J, COUNT, MAX; real AA, BB, D, M, R, S, W, X, Y, NORM, MACHTOL, TOL; array G, F[1:N]; Boolean array P[1:N]; real procedure VECVEC(L, U, SHIFT, A, B); code 34010; real procedure MATVEC(L, U, I, A, B); code 34011; real procedure TAMVEC(L, U, I, A, B); code 34012; NORM := EM[1]; MACHTOL := EM[0] × NORM; TOL := EM[6] × NORM; MAX := EM[8]; for I := 2 step 1 until N do begin F[I - 1] := A[I, I - 1]; A[I, 1] := 0 end; AA := A[1, 1] - LAMBDA; BB := -MU; for I := 1 step 1 until N - 1 do begin I1 := I + 1; M := F[I]; if ABS(M) < MACHTOL then M := MACHTOL; A[I, I] := M; D := AA ⭡ 2 + BB ⭡ 2; P[I] := ABS(M) < SQRT(D); if P[I] then begin comment A[I, J] × FACTOR AND A[I1, J] - A[I, J]; F[I] := R := M × AA / D; G[I] := S := -M × BB / D; W := A[I1, I]; X := A[I, I1]; A[I1, I] := Y := X × S + W × R; A[I, I1] := X := X × R - W × S; AA := A[I1, I1] - LAMBDA - X; BB := -(MU + Y); for J := I + 2 step 1 until N do begin W := A[J, I]; X := A[I, J]; A[J, I] := Y := X × S + W × R; A[I, J] := X := X × R - W × S; A[J, I1] := -Y; A[I1, J] := A[I1, J] - X end end else begin comment INTERCHANGE A[I1, J] AND A[I, J] - A[I1, J] × FACTOR; F[I] := R := AA / M; G[I] := S := BB / M; W := A[I1, I1] - LAMBDA; AA := A[I, I1] - R × W - S × MU; A[I, I1] := W; BB := A[I1, I] - S × W + R × MU; A[I1, I] := -MU; for J := I + 2 step 1 until N do begin W := A[I1, J]; A[I1, J] := A[I, J] - R × W; A[I, J] := W; A[J, I1] := A[J, I] - S × W; A[J, I] := 0 end end end P[N] := true; D := AA ⭡ 2 + BB ⭡ 2; if D < MACHTOL ⭡ 2 then begin AA := MACHTOL; BB := 0; D := MACHTOL ⭡ 2 end; A[N, N] := D; F[N] := AA; G[N] := -BB; for I := 1 step 1 until N do begin U[I] := 1; V[I] := 0 end; COUNT := 0; FORWARD: if COUNT > MAX then goto OUTM; for I := 1 step 1 until N do begin if P[I] then begin W := V[I]; V[I] := G[I] × U[I] + F[I] × W; U[I] := F[I] × U[I] - G[I] × W; if I < N then begin V[I + 1] := V[I + 1] - V[I]; U[I + 1] := U[I + 1] - U[I] end end else begin AA := U[I + 1]; BB := V[I + 1]; U[I + 1] := U[I] - (F[I] × AA - G[I] × BB); U[I] := AA; V[I + 1] := V[I] - (G[I] × AA + F[I] × BB); V[I] := BB end end FORWARD; BACKWARD: for I := N step -1 until 1 do begin I1 := I + 1; U[I] := (U[I] - MATVEC(I1, N, I, A, U) + (if P[I] then TAMVEC(I1, N, I, A, V) else A[I1, I] × V[I1])) / A[I, I]; V[I] := (V[I] - MATVEC(I1, N, I, A, V) - (if P[I] then TAMVEC(I1, N, I, A, U) else A[I1, I] × U[I1])) / A[I, I] end BACKWARD; NORMALISE: W := 1 / SQRT(VECVEC(1, N, 0, U, U) + VECVEC(1, N, 0, V, V)); for J := 1 step 1 until N do begin U[J] := U[J] × W; V[J] := V[J] × W end; COUNT := COUNT + 1; if W > TOL then goto FORWARD; OUTM: EM[7] := W; EM[9] := COUNT end COMVECHES; comment ================== 34182 ================= ; comment MCA 2412; integer procedure REAEIGVAL(A, N, EM, VAL); value N; integer N; array A, EM, VAL; begin integer I, J; real R; array D[1:N]; integer array INT, INT0[1:N]; procedure TFMREAHES(A, N, EM, INT); code 34170; procedure EQILBR(A, N, EM, D, INT); code 34173; integer procedure REAVALQRI(A, N, EM, VAL); code 34180; EQILBR(A, N, EM, D, INT0); TFMREAHES(A, N, EM, INT); J := REAEIGVAL := REAVALQRI(A, N, EM, VAL); for I := J + 1 step 1 until N do for J := I + 1 step 1 until N do begin if VAL[J] > VAL[I] then begin R := VAL[I]; VAL[I] := VAL[J]; VAL[J] := R end end end REAEIGVAL; comment ================== 34184 ================= ; comment MCA 2414; integer procedure REAEIG1(A, N, EM, VAL, VEC); value N; integer N; array A, EM, VAL, VEC; begin integer I, K, MAX, J, L; real RESIDU, R, MACHTOL; array D, V[1:N], B[1:N, 1:N]; integer array INT, INT0[1:N]; procedure TFMREAHES(A, N, EM, INT); code 34170; procedure BAKREAHES2(A, N, N1, N2, INT, VEC); code 34172; procedure EQILBR(A, N, EM, D, INT); code 34173; procedure BAKLBR(N, N1, N2, D, INT, VEC); code 34174; integer procedure REAVALQRI(A, N, EM, VAL); code 34180; procedure REAVECHES(A, N, LAMBDA, EM, V); code 34181; procedure REASCL(A, N, N1, N2); code 34183; RESIDU := 0; MAX := 0; EQILBR(A, N, EM, D, INT0); TFMREAHES(A, N, EM, INT); for I := 1 step 1 until N do for J := (if I = 1 then 1 else I - 1) step 1 until N do B[I, J] := A[I, J]; K := REAEIG1 := REAVALQRI(B, N, EM, VAL); for I := K + 1 step 1 until N do for J := I + 1 step 1 until N do begin if VAL[J] > VAL[I] then begin R := VAL[I]; VAL[I] := VAL[J]; VAL[J] := R end end; MACHTOL := EM[0] × EM[1]; for L := K + 1 step 1 until N do begin if L > 1 then begin if VAL[L - 1] - VAL[L] < MACHTOL then VAL[L] := VAL[L - 1] - MACHTOL end; for I := 1 step 1 until N do for J := (if I = 1 then 1 else I - 1) step 1 until N do B[I, J] := A[I, J]; REAVECHES(B, N, VAL[L], EM, V); if EM[7] > RESIDU then RESIDU := EM[7]; if EM[9] > MAX then MAX := EM[9]; for J := 1 step 1 until N do VEC[J, L] := V[J] end; EM[7] := RESIDU; EM[9] := MAX; BAKREAHES2(A, N, K + 1, N, INT, VEC); BAKLBR(N, K + 1, N, D, INT0, VEC); REASCL(VEC, N, K + 1, N) end REAEIG1; comment ================== 34187 ================= ; comment MCA 2417; integer procedure REAEIG3(A, N, EM, VAL, VEC); value N; integer N; array A, EM, VAL, VEC; begin integer I; real S; integer array INT, INT0[1:N]; array D[1:N]; procedure TFMREAHES(A, N, EM, INT); code 34170; procedure BAKREAHES2(A, N, N1, N2, INT, VEC); code 34172; procedure EQILBR(A, N, EM, D, INT); code 34173; procedure BAKLBR(N, N1, N2, D, INT, VEC); code 34174; procedure REASCL(A, N, N1, N2); code 34183; integer procedure REAQRI(A, N, EM, VAL, VEC); code 34186; EQILBR(A, N, EM, D, INT0); TFMREAHES(A, N, EM, INT); I := REAEIG3 := REAQRI(A, N, EM, VAL, VEC); if I = 0 then begin BAKREAHES2(A, N, 1, N, INT, VEC); BAKLBR(N, 1, N, D, INT0, VEC); REASCL(VEC, N, 1, N) end end REAEIG3; comment ================== 34192 ================= ; comment MCA 2422; integer procedure COMEIGVAL(A, N, EM, RE, IM); value N; integer N; array A, EM, RE, IM; begin integer array INT, INT0[1:N]; array D[1:N]; procedure EQILBR(A, N, EM, D, INT); code 34173; procedure TFMREAHES(A, N, EM, INT); code 34170; integer procedure COMVALQRI(A, N, EM, RE, IM); code 34190; EQILBR(A, N, EM, D, INT0); TFMREAHES(A, N, EM, INT); COMEIGVAL := COMVALQRI(A, N, EM, RE, IM) end COMEIGVAL; comment ================== 34194 ================= ; comment MCA 2424; integer procedure COMEIG1(A, N, EM, RE, IM, VEC); value N; integer N; array A, EM, RE, IM, VEC; begin integer I, J, K, PJ, ITT; real X, Y, MAX, NEPS; array AB[1:N, 1:N], D, U, V[1:N]; integer array INT, INT0[1:N]; procedure TRANSFER; begin integer I, J; for I := 1 step 1 until N do for J := (if I = 1 then 1 else I - 1) step 1 until N do AB[I, J] := A[I, J] end TRANSFER; procedure EQILBR(A, N, EM, D, INT); code 34173; procedure TFMREAHES(A, N, EM, INT); code 34170; procedure BAKREAHES2(A, N, N1, N2, INT, VEC); code 34172; procedure BAKLBR(N, N1, N2, D, INT, VEC); code 34174; procedure REAVECHES(A, N, LAMBDA, EM, V); code 34181; procedure COMSCL(A, N, N1, N2, IM); code 34193; integer procedure COMVALQRI(A, N, EM, RE, IM); code 34190; procedure COMVECHES(A, N, LAMBDA, MU, EM, U, V); code 34191; EQILBR(A, N, EM, D, INT0); TFMREAHES(A, N, EM, INT); TRANSFER; K := COMEIG1 := COMVALQRI(AB, N, EM, RE, IM); NEPS := EM[0] × EM[1]; MAX := 0; ITT := 0; for I := K + 1 step 1 until N do begin X := RE[I]; Y := IM[I]; PJ := 0; AGAIN: for J := K + 1 step 1 until I - 1 do begin if ((X - RE[J]) ⭡ 2 + (Y - IM[J]) ⭡ 2 ≤ NEPS ⭡ 2) then begin if PJ = J then NEPS := EM[2] × EM[1] else PJ := J; X := X + 2 × NEPS; goto AGAIN end end; RE[I] := X; TRANSFER; if Y ≠ 0 then begin COMVECHES(AB, N, RE[I], IM[I], EM, U, V); for J := 1 step 1 until N do VEC[J, I] := U[J]; I := I + 1; RE[I] := X end else REAVECHES(AB, N, X, EM, V); for J := 1 step 1 until N do VEC[J, I] := V[J]; if EM[7] > MAX then MAX := EM[7]; ITT := if ITT > EM[9] then ITT else EM[9] end; EM[7] := MAX; EM[9] := ITT; BAKREAHES2(A, N, K + 1, N, INT, VEC); BAKLBR(N, K + 1, N, D, INT0, VEC); COMSCL(VEC, N, K + 1, N, IM) end COMEIG1; comment ================== 34368 ================= ; procedure EIGVALHRM(A, N, NUMVAL, VAL, EM); value N, NUMVAL; integer N, NUMVAL; array A, VAL, EM; begin array D[1:N], BB[1:N - 1]; procedure HSHHRMTRIVAL(A, N, D, BB, EM); code 34364; procedure VALSYMTRI(D, BB, N, N1, N2, VAL, EM); code 34151; HSHHRMTRIVAL(A, N, D, BB, EM); VALSYMTRI(D, BB, N, 1, NUMVAL, VAL, EM) end EIGVALHRM; comment ================== 34369 ================= ; procedure EIGHRM(A, N, NUMVAL, VAL, VECR, VECI, EM); value N, NUMVAL; integer N, NUMVAL; array A, VAL, VECR, VECI, EM; begin array BB, TR, TI[1:N - 1], D, B[1:N]; procedure HSHHRMTRI(A, N, D, B, BB, EM, TR, TI); code 34363; procedure VALSYMTRI(D, BB, N, N1, N2, VAL, EM); code 34151; procedure VECSYMTRI(D, B, N, N1, N2, VAL, VEC, EM); code 34152; procedure BAKHRMTRI(A, N, N1, N2, VECR, VECI, TR, TI); code 34365; HSHHRMTRI(A, N, D, B, BB, EM, TR, TI); VALSYMTRI(D, BB, N, 1, NUMVAL, VAL, EM); B[N] := 0; VECSYMTRI(D, B, N, 1, NUMVAL, VAL, VECR, EM); BAKHRMTRI(A, N, 1, NUMVAL, VECR, VECI, TR, TI) end EIGHRM; comment ================== 34370 ================= ; integer procedure QRIVALHRM(A, N, VAL, EM); value N; integer N; array A, VAL, EM; begin array B, BB[1:N]; integer I; procedure HSHHRMTRIVAL(A, N, D, BB, EM); code 34364; integer procedure QRIVALSYMTRI(D, BB, N, EM); code 34160; HSHHRMTRIVAL(A, N, VAL, BB, EM); B[N] := BB[N] := 0; for I := 1 step 1 until N-1 do B[I] := SQRT(BB[I]); QRIVALHRM := QRIVALSYMTRI(VAL, BB, N, EM) end QRIVALHRM; comment ================== 34371 ================= ; integer procedure QRIHRM(A, N, VAL, VR, VI, EM); value N; integer N; array A, VAL, VR, VI, EM; begin integer I, J; array B, BB[1:N], TR, TI[1:N - 1]; procedure HSHHRMTRI(A, N, D, B, BB, EM, TR, TI); code 34363; integer procedure QRISYMTRI(A, N, D, B, BB, EM); code 34161; procedure BAKHRMTRI(A, N, N1, N2, VECR, VECI, TR, TI); code 34365; HSHHRMTRI(A, N, VAL, B, BB, EM, TR, TI); for I := 1 step 1 until N do begin VR[I, I] := 1; for J := I + 1 step 1 until N do VR[I, J] := VR[J, I] := 0 end; B[N] := BB[N] := 0; I := QRIHRM := QRISYMTRI(VR, N, VAL, B, BB, EM); BAKHRMTRI(A, N, I + 1, N, VR, VI, TR, TI); end QRIHRM; comment ================== 34372 ================= ; integer procedure VALQRICOM(A1, A2, B, N, EM, VAL1, VAL2); value N; integer N; array A1, A2, B, EM, VAL1, VAL2; begin integer M, NM1, I, I1, Q, Q1, MAX, COUNT; real R, Z1, Z2, DD1, DD2, CC, G1, G2, K1, K2, HC, A1NN, A2NN, AIJ1, AIJ2, AI1I, KAPPA, NUI, MUI1, MUI2, MUIM11, MUIM12, NUIM1, TOL; procedure COMCOLCST(L, U, J, AR, AI, XR, XI); code 34352; procedure ROTCOMCOL(L, U, I, J, AR, AI, CR, CI, S); code 34357; procedure ROTCOMROW(L, U, I, J, AR, AI, CR, CI, S); code 34358; procedure COMKWD(PR, PI, QR, QI, GR, GI, KR, KI); code 34345; TOL := EM[1] × EM[2]; MAX := EM[4]; COUNT := 0; R := 0; M := N; if N > 1 then HC := B[N - 1]; IN: NM1 := N - 1; for I := N, I - 1 while (if I ≥ 1 then ABS(B[I]) > TOL else false) do Q := I; if Q > 1 then begin if ABS(B[Q - 1]) > R then R := ABS(B[Q - 1]) end; if Q = N then begin VAL1[N] := A1[N, N]; VAL2[N] := A2[N, N]; N := NM1; if N > 1 then HC := B[N - 1]; end else begin DD1 := A1[N, N]; DD2 := A2[N, N]; CC := B[NM1]; COMKWD((A1[NM1, NM1] - DD1) / 2, (A2[NM1, NM1] - DD2) / 2, CC × A1[NM1, N], CC × A2[NM1, N], G1, G2, K1, K2); if Q = NM1 then begin VAL1[NM1] := G1 + DD1; VAL2[NM1] := G2 + DD2; VAL1[N] := K1 + DD1; VAL2[N] := K2 + DD2; N := N - 2; if N > 1 then HC := B[N - 1]; end else begin COUNT := COUNT + 1; if COUNT > MAX then goto OUT; Z1 := K1 + DD1; Z2 := K2 + DD2; if ABS(CC) > ABS(HC) then Z1 := Z1 + ABS(CC); HC := CC / 2; I := Q1 := Q + 1; AIJ1 := A1[Q, Q] - Z1; AIJ2 := A2[Q, Q] - Z2; AI1I := B[Q]; KAPPA := SQRT(AIJ1 ⭡ 2 + AIJ2 ⭡ 2 + AI1I ⭡ 2); MUI1 := AIJ1 / KAPPA; MUI2 := AIJ2 / KAPPA; NUI := AI1I / KAPPA; A1[Q, Q] := KAPPA; A2[Q, Q] := 0; A1[Q1, Q1] := A1[Q1, Q1] - Z1; A2[Q1, Q1] := A2[Q1, Q1] - Z2; ROTCOMROW(Q1, N, Q, Q1, A1, A2, MUI1, MUI2, NUI); ROTCOMCOL(Q, Q, Q, Q1, A1, A2, MUI1, - MUI2, - NUI); A1[Q, Q] := A1[Q, Q] + Z1; A2[Q, Q] := A2[Q, Q] + Z2; for I1 := Q1 + 1 step 1 until N do begin AIJ1 := A1[I, I]; AIJ2 := A2[I, I]; AI1I := B[I]; KAPPA := SQRT(AIJ1 ⭡ 2 + AIJ2 ⭡ 2 + AI1I ⭡ 2); MUIM11 := MUI1; MUIM12 := MUI2; NUIM1 := NUI; MUI1 := AIJ1 / KAPPA; MUI2 := AIJ2 / KAPPA; NUI := AI1I / KAPPA; A1[I1, I1] := A1[I1, I1] - Z1; A2[I1, I1] := A2[I1, I1] - Z2; ROTCOMROW(I1, N, I, I1, A1, A2, MUI1, MUI2, NUI); A1[I, I] := MUIM11 × KAPPA; A2[I, I] := - MUIM12 × KAPPA; B[I - 1] := NUIM1 × KAPPA; ROTCOMCOL(Q, I, I, I1, A1, A2, MUI1, - MUI2, - NUI); A1[I, I] := A1[I, I] + Z1; A2[I, I] := A2[I, I] + Z2; I := I1; end; AIJ1 := A1[N, N]; AIJ2 := A2[N, N]; KAPPA := SQRT(AIJ1 ⭡ 2 + AIJ2 ⭡ 2); if (if KAPPA < TOL then true else AIJ2 ⭡ 2 ≤ EM[0] × AIJ1 ⭡ 2) then begin B[NM1] := NUI × AIJ1; A1[N, N] := AIJ1 × MUI1 + Z1; A2[N, N] := - AIJ1 × MUI2 + Z2 end else begin B[NM1] := NUI × KAPPA; A1NN := MUI1 × KAPPA; A2NN := - MUI2 × KAPPA; MUI1 := AIJ1 / KAPPA; MUI2 := AIJ2 / KAPPA; COMCOLCST(Q, NM1, N, A1, A2, MUI1, MUI2); A1[N, N] := MUI1 × A1NN - MUI2 × A2NN + Z1; A2[N, N] := MUI1 × A2NN + MUI2 × A1NN + Z2; end; end end; if N > 0 then goto IN; OUT: EM[3] := R; EM[5] := COUNT; VALQRICOM := N; end VALQRICOM; comment ================== 34373 ================= ; integer procedure QRICOM(A1, A2, B, N, EM, VAL1, VAL2, VEC1, VEC2); value N; integer N; array A1, A2, B, EM, VAL1, VAL2, VEC1, VEC2; begin integer M, NM1, I, I1, J, Q, Q1, MAX, COUNT; real R, Z1, Z2, DD1, DD2, CC, P1, P2, T1, T2, DELTA1, DELTA2, MV1, MV2, H, H1, H2, G1, G2, K1, K2, HC, AIJ12, AIJ22, A1NN, A2NN, AIJ1, AIJ2, AI1I, KAPPA, NUI, MUI1, MUI2, MUIM11, MUIM12, NUIM1, TOL, MACHTOL; array TF1, TF2[1:N]; procedure COMKWD(PR, PI, QR, QI, GR, GI, KR, KI); code 34345; procedure ROTCOMROW(L, U, I, J, AR, AI, CR, CI, S); code 34358; procedure ROTCOMCOL(L, U, I, J, AR, AI, CR, CI, S); code 34357; procedure COMCOLCST(L, U, J, AR, AI, XR, XI); code 34352; procedure COMROWCST(L, U, I, AR, AI, XR, XI); code 34353; real procedure MATVEC(L, U, I, A, B); code 34011; procedure COMMATVEC(L, U, I, AR, AI, BR, BI, RR, RI); code 34354; procedure COMDIV(XR, XI, YR, YI, ZR, ZI); code 34342; TOL := EM[1] × EM[2]; MACHTOL := EM[0] × EM[1]; MAX := EM[4]; COUNT := 0; R := 0; M := N; if N > 1 then HC := B[N - 1]; for I := 1 step 1 until N do begin VEC1[I, I] := 1; VEC2[I, I] := 0; for J := I + 1 step 1 until N do VEC1[I, J] := VEC1[J, I] := VEC2[I, J] := VEC2[J, I] := 0 end; IN: NM1 := N - 1; for I := N, I - 1 while (if I ≥ 1 then ABS(B[I]) > TOL else false) do Q := I; if Q > 1 then begin if ABS(B[Q - 1]) > R then R := ABS(B[Q - 1]) end; if Q = N then begin VAL1[N] := A1[N, N]; VAL2[N] := A2[N, N]; N := NM1; if N > 1 then HC := B[N - 1]; end else begin DD1 := A1[N, N]; DD2 := A2[N, N]; CC := B[NM1]; P1 := (A1[NM1, NM1] - DD1) × .5; P2 := (A2[NM1, NM1] - DD2) × .5; COMKWD(P1, P2, CC × A1[NM1, N], CC × A2[NM1, N], G1, G2, K1, K2); if Q = NM1 then begin A1[N, N] := VAL1[N] := G1 + DD1; A2[N, N] := VAL2[N] := G2 + DD2; A1[Q, Q] := VAL1[Q] := K1 + DD1; A2[Q, Q] := VAL2[Q] := K2 + DD2; KAPPA := SQRT(K1 ⭡ 2 + K2 ⭡ 2 + CC ⭡ 2); NUI := CC / KAPPA; MUI1 := K1 / KAPPA; MUI2 := K2 / KAPPA; AIJ1 := A1[Q, N]; AIJ2 := A2[Q, N]; H1 := MUI1 ⭡ 2 - MUI2 ⭡ 2; H2 := 2 × MUI1 × MUI2; H := - NUI × 2; A1[Q, N] := H × (P1 × MUI1 + P2 × MUI2) - NUI × NUI × CC + AIJ1 × H1 + AIJ2 × H2; A2[Q, N] := H × (P2 × MUI1 - P1 × MUI2) + AIJ2 × H1 - AIJ1 × H2; ROTCOMROW(Q + 2, M, Q, N, A1, A2, MUI1, MUI2, NUI); ROTCOMCOL(1, Q - 1, Q, N, A1, A2, MUI1, - MUI2, - NUI); ROTCOMCOL(1, M, Q, N, VEC1, VEC2, MUI1, - MUI2, - NUI); N := N - 2; if N > 1 then HC := B[N - 1]; B[Q] := 0 end else begin COUNT := COUNT + 1; if COUNT > MAX then goto OUT; Z1 := K1 + DD1; Z2 := K2 + DD2; if ABS(CC) > ABS(HC) then Z1 := Z1 + ABS(CC); HC := CC / 2; Q1 := Q + 1; AIJ1 := A1[Q, Q] - Z1; AIJ2 := A2[Q, Q] - Z2; AI1I := B[Q]; KAPPA := SQRT(AIJ1 ⭡ 2 + AIJ2 ⭡ 2 + AI1I ⭡ 2); MUI1 := AIJ1 / KAPPA; MUI2 := AIJ2 / KAPPA; NUI := AI1I / KAPPA; A1[Q, Q] := KAPPA; A2[Q, Q] := 0; A1[Q1, Q1] := A1[Q1, Q1] - Z1; A2[Q1, Q1] := A2[Q1, Q1] - Z2; ROTCOMROW(Q1, M, Q, Q1, A1, A2, MUI1, MUI2, NUI); ROTCOMCOL(1, Q, Q, Q1, A1, A2, MUI1, - MUI2, - NUI); A1[Q, Q] := A1[Q, Q] + Z1; A2[Q, Q] := A2[Q, Q] + Z2; ROTCOMCOL(1, M, Q, Q1, VEC1, VEC2, MUI1, - MUI2, - NUI); for I := Q1 step 1 until NM1 do begin I1 := I + 1; AIJ1 := A1[I, I]; AIJ2 := A2[I, I]; AI1I := B[I]; KAPPA := SQRT(AIJ1 ⭡ 2 + AIJ2 ⭡ 2 + AI1I ⭡ 2); MUIM11 := MUI1; MUIM12 := MUI2; NUIM1 := NUI; MUI1 := AIJ1 / KAPPA; MUI2 := AIJ2 / KAPPA; NUI := AI1I / KAPPA; A1[I1, I1] := A1[I1, I1] - Z1; A2[I1, I1] := A2[I1, I1] - Z2; ROTCOMROW(I1, M, I, I1, A1, A2, MUI1, MUI2, NUI); A1[I, I] := MUIM11 × KAPPA; A2[I, I] := - MUIM12 × KAPPA; B[I - 1] := NUIM1 × KAPPA; ROTCOMCOL(1, I, I, I1, A1, A2, MUI1, - MUI2, - NUI); A1[I, I] := A1[I, I] + Z1; A2[I, I] := A2[I, I] + Z2; ROTCOMCOL(1, M, I, I1, VEC1, VEC2, MUI1, - MUI2, - NUI); end; AIJ1 := A1[N, N]; AIJ2 := A2[N, N]; AIJ12 := AIJ1 ⭡ 2; AIJ22 := AIJ2 ⭡ 2; KAPPA := SQRT(AIJ12 + AIJ22); if (if KAPPA < TOL then true else AIJ22 ≤ EM[0] × AIJ12) then begin B[NM1] := NUI × AIJ1; A1[N, N] := AIJ1 × MUI1 + Z1; A2[N, N] := - AIJ1 × MUI2 + Z2 end else begin B[NM1] := NUI × KAPPA; A1NN := MUI1 × KAPPA; A2NN := - MUI2 × KAPPA; MUI1 := AIJ1 / KAPPA; MUI2 := AIJ2 / KAPPA; COMCOLCST(1, NM1, N, A1, A2, MUI1, MUI2); COMCOLCST(1, NM1, N, VEC1, VEC2, MUI1, MUI2); COMROWCST(N + 1, M, N, A1, A2, MUI1, - MUI2); COMCOLCST(N, M, N, VEC1, VEC2, MUI1, MUI2); A1[N, N] := MUI1 × A1NN - MUI2 × A2NN + Z1; A2[N, N] := MUI1 × A2NN + MUI2 × A1NN + Z2; end; end; end; if N > 0 then goto IN; for J := M step - 1 until 2 do begin TF1[J] := 1; TF2[J] := 0; T1 := A1[J, J]; T2 := A2[J, J]; for I := J - 1 step - 1 until 1 do begin DELTA1 := T1 - A1[I, I]; DELTA2 := T2 - A2[I, I]; COMMATVEC(I + 1, J, I, A1, A2, TF1, TF2, MV1, MV2); if ABS(DELTA1) < MACHTOL ∧ ABS(DELTA2) < MACHTOL then begin TF1[I] := MV1 / MACHTOL; TF2[I] := MV2 / MACHTOL end else COMDIV(MV1, MV2, DELTA1, DELTA2, TF1[I], TF2[I]); end; for I := 1 step 1 until M do COMMATVEC(1, J, I, VEC1, VEC2, TF1, TF2, VEC1[I, J], VEC2[I, J]); end; OUT: EM[3] := R; EM[5] := COUNT; QRICOM := N; end QRICOM; comment ================== 34374 ================= ; integer procedure EIGVALCOM(AR, AI, N, EM, VALR, VALI); value N; integer N; array AR, AI, EM, VALR, VALI; begin integer array INT[1:N]; array D, B, DEL, TR, TI[1:N]; procedure HSHCOMHES(AR, AI, N, EM, B, TR, TI, DEL); code 34366; real procedure COMEUCNRM(AR, AI, LW, N); code 34359; procedure EQILBRCOM(A1, A2, N, EM, D, INT); code 34361; integer procedure VALQRICOM(A1, A2, B, N, EM, VAL1, VAL2); code 34372; EQILBRCOM(AR, AI, N, EM, D, INT); EM[1] := COMEUCNRM(AR, AI, N - 1, N); HSHCOMHES(AR, AI, N, EM, B, TR, TI, DEL); EIGVALCOM := VALQRICOM(AR, AI, B, N, EM, VALR, VALI) end EIGVALCOM; comment ================== 34375 ================= ; integer procedure EIGCOM(AR, AI, N, EM, VALR, VALI, VR, VI); value N; integer N; array AR, AI, EM, VALR, VALI, VR, VI; begin integer I; integer array INT[1:N]; array D, B, DEL, TR, TI[1:N]; procedure EQILBRCOM(A1, A2, N, EM, D, INT); code 34361; real procedure COMEUCNRM(AR, AI, LW, N); code 34359; procedure HSHCOMHES(AR, AI, N, EM, B, TR, TI, DEL); code 34366; integer procedure QRICOM(A1, A2, B, N, EM, VAL1, VAL2, VEC1, VEC2); code 34373; procedure BAKCOMHES(AR, AI, TR, TI, DEL, VR, VI, N, N1, N2); code 34367; procedure BAKLBRCOM(N, N1, N2, D, INT, VR, VI); code 34362; procedure SCLCOM(AR, AI, N, N1, N2); code 34360; EQILBRCOM(AR, AI, N, EM, D, INT); EM[1] := COMEUCNRM(AR, AI, N - 1, N); HSHCOMHES(AR, AI, N, EM, B, TR, TI, DEL); I := EIGCOM := QRICOM(AR, AI, B, N, EM, VALR, VALI, VR, VI); if I = 0 then begin BAKCOMHES(AR, AI, TR, TI, DEL, VR, VI, N, 1, N); BAKLBRCOM(N, 1, N, D, INT, VR, VI); SCLCOM(VR, VI, N, 1, N) end end EIGCOM; comment ================== 34270 ================= ; integer procedure QRISNGVALBID(D, B, N, EM); value N; integer N; array D, B, EM; begin integer N1, K, K1, I, I1, COUNT, MAX, RNK; real TOL, BMAX, Z, X, Y, G, H, F, C, S, MIN; TOL := EM[2] × EM[1]; COUNT := 0; BMAX := 0; MAX := EM[4]; MIN := EM[6]; RNK := N; IN: K := N; N1 := N - 1; NEXT: K := K - 1; if K > 0 then begin if ABS(B[K]) ≥ TOL then begin if ABS(D[K]) ≥ TOL then goto NEXT; C := 0; S := 1; for I := K step 1 until N1 do begin F := S × B[I]; B[I] := C × B[I]; I1 := I + 1; if ABS(F) < TOL then goto NEGLECT; G := D[I1]; D[I1] := H := SQRT(F × F + G × G); C := G / H; S := - F / H end; NEGLECT: end else if ABS(B[K]) > BMAX then BMAX := ABS(B[K]) end; if K = N1 then begin if D[N] < 0 then D[N] := - D[N]; if D[N] ≤ MIN then RNK := RNK - 1; N := N1 end else begin COUNT := COUNT + 1; if COUNT > MAX then goto END; K1 := K + 1; Z := D[N]; X := D[K1]; Y := D[N1]; G := if N1 = 1 then 0 else B[N1 - 1]; H := B[N1]; F := ((Y - Z) × (Y + Z) + (G - H) × (G + H)) / (2 × H × Y); G := SQRT(F × F + 1); F := ((X - Z) × (X + Z) + H × (Y / (if F < 0 then F - G else F + G) - H)) / X; C := S := 1; for I := K1 + 1 step 1 until N do begin I1 := I - 1; G := B[I1]; Y := D[I]; H := S × G; G := C × G; Z := SQRT(F × F + H × H); C := F / Z; S := H / Z; if I1 ≠ K1 then B[I1 - 1] := Z; F := X × C + G × S; G := G × C - X × S; H := Y × S; Y := Y × C; D[I1] := Z := SQRT(F × F + H × H); C := F / Z; S := H / Z; F := C × G + S × Y; X := C × Y - S × G end; B[N1] := F; D[N] := X end; if N > 0 then goto IN; END: EM[3] := BMAX; EM[5] := COUNT; EM[7] := RNK; QRISNGVALBID := N end QRISNGVALBID; comment ================== 34271 ================= ; integer procedure QRISNGVALDECBID(D, B, M, N, U, V, EM); value M, N; integer M, N; array D, B, U, V, EM; begin integer N0, N1, K, K1, I, I1, COUNT, MAX, RNK; real TOL, BMAX, Z, X, Y, G, H, F, C, S, MIN; procedure ROTCOL(L, U, I, J, A, C, S); value L, U, I, J, C, S; integer L, U, I, J; real C, S; array A; code 34040; TOL := EM[2] × EM[1]; COUNT := 0; BMAX := 0; MAX := EM[4]; MIN := EM[6]; RNK := N0 := N; IN: K := N; N1 := N - 1; NEXT: K := K - 1; if K > 0 then begin if ABS(B[K]) ≥ TOL then begin if ABS(D[K]) ≥ TOL then goto NEXT; C := 0; S := 1; for I := K step 1 until N1 do begin F := S × B[I]; B[I] := C × B[I]; I1 := I + 1; if ABS(F) < TOL then goto NEGLECT; G := D[I1]; D[I1] := H := SQRT(F × F + G × G); C := G / H; S := - F / H; ROTCOL(1, M, K, I1, U, C, S) end; NEGLECT: end else if ABS(B[K]) > BMAX then BMAX := ABS(B[K]) end; if K = N1 then begin if D[N] < 0 then begin D[N] := - D[N]; for I := 1 step 1 until N0 do V[I, N] := - V[I, N] end; if D[N] ≤ MIN then RNK := RNK - 1; N := N1 end else begin COUNT := COUNT + 1; if COUNT > MAX then goto END; K1 := K + 1; Z := D[N]; X := D[K1]; Y := D[N1]; G := if N1 = 1 then 0 else B[N1 - 1]; H := B[N1]; F := ((Y - Z) × (Y + Z) + (G - H) × (G + H)) / (2 × H × Y); G := SQRT(F × F + 1); F := ((X - Z) × (X + Z) + H × (Y / (if F < 0 then F - G else F + G) - H)) / X; C := S := 1; for I := K1 + 1 step 1 until N do begin I1 := I - 1; G := B[I1]; Y := D[I]; H := S × G; G := C × G; Z := SQRT(F × F + H × H); C := F / Z; S := H / Z; if I1 ≠ K1 then B[I1 - 1] := Z; F := X × C + G × S; G := G × C - X × S; H := Y × S; Y := Y × C; ROTCOL(1, N0, I1, I, V, C, S); D[I1] := Z := SQRT(F × F + H × H); C := F / Z; S := H / Z; F := C × G + S × Y; X := C × Y - S × G; ROTCOL(1, M, I1, I, U, C, S) end; B[N1] := F; D[N] := X end; if N > 0 then goto IN; END: EM[3] := BMAX; EM[5] := COUNT; EM[7] := RNK; QRISNGVALDECBID := N end QRISNGVALDECBID; comment ================== 34272 ================= ; integer procedure QRISNGVAL(A, M, N, VAL, EM); value M, N; integer M, N; array A, VAL, EM; begin array B[1:N]; procedure HSHREABID(A, M, N, D, B, EM); value M, N; integer M, N; array D, B, EM; code 34260; integer procedure QRISNGVALBID(D, B, N, EM); value N; integer N; array D, B, EM; code 34270; HSHREABID(A, M, N, VAL, B, EM); QRISNGVAL := QRISNGVALBID(VAL, B, N, EM) end QRISNGVAL; comment ================== 34273 ================= ; integer procedure QRISNGVALDEC(A, M, N, VAL, V, EM); value M, N; integer M, N; array A, VAL, V, EM; begin array B[1:N]; procedure HSHREABID(A, M, N, D, B, EM); value M, N; integer M, N; array A, D, B, EM; code 34260; procedure PSTTFMMAT(A, N, V, B); value N; integer N; array A, V, B; code 34261; procedure PRETFMMAT(A, M, N, D); value M, N; integer M, N; array A, D; code 34262; integer procedure QRISNGVALDECBID(D, B, M, N, U, V, EM); value M, N; integer M, N; array D, B, U, V, EM; code 34271; HSHREABID(A, M, N, VAL, B, EM); PSTTFMMAT(A, N, V, B); PRETFMMAT(A, M, N, VAL); QRISNGVALDEC := QRISNGVALDECBID(VAL, B, M, N, A, V, EM) end QRISNGVALDEC; comment ================== 34345 ================= ; procedure COMKWD(PR, PI, QR, QI, GR, GI, KR, KI); value PR, PI, QR, QI; real PR, PI, QR, QI, GR, GI, KR, KI; begin procedure COMMUL (AR, AI, BR, BI, RR, RI); code 34341; procedure COMDIV(XR, XI, YR, YI, ZR, ZI); code 34342; procedure COMSQRT(AR, AI, PR, PI); code 34343; if QR = 0 ∧ QI = 0 then begin KR := KI := 0 ; GR := PR × 2; GI := PI × 2 end else if PR = 0 ∧ PI = 0 then begin COMSQRT(QR, QI, GR, GI); KR := -GR; KI := -GI end else begin real HR, HI; if ABS(PR) > 1 ∨ ABS(PI) > 1 then begin COMDIV(QR, QI, PR, PI, HR, HI); COMDIV(HR, HI, PR, PI, HR, HI); COMSQRT(1 + HR, HI, HR, HI); COMMUL(PR, PI, HR + 1, HI, GR, GI); end else begin COMSQRT(QR + (PR + PI) × (PR-PI), QI + PR × PI × 2, HR, HI); if PR × HR + PI × HI > 0 then begin GR := PR + HR; GI := PI + HI end else begin GR := PR - HR; GI := PI - HI end; end; COMDIV(-QR, -QI, GR, GI, KR, KI); end end COMKWD; comment ================== 32010 ================= ; real procedure EULER(AI, I, EPS, TIM); value EPS, TIM; integer I, TIM; real AI, EPS; begin integer K, N, T; real MN, MP, DS, SUM; array M[0:15]; N := T := 0; I := 0; M[0] := AI; SUM := M[0] / 2; NEXT TERM: I := I + 1; MN := AI; for K := 0 step 1 until N do begin MP := (MN + M[K]) / 2; M[K] := MN; MN := MP end; if ABS(MN) < ABS(M[N]) ∧ N < 15 then begin DS := MN / 2; N := N + 1; M[N] := MN end else DS := MN; SUM := SUM + DS; T := if ABS(DS) < EPS then T + 1 else 0; if T < TIM then go to NEXT TERM; EULER := SUM end EULER; comment ================== 32020 ================= ; real procedure SUMPOSSERIES(AI, I, MAXADDUP, MAXZERO, MAXRECURS, MACHEXP, TIM); value MAXADDUP, MAXZERO, MAXRECURS, MACHEXP, TIM; real AI, I, MAXZERO; integer MAXADDUP, MAXRECURS, MACHEXP, TIM; begin integer RECURS, VL, VL2, VL4; real procedure EULER(AI, I, EPS, TIM); code 32010; real procedure SUMUP(AI, I); real AI, I; begin integer J; real SUM, NEXTTERM; I := MAXADDUP + 1; J := 1; CHECK ADD: if AI ≤ MAXZERO then begin if J < TIM then begin J := J + 1; I := I + 1; go to CHECK ADD end end else if RECURS ≠ MAXRECURS then go to TRANSFORMSERIES; SUM := 0; I := 0; J := 0; ADD LOOP: I := I + 1; NEXTTERM := AI; J := if NEXTTERM ≤ MAXZERO then J + 1 else 0; SUM := SUM + NEXTTERM; if J < TIM then go to ADD LOOP; SUMUP := SUM; go to GOTSUM; TRANSFORMSERIES: begin Boolean JODD; integer J2; array V[1:VL]; real procedure BJK(J, K); value J, K; real K; integer J; begin real COEFF; if K > MACHEXP then BJK := 0 else begin COEFF := 2 ⭡ (K - 1); I := J × COEFF; BJK := COEFF × AI end end BJK; real procedure VJ(J); value J; integer J; begin real TEMP, K; if JODD then begin JODD := false; RECURS := RECURS + 1; TEMP := VJ := SUMUP(BJK(J, K), K); RECURS := RECURS - 1; if J ≤ VL then V[J] := TEMP else if J ≤ VL2 then V[J - VL] := TEMP end else begin JODD := true; if J > VL4 then begin RECURS := RECURS + 1; VJ := - SUMUP(BJK(J, K), K); RECURS := RECURS - 1 end else begin J2 := J2 + 1; I := J2; if J > VL2 then VJ := - (V[J2 - VL] - AI) / 2 else begin TEMP := V[ if J ≤ VL then J else J - VL] := (V[J2] - AI) / 2; VJ := - TEMP end end end end VJ; J2 := 0; JODD := true; SUMUP := EULER(VJ(J + 1), J, MAXZERO, TIM) end TRANSFORMSERIES; GOTSUM: end SUMUP; RECURS := 0; VL := 1000; VL2 := 2 × VL; VL4 := 2 × VL2; SUMPOSSERIES := SUMUP(AI, I) end SUMPOSSERIES; comment ================== 32070 ================= ; real procedure QADRAT(X, A, B, FX, E); value A, B; real X, A, B, FX; array E; begin real F0, F2, F3, F5, F6, F7, F9, F14, V, W, HMIN, HMAX, RE, AE; real procedure LINT(X0, XN, F0, F2, F3, F5, F6, F7, F9, F14); real X0, XN, F0, F2, F3, F5, F6, F7, F9, F14; begin real H, XM, F1, F4, F8, F10, F11, F12, F13; XM := (X0 + XN) / 2; H := (XN - X0) / 32; X := XM + 4 × H; F8 := FX; X := XN - 4 × H; F11 := FX; X := XN - 2 × H; F12 := FX; V := 0.330580178199226 × F7 + 0.173485115707338 × (F6 + F8) + 0.321105426559972 × (F5 + F9) + 0.135007708341042 × (F3 + F11) + 0.165714514228223 × (F2 + F12) + 0.39397146063812710-1 × (F0 + F14); X := X0 + H; F1 := FX; X := XN - H; F13 := FX; W := 0.260652434656970 × F7 + 0.239063286684765 × (F6 + F8) + 0.263062635477467 × (F5 + F9) + 0.218681931383057 × (F3 + F11) + 0.27578976466428410-1 × (F2 + F12) + 0.105575010053846 × (F1 + F13) + 0.15711942605951810-1 × (F0 + F14); if ABS(H) < HMIN then E[3] := E[3] + 1; if ABS(V - W) < ABS(W) × RE + AE ∨ ABS(H) < HMIN then LINT := H × W else begin X := X0 + 6 × H; F4 := FX; X := XN - 6 × H; F10 := FX; V := 0.245673430093324 × F7 + 0.255786258286921 × (F6 + F8) + 0.228526063690406 × (F5 + F9) + 0.50055713152546010-1 × (F4 + F10) + 0.177946487736780 × (F3 + F11) + 0.58401459934744910-1 × (F2 + F12) + 0.87483094287133110-1 × (F1 + F13) + 0.18964207864807910-1 × (F0 + F14); LINT := if ABS(V - W) < ABS(V) × RE + AE then H × V else LINT(X0, XM, F0, F1, F2, F3, F4, F5, F6, F7) - LINT(XN, XM, F14, F13, F12, F11, F10, F9, F8, F7) end end LINT; HMAX := (B - A) / 16; if HMAX = 0 then begin QADRAT := 0; goto RETURN end; RE := E[1]; AE := 2 × E[2] / ABS(B - A); E[3] := 0; HMIN := ABS(B - A) × RE; X := A; F0 := FX; X := A + HMAX; F2 := FX; X := A + 2 × HMAX; F3 := FX; X := A + 4 × HMAX; F5 := FX; X := A + 6 × HMAX; F6 := FX; X := A + 8 × HMAX; F7 := FX; X := B - 4 × HMAX; F9 := FX; X := B; F14 := FX; QADRAT := LINT(A, B, F0, F2, F3, F5, F6, F7, F9, F14) × 16; RETURN: end QADRAT; comment ================== 32051 ================= ; real procedure INTEGRAL(X, A, B, FX, E, UA, UB); value A, B; real X, A, B, FX; array E; Boolean UA, UB; begin real procedure TRANSF; begin Z := 1 / X; X := Z + B1; TRANSF := FX × Z × Z end; real procedure QAD(FX); real FX; begin real T, V, SUM, HMIN; procedure INT; begin real X3, X4, F3, F4, H; X4 := X2; X2 := X1; F4 := F2; F2 := F1; ANEW: X := X1 := (X0 + X2) × .5; F1 := FX; X := X3 := (X2 + X4) × .5; F3 := FX; H := X4 - X0; V := (4 × (F1 + F3) + 2 × F2 + F0 + F4) × 15; T := 6 × F2 -4 × (F1 + F3) + F0 + F4; if ABS(T) < ABS(V) × RE + AE then SUM := SUM + (V - T) × H else if ABS(H) < HMIN then E[3] := E[3] + 1 else begin INT; X2 := X3; F2 := F3; goto ANEW end; X0 := X4; F0 := F4 end INT; HMIN := ABS(X0 - X2) × RE; X := X1 := (X0 + X2) × .5; F1 := FX; SUM := 0; INT; QAD := SUM / 180 end QAD; real X0, X1, X2, F0, F1, F2, RE, AE, B1, Z; RE := E[1]; if UB then AE := E[2] × 180 / ABS(B - A) else AE := E[2] × 90 / ABS(B - A); if UA then begin E[3] := E[4] := 0; X := X0 := A; F0 := FX end else begin X := X0 := A := E[5]; F0 := E[6] end; E[5] := X := X2 := B; E[6] := F2 := FX; E[4] := E[4] + QAD(FX); if ¬UB then begin if A < B then begin B1 := B -1 ; X0 := 1 end else begin B1 := B + 1 ; X0 := -1 end; F0 := E[6]; E[5] := X2 := 0; E[6] := F2 := 0; AE := E[2] × 90; E[4] := E[4] - QAD(TRANSF) end; INTEGRAL := E[4] end INTEGRAL; comment ================== 34210 ================= ; procedure LINEMIN(N, X, D, ND, ALFA, G, FUNCT, F0, F1, DF0, DF1, EVLMAX, STRONGSEARCH, IN); value N, ND, F0, DF0, STRONGSEARCH; integer N, EVLMAX; Boolean STRONGSEARCH; real ND, ALFA, F0, F1, DF0, DF1; array X, D, G, IN; real procedure FUNCT; begin integer I, EVL; Boolean NOTININT; real F, OLDF, DF, OLDDF, MU, ALFA0, Q, W, Y, Z, RELTOL, ABSTOL , EPS, AID; array X0[1:N]; real procedure VECVEC(L, U, SHIFT, A, B); code 34010; procedure ELMVEC(L, U, SHIFT, A, B, X); code 34020; procedure DUPVEC(L, U, SHIFT, A, B); code 31030; RELTOL := IN[1]; ABSTOL := IN[2]; MU := IN[3]; EVL := 0; ALFA0 := 0; OLDF := F0; OLDDF := DF0; Y := ALFA; NOTININT := true; DUPVEC(1, N, 0, X0, X); EPS := (SQRT(VECVEC(1, N, 0, X, X)) × RELTOL + ABSTOL) / ND; Q := (F1 - F0) / (ALFA × DF0); INT: if NOTININT then NOTININT := DF1 < 0 ∧ Q > MU; AID := ALFA; if DF1 ≥ 0 then begin Z := 3 × (OLDF - F1) / ALFA + OLDDF + DF1; W := SQRT(Z ⭡ 2 - OLDDF × DF1); ALFA := ALFA × (1 - (DF1 + W - Z) / (DF1 - OLDDF + W × 2)); if ALFA < EPS then ALFA := EPS else if AID - ALFA < EPS then ALFA := AID - EPS end CUBIC INTERPOLATION else if NOTININT then begin ALFA0 := ALFA := Y; OLDDF := DF1; OLDF := F1 end else ALFA := 0.5 × ALFA; Y := ALFA + ALFA0; DUPVEC(1, N, 0, X, X0); ELMVEC(1, N, 0, X, D, Y); EPS := (SQRT(VECVEC(1, N, 0, X, X)) × RELTOL + ABSTOL) / ND; F := FUNCT(N, X, G); EVL := EVL + 1 ; DF := VECVEC(1, N, 0, D, G); Q := (F - F0) / (Y × DF0); if (if NOTININT ∨ STRONGSEARCH then true else Q < MU ∨ Q > 1 - MU) ∧ EVL < EVLMAX then begin if NOTININT ∨ DF > 0 ∨ Q < MU then begin DF1 := DF; F1 := F end else begin ALFA0 := Y; ALFA := AID - ALFA; OLDDF := DF; OLDF := F end; if ALFA > EPS × 2 then goto INT end; ALFA := Y; EVLMAX := EVL; DF1 := DF; F1 := F end LINEMIN; comment ================== 34211 ================= ; procedure RNK1UPD(H, N, V, C); value N, C; integer N; real C; array H, V; begin integer J, K; procedure ELMVEC(L, U, SHIFT, A, B, X); code 34020; K := 0; for J := 1, J + K while K < N do begin K := K + 1 ; ELMVEC(J, J + K - 1, 1 - J, H, V, V[K] × C) end end RNK1UPD; comment ================== 34212 ================= ; procedure DAVUPD(H, N, V, W, C1, C2); value N, C1, C2; integer N; real C1, C2; array H, V, W; begin integer I, J, K; real VK, WK; K := 0; for J := 1, J + K while K < N do begin K := K + 1 ; VK := V[K] × C1; WK := W[K] × C2; for I := 0 step 1 until K -1 do H[I + J] := H[I + J] + V[I + 1] × VK - W[I + 1] × WK end end DAVUPD; comment ================== 34213 ================= ; procedure FLEUPD(H, N, V, W, C1, C2); value N, C1, C2; integer N; real C1, C2; array H, V, W; begin integer I, J, K; real VK, WK; K := 0; for J := 1, J + K while K < N do begin K := K + 1; VK := - W[K] × C1 + V[K] × C2; WK := V[K] × C1; for I := 0 step 1 until K - 1 do H[I + J] := H[I + J] + V[I + 1] × VK -W[I + 1] × WK end end FLEUPD; comment ================== 33010 ================= ; procedure RK1(X, A, B, Y, YA, FXY, E, D, FI); value B, FI; real X, A, B, Y, YA, FXY; Boolean FI; array E, D; begin real E1, E2, XL, YL, H, INT, HMIN, ABSH, K0, K1, K2, K3, K4, K5, DISCR, TOL, MU, MU1, FH, HL; Boolean LAST, FIRST, REJECT; if FI then begin D[3] := A; D[4] := YA end; D[1] := 0; XL := D[3]; YL := D[4]; if FI then D[2] := B - D[3]; ABSH := H := ABS(D[2]); if B - XL < 0 then H := - H; INT := ABS(B - XL); HMIN := INT × E[1] + E[2]; E1 := E[1] / INT; E2 := E[2] / INT; FIRST := true; if FI then begin LAST := true; goto STEP end; TEST: ABSH := ABS(H); if ABSH < HMIN then begin H := if H > 0 then HMIN else - HMIN; ABSH := HMIN end; if H ≥ B - XL equiv H ≥ 0 then begin D[2] := H; LAST := true; H := B - XL; ABSH := ABS(H) end else LAST := false; STEP: X := XL; Y := YL; K0 := FXY × H; X := XL + H / 4.5; Y := YL + K0 / 4.5; K1 := FXY × H; X := XL + H / 3; Y := YL + (K0 + K1 × 3) / 12; K2 := FXY × H; X := XL + H × .5; Y := YL + (K0 + K2 × 3) / 8; K3 := FXY × H; X := XL + H × .8; Y := YL + (K0 × 53 - K1 × 135 + K2 × 126 + K3 × 56) / 125; K4 := FXY × H; X := if LAST then B else XL + H; Y := YL + (K0 × 133 - K1 × 378 + K2 × 276 + K3 × 112 + K4 × 25) / 168; K5 := FXY × H; DISCR := ABS(K0 × 21 - K2 × 162 + K3 × 224 - K4 × 125 + K5 × 42) / 14; TOL := ABS(K0) × E1 + ABSH × E2; REJECT := DISCR > TOL; MU := TOL / (TOL + DISCR) + .45; if REJECT then begin if ABSH ≤ HMIN then begin D[1] := D[1] + 1; Y := YL; FIRST := true; goto NEXT end; H := MU × H; goto TEST end; if FIRST then begin FIRST := false; HL := H; H := MU × H; goto ACC end; FH := MU × H / HL + MU - MU1; HL := H; H := FH × H; ACC: MU1 := MU; Y := YL + ( - K0 × 63 + K1 × 189 - K2 × 36 - K3 × 112 + K4 × 50) / 28; K5 := FXY × HL; Y := YL + (K0 × 35 + K2 × 162 + K4 × 125 + K5 × 14) / 336; NEXT: if B ≠ X then begin XL := X; YL := Y; goto TEST end; if ¬LAST then D[2] := H; D[3] := X; D[4] := Y end RK1; comment ================== 33033 ================= ; procedure RKE (X, XE, N, Y, DER, DATA, FI, OUT); value FI, N; integer N; real X, XE; Boolean FI; array Y, DATA; procedure DER, OUT; begin integer J; real XT, H, HMIN, INT, HL, HT, ABSH, FHM, DISCR, TOL, MU, MU1, FH, E1, E2; Boolean LAST, FIRST, REJECT; array K0, K1, K2, K3, K4[1:N]; if FI then begin DATA[3] := XE - X; DATA[4] := DATA[5] := DATA[6] := 0 end; ABSH := H := ABS(DATA[3]); if XE < X then H := - H; INT := ABS(XE - X); HMIN := INT × DATA[1] + DATA[2]; E1 := 12 × DATA[1] / INT; E2 := 12 × DATA[2] / INT; FIRST := true; REJECT := false; if FI then begin LAST := true; goto STEP end; TEST: ABSH := ABS(H); if ABSH < HMIN then begin H := SIGN (XE - X) × HMIN; ABSH := HMIN end; if H ≥ XE - X equiv H ≥ 0 then begin LAST := true; H := XE - X; ABSH := ABS(H) end else LAST := false; STEP: if ¬REJECT then begin for J := 1 step 1 until N do K0[J] := Y[J]; DER(X, K0) end; HT := .184262134833347 × H; XT := X + HT; for J := 1 step 1 until N do K1[J] := K0[J] × HT + Y[J]; DER(XT, K1); HT := .69098300562505310-1 × H; XT := 4 × HT + X; for J := 1 step 1 until N do K2[J] := (3 × K1[J] + K0[J]) × HT + Y[J]; DER(XT, K2); XT := .5 × H + X; HT := .1875 × H; for J := 1 step 1 until N do K3[J] := ((1.74535599249993 × K2[J] - K1[J]) × 2.23606797749979 + K0[J]) × HT + Y[J]; DER(XT, K3); XT := .723606797749979 × H + X; HT := .4 × H; for J := 1 step 1 until N do K4[J] := (((.517595468166681 × K0[J] - K1[J]) × .927050983124840 + K2[J]) × 1.46352549156242 + K3[J]) × HT + Y[J]; DER(XT, K4); XT := if LAST then XE else X + H; HT := 2 × H; for J := 1 step 1 until N do K1[J] := ((((2 × K4[J] + K2[J]) × .412022659166595 + K1[J]) × 2.23606797749979 - K0[J]) × .375 - K3[J]) × HT + Y[J]; DER(XT, K1); REJECT := false; FHM := 0; for J := 1 step 1 until N do begin DISCR := ABS((1.6 × K3[J] - K2[J] - K4[J]) × 5 + K0[J] + K1[J]); TOL := ABS(K0[J]) × E1 + E2; REJECT := DISCR > TOL ∨ REJECT; FH := DISCR / TOL; if FH > FHM then FHM := FH end; MU := 1 / (1 + FHM) + .45; if REJECT then begin DATA[5] := DATA[5] + 1; if ABSH ≤ HMIN then begin DATA[6] := DATA[6] + 1; HL := H; REJECT := false; FIRST := true; goto NEXT end; H := MU × H; goto TEST end; if FIRST then begin FIRST := false; HL := H; H := MU × H; goto ACC end; FH := MU × H / HL + MU - MU1; HL := H; H := FH × H; ACC: MU1 := MU; HT := HL / 12; for J := 1 step 1 until N do Y[J] := ((K2[J] + K4[J]) × 5 + K0[J] + K1[J]) × HT + Y[J]; NEXT: DATA[3] := HL; DATA[4] := DATA[4] + 1; X := XT; OUT; if X ≠ XE then goto TEST end RKE; comment ================== 33016 ================= ; procedure RK4A(X, XA, B, Y, YA, FXY, E, D, FI, XDIR, POS); value FI, XDIR, POS; Boolean FI, XDIR, POS; real X, XA, B, Y, YA, FXY; array E, D; begin integer I; Boolean IV, FIRST, FIR, REJ; real K0, K1, K2, K3, K4, K5, FHM, ABSH, DISCR, S, XL, COND0, S1, COND1, YL, HMIN, H, ZL, TOL, HL, MU, MU1; array E1[1:2]; Boolean procedure ZEROIN(X, Y, FX, EPS) ; real X, Y, FX, EPS ; code 34150 ; procedure RKSTEP(X, XL, H, Y, YL, ZL, FXY, D); value XL, YL, ZL, H; real X, XL, H, Y, YL, ZL, FXY; integer D; begin if D = 2 then goto INTEGRATE; if D = 3 then begin X := XL; Y := YL; K0 := FXY × H end else if D = 1 then K0 := ZL × H else K0 := K0 × MU; X := XL + H / 4.5; Y := YL + K0 / 4.5; K1 := FXY × H; X := XL + H / 3; Y := YL + (K0 + K1 × 3) / 12; K2 := FXY × H; X := XL + H × .5; Y := YL + (K0 + K2 × 3) / 8; K3 := H × FXY; X := XL + H × .8; Y := YL + (K0 × 53 - K1 × 135 + K2 × 126 + K3 × 56) / 125; K4 := FXY × H; if D ≤ 1 then begin X := XL + H; Y := YL + (K0 × 133 - K1 × 378 + K2 × 276 + K3 × 112 + K4 × 25) / 168; K5 := FXY × H; DISCR := ABS(K0 × 21 - K2 × 162 + K3 × 224 - K4 × 125 + K5 × 42) / 14; goto END end; INTEGRATE: X := XL + H; Y := YL + ( - K0 × 63 + K1 × 189 - K2 × 36 - K3 × 112 + K4 × 50) / 28; K5 := FXY × H; Y := YL + (K0 × 35 + K2 × 162 + K4 × 125 + K5 × 14) / 336; END: end RKSTEP; real procedure FZERO; begin if IV then begin if S = XL then FZERO := COND0 else if S = S1 then FZERO := COND1 else begin RKSTEP(X, XL, S - XL, Y, YL, ZL, FXY, 3); FZERO := B end end else begin if S = YL then FZERO := COND0 else if S = S1 then FZERO := COND1 else begin RKSTEP(Y, YL, S - YL, X, XL, ZL, 1 / FXY, 3); FZERO := B end end end FZERO; if FI then begin D[3] := XA; D[4] := YA; D[0] := 1 end; D[1] := 0; X := XL := D[3]; Y := YL := D[4]; IV := D[0] > 0; FIRST := FIR := true; HMIN := E[0] + E[1]; H := E[2] + E[3]; if H < HMIN then HMIN := H; CHANGE: ZL := FXY; if ABS(ZL) ≤ 1 then begin if ¬IV then begin D[2] := H := H / ZL; D[0] := 1; IV := FIRST := true end; if FIR then goto A; I := 1; goto AGAIN end else begin if IV then begin if ¬FIR then D[2] := H := H × ZL; D[0] := - 1; IV := false; FIRST := true end; if FIR then begin H := E[0] + E[1]; A: if (if FI then (if IV equiv XDIR then H else H × ZL) < 0 equiv POS else H × D[2] < 0) then H := - H end; I := 1 end; AGAIN: ABSH := ABS(H); if ABSH < HMIN then begin H := SIGN(H) × HMIN; ABSH := HMIN end; if IV then begin RKSTEP(X, XL, H, Y, YL, ZL, FXY, I); TOL := E[2] × ABS(K0) + E[3] × ABSH end else begin RKSTEP(Y, YL, H, X, XL, 1 / ZL, 1 / FXY, I); TOL := E[0] × ABS(K0) + E[1] × ABSH end; REJ := DISCR > TOL; MU := TOL / (TOL + DISCR) + .45; if REJ then begin if ABSH ≤ HMIN then begin if IV then begin X := XL + H; Y := YL + K0 end else begin X := XL + K0; Y := YL + H end; D[1] := D[1] + 1; FIRST := true; goto NEXT end; H := H × MU; I := 0; goto AGAIN end REJ; if FIRST then begin FIRST := FIR; HL := H; H := MU × H; goto ACCEPT end; FHM := MU × H / HL + MU - MU1; HL := H; H := FHM × H; ACCEPT: if IV then RKSTEP(X, XL, HL, Y, YL, ZL, FXY, 2) else RKSTEP(Y, YL, HL, X, XL, ZL, 1 / FXY, 2); MU1 := MU; NEXT: if FIR then begin FIR := false; COND0 := B; if ¬(FI ∨ REJ) then H := D[2] end else begin D[2] := H; COND1 := B; if COND0 × COND1 ≤ 0 then goto ZERO; COND0 := COND1 end; D[3] := XL := X; D[4] := YL := Y; goto CHANGE; ZERO: E1[1] := E[4]; E1[2] := E[5]; S1 := if IV then X else Y; S := if IV then XL else YL ; ZEROIN(S, S1, FZERO, ABS(E1[1] × S) + ABS(E1[2])) ; S1 := if IV then X else Y ; if IV then RKSTEP(X, XL, S - XL, Y, YL, ZL, FXY, 3) else RKSTEP(Y, YL, S - YL, X, XL, ZL, 1 / FXY, 3); D[3] := X; D[4] := Y end RK4A; comment ================== 33017 ================= ; procedure RK4NA(X, XA, B, FXJ, J, E, D, FI, N, L, POS); value FI, N, L, POS; integer J, N, L; Boolean FI, POS; real B, FXJ; array X, XA, E, D; begin integer I, IV, IV0; Boolean FIR, FIRST, REJ; real H, COND0, COND1, FHM, ABSH, TOL, FH, MAX, X0, X1, S, HMIN, HL, MU, MU1; array XL, DISCR, Y[0:N], K[0:5, 0:N], E1[1:2]; Boolean procedure ZEROIN(X, Y, FX, EPS) ; real X, Y, FX, EPS ; code 34150 ; procedure RKSTEP(H, D); value H, D; integer D; real H; begin integer I; procedure F(T); value T; integer T; begin integer I; real P; for J := 1 step 1 until N do Y[J] := FXJ; P := H / Y[IV]; for I := 0 step 1 until N do begin if I ≠ IV then K[T, I] := Y[I] × P end end F; if D = 2 then goto INTEGRATE; if D = 3 then begin for I := 0 step 1 until N do X[I] := XL[I]; F(0) end else if D = 1 then begin real P; P := H / Y[IV]; for I := 0 step 1 until N do begin if I ≠ IV then K[0, I] := P × Y[I] end end else for I := 0 step 1 until N do begin if I ≠ IV then K[0, I] := K[0, I] × MU end; for I := 0 step 1 until N do X[I] := XL[I] + (if I = IV then H else K[0, I]) / 4.5; F(1); for I := 0 step 1 until N do X[I] := XL[I] + (if I = IV then H × 4 else (K[0, I] + K[1, I] × 3)) / 12; F(2); for I := 0 step 1 until N do X[I] := XL[I] + (if I = IV then H × .5 else (K[0, I] + K[2, I] × 3) / 8); F(3); for I := 0 step 1 until N do X[I] := XL[I] + (if I = IV then H × .8 else (K[0, I] × 53 - K[1, I] × 135 + K[2, I] × 126 + K[3, I] × 56) / 125); F(4); if D ≤ 1 then begin for I := 0 step 1 until N do X[I] := XL[I] + (if I = IV then H else (K[0, I] × 133 - K[1, I] × 378 + K[2, I] × 276 + K[3, I] × 112 + K[4, I] × 25) / 168); F(5); for I := 0 step 1 until N do begin if I ≠ IV then DISCR[I] := ABS(K[0, I] × 21 - K[2, I] × 162 + K[3, I] × 224 - K[4, I] × 125 + K[5, I] × 42) / 14 end; goto END end; INTEGRATE: for I := 0 step 1 until N do X[I] := XL[I] + (if I = IV then H else ( - K[0, I] × 63 + K[1, I] × 189 - K[2, I] × 36 - K[3, I] × 112 + K[4, I] × 50) / 28); F(5); for I := 0 step 1 until N do begin if I ≠ IV then X[I] := XL[I] + (K[0, I] × 35 + K[2, I] × 162 + K[4, I] × 125 + K[5, I] × 14) / 336 end ; END: end RKSTEP ; real procedure FZERO; begin if S = X0 then FZERO := COND0 else if S = X1 then FZERO := COND1 else begin RKSTEP(S - XL[IV], 3); FZERO := B end end FZERO; if FI then begin for I := 0 step 1 until N do D[I + 3] := XA[I]; D[0] := D[2] := 0 end; D[1] := 0; for I := 0 step 1 until N do X[I] := XL[I] := D[I + 3]; IV := D[0]; H := D[2]; FIRST := FIR := true; Y[0] := 1; goto CHANGE; AGAIN: ABSH := ABS(H); if ABSH < HMIN then begin H := if H > 0 then HMIN else - HMIN; ABSH := ABS(H) end; RKSTEP(H, I); REJ := false; FHM := 0; for I := 0 step 1 until N do begin if I ≠ IV then begin TOL := E[2 × I] × ABS(K[0, I]) + E[2 × I + 1] × ABSH; REJ := TOL < DISCR[I] ∨ REJ; FH := DISCR[I] / TOL; if FH > FHM then FHM := FH end end; MU := 1 / (1 + FHM) + .45; if REJ then begin if ABSH ≤ HMIN then begin for I := 0 step 1 until N do begin if I ≠ IV then X[I] := XL[I] + K[0, I] else X[I] := XL[I] + H end; D[1] := D[1] + 1; FIRST := true; goto NEXT end; H := H × MU; I := 0; goto AGAIN end; if FIRST then begin FIRST := FIR; HL := H; H := MU × H; goto ACCEPT end; FH := MU × H / HL + MU - MU1; HL := H; H := FH × H; ACCEPT: RKSTEP(HL, 2); MU1 := MU; NEXT: if FIR then begin FIR := false; COND0 := B; if ¬(FI ∨ REJ) then H := D[2] end else begin D[2] := H; COND1 := B; if COND0 × COND1 ≤ 0 then goto ZERO; COND0 := COND1 end; for I := 0 step 1 until N do D[I + 3] := XL[I] := X[I]; CHANGE: IV0 := IV; for J := 1 step 1 until N do Y[J] := FXJ; MAX := ABS(Y[IV]); for I := 0 step 1 until N do begin if ABS(Y[I]) > MAX then begin MAX := ABS(Y[I]); IV := I end end; if IV0 ≠ IV then begin FIRST := true; D[0] := IV; D[2] := H := Y[IV] / Y[IV0] × H end; X0 := XL[IV]; if FIR then begin HMIN := E[0] + E[1]; for I := 1 step 1 until N do begin H := E[2 × I] + E[2 × I + 1]; if H < HMIN then HMIN := H end; H := E[2 × IV] + E[2 × IV + 1]; if (FI ∧ (Y[L]/Y[IV] × H < 0 equiv POS)) ∨ ( ¬FI ∧ D[2] × H < 0) then H := -H end; I := 1; goto AGAIN; ZERO: E1[1] := E[2 × N + 2]; E1[2] := E[2 × N + 3]; X1 := X[IV] ; S := X0 ; ZEROIN(S, X1, FZERO, ABS(E1[1] × S) + ABS(E1[2])) ; X0 := S ; X1 := X[IV]; RKSTEP(X0 - XL[IV], 3); for I := 0 step 1 until N do D[I + 3] := X[I] end RK4NA; comment ================== 33080 ================= ; Boolean procedure MULTISTEP(X, XEND, Y, HMIN, HMAX, YMAX, EPS, FIRST, SAVE, DERIV, AVAILABLE, JACOBIAN, STIFF, N, OUT); value HMIN, HMAX, EPS, XEND, N, STIFF; Boolean FIRST, AVAILABLE, STIFF; integer N; real X, XEND, HMIN, HMAX, EPS; array Y, YMAX, SAVE, JACOBIAN; procedure DERIV, OUT; begin own Boolean ADAMS, WITH JACOBIAN; own integer M, SAME, KOLD; own real XOLD, HOLD, A0, TOLUP, TOL, TOLDWN, TOLCONV; Boolean EVALUATE, EVALUATED, DECOMPOSE, DECOMPOSED, CONV; integer I, J, L, K, KNEW, FAILS; real H, CH, CHNEW, ERROR, DFI, C; array A[0:5], DELTA, LAST DELTA, DF[1:N], JAC[1:N, 1:N], AUX[1:3]; integer array P[1:N]; real procedure MATVEC(L, U, I, A, B); code 34011; real procedure DEC(A, N, AUX, P); code 34300; procedure SOL(A, N, P, B); code 34051; real procedure NORM2(AI); real AI; begin real S, A; S := 1.010-100; for I := 1 step 1 until N do begin A := AI/YMAX[I]; S := S + A × A end; NORM2 := S end NORM2; procedure RESET; begin if CH < HMIN/HOLD then CH := HMIN/HOLD else if CH > HMAX/HOLD then CH := HMAX/HOLD; X := XOLD; H := HOLD × CH; C := 1; for J := 0 step M until K × M do begin for I := 1 step 1 until N do Y[J + I] := SAVE[J + I] × C; C := C × CH end; DECOMPOSED := false end RESET; procedure METHOD; begin I := -39; if ADAMS then begin for C := 1, 1, 144, 4, 0, .5, 1, .5, 576, 144, 1, 5/12, 1, .75, 1/6, 1436, 576, 4, .375, 1, 11/12, 1/3, 1/24, 2844, 1436, 1, 251/720, 1, 25/24, 35/72, 5/48, 1/120, 0, 2844, 0.1 do begin I := I + 1; SAVE[I] := C end end else begin for C := 1, 1, 9, 4, 0, 2/3, 1, 1/3, 36, 20.25, 1, 6/11, 1, 6/11, 1/11, 84.028, 53.778, 0.25, .48, 1, .7, .2, .02, 156.25, 108.51, .027778, 120/274, 1, 225/274, 85/274, 15/274, 1/274, 0, 187.69, .0047361 do begin I := I + 1; SAVE[I] := C end end end METHOD; procedure ORDER; begin C := EPS × EPS; J := (K-1) × (K + 8)/2 - 38; for I := 0 step 1 until K do A[I] := SAVE[I + J]; TOLUP := C × SAVE[J + K + 1]; TOL := C × SAVE[J + K + 2]; TOLDWN := C × SAVE[J + K + 3]; TOLCONV := EPS/(2 × N × (K + 2)); A0 := A[0]; DECOMPOSE := true; end ORDER; procedure EVALUATE JACOBIAN; begin EVALUATE := false; DECOMPOSE := EVALUATED := true; if AVAILABLE then else begin real D; array FIXY, FIXDY, DY[1:N]; for I := 1 step 1 until N do FIXY[I] := Y[I]; DERIV(FIXDY); for J := 1 step 1 until N do begin D := if EPS > ABS(FIXY[J]) then EPS × EPS else EPS × ABS(FIXY[J]); Y[J] := Y[J] + D; DERIV(DY); for I := 1 step 1 until N do JACOBIAN[I, J] := (DY[I]-FIXDY[I])/D; Y[J] := FIXY[J] end end end EVALUATE JACOBIAN; procedure DECOMPOSE JACOBIAN; begin DECOMPOSE := false; DECOMPOSED := true; C := -A0 × H; for J := 1 step 1 until N do begin for I := 1 step 1 until N do JAC[I, J] := JACOBIAN[I, J] × C; JAC[J, J] := JAC[J, J] + 1 end; AUX[2] := 1.010-12; DEC(JAC, N, AUX, P) end DECOMPOSE JACOBIAN; procedure CALCULATE STEP AND ORDER; begin real A1, A2, A3; A1 := if K ≤ 1 then 0 else 0.75 × (TOLDWN/NORM2(Y[K × M + I])) ⭡ (0.5/K); A2 := 0.80 × (TOL/ERROR) ⭡ (0.5/(K + 1)); A3 := if K ≥ 5 ∨ FAILS ≠ 0 then 0 else 0.70 × (TOLUP/NORM2(DELTA[I] - LAST DELTA[I])) ⭡ (0.5/(K + 2)); if A1 > A2 ∧ A1 > A3 then begin KNEW := K-1; CHNEW := A1 end else if A2 > A3 then begin KNEW := K ; CHNEW := A2 end else begin KNEW := K + 1; CHNEW := A3 end end CALCULATE STEP AND ORDER; if FIRST then begin FIRST := false; M := N; for I := -1, -2, -3 do SAVE[I] := 0; OUT(0, 0); ADAMS := ¬STIFF; WITH JACOBIAN := ¬ADAMS; if WITH JACOBIAN then EVALUATE JACOBIAN; METHOD; NEW START: K := 1; SAME := 2; ORDER; DERIV(DF); H := if ¬WITH JACOBIAN then HMIN else SQRT(2 × EPS/SQRT(NORM2 (MATVEC(1, N, I, JACOBIAN, DF)))); if H > HMAX then H := HMAX else if H < HMIN then H := HMIN; XOLD := X; HOLD := H; KOLD := K; CH := 1; for I := 1 step 1 until N do begin SAVE[I] := Y[I]; SAVE[M + I] := Y[M + I] := DF[I] × H end; OUT(0, 0) end else begin WITH JACOBIAN := ¬ADAMS; CH := 1; K := KOLD; RESET; ORDER; DECOMPOSE := WITH JACOBIAN end; FAILS := 0; for L := 0 while X < XEND do begin if X + H ≤ XEND then X := X + H else begin H := XEND-X; X := XEND; CH := H/HOLD; C := 1; for J := M step M until K × M do begin C := C × CH; for I := J + 1 step 1 until J + N do Y[I] := Y[I] × C end; SAME := if SAME < 3 then 3 else SAME + 1; end; comment PREDICTION; for L := 1 step 1 until N do begin for I := L step M until (K-1) × M + L do for J := (K-1) × M + L step -M until I do Y[J] := Y[J] + Y[J + M]; DELTA[L] := 0 end; EVALUATED := false; comment CORRECTION AND ESTIMATION LOCAL ERROR; for L := 1, 2, 3 do begin DERIV(DF); for I := 1 step 1 until N do DF[I] := DF[I] × H - Y[M + I]; if WITH JACOBIAN then begin if EVALUATE then EVALUATE JACOBIAN; if DECOMPOSE then DECOMPOSE JACOBIAN; SOL(JAC, N, P, DF) end; CONV := true; for I := 1 step 1 until N do begin DFI := DF[I]; Y[ I] := Y[ I] + A0 × DFI; Y[M + I] := Y[M + I] + DFI; DELTA[I] := DELTA[I] + DFI; CONV := CONV ∧ ABS(DFI) < TOLCONV × YMAX[I] end; if CONV then begin ERROR := NORM2(DELTA[I]); goto CONVERGENCE end end; comment ACCEPTANCE OR REJECTION; if ¬CONV then begin if ¬WITH JACOBIAN then begin EVALUATE := WITH JACOBIAN := SAME ≥ K ∨ H < 1.1 × HMIN; if ¬WITH JACOBIAN then CH := CH/4; end else if ¬DECOMPOSED then DECOMPOSE := true else if ¬EVALUATED then EVALUATE := true else if H > 1.1 × HMIN then CH := CH/4 else if ADAMS then goto TRY CURTISS else begin SAVE[-1] := 1; goto RETURN end; RESET end else CONVERGENCE: if ERROR > TOL then begin FAILS := FAILS + 1; if H > 1.1 × HMIN then begin if FAILS > 2 then begin if ADAMS then begin ADAMS := false; METHOD end; KOLD := 0; RESET; goto NEW START end else begin CALCULATE STEP AND ORDER; if KNEW ≠ K then begin K := KNEW; ORDER end; CH := CH × CHNEW; RESET end end else begin if ADAMS then TRY CURTISS: begin ADAMS := false; METHOD end else if K = 1 then begin comment VIOLATE EPS CRITERION; C := EPS × SQRT(ERROR/TOL); if C > SAVE[-3] then SAVE[-3] := C; SAVE[-2] := SAVE[-2] + 1; SAME := 4; goto ERROR TEST OK end; K := KOLD := 1; RESET; ORDER; SAME := 2 end end else ERROR TEST OK: begin FAILS := 0; for I := 1 step 1 until N do begin C := DELTA[I]; for L := 2 step 1 until K do Y[L × M + I] := Y[L × M + I] + A[L] × C; if ABS(Y[I]) > YMAX[I] then YMAX[I] := ABS(Y[I]) end; SAME := SAME-1; if SAME = 1 then begin for I := 1 step 1 until N do LAST DELTA[I] := DELTA[I] end else if SAME = 0 then begin CALCULATE STEP AND ORDER; if CHNEW > 1.1 then begin DECOMPOSED := false; if K ≠ KNEW then begin if KNEW > K then begin for I := 1 step 1 until N do Y[KNEW × M + I] := DELTA[I] × A[K]/KNEW end; K := KNEW; ORDER end; SAME := K + 1; if CHNEW × H > HMAX then CHNEW := HMAX/H; H := H × CHNEW; C := 1; for J := M step M until K × M do begin C := C × CHNEW; for I := J + 1 step 1 until J + N do Y[I] := Y[I] × C end end else SAME := 10 end; if X ≠ XEND then begin XOLD := X; HOLD := H; KOLD := K; CH := 1; for I := K × M + N step -1 until 1 do SAVE[I] := Y[I]; OUT(H, K) end end CORRECTION AND ESTIMATION LOCAL ERROR; end STEP; RETURN: SAVE[0] := if ADAMS then 0 else 1; MULTISTEP := SAVE[-1] = 0 ∧ SAVE[-2] = 0 end MULTISTEP; comment ================== 33180 ================= ; procedure DIFFSYS(X, XE, N, Y, DERIVATIVE, AETA, RETA, S, H0, OUTPUT); value N; integer N; real X, XE, AETA, RETA, H0; array Y, S; procedure DERIVATIVE, OUTPUT; begin real A, B, B1, C, G, H, U, V, TA, FC; integer I, J, K, KK, JJ, L, M, R, SR; array YA, YL, YM, DY, DZ[1:N], DT[1:N, 0:6], D[0:6], YG, YH[0:7, 1:N]; Boolean KONV, B0, BH, LAST; LAST := false; H := H0; NEXT: if H × 1.1 ≥ XE-X then begin LAST := true; H0 := H; H := XE-X + 10-13 end; DERIVATIVE(X, Y, DZ); BH := false; for I := 1 step 1 until N do YA[I] := Y[I]; ANF: A := H + X; FC := 1.5; B0 := false; M := 1; R := 2; SR := 3; JJ := -1; for J := 0 step 1 until 9 do begin if B0 then begin D[1] := 16/9; D[3] := 64/9; D[5] := 256/9 end else begin D[1] := 9/4; D[3] := 9; D[5] := 36 end; KONV := true; if J > 6 then begin L := 6; D[6] := 64; FC := .6 × FC end else begin L := J; D[L] := M × M end; M := M × 2; G := H/M; B := G × 2; if BH ∧ J < 8 then begin for I := 1 step 1 until N do begin YM[I] := YH[J, I]; YL[I] := YG[J, I] end end else begin KK := (M-2)/2; M := M-1; for I := 1 step 1 until N do begin YL[I] := YA[I]; YM[I] := YA[I] + G × DZ[I] end; for K := 1 step 1 until M do begin DERIVATIVE(X + K × G, YM, DY); for I := 1 step 1 until N do begin U := YL[I] + B × DY[I]; YL[I] := YM[I]; YM[I] := U; U := ABS(U); if U > S[I] then S[I] := U end; if K = KK ∧ K ≠ 2 then begin JJ := JJ + 1; for I := 1 step 1 until N do begin YH[JJ, I] := YM[I]; YG[JJ, I] := YL[I] end end end end; DERIVATIVE(A, YM, DY); for I := 1 step 1 until N do begin V := DT[I, 0]; TA := C := DT[I, 0] := (YM[I] + YL[I] + G × DY[I])/2; for K := 1 step 1 until L do begin B1 := D[K] × V; B := B1-C; U := V; if B ≠ 0 then begin B := (C-V)/B; U := C × B; C := B1 × B end; V := DT[I, K]; DT[I, K] := U; TA := U + TA end; if ABS(Y[I]-TA) > RETA × S[I] + AETA then KONV := false; Y[I] := TA end; if KONV then goto END; D[2] := 4; D[4] := 16; B0 := ¬B0; M := R; R := SR; SR := M × 2 end; BH := ¬BH; LAST := false; H := H/2; goto ANF; END: H := FC × H; X := A; OUTPUT; if ¬LAST then goto NEXT; end DIFFSYS; comment ================== 33061 ================= ; procedure ARK (T, TE, M0, M, U, DERIVATIVE, DATA, OUT); integer M0, M; real T, TE; array U, DATA; procedure DERIVATIVE, OUT; begin integer P, N, Q; own real EC0, EC1, EC2, TAU0, TAU1, TAU2, TAUS, T2; real THETANM1, TAU, BETAN, QINV, ETA; array MU, LAMBDA[1:DATA[1]], THETHA[0:DATA[1]], RO, R[M0:M]; Boolean START, STEP1, LAST; procedure INIVEC(L, U, A, X); code 31010; procedure MULVEC(L, U, SHIFT, A, B, X); code 31020; procedure DUPVEC(L, U, SHIFT, A, B); code 31030; real procedure VECVEC(L, U, SHIFT, A, B); code 34010; procedure ELMVEC(L, U, SHIFT, A, B, X); code 34020; procedure DECSOL(A, N, AUX, B); code 34301; procedure INITIALIZE; begin integer I, J, K, L, N1; real S, THETA0; array ALFA[1:8, 1:DATA[1] + 1], TH[1:8], AUX[1:3]; real procedure LABDA(I, J); value I, J; integer I, J; LABDA := if P < 3 then (if J = I-1 then MUI(I) else 0) else if P = 3 then (if I = N then (if J = 0 then .25 else if J = N - 1 then .75 else 0) else if J = 0 then (if I = 1 then MUI(1) else .25) else if J = I - 1 then LAMBDA[I] else 0) else 0; real procedure MUI(I); value I; integer I; MUI := if I = N then 1 else if I < 1 ∨ I > N then 0 else if P < 3 then LAMBDA[I] else if P = 3 then LAMBDA[I] + .25 else 0; real procedure SUM(I, A, B, X); value B; integer I, A, B; real X; begin real S; S := 0; for I := A step 1 until B do S := S + X; SUM := S end SUM; N := DATA[1]; P := DATA[2]; EC1 := EC2 := 0; BETAN := DATA[3]; THETANM1 := if P = 3 then .75 else 1; THETA0 := 1 - THETANM1; S := 1; for J := N - 1 step - 1 until 1 do begin S := - S × THETA0 + DATA[N + 10 - J]; MU[J] := DATA[N + 11 - J] / S; LAMBDA[J] := MU[J] - THETA0 end; for I := 1 step 1 until 8 do for J := 0 step 1 until N do ALFA[I, J + 1] := if I = 1 then 1 else if J = 0 then 0 else if I = 2 ∨ I = 4 ∨ I = 8 then MUI(J) ⭡ ENTIER((I + 2) / 3) else if (I = 3 ∨ I = 6) ∧ J > 1 then SUM(L, 1, J-1, LABDA(J, L) × MUI(L) ⭡ ENTIER(I / 3)) else if I = 5 ∧ J > 2 then SUM(L, 2, J - 1, LABDA(J, L) × SUM(K, 1, L - 1, LABDA(L, K) × MUI(K))) else if I = 7 ∧ J > 1 then SUM(L, 1, J - 1, LABDA(J, L) × MUI(L)) × MUI(J) else 0; N1 := if N < 4 then N + 1 else if N < 7 then 4 else 8; I := 1; for S := 1, .5, 1 / 6, 1 / 3, 1 / 24, 1 / 12, .125, .25 do begin TH[I] := S; I := I + 1 end; if P = 3 ∧ N < 7 then TH[1] := TH[2] := 0; AUX[2] := 10-14; DECSOL(ALFA, N1, AUX, TH); INIVEC(0, N, THETHA, 0); DUPVEC(0, N1 - 1, 1, THETHA, TH); if ¬(P = 3 ∧ N < 7) then begin THETHA[0] := THETHA[0] - THETA0; THETHA[N - 1] := THETHA[N - 1] - THETANM1; Q := P + 1 end else Q := 3; QINV := 1 / Q; START := DATA[8] = 0; DATA[10] := 0; LAST := false; DUPVEC(M0, M, 0, R, U); DERIVATIVE(T, R) end INITIALIZE; procedure LOCAL ERROR CONSTRUCTION(I); value I; integer I; begin if THETHA[I] ≠ 0 then ELMVEC(M0, M, 0, RO, R, THETHA[I]); if I = N then begin DATA[9] := SQRT(VECVEC(M0, M, 0, RO, RO)) × TAU; EC0 := EC1; EC1 := EC2; EC2 := DATA[9] / TAU ⭡ Q end end LEC; procedure STEPSIZE; begin real TAUACC, TAUSTAB, AA, BB, CC, EC; ETA := SQRT(VECVEC(M0, M, 0, U, U)) × DATA[7] + DATA[6]; if ETA > 0 then begin if START then begin if DATA[8] = 0 then begin TAUACC := DATA[5]; STEP1 := true end else if STEP1 then begin TAUACC := (ETA / EC2) ⭡ QINV; if TAUACC > 10 × TAU2 then TAUACC := 10 × TAU2 else STEP1 := false end else begin BB := (EC2 - EC1) / TAU1; CC := - BB × T2 + EC2; EC := BB × T + CC; TAUACC := if EC < 0 then TAU2 else (ETA / EC) ⭡ QINV; START := false end end else begin AA := ((EC0 - EC1) / TAU0 + (EC2 - EC1) / TAU1) / (TAU1 + TAU0); BB := (EC2 - EC1) / TAU1 - (2 × T2 - TAU1) × AA; CC := - (AA × T2 + BB) × T2 + EC2; EC := (AA × T + BB) × T + CC; TAUACC := if EC < 0 then TAUS else (ETA / EC) ⭡ QINV; if TAUACC > 2 × TAUS then TAUACC := 2 × TAUS; if TAUACC < TAUS / 2 then TAUACC := TAUS / 2 end end else TAUACC := DATA[5]; if TAUACC < DATA[5] then TAUACC := DATA[5]; TAUSTAB := BETAN / DATA[4]; if TAUSTAB < DATA[5] then begin DATA[10] := 1; goto ENDARK end; TAU := if TAUACC > TAUSTAB then TAUSTAB else TAUACC; TAUS := TAU; if TAU ≥ TE - T then begin TAU := TE - T; LAST := true end; TAU0 := TAU1; TAU1 := TAU2; TAU2 := TAU end STEPSIZE; procedure DIFFERENCE SCHEME; begin integer I, J; real MT, LT; MULVEC(M0, M, 0, RO, R, THETHA[0]); if P = 3 then ELMVEC(M0, M, 0, U, R, .25 × TAU); for I := 1 step 1 until N - 1 do begin MT := MU[I] × TAU; LT := LAMBDA[I] × TAU; for J := M0 step 1 until M do R[J] := LT × R[J] + U[J]; DERIVATIVE(T + MT, R); LOCAL ERROR CONSTRUCTION(I) end; ELMVEC(M0, M, 0, U, R, THETANM1 × TAU); DUPVEC(M0, M, 0, R, U); DERIVATIVE(T + TAU, R); LOCAL ERROR CONSTRUCTION(N); T2 := T; if LAST then begin LAST := false; T := TE end else T := T + TAU; DATA[8] := DATA[8] + 1 end DIFSCH; INITIALIZE; NEXT STEP: STEPSIZE; DIFFERENCE SCHEME; OUT; if T ≠ TE then goto NEXT STEP; ENDARK: end ARK; comment ================== 33070 ================= ; procedure EFRK(T, TE, M0, M, U, SIGMA, PHI, DIAMETER, DERIVATIVE, K, STEP, R, L, BETA, THIRDORDER, TOL, OUTPUT); value R, L; integer M0, M, K, R, L; real T, TE, SIGMA, PHI, DIAMETER, STEP, TOL; array U, BETA; Boolean THIRDORDER; procedure DERIVATIVE, OUTPUT; begin integer N; real THETA0, THETANM1, H, B, B0, PHI0, PHIL, PI, COSPHI, SINPHI, EPS, BETAR; Boolean FIRST, LAST, COMPLEX, CHANGE; integer array P[1:L]; real array MU, LABDA[0:R + L-1], PT[0:R], FAC, BETAC[0:L-1], RL[M0:M], A[1:L, 1:L], AUX[0:3]; procedure ELMVEC(L, U, SHIFT, A, B, X); code 34020; procedure SOL(A, N, P, B); code 34051; procedure DEC(A, N, AUX, P); code 34300; procedure FORM CONSTANTS; begin integer I; FIRST := false; FAC[0] := 1; for I := 1 step 1 until L-1 do FAC[I] := I × FAC[I-1]; PT[R] := L × FAC[L-1]; for I := 1 step 1 until R do PT[R-I] := PT[R-I + 1] × (L + I)/I end FORM CONSTANTS; procedure FORM BETA; begin integer I, J; real BB, C, D; if FIRST then FORM CONSTANTS; if L = 1 then begin C := 1-EXP(-B); for J := 1 step 1 until R do C := BETA[J]-C/B; BETA[R + 1] := C/B end else if B > 40 then begin for I := R + 1 step 1 until R + L do begin C := 0; for J := 0 step 1 until R do C := BETA[J] × PT[J]/(I-J)-C/B; BETA[I] := C/B/FAC[L + R-I]/FAC[I-R-1] end; end else begin D := C := EXP(-B); BETAC[L-1] := D/FAC[L-1]; for I := 1 step 1 until L-1 do begin C := B × C/I; D := D + C; BETAC[L-1-I] := D/FAC[L-1-I] end; BB := 1; for I := R + 1 step 1 until R + L do begin C := 0; for J := 0 step 1 until R do C := (BETA[J]-(if J < L then BETAC[J] else 0)) × PT[J]/(I-J)-C/B; BETA[I] := C/B/FAC[L + R-I]/FAC[I-R-1] + (if I < L then BB × BETAC[I] else 0); BB := BB × B end end end FORM BETA; procedure SOLUTION OF COMPLEX EQUATIONS; begin integer I, J, C1, C3; real C2, E, B1, ZI, COSIPHI, SINIPHI, COSPHIL; real array D[1:L]; procedure ELEMENTS OF MATRIX; begin PHIL := PHI0; COSPHI := COS(PHIL); SINPHI := SIN(PHIL); COSIPHI := 1; SINIPHI := 0; for I := 0 step 1 until L-1 do begin C1 := R + 1 + I; C2 := 1; for J := L-1 step -2 until 1 do begin A[J, L-I] := C2 × COSIPHI; A[J + 1, L-I] := C2 × SINIPHI; C2 := C1 × C2; C1 := C1-1 end; COSPHIL := COSIPHI × COSPHI-SINIPHI × SINPHI; SINIPHI := COSIPHI × SINPHI + SINIPHI × COSPHI; COSIPHI := COSPHIL end; AUX[2] := 0; DEC(A, L, AUX, P) end EL OF MAT; procedure RIGHTHANDSIDE; begin E := EXP(B × COSPHI); B1 := B × SINPHI-(R + 1) × PHIL; COSIPHI := E × COS(B1); SINIPHI := E × SIN(B1); B1 := 1/B; ZI := B1⭡R; for J := L step -2 until 2 do begin D[J] := ZI × SINIPHI; D[J-1] := ZI × COSIPHI; COSPHIL := COSIPHI × COSPHI-SINIPHI × SINPHI; SINIPHI := COSIPHI × SINPHI + SINIPHI × COSPHI; COSIPHI := COSPHIL; ZI := ZI × B end; COSIPHI := ZI := 1; SINIPHI := 0; for I := R step -1 until 0 do begin C1 := I; C2 := BETA[I]; C3 := if 2 × I > L-2 then 2 else L-2 × I; COSPHIL := COSIPHI × COSPHI-SINIPHI × SINPHI; SINIPHI := COSIPHI × SINPHI + SINIPHI × COSPHI; COSIPHI := COSPHIL; for J := L step -2 until C3 do begin D[J] := D[J] + ZI × C2 × SINIPHI; D[J-1] := D[J-1]-ZI × C2 × COSIPHI; C2 := C2 × C1; C1 := C1-1 end; ZI := ZI × B1 end end RIGHT HAND SIDE; if PHI0 ≠ PHIL then ELEMENTS OF MATRIX; RIGHTHANDSIDE; SOL(A, L, P, D); for I := 1 step 1 until L do BETA[R + I] := D[L + 1-I] × B1 end SOLOFCOMEQ; procedure COEFFICIENT; begin integer J, K; real C; B0 := B; PHI0 := PHI; if B ≥ 1 then begin if COMPLEX then SOLUTION OF COMPLEX EQUATIONS else FORM BETA end; LABDA[0] := MU[0] := 0; if THIRDORDER then begin THETA0 := .25; THETANM1 := .75; if B < 1 then begin C := MU[N-1] := 2/3; LABDA[N-1] := 5/12; for J := N-2 step -1 until 1 do begin C := MU[J] := C/(C-.25)/(N-J + 1); LABDA[J] := C-.25 end end else begin C := MU[N-1] := BETA[2] × 4/3; LABDA[N-1] := C-.25; for J := N-2 step -1 until 1 do begin C := MU[J] := C/(C-.25) × BETA[N-J + 1]/BETA[N-J]/ (if J < L then B else 1); LABDA[J] := C-.25 end end end else begin THETA0 := 0; THETANM1 := 1; if B < 1 then begin for J := N-1 step -1 until 1 do MU[J] := LABDA[J] := 1/(N-J + 1) end else begin LABDA[N-1] := MU[N-1] := BETA[2]; for J := N-2 step -1 until 1 do MU[J] := LABDA[J] := BETA[N-J + 1]/BETA[N-J]/ (if J < L then B else 1) end end end COEFFICIENT; procedure STEPSIZE; begin real D, HSTAB, HSTABINT; H := STEP; D := ABS(SIGMA × SIN(PHI)); COMPLEX := L÷2 × 2 = L ∧ 2 × D > DIAMETER; if DIAMETER > 0 then HSTAB := (SIGMA⭡2/(DIAMETER × (DIAMETER × .25 + D)))⭡(L × .5/R)/ BETAR/SIGMA else HSTAB := H; D := if THIRDORDER then (2 × TOL/EPS/BETA[R])⭡(1/(N-1)) × 4⭡((L-1)/(N-1)) else (TOL/EPS)⭡(1/R)/BETAR; HSTABINT := ABS(D/SIGMA); if H > HSTAB then H := HSTAB; if H > HSTABINT then H := HSTABINT; if T + H > TE × (1-K × EPS) then begin LAST := true; H := TE-T end; B := H × SIGMA; D := DIAMETER × .1 × H; D := D × D; if H < T × EPS then goto ENDOFEFRK; CHANGE := B0 = -1 ∨ ((B-B0) × (B-B0) + B × B0 × (PHI-PHI0) × (PHI-PHI0) > D) end STEPSIZE; procedure DIFFERENCESCHEME ; begin integer I, J; real MT, LT, THT; I := -1; NEXTTERM: I := I + 1; MT := MU[I] × H; LT := LABDA[I] × H; for J := M0 step 1 until M do RL[J] := U[J] + LT × RL[J]; DERIVATIVE(T + MT, RL); if I = 0 ∨ I = N-1 then begin THT := if I = 0 then THETA0 × H else THETANM1 × H; ELMVEC(M0, M, 0, U, RL, THT) end; if I < N-1 then goto NEXTTERM; T := T + H end DIFFERENCE SCHEME; N := R + L; FIRST := true; B0 := -1; BETAR := BETA[R]⭡(1/R); LAST := false; EPS := 2⭡(-48); PI := PHI0 := PHIL := 4 × ARCTAN(1); NEXTLEVEL: STEPSIZE; if CHANGE then COEFFICIENT; K := K + 1; DIFFERENCE SCHEME; OUTPUT; if ¬LAST then goto NEXTLEVEL; ENDOFEFRK: end EXPONENTIALLY FITTED RUNGE KUTTA; comment ================== 33160 ================= ; procedure EFSIRK(X, XE, M, Y, DELTA, DERIVATIVE, JACOBIAN, J, N, AETA, RETA, HMIN, HMAX, LINEAR, OUTPUT); value M; integer M, N; real X, XE, DELTA, AETA, RETA, HMIN, HMAX; procedure DERIVATIVE, JACOBIAN, OUTPUT; Boolean LINEAR; array Y, J; begin integer K, L; real STEP, H, MU0, MU1, MU2, THETA0, THETA1, NU1, NU2, NU3, YK, FK, C1, C2, D; array F, K0, LABDA[1 : M], J1[1 : M, 1 : M], AUX[1 : 7]; integer array RI, CI[1 : M]; Boolean LIN; real procedure VECVEC(L, U, SHIFT, A, B); code 34010; real procedure MATMAT(L, U, I, J, A, B); code 34013; real procedure MATVEC(L, U, I, A, B); code 34011; procedure GSSELM(A, N, AUX, RI, CI); code 34231; procedure SOLELM(A, N, RI, CI, B); code 34061; real procedure STEPSIZE; begin real DISCR, ETA, S; if LINEAR then S := H := HMAX else if N = 1 ∨ HMIN = HMAX then S := H := HMIN else begin ETA := AETA + RETA × SQRT(VECVEC(1, M, 0, Y, Y)); C1 := NU3 × STEP; for K := 1 step 1 until M do LABDA[K] := LABDA[K] + C1 × F[K] - Y[K]; DISCR := SQRT(VECVEC(1, M, 0, LABDA, LABDA)); S := H := (ETA / (0.75 × (ETA + DISCR)) + 0.33) × H; if H < HMIN then S := H := HMIN else if H > HMAX then S := H := HMAX end; if X + S > XE then S := XE - X; LIN := STEP = S ∧ LINEAR; STEPSIZE := S end STEPSIZE; procedure COEFFICIENT; begin real Z1, E, ALPHA1, A, B; own real Z2; Z1 := STEP × DELTA; if N = 1 then Z2 := Z1 + Z1; if ABS(Z2 - Z1) > 10-6 × ABS(Z1) ∨ Z2 > - 1 then begin A := Z1 × Z1 + 12; B := 6 × Z1; if ABS(Z1) < 0.1 then ALPHA1 := (Z1 × Z1 / 140 - 1) × Z1 / 30 else if Z1 < - 1014 then ALPHA1 := 1 / 3 else if Z1 < - 33 then ALPHA1 := (A + B) / (3 × Z1 × (2 + Z1)) else begin E := if Z1 < 230 then EXP(Z1) else 10100; ALPHA1 := ((A - B) × E - A - B) / (((2 - Z1) × E - 2 - Z1) × 3 × Z1) end; MU2 := (1 / 3 + ALPHA1) × 0.25; MU1 := - (1 + ALPHA1) × 0.5; MU0 := (6 × MU1 + 2) / 9; THETA0 := 0.25; THETA1 := 0.75; A := 3 × ALPHA1; NU3 := (1 + A) / (5 - A) × 0.5; A := NU3 + NU3; NU1 := 0.5 - A; NU2 := (1 + A) × 0.75; Z2 := Z1 end end COEFFICIENT; procedure DIFFERENCE SCHEME; begin DERIVATIVE(F); STEP := STEPSIZE; if ¬LINEAR ∨ N = 1 then JACOBIAN(J, Y); if ¬LIN then begin COEFFICIENT; C1 := STEP × MU1; D := STEP × STEP × MU2; for K := 1 step 1 until M do begin for L := 1 step 1 until M do J1[K, L] := D × MATMAT(1, M, K, L, J, J) + C1 × J[K, L]; J1[K, K] := J1[K, K] + 1 end; GSSELM(J1, M, AUX, RI, CI) end; C1 := STEP × STEP × MU0; D := STEP × 2 / 3; for K := 1 step 1 until M do begin K0[K] := FK := F[K]; LABDA[K] := D × FK + C1 × MATVEC(1, M, K, J, F) end; SOLELM(J1, M, RI, CI, LABDA); for K := 1 step 1 until M do F[K] := Y[K] + LABDA[K]; DERIVATIVE(F); C1 := THETA0 × STEP; C2 := THETA1 × STEP; D := NU1 × STEP; for K := 1 step 1 until M do begin YK := Y[K]; FK := F[K]; LABDA[K] := YK + D × FK + NU2 × LABDA[K]; Y[K] := F[K] := YK + C1 × K0[K] + C2 × FK end end DIFFERENCE SCHEME; AUX[2] := 10-14; AUX[4] := 8; for K := 1 step 1 until M do F[K] := Y[K]; N := 0; OUTPUT; STEP := 0; NEXT STEP: N := N + 1; DIFFERENCE SCHEME; X := X + STEP; OUTPUT; if X < XE then goto NEXT STEP end EFSIRK; comment ================== 33120 ================= ; procedure EFERK(X, XE, M, Y, SIGMA, PHI, DERIVATIVE, J, JACOBIAN, K, L, AUT, AETA, RETA, HMIN, HMAX, LINEAR, OUTPUT); value L; integer M, K, L; real X, XE, SIGMA, PHI, AETA, RETA, HMIN, HMAX; array Y, J; Boolean AUT, LINEAR; procedure DERIVATIVE, JACOBIAN, OUTPUT; begin integer M1, I; real H, B, B0, PHI0, COSPHI, SINPHI, ETA, DISCR, FAC, PI; Boolean CHANGE, LAST; integer array P[1:L]; real array BETA, BETHA[0:L], BETAC[0:L + 3], K0, D, D1, D2[1:M], A[1:L, 1:L], AUX[1:3]; real procedure VECVEC(L, U, SHIFT, A, B); code 34010; real procedure MATVEC(L, U, I, A, B); code 34011; procedure DEC(A, N, AUX, P); code 34300; procedure SOL(A, N, P, B); code 34051; real procedure SUM(I, L, U, T); value L, U; integer I, L, U; real T; begin real S; S := 0; for I := L step 1 until U do S := S + T; SUM := S end; procedure FORMBETA; if L = 1 then begin BETHA[1] := (.5-(1-(1-EXP(-B))/B)/B)/B; BETA[1] := (1/6-BETHA[1])/B end else if L = 2 then begin real E, EMIN1; E := EXP(-B); EMIN1 := E-1; BETHA[1] := (1-(3 + E + 4 × EMIN1/B)/B)/B; BETHA[2] := (.5-(2 + E + 3 × EMIN1/B)/B)/B/B; BETA[2] := (1/6-BETHA[1])/B/B; BETA[1] := (1/3-(1.5-(4 + E + 5 × EMIN1/B)/B)/B)/B end else begin real B0, B1, B2, A0, A1, A2, A3, C, D; BETAC[L-1] := C := D := EXP(-B)/FAC; for I := L-1 step -1 until 1 do begin C := I × B × C/(L-I); BETAC[I-1] := D := D × I + C end; B2 := .5-BETAC[2]; B1 := (1-BETAC[1]) × (L + 1)/B; B0 := (1-BETAC[0]) × (L + 2) × (L + 1) × .5/B/B; A3 := 1/6-BETAC[3]; A2 := B2 × (L + 1)/B; A1 := B1 × (L + 2) × .5/B; A0 := B0 × (L + 3)/3/B; D := L/B; for I := 1 step 1 until L do begin BETA[I] := (A3/I-A2/(I + 1) + A1/(I + 2)-A0/(I + 3)) × D + BETAC[I + 3]; BETHA[I] := (B2/I-B1/(I + 1) + B0/(I + 2)) × D + BETAC[I + 2]; D := D × (L-I)/I/B; end end FORMBETA; procedure SOLUTIONOFCOMPLEXEQUATIONS; if L = 2 then begin real COS2PHI, COSA, SINA, E, ZI; PHI0 := PHI; COSPHI := COS(PHI0); SINPHI := SIN(PHI0); E := EXP(B × COSPHI); ZI := B × SINPHI-3 × PHI0; SINA := (if ABS(SINPHI) < 10-6 then -E × (B + 3) else E × SIN(ZI)/SINPHI); COS2PHI := 2 × COSPHI × COSPHI-1; BETHA[2] := (.5 + (2 × COSPHI + (1 + 2 × COS2PHI + SINA)/B)/B)/B/B; SINA := (if ABS(SINPHI) < 10-6 then E × (B + 4) else SINA × COSPHI-E × COS(ZI)); BETHA[1] := -(COSPHI + (1 + 2 × COS2PHI + (4 × COSPHI × COS2PHI + SINA) /B)/B)/B; BETA[1] := BETHA[2] + 2 × COSPHI × (BETHA[1]-1/6)/B; BETA[2] := (1/6-BETHA[1])/B/B end else begin integer J, C1; real C2, E, ZI, COSIPHI, SINIPHI, COSPHIL; real array D[1:L]; procedure ELEMENTS OF MATRIX; begin PHI0 := PHI; COSPHI := COS(PHI0); SINPHI := SIN(PHI0); COSIPHI := 1; SINIPHI := 0; for I := 0 step 1 until L-1 do begin C1 := 4 + I; C2 := 1; for J := L-1 step -2 until 1 do begin A[J, L-I] := C2 × COSIPHI; A[J + 1, L-I] := C2 × SINIPHI; C2 := C2 × C1; C1 := C1-1 end; COSPHIL := COSIPHI × COSPHI-SINIPHI × SINPHI; SINIPHI := COSIPHI × SINPHI + SINIPHI × COSPHI; COSIPHI := COSPHIL end; AUX[2] := 0; DEC(A, L, AUX, P) end EL OF MAT; procedure RIGHT HAND SIDE; begin E := EXP(B × COSPHI); ZI := B × SINPHI-4 × PHI0; COSIPHI := E × COS(ZI); SINIPHI := E × SIN(ZI); ZI := 1/B/B/B; for J := L step -2 until 2 do begin D[J] := ZI × SINIPHI; D[J-1] := ZI × COSIPHI; COSPHIL := COSIPHI × COSPHI-SINIPHI × SINPHI; SINIPHI := COSIPHI × SINPHI + SINIPHI × COSPHI; COSIPHI := COSPHIL; ZI := ZI × B end; SINIPHI := 2 × SINPHI × COSPHI; COSIPHI := 2 × COSPHI × COSPHI-1; COSPHIL := COSPHI × (2 × COSIPHI-1); D[L] := D[L] + SINPHI × (1/6 + (COSPHI + (1 + 2 × COSIPHI × (1 + 2 × COSPHI/B)) /B)/B); D[L-1] := D[L-1]-COSPHI/6-(.5 × COSIPHI + (COSPHIL + (2 × COSIPHI × COSIPHI-1)/B)/B)/B; D[L-2] := D[L-2] + SINPHI × (.5 + (2 × COSPHI + (2 × COSIPHI + 1)/B)/B); D[L-3] := D[L-3]-.5 × COSPHI-(COSIPHI + COSPHIL/B)/B; if L < 5 then goto END; D[L-4] := D[L-4] + SINPHI + SINIPHI/B; D[L-5] := D[L-5]-COSPHI-COSIPHI/B; if L < 7 then goto END; D[L-6] := D[L-6] + SINPHI; D[L-7] := D[L-7]-COSPHI; END: end RHS; if PHI0 ≠ PHI then ELEMENTS OF MATRIX; RIGHT HAND SIDE; SOL(A, L, P, D); ZI := 1/B; for I := 1 step 1 until L do begin BETA[I] := D[L + 1-I] × ZI; BETHA[I] := (I + 3) × BETA[I]; ZI := ZI/B end end SOLOFEQCOM; procedure COEFFICIENT; begin B0 := B := ABS(H × SIGMA); if B ≥ .1 then begin if PHI ≠ PI ∧ L = 2 ∨ ABS(PHI-PI) > .01 then SOLUTION OF COMPLEX EQUATIONS else FORMBETA end else begin for I := 1 step 1 until L do begin BETHA[I] := BETA[I-1]; BETA[I] := BETA[I-1]/(I + 3); end end end COEFFICIENT; procedure LOCAL ERROR BOUND; ETA := AETA + RETA × SQRT(VECVEC(1, M1, 0, Y, Y)); procedure STEPSIZE; begin LOCAL ERROR BOUND; if K = 0 then begin DISCR := SQRT(VECVEC(1, M1, 0, D, D)); H := ETA/DISCR end else begin DISCR := H × SQRT(SUM(I, 1, M1, (D[I]-D2[I])⭡2))/ETA; H := H × (if LINEAR then 4/(4 + DISCR) + .5 else 4/(3 + DISCR) + 1/3) end; if H < HMIN then H := HMIN; if H > HMAX then H := HMAX; B := ABS(H × SIGMA); CHANGE := ABS(1-B/B0) > .05 ∨ PHI ≠ PHI0; if 1.1 × H ≥ XE-X then begin CHANGE := LAST := true; H := XE-X end; if ¬CHANGE then H := H × B0/B end STEPSIZE; procedure DIFFERENCE SCHEME; begin integer K; real BETAI, BETHAI; if M1 < M then begin D2[M] := 1; K0[M] := Y[M] + 2 × H/3; Y[M] := Y[M] + .25 × H end; for K := 1 step 1 until M1 do begin K0[K] := Y[K] + 2 × H/3 × D[K]; Y[K] := Y[K] + .25 × H × D[K]; D1[K] := H × MATVEC(1, M, K, J, D); D2[K] := D1[K] + D[K] end; for I := 0 step 1 until L do begin BETAI := 4 × BETA[I]/3; BETHAI := BETHA[I]; for K := 1 step 1 until M1 do D[K] := H × D1[K]; for K := 1 step 1 until M1 do begin K0[K] := K0[K] + BETAI × D[K]; D1[K] := MATVEC(1, M1, K, J, D); D2[K] := D2[K] + BETHAI × D1[K] end end; DERIVATIVE(K0); for K := 1 step 1 until M do Y[K] := Y[K] + .75 × H × K0[K] end DIFF SCHEME; B0 := PHI0 := -1; PI := 4 × ARCTAN(1); BETAC[L] := BETAC[L + 1] := BETAC[L + 2] := BETAC[L + 3] := 0; BETA[0] := 1/6; BETHA[0] := .5; FAC := 1; for I := 2 step 1 until L-1 do FAC := I × FAC; M1 := if AUT then M else M-1; K := 0; LAST := false; NEXT LEVEL: for I := 1 step 1 until M do D[I] := Y[I]; DERIVATIVE(D); if ¬LINEAR ∨ K = 0 then JACOBIAN(J, Y); STEPSIZE; if CHANGE then COEFFICIENT; OUTPUT; DIFFERENCE SCHEME; K := K + 1; X := X + H; if ¬LAST then goto NEXT LEVEL; END OF EFERK: OUTPUT; end EFERK; comment ================== 33131 ================= ; procedure LINIGER2(X, XE, M, Y, SIGMA1, SIGMA2, F, EVALUATE, J, JACOBIAN, K, ITMAX, STEP, AETA, RETA, OUTPUT); integer M, K, ITMAX; real X, XE, SIGMA1, SIGMA2, STEP, AETA, RETA; array Y, J; Boolean procedure EVALUATE; real procedure F; procedure JACOBIAN, OUTPUT; begin integer I; real H, HL, B1, B2, P, Q, C0, C1, C2, C3, C4; Boolean LAST; integer array PI[1:M]; real array DY, YL, FL[1:M], A[1:M, 1:M], AUX[1:3]; real procedure VECVEC(L, U, SHIFT, A, B); code 34010; real procedure MATVEC(L, U, I, A, B); code 34011; real procedure MATMAT(L, U, I, J, A, B); code 34013; procedure DEC(A, N, AUX, P); code 34300; procedure SOL(A, N, P, B); code 34051; procedure STEPSIZE; begin H := STEP; if 1.1 × H ≥ XE-X then begin LAST := true; H := XE-X; X := XE end else X := X + H end STEPSIZE; procedure COEFFICIENT; begin real R1, R2, EX, ZETA, ETA, SINL, COSL, SINH, COSH, D; real procedure R(X); value X; real X; if X > 40 then R := X/(X-2) else begin EX := EXP(-X); R := X × (1-EX)/(X-2 + (X + 2) × EX) end; B1 := H × SIGMA1; B2 := H × SIGMA2; if B1 < .1 then begin P := 0; Q := 1/3; goto OUT end; if B2 < 0 then goto COMPLEX; if B1 < 1 ∨ B2 < .1 then goto THIRDORDER; if ABS(B1-B2) < B1 × B1 × 10-6 then goto DOUBLEFIT; R1 := R(B1) × B1; R2 := R(B2) × B2; D := B2 × R1-B1 × R2; P := 2 × (R2-R1)/D; Q := 2 × (B2-B1)/D; goto OUT; THIRDORDER: Q := 1/3; P := R(B1)/3-2/B1; goto OUT; DOUBLEFIT: B1 := .5 × (B1 + B2); R1 := R(B1); if B1 > 40 then EX := 0; R2 := B1/(1-EX); R2 := 1-EX × R2 × R2; Q := 1/(R1 × R1 × R2); P := R1 × Q-2/B1; goto OUT; COMPLEX: ETA := ABS(B1 × SIN(SIGMA2)); ZETA := ABS(B1 × COS(SIGMA2)); if ETA < B1 × B1 × 10-6 then begin B1 := B2 := ZETA; goto DOUBLEFIT end; if ZETA > 40 then begin P := 1-4 × ZETA/B1/B1; Q := 4 × (1-ZETA)/B1/B1 + 1 end else begin EX := EXP(ZETA); SINL := SIN(ETA); COSL := COS(ETA); SINH := .5 × (EX-1/EX); COSH := .5 × (EX + 1/EX); D := ETA × (COSH-COSL)-.5 × B1 × B1 × SINL; P := (ZETA × SINL + ETA × SINH-4 × ZETA × ETA/B1/B1 × (COSH-COSL))/D; Q := ETA × ((COSH-COSL-ZETA × SINH-ETA × SINL) × 4/B1/B1 + COSH + COSL)/D end; OUT: C0 := .25 × H × H × (P + Q); C1 := .5 × H × (1 + P); C2 := H-C1; C3 := .25 × H × H × (Q-P); C4 := .5 × H × P; ELEMENTS OF MATRIX end COEFFICIENT; procedure ELEMENTS OF MATRIX; begin integer K; for I := 1 step 1 until M do begin for K := 1 step 1 until M do A[I, K] := C0 × MATMAT(1, M, I, K, J, J)-C1 × J[I, K]; A[I, I] := A[I, I] + 1 end; AUX[2] := 0; DEC(A, M, AUX, PI) end ELOFMAT; procedure NEWTON ITERATION; begin integer ITNUM; real JFL, ETA, DISCR; ITNUM := 0; NEXT: ITNUM := ITNUM + 1; if EVALUATE(ITNUM) then begin JACOBIAN(J, Y); COEFFICIENT end else if ITNUM = 1 ∧ H ≠ HL then COEFFICIENT; for I := 1 step 1 until M do FL[I] := F(I); if ITNUM = 1 then begin for I := 1 step 1 until M do begin JFL := MATVEC(1, M, I, J, FL); DY[I] := H × (FL[I]-C4 × JFL); YL[I] := Y[I] + C2 × FL[I] + C3 × JFL end end else for I := 1 step 1 until M do DY[I] := YL[I]-Y[I] + C1 × FL[I]-C0 × MATVEC(1, M, I, J, FL); SOL(A, M, PI, DY); for I := 1 step 1 until M do Y[I] := Y[I] + DY[I]; if ITNUM < ITMAX then begin ETA := SQRT(VECVEC(1, M, 0, Y, Y)) × RETA + AETA; DISCR := SQRT(VECVEC(1, M, 0, DY, DY)); if ETA < DISCR then goto NEXT end end NEWTON; LAST := false; K := 0; HL := 0; NEXT LEVEL: K := K + 1; STEPSIZE; NEWTON ITERATION; HL := H; OUTPUT; if ¬LAST then goto NEXT LEVEL end LINIGER2; comment ================== 33040 ================= ; procedure MODIFIED TAYLOR(T, TE, M0, M, U, SIGMA, TAUMIN, I, DERIVATIVE, K, DATA, ALFA, NORM, AETA, RETA, ETA, RHO, OUT); integer M0, M, I, K, NORM; real T, TE, SIGMA, TAUMIN, ALFA, AETA, RETA, ETA, RHO; array U, DATA; procedure DERIVATIVE, OUT; begin I := 0; begin integer N, P, Q; own real EC0, EC1, EC2, TAU0, TAU1, TAU2, TAUS, T2; real T0, TAU, TAUI, TAUEC, ECL, BETAN, GAMMA; real array C[M0:M], BETA, BETHA[1:DATA[-2]]; Boolean START, STEP1, LAST; real procedure VECVEC(L, U, SHIFT, A, B); code 34010; procedure COEFFICIENT; begin integer J; real IFAC; IFAC := 1; GAMMA := .5; N := DATA[-2]; P := DATA[-1]; BETAN := DATA[0]; Q := if P < N then P + 1 else N; for J := 1 step 1 until N do begin BETA[J] := DATA[J]; IFAC := IFAC/J; BETHA[J] := IFAC-BETA[J] end; if P = N then BETHA[N] := IFAC end; real procedure NORMFUNCTION(NORM, W); integer NORM; array W; begin integer J; real S, X; S := 0; if NORM = 1 then begin for J := M0 step 1 until M do begin X := ABS(W[J]); if X > S then S := X end end else S := SQRT(VECVEC(M0, M, 0, W, W)); NORMFUNCTION := S end; procedure LOCAL ERROR BOUND; ETA := AETA + RETA × NORMFUNCTION(NORM, U); procedure LOCAL ERROR CONSTRUCTION(I); integer I; begin if I = P then begin ECL := 0; TAUEC := 1 end; if I > P + 1 then TAUEC := TAUEC × TAU; ECL := ECL + ABS(BETHA[I]) × TAUEC × NORMFUNCTION(NORM, C); if I = N then begin EC0 := EC1; EC1 := EC2; EC2 := ECL; RHO := ECL × TAU⭡Q end end; procedure STEPSIZE; begin real TAUACC, TAUSTAB, AA, BB, CC, EC; LOCAL ERROR BOUND; if ETA > 0 then begin if START then begin if K = 0 then begin integer J; for J := M0 step 1 until M do C[J] := U[J]; I := 1; DERIVATIVE(I, C); TAUACC := ETA/NORMFUNCTION(NORM, C); STEP1 := true end else if STEP1 then begin TAUACC := (ETA/RHO)⭡(1/Q) × TAU2; if TAUACC > 10 × TAU2 then TAUACC := 10 × TAU2 else STEP1 := false end else begin BB := (EC2-EC1)/TAU1; CC := EC2-BB × T2; EC := BB × T + CC; TAUACC := if EC < 0 then TAU2 else (ETA/EC)⭡(1/Q); START := false end end else begin AA := ((EC0-EC1)/TAU0 + (EC2-EC1)/TAU1)/ (TAU1 + TAU0); BB := (EC2-EC1)/TAU1-AA × (2 × T2-TAU1); CC := EC2-T2 × (BB + AA × T2); EC := CC + T × (BB + T × AA); TAUACC := if EC < 0 then TAUS else (ETA/EC)⭡(1/Q); if TAUACC > ALFA × TAUS then TAUACC := ALFA × TAUS; if TAUACC < GAMMA × TAUS then TAUACC := GAMMA × TAUS; end end else TAUACC := TE-T; if TAUACC < TAUMIN then TAUACC := TAUMIN; TAUSTAB := BETAN/SIGMA; if TAUSTAB < 10-12 × (T-T0) then begin OUT; goto END OF MODIFIED TAYLOR end; TAU := if TAUACC > TAUSTAB then TAUSTAB else TAUACC; TAUS := TAU; if TAU ≥ TE-T then begin TAU := TE-T; LAST := true end; TAU0 := TAU1; TAU1 := TAU2; TAU2 := TAU end; procedure DIFFERENCE SCHEME; begin integer J; real B; for J := M0 step 1 until M do C[J] := U[J]; TAUI := 1; NEXT TERM: I := I + 1; DERIVATIVE(I, C); TAUI := TAUI × TAU; B := BETA[I] × TAUI; if ETA > 0 ∧ I ≥ P then LOCAL ERROR CONSTRUCTION(I); for J := M0 step 1 until M do U[J] := U[J] + B × C[J]; if I < N then goto NEXT TERM; T2 := T; if LAST then begin LAST := false; T := TE end else T := T + TAU end; START := K = 0; T0 := T; COEFFICIENT; LAST := false; NEXT LEVEL: STEPSIZE; K := K + 1; I := 0; DIFFERENCE SCHEME; OUT; if T ≠ TE then goto NEXT LEVEL end; END OF MODIFIED TAYLOR: end MODIFIED TAYLOR; comment ================== 33050 ================= ; procedure EXPONENTIALLY FITTED TAYLOR(T, TE, M0, M, U, SIGMA, PHI, DIAMETER, DERIVATIVE, I, K, ALFA, NORM, AETA, RETA, ETA, RHO, HMIN, HSTART, OUTPUT); integer M0, M, I, K, NORM; real T, TE, SIGMA, PHI, DIAMETER, ALFA, AETA, RETA, ETA, RHO, HMIN, HSTART; array U; procedure DERIVATIVE, OUTPUT; begin integer KL; real Q, EC0, EC1, EC2, H, HI, H0, H1, H2, BETAN, T2, SIGMAL, PHIL; real array C, RO[M0:M], BETA, BETHA[1:3]; Boolean LAST, START; procedure INIVEC(L, U, A, X); code 31010; procedure DUPVEC(L, U, SHIFT, A, B); code 31030; real procedure VECVEC(L, U, SHIFT, A, B); code 34010; procedure ELMVEC(L, U, SHIFT, A, B, X); code 34020; Boolean procedure ZEROIN(X, Y, FX, EPS); code 34150; procedure COEFFICIENT; begin real B, B1, B2, BB, E, BETA2, BETA3; B := H × SIGMAL; B1 := B × COS(PHIL); BB := B × B; if ABS(B) < 10-3 then begin BETA2 := .5-BB/24; BETA3 := 1/6 + B1/12; BETHA[3] := .5 + B1/3 end else if B1 < -40 then begin BETA2 := (-2 × B1-4 × B1 × B1/BB + 1)/BB; BETA3 := (1 + 2 × B1/BB)/BB; BETHA[3] := 1/BB end else begin E := EXP(B1)/BB; B2 := B × SIN(PHIL); BETA2 := (-2 × B1-4 × B1 × B1/BB + 1)/BB; BETA3 := (1 + 2 × B1/BB)/BB; if ABS(B2/B) < 10-5 then begin BETA2 := BETA2-E × (B1-3); BETA3 := BETA3 + E × (B1-2)/B1; BETHA[3] := 1/BB + E × (B1-1) end else begin BETA2 := BETA2-E × SIN(B2-3 × PHIL)/B2 × B; BETA3 := BETA3 + E × SIN(B2-2 × PHIL)/B2; BETHA[3] := 1/BB + E × SIN(B2-PHIL)/B2 × B; end end; BETA[1] := BETHA[1] := 1; BETA[2] := BETA2; BETA[3] := BETA3; BETHA[2] := 1-BB × BETA3; B := ABS(B); Q := if B < 1.5 then 4-2 × B/3 else if B < 6 then (30-2 × B)/9 else 2; end; real procedure NORMFUNCTION(NORM, W); integer NORM; array W; begin integer J; real S, X; S := 0; if NORM = 1 then begin for J := M0 step 1 until M do begin X := ABS(W[J]); if X > S then S := X end end else S := SQRT(VECVEC(M0, M, 0, W, W)); NORMFUNCTION := S; end; procedure LOCAL ERROR BOUND; ETA := AETA + RETA × NORMFUNCTION(NORM, U); procedure LOCAL ERROR CONSTRUCTION(I); integer I; begin if I = 1 then INIVEC(M0, M, RO, 0); if I < 4 then ELMVEC(M0, M, 0, RO, C, BETHA[I] × HI); if I = 4 then begin ELMVEC(M0, M, 0, RO, C, -H); RHO := NORMFUNCTION(NORM, RO); EC0 := EC1; EC1 := EC2; EC2 := RHO/H⭡Q; end end; procedure STEPSIZE; begin real HACC, HSTAB, HCR, HMAX, A, B, C; if ¬START then LOCAL ERROR BOUND; if START then begin H1 := H2 := HACC := HSTART; EC2 := EC1 := 1; KL := 1; START := false end else if KL < 3 then begin HACC := (ETA/RHO)⭡(1/Q) × H2; if HACC > 10 × H2 then HACC := 10 × H2 else KL := KL + 1 end else begin A := (H0 × (EC2-EC1)-H1 × (EC1-EC0))/(H2 × H0-H1 × H1); H := H2 × (if ETA < RHO then (ETA/RHO)⭡(1/Q) else ALFA); if A > 0 then begin B := (EC2-EC1-A × (H2-H1))/H1; C := EC2-A × H2-B × T2; HACC := 0; HMAX := H; if ¬ZEROIN(HACC, H, HACC⭡Q × (A × HACC + B × T + C)-ETA, 10-3 × H2) then HACC := HMAX end else HACC := H; if HACC < .5 × H2 then HACC := .5 × H2; end; if HACC < HMIN then HACC := HMIN; H := HACC; if H × SIGMAL > 1 then begin A := ABS(DIAMETER/SIGMAL + 10-14)/2; B := 2 × ABS(SIN(PHIL)); BETAN := (if A > B then 1/A else 1/B)/A; HSTAB := ABS(BETAN/SIGMAL); if HSTAB < 10-14 × T then goto ENDOFEFT; if H > HSTAB then H := HSTAB end; HCR := H2 × H2/H1; if KL > 2 ∧ ABS(H-HCR) < 10-6 × HCR then H := if H < HCR then HCR × (1-10-7) else HCR × (1 + 10-7); if T + H > TE then begin LAST := true; HSTART := H; H := TE-T end; H0 := H1; H1 := H2; H2 := H; end; procedure DIFFERENCE SCHEME; begin HI := 1; SIGMAL := SIGMA; PHIL := PHI; STEPSIZE; COEFFICIENT; for I := 1, 2, 3 do begin HI := HI × H; if I > 1 then DERIVATIVE(I, C); LOCALERRORCONSTRUCTION(I); ELMVEC(M0, M, 0, U, C, BETA[I] × HI) end; T2 := T; K := K + 1; if LAST then begin LAST := false; T := TE; START := true end else T := T + H; DUPVEC(M0, M, 0, C, U); DERIVATIVE(1, C); LOCALERRORCONSTRUCTION(4); OUTPUT; end; START := true; LAST := false; DUPVEC(M0, M, 0, C, U); DERIVATIVE(1, C); if K = 0 then begin LOCAL ERROR BOUND; HSTART := ETA/NORMFUNCTION(NORM, C) end; NEXT LEVEL: DIFFERENCE SCHEME; if T ≠ TE then goto NEXT LEVEL; ENDOFEFT: end EXPONENTIAL FITTED TAYLOR; comment ================== 33012 ================= ; procedure RK2(X, A, B, Y, YA, Z, ZA, FXYZ, E, D, FI); value B, FI; real X, A, B, Y, YA, Z, ZA, FXYZ; Boolean FI; array E, D; begin real E1, E2, E3, E4, XL, YL, ZL, H, INT, HMIN, HL, ABSH, K0, K1, K2, K3, K4, K5, DISCRY, DISCRZ, TOLY, TOLZ, MU, MU1, FHY, FHZ; Boolean LAST, FIRST, REJECT; if FI then begin D[3] := A; D[4] := YA; D[5] := ZA end; D[1] := 0; XL := D[3]; YL := D[4]; ZL := D[5]; if FI then D[2] := B - D[3]; ABSH := H := ABS(D[2]); if B - XL < 0 then H := - H; INT := ABS(B - XL); HMIN := INT × E[1] + E[2]; HL := INT × E[3] + E[4]; if HL < HMIN then HMIN := HL; E1 := E[1] / INT; E2 := E[2] / INT; E3 := E[3] / INT; E4 := E[4] / INT; FIRST := true; if FI then begin LAST := true; goto STEP end; TEST: ABSH := ABS(H); if ABSH < HMIN then begin H := if H > 0 then HMIN else - HMIN; ABSH := HMIN end; if H ≥ B - XL equiv H ≥ 0 then begin D[2] := H; LAST := true; H := B - XL; ABSH := ABS(H) end else LAST := false; STEP: X := XL; Y := YL; Z := ZL; K0 := FXYZ × H; X := XL + H / 4.5; Y := YL + (ZL × 18 + K0 × 2) / 81 × H; Z := ZL + K0 / 4.5 ; K1 := FXYZ × H; X := XL + H / 3; Y := YL + (ZL × 6 + K0) / 18 × H; Z := ZL + (K0 + K1 × 3) / 12; K2 := FXYZ × H; X := XL + H × .5; Y := YL + (ZL × 8 + K0 + K2) / 16 × H; Z := ZL + (K0 + K2 × 3) / 8; K3 := FXYZ × H; X := XL + H × .8; Y := YL + (ZL × 100 + K0 × 12 + K3 × 28) / 125 × H; Z := ZL + (K0 × 53 - K1 × 135 + K2 × 126 + K3 × 56) / 125; K4 := FXYZ × H; X := if LAST then B else XL + H; Y := YL + (ZL × 336 + K0 × 21 + K2 × 92 + K4 × 55) / 336 × H; Z := ZL + (K0 × 133 - K1 × 378 + K2 × 276 + K3 × 112 + K4 × 25) / 168; K5 := FXYZ × H; DISCRY := ABS(( - K0 × 21 + K2 × 108 - K3 × 112 + K4 × 25) / 56 × H); DISCRZ := ABS(K0 × 21 - K2 × 162 + K3 × 224 - K4 × 125 + K5 × 42) / 14; TOLY := ABSH × (ABS(ZL) × E1 + E2); TOLZ := ABS(K0) × E3 + ABSH × E4; REJECT := DISCRY > TOLY ∨ DISCRZ > TOLZ; FHY := DISCRY / TOLY; FHZ := DISCRZ / TOLZ; if FHZ > FHY then FHY := FHZ; MU := 1 / (1 + FHY) + .45; if REJECT then begin if ABSH ≤ HMIN then begin D[1] := D[1] + 1; Y := YL; Z := ZL; FIRST := true; goto NEXT end; H := MU × H; goto TEST end; if FIRST then begin FIRST := false; HL := H; H := MU × H; goto ACC end; FHY := MU × H / HL + MU - MU1; HL := H; H := FHY × H; ACC: MU1 := MU; Y := YL + (ZL × 56 + K0 × 7 + K2 × 36 - K4 × 15) / 56 × HL; Z := ZL + ( - K0 × 63 + K1 × 189 - K2 × 36 - K3 × 112 + K4 × 50) / 28; K5 := FXYZ × HL; Y := YL + (ZL × 336 + K0 × 35 + K2 × 108 + K4 × 25) / 336 × HL; Z := ZL + (K0 × 35 + K2 × 162 + K4 × 125 + K5 × 14) / 336; NEXT: if B ≠ X then begin XL := X; YL := Y; ZL := Z; goto TEST end; if ¬LAST then D[2] := H; D[3] := X; D[4] := Y; D[5] := Z end RK2; comment ================== 33013 ================= ; procedure RK2N(X, A, B, Y, YA, Z, ZA, FXYZJ, J, E, D, FI, N); value B, FI, N; integer J, N; real X, A, B, FXYZJ; Boolean FI; array Y, YA, Z, ZA, E, D; begin integer JJ; real XL, H, INT, HMIN, HL, ABSH, FHM, DISCRY, DISCRZ, TOLY, TOLZ, MU, MU1, FHY, FHZ; Boolean LAST, FIRST, REJECT; array YL, ZL, K0, K1, K2, K3, K4, K5[1:N], EE[1:4 × N]; if FI then begin D[3] := A; for JJ := 1 step 1 until N do begin D[JJ + 3] := YA[JJ]; D[N + JJ + 3] := ZA[JJ] end end; D[1] := 0; XL := D[3]; for JJ := 1 step 1 until N do begin YL[JJ] := D[JJ + 3]; ZL[JJ] := D[N + JJ + 3] end; if FI then D[2] := B - D[3]; ABSH := H := ABS(D[2]); if B - XL < 0 then H := - H; INT := ABS(B - XL); HMIN := INT × E[1] + E[2]; for JJ := 2 step 1 until 2 × N do begin HL := INT × E[2 × JJ - 1] + E[2 × JJ]; if HL < HMIN then HMIN := HL end; for JJ := 1 step 1 until 4 × N do EE[JJ] := E[JJ] / INT; FIRST := true; if FI then begin LAST := true; goto STEP end; TEST: ABSH := ABS(H); if ABSH < HMIN then begin H := if H > 0 then HMIN else - HMIN; ABSH := ABS(H) end; if H ≥ B - XL equiv H ≥ 0 then begin D[2] := H; LAST := true; H := B - XL; ABSH := ABS(H) end else LAST := false; STEP: X := XL; for JJ := 1 step 1 until N do begin Y[JJ] := YL[JJ]; Z[JJ] := ZL[JJ] end; for J := 1 step 1 until N do K0[J] := FXYZJ × H; X := XL + H / 4.5; for JJ := 1 step 1 until N do begin Y[JJ] := YL[JJ] + (ZL[JJ] × 18 + K0[JJ] × 2) / 81 × H; Z[JJ] := ZL[JJ] + K0[JJ] / 4.5; end; for J := 1 step 1 until N do K1[J] := FXYZJ × H; X := XL + H / 3; for JJ := 1 step 1 until N do begin Y[JJ] := YL[JJ] + (ZL[JJ] × 6 + K0[JJ]) / 18 × H; Z[JJ] := ZL[JJ] + (K0[JJ] + K1[JJ] × 3) / 12 end; for J := 1 step 1 until N do K2[J] := FXYZJ × H; X := XL + H × .5; for JJ := 1 step 1 until N do begin Y[JJ] := YL[JJ] + (ZL[JJ] × 8 + K0[JJ] + K2[JJ]) / 16 × H; Z[JJ] := ZL[JJ] + (K0[JJ] + K2[JJ] × 3) / 8 end; for J := 1 step 1 until N do K3[J] := FXYZJ × H; X := XL + H × .8; for JJ := 1 step 1 until N do begin Y[JJ] := YL[JJ] + (ZL[JJ] × 100 + K0[JJ] × 12 + K3[JJ] × 28) / 125 × H; Z[JJ] := ZL[JJ] + (K0[JJ] × 53 - K1[JJ] × 135 + K2[JJ] × 126 + K3[JJ] × 56) / 125 end; for J := 1 step 1 until N do K4[J] := FXYZJ × H; X := if LAST then B else XL + H; for JJ := 1 step 1 until N do begin Y[JJ] := YL[JJ] + (ZL[JJ] × 336 + K0[JJ] × 21 + K2[JJ] × 92 + K4[JJ] × 55) / 336 × H; Z[JJ] := ZL[JJ] + (K0[JJ] × 133 - K1[JJ] × 378 + K2[JJ] × 276 + K3[JJ] × 112 + K4[JJ] × 25) / 168 end; for J := 1 step 1 until N do K5[J] := FXYZJ × H; REJECT := false; FHM := 0; for JJ := 1 step 1 until N do begin DISCRY := ABS(( - K0[JJ] × 21 + K2[JJ] × 108 - K3[JJ] × 112 + K4[JJ] × 25) / 56 × H); DISCRZ := ABS(K0[JJ] × 21 - K2[JJ] × 162 + K3[JJ] × 224 - K4[JJ] × 125 + K5[JJ] × 42) / 14; TOLY := ABSH × (ABS(ZL[JJ]) × EE[2 × JJ - 1] + EE[2 × JJ]); TOLZ := ABS(K0[JJ]) × EE[2 × (JJ + N) - 1] + ABSH × EE[2 × (JJ + N)]; REJECT := DISCRY > TOLY ∨ DISCRZ > TOLZ ∨ REJECT; FHY := DISCRY / TOLY; FHZ := DISCRZ / TOLZ; if FHZ > FHY then FHY := FHZ; if FHY > FHM then FHM := FHY end; MU := 1 / (1 + FHM) + .45; if REJECT then begin if ABSH ≤ HMIN then begin D[1] := D[1] + 1; for JJ := 1 step 1 until N do begin Y[JJ] := YL[JJ]; Z[JJ] := ZL[JJ] end; FIRST := true; goto NEXT end; H := MU × H; goto TEST end; if FIRST then begin FIRST := false; HL := H; H := MU × H; goto ACC end; FHM := MU × H / HL + MU - MU1; HL := H; H := FHM × H; ACC: MU1 := MU; for JJ := 1 step 1 until N do begin Y[JJ] := YL[JJ] + (ZL[JJ] × 56 + K0[JJ] × 7 + K2[JJ] × 36 - K4[JJ] × 15) / 56 × HL; Z[JJ] := ZL[JJ] + ( - K0[JJ] × 63 + K1[JJ] × 189 - K2[JJ] × 36 - K3[JJ] × 112 + K4[JJ] × 50) / 28 end; for J := 1 step 1 until N do K5[J] := FXYZJ × HL; for JJ := 1 step 1 until N do begin Y[JJ] := YL[JJ] + (ZL[JJ] × 336 + K0[JJ] × 35 + K2[JJ] × 108 + K4[JJ] × 25) / 336 × HL; Z[JJ] := ZL[JJ] + (K0[JJ] × 35 + K2[JJ] × 162 + K4[JJ] × 125 + K5[JJ] × 14) / 336 end; NEXT: if B ≠ X then begin XL := X; for JJ := 1 step 1 until N do begin YL[JJ] := Y[JJ]; ZL[JJ] := Z[JJ] end; goto TEST end; if ¬LAST then D[2] := H; D[3] := X; for JJ := 1 step 1 until N do begin D[JJ + 3] := Y[JJ]; D[N + JJ + 3] := Z[JJ] end end RK2N; comment ================== 33014 ================= ; procedure RK3(X, A, B, Y, YA, Z, ZA, FXY, E, D, FI); value B, FI; real X, A, B, Y, YA, Z, ZA, FXY; Boolean FI; array E, D; begin real E1, E2, E3, E4, XL, YL, ZL, H, INT, HMIN, HL, ABSH, K0, K1, K2, K3, K4, K5, DISCRY, DISCRZ, TOLY, TOLZ, MU, MU1, FHY, FHZ; Boolean LAST, FIRST, REJECT; if FI then begin D[3] := A; D[4] := YA; D[5] := ZA end; D[1] := 0; XL := D[3]; YL := D[4]; ZL := D[5]; if FI then D[2] := B - D[3]; ABSH := H := ABS(D[2]); if B - XL < 0 then H := - H; INT := ABS(B - XL); HMIN := INT × E[1] + E[2]; HL := INT × E[3] + E[4]; if HL < HMIN then HMIN := HL; E1 := E[1] / INT; E2 := E[2] / INT; E3 := E[3] / INT; E4 := E[4] / INT; FIRST := REJECT := true; if FI then begin LAST := true; goto STEP end; TEST: ABSH := ABS(H); if ABSH < HMIN then begin H := if H > 0 then HMIN else - HMIN; ABSH := HMIN end; if H ≥ B - XL equiv H ≥ 0 then begin D[2] := H; LAST := true; H := B - XL; ABSH := ABS(H) end else LAST := false; STEP: if REJECT then begin X := XL; Y := YL; K0 := FXY × H end else K0 := K5 × H / HL; X := XL + .276393202250021 × H; Y := YL + (ZL × .2763932022 50021 + K0 × .038196601125011) × H; K1 := FXY × H; X := XL + .72360 6797749979 × H; Y := YL + (ZL × .723606797749979 + K1 × .26180 3398874989) × H; K2 := FXY × H; X := XL + H × .5; Y := YL + (ZL × .5 + K0 × .046875 + K1 × .079824155839840 - K2 × .001699155839840) × H; K4 := FXY × H; X := if LAST then B else XL + H; Y := YL + (ZL + K0 × .309016994374947 + K2 × .190983005625053) × H; K3 := FXY × H; Y := YL + (ZL + K0 × .083333333333333 + K1 × .301502832395825 + K2 × .115163834270842) × H; K5 := FXY × H; DISCRY := ABS(( - K0 × .5 + K1 × 1.809016994374947 + K2 × .690983005625053 - K4 × 2) × H); DISCRZ := ABS((K0 - K3) × 2 - (K1 + K2) × 10 + K4 × 16 + K5 × 4); TOLY := ABSH × (ABS(ZL) × E1 + E2); TOLZ := ABS(K0) × E3 + ABSH × E4; REJECT := DISCRY > TOLY ∨ DISCRZ > TOLZ; FHY := DISCRY / TOLY; FHZ := DISCRZ / TOLZ; if FHZ > FHY then FHY := FHZ; MU := 1 / (1 + FHY) + .45; if REJECT then begin if ABSH ≤ HMIN then begin D[1] := D[1] + 1; Y := YL; Z := ZL; FIRST := true; goto NEXT end; H := MU × H; goto TEST end; if FIRST then begin FIRST := false; HL := H; H := MU × H; goto ACC end; FHY := MU × H / HL + MU - MU1; HL := H; H := FHY × H; ACC: MU1 := MU; Z := ZL + (K0 + K3) × .083333333333333 + (K1 + K2) × .416666666666667; NEXT: if B ≠ X then begin XL := X; YL := Y; ZL := Z; goto TEST end; if ¬LAST then D[2] := H; D[3] := X; D[4] := Y; D[5] := Z end RK3; comment ================== 33015 ================= ; procedure RK3N(X, A, B, Y, YA, Z, ZA, FXYJ, J, E, D, FI, N); value B, FI, N; integer J, N; real X, A, B, FXYJ; Boolean FI; array Y, YA, Z, ZA, E, D; begin integer JJ; real XL, H, HMIN, INT, HL, ABSH, FHM, DISCRY, DISCRZ, TOLY, TOLZ, MU, MU1, FHY, FHZ; Boolean LAST, FIRST, REJECT; array YL, ZL, K0, K1, K2, K3, K4, K5[1:N], EE[1:4 × N]; if FI then begin D[3] := A; for JJ := 1 step 1 until N do begin D[JJ + 3] := YA[JJ]; D[N + JJ + 3] := ZA[JJ] end end; D[1] := 0; XL := D[3]; for JJ := 1 step 1 until N do begin YL[JJ] := D[JJ + 3]; ZL[JJ] := D[N + JJ + 3] end; if FI then D[2] := B - D[3]; ABSH := H := ABS(D[2]); if B - XL < 0 then H := - H; INT := ABS(B - XL); HMIN := INT × E[1] + E[2]; for JJ := 2 step 1 until 2 × N do begin HL := INT × E[2 × JJ - 1] + E[2 × JJ]; if HL < HMIN then HMIN := HL end; for JJ := 1 step 1 until 4 × N do EE[JJ] := E[JJ] / INT; FIRST := REJECT := true; if FI then begin LAST := true; goto STEP end; TEST: ABSH := ABS(H); if ABSH < HMIN then begin H := if H > 0 then HMIN else - HMIN; ABSH := HMIN end; if H ≥ B - XL equiv H ≥ 0 then begin D[2] := H; LAST := true; H := B - XL; ABSH := ABS(H) end else LAST := false; STEP: if REJECT then begin X := XL; for JJ := 1 step 1 until N do Y[JJ] := YL[JJ]; for J := 1 step 1 until N do K0[J] := FXYJ × H end else begin FHY := H / HL; for JJ := 1 step 1 until N do K0[JJ] := K5[JJ] × FHY end; X := XL + .27639 3202250021 × H; for JJ := 1 step 1 until N do Y[JJ] := YL[JJ] + (ZL[JJ] × .276393202250021 + K0[JJ] × .038196601125011) × H; for J := 1 step 1 until N do K1[J] := FXYJ × H; X := XL + .723606797749979 × H; for JJ := 1 step 1 until N do Y[JJ] := YL[JJ] + (ZL[JJ] × .723606797749979 + K1[JJ] × .261803398874989) × H; for J := 1 step 1 until N do K2[J] := FXYJ × H; X := XL + H × .5; for JJ := 1 step 1 until N do Y[JJ] := YL[JJ] + (ZL[JJ] × .5 + K0[JJ] × .046875 + K1[JJ] × .079824155839840 - K2[JJ] × .00169 9155839840) × H; for J := 1 step 1 until N do K4[J] := FXYJ × H; X := if LAST then B else XL + H; for JJ := 1 step 1 until N do Y[JJ] := YL[JJ] + (ZL[JJ] + K0[JJ] × .309016994374947 + K2[JJ] × .190983005625053) × H; for J := 1 step 1 until N do K3[J] := FXYJ × H; for JJ := 1 step 1 until N do Y[JJ] := YL[JJ] + (ZL[JJ] + K0[JJ] × .083333333333333 + K1[JJ] × .30150 2832395825 + K2[JJ] × .115163834270842) × H; for J := 1 step 1 until N do K5[J] := FXYJ × H; REJECT := false; FHM := 0; for JJ := 1 step 1 until N do begin DISCRY := ABS(( - K0[JJ] × .5 + K1[JJ] × 1.809016994374947 + K2[JJ] × .690983005625053 - K4[JJ] × 2) × H); DISCRZ := ABS((K0[JJ] - K3[JJ]) × 2 - (K1[JJ] + K2[JJ]) × 10 + K4[JJ] × 16 + K5[JJ] × 4); TOLY := ABSH × (ABS(ZL[JJ]) × EE[2 × JJ - 1] + EE[2 × JJ]); TOLZ := ABS(K0[JJ]) × EE[2 × (JJ + N) - 1] + ABSH × EE[2 × (JJ + N)]; REJECT := DISCRY > TOLY ∨ DISCRZ > TOLZ ∨ REJECT; FHY := DISCRY / TOLY; FHZ := DISCRZ / TOLZ; if FHZ > FHY then FHY := FHZ; if FHY > FHM then FHM := FHY end; MU := 1 / (1 + FHM) + .45; if REJECT then begin if ABSH ≤ HMIN then begin D[1] := D[1] + 1; for JJ := 1 step 1 until N do begin Y[JJ] := YL[JJ]; Z[JJ] := ZL[JJ] end; FIRST := true; goto NEXT end; H := MU × H; goto TEST end REJ; if FIRST then begin FIRST := false; HL := H; H := MU × H; goto ACC end; FHY := MU × H / HL + MU - MU1; HL := H; H := FHY × H; ACC: MU1 := MU; for JJ := 1 step 1 until N do Z[JJ] := ZL[JJ] + (K0[JJ] + K3[JJ]) × .083333333333333 + (K1[JJ] + K2[JJ]) × .416666666666667; NEXT: if B ≠ X then begin XL := X; for JJ := 1 step 1 until N do begin YL[JJ] := Y[JJ]; ZL[JJ] := Z[JJ] end; goto TEST end; if ¬LAST then D[2] := H; D[3] := X; for JJ := 1 step 1 until N do begin D[JJ + 3] := Y[JJ]; D[N + JJ + 3] := Z[JJ] end end RK3N; comment ================== 35120 ================= ; real procedure TAN(X); value X; real X; begin real U; Boolean procedure OVERFLOW(X); code 30009; real procedure GIANT; code 30004; U := SIN(X)/COS(X); TAN := if OVERFLOW(U) then GIANT else U end TAN; comment ================== 35111 ================= ; real procedure SINH(X); value X; real X; begin real AX, Y; AX := ABS(X); if AX < 0.3 then begin Y := if AX < 0.1 then X × X else X × X/9; X := ((( 0.0001984540 × Y + 0.0083333331783 ) × Y + 0.16666666666675) × Y + 1.0 ) × X ; SINH := if AX < 0.1 then X else X × ( 1.0 + 0.14814814814815 × X × X ) end else if AX < 17.5 then begin AX := EXP( AX ); SINH := SIGN(X) × .5 × ( AX -1/AX ) end else if AX > 742.36063037970 then begin real procedure GIANT; code 30004; SINH := SIGN(X) × GIANT end else SINH := SIGN(X) × EXP(AX- .69314 71805 59945) end SINH; comment ================== 35115 ================= ; real procedure ARCCOSH(X); value X; real X; ARCCOSH := if X ≤ 1 then 0 else if X > 1010 then 0.69314718055995 + LN(X) else LN(X + SQRT((X-1) × (X + 1))); comment ================== 35080 ================= ; real procedure EI(X); value X; real X; begin real array P, Q[0:7]; real procedure CHEPOLSER(N, X, A); code 31046; real procedure POL(N, X, A); code 31040; real procedure JFRAC(N, A, B); code 35083; if X > 24 then begin P[0] := + 1.00000000000058 ; Q[1] := 1.99999999924131 ; P[1] := X-3.00000016782085 ; Q[2] := -2.99996432944446 ; P[2] := X-5.00140345515924 ; Q[3] := -7.90404992298926 ; P[3] := X-7.49289167792884 ; Q[4] := -4.31325836146628 ; P[4] := X-3.0833626905176310+1; Q[5] := 2.9599939948683110+2; P[5] := X-1.39381360364405 ; Q[6] := -6.74704580465832 ; P[6] := X + 8.91263822573708 ; Q[7] := 1.0474536265246810+3; P[7] := X-5.3168662349448210+1; EI := EXP(X) × (1 + JFRAC(7, Q, P)/X)/X end else if X > 12 then begin P[0] := + 9.9999429607470810-1; Q[1] := 1.00083867402639 ; P[1] := X-1.95022321289660 ; Q[2] := -3.43942266899870 ; P[2] := X + 1.75656315469614 ; Q[3] := 2.8951672792513510+1; P[3] := X + 1.7960168876925210+1; Q[4] := 7.6076114800773510+2; P[4] := X-3.2346733030540310+1; Q[5] := 2.5777638423844010+1; P[5] := X-8.28561994140641 ; Q[6] := 5.7283719383732410+1; P[6] := X-1.8654545488339910+1; Q[7] := 6.9500065588743410+1; P[7] := X-3.48334653602853 ; EI := EXP(X) × JFRAC(7, Q, P)/X end else if X > 6 then begin P[0] := + 1.00443109228078 ; Q[1] := 5.2746885196290810-1; P[1] := X-4.3253113287813510+1; Q[2] := 2.7362411988932810+3; P[2] := X + 6.0121799083008010+1; Q[3] := 1.4325673812193810+1; P[3] := X-3.3184253199722110+1; Q[4] := 1.0036743951672610+3; P[4] := X + 2.5076281129356010+1; Q[5] := -6.25041161671876 ; P[5] := X + 9.30816385662165 ; Q[6] := 3.0089264837291510+2; P[6] := X-2.1901023385488010+1; Q[7] := 3.93707701852715 ; P[7] := X-2.18086381520724 ; EI := EXP(X) × JFRAC(7, Q, P)/X end else if X > 0 then begin real T, R, X0, XMX0; P[0] := -1.9577303690454810+8; Q[0] := -8.2627149862605510+7; P[1] := 3.8928042131120110+6; Q[1] := 8.9192576757561210+7; P[2] := -2.2174462775884510+7; Q[2] := -2.4903337574054010+7; P[3] := -1.1962366934924710+5; Q[3] := 4.2855962461174910+6; P[4] := -2.4930139345864810+5; Q[4] := -4.8354743616216410+5; P[5] := -4.2100161535707010+3; Q[5] := 3.5730029805850810+4; P[6] := -5.4914226552108510+2; Q[6] := -1.6070892658722110+3; P[7] := -8.66937339951070 ; Q[7] := 3.4171875000000010+1; X0 := .372507410781367; T := X/3-1; R := CHEPOLSER(7, T, P)/CHEPOLSER(7, T, Q); XMX0 := (X-409576229586/1099511627776)-.76717725019939410-12; if ABS(XMX0) > .037 then T := LN(X/X0) else begin real Z, Z2; P[0] := .83720793397607510+1; Q[0] := .41860396698803710+1; P[1] := -.65226874083710310+1; Q[1] := -.46566902608081410+1; P[2] := .569955700306720 ; Q[2] := .110+1; Z := XMX0/(X + X0); Z2 := Z × Z; T := Z × POL(2, Z2, P)/POL(2, Z2, Q) end; EI := T + XMX0 × R end else if X > -1 then begin real Y; P[0] := -4.4178547172821710+4; Q[0] := 7.6537332333761410+4; P[1] := 5.7721724713944410+4; Q[1] := 3.2597188129027510+4; P[2] := 9.9383138896203710+3; Q[2] := 6.1061079424575910+3; P[3] := 1.8421108866800010+3; Q[3] := 6.3541941837838210+2; P[4] := 1.0109380616190610+2; Q[4] := 3.7229835283332710+1; P[5] := 5.03416184097568 ; Q[5] := 1; Y := -X; EI := LN(Y)-POL(5, Y, P)/POL(5, Y, Q) end else if X > -4 then begin real Y; P[0] := 8.6774595483844410-8; Q[0] := 1; P[1] := 9.9999551930139010-1; Q[1] := 1.2848193537915710+1; P[2] := 1.1848310555494610+1; Q[2] := 5.6443356956180310+1; P[3] := 4.5593064425339010+1; Q[3] := 1.0664518376991410+2; P[4] := 6.9927945129100310+1; Q[4] := 8.9731109712529010+1; P[5] := 4.2520203476884110+1; Q[5] := 3.1497184917044110+1; P[6] := 8.83671808803844 ; Q[6] := 3.79559003762122 ; P[7] := 4.0137766494066510-1; Q[7] := 9.0880456918886910-2; Y := -1/X; EI := -EXP(X) × POL(7, Y, P)/POL(7, Y, Q) end else begin real Y; P[0] := -9.9999999999844710-1; Q[0] := 1; P[1] := -2.6627106043181110+1; Q[1] := 2.8627106042219210+1; P[2] := -2.4105582709701510+2; Q[2] := 2.9231003938853310+2; P[3] := -8.9592795777293710+2; Q[3] := 1.3327853774825710+3; P[4] := -1.2988568874648410+3; Q[4] := 2.7776194950916310+3; P[5] := -5.4537415888313310+2; Q[5] := 2.4040171322590910+3; P[6] := -5.66575206533869 ; Q[6] := 6.3165748328080010+2; Y := -1/X; EI := -EXP(X) × Y × (1 + Y × POL(6, Y, P)/POL(6, Y, Q)) end end EI; comment ================== 35086 ================= ; procedure ENX(X, N1, N2, A); value X, N1, N2; real X; integer N1, N2; array A; if X ≤ 1.5 then begin real procedure EI(X); code 35080; real W, E; integer I; W := -EI(-X); if N1 = 1 then A[1] := W; if N2 > 1 then E := EXP(-X); for I := 2 step 1 until N2 do begin W := (E - X × W)/(I - 1); if I ≥ N1 then A[I] := W end end else begin integer I, N; real W, E, AN; N := ENTIER(X + .5); if N ≤ 10 then begin real F, W1, T, H; real array P[2:19]; P[ 2] := .3753426182049110-1; P[11] := .135335283236613 ; P[ 3] := .8930646556022810-2; P[12] := .49787068367863910-1; P[ 4] := .2423398368658110-2; P[13] := .18315638888734210-1; P[ 5] := .7057606934245810-3; P[14] := .67379469990854710-2; P[ 6] := .2148027781901310-3; P[15] := .24787521766663610-2; P[ 7] := .6737580778101810-4; P[16] := .91188196555451610-3; P[ 8] := .2160073015997510-4; P[17] := .33546262790251210-3; P[ 9] := .7041157985429210-5; P[18] := .12340980408668010-3; P[10] := .2325302657028210-5; P[19] := .45399929762484810-4; F := W := P[N]; E := P[N + 9]; W1 := T := 1; H := X-N; for I := N-1, I-1 while ABS(W1) > 10-15 × W do begin F := (E - I × F)/N; T := -H × T / (N-I); W1 := T × F; W := W + W1 end end else begin procedure NONEXPENX(X, N1, N2, A); code 35087; array B[N:N]; NONEXPENX(X, N, N, B); W := B[N] × EXP(-X) end; if N1 = N2 ∧ N1 = N then A[N] := W else begin E := EXP(-X); AN := W; if N ≤ N2 ∧ N ≥ N1 then A[N] := W; for I := N-1 step -1 until N1 do begin W := (E - I × W)/X; if I ≤ N2 then A[I] := W end; W := AN; for I := N + 1 step 1 until N2 do begin W := (E - X × W)/(I - 1); if I ≥ N1 then A[I] := W end end end ENX; comment ================== 35087 ================= ; procedure NONEXPENX(X, N1, N2, A); value X, N1, N2; real X; integer N1, N2; array A; begin integer I, N; real W, AN; N := if X ≤ 1.5 then 1 else ENTIER(X + .5); if N ≤ 10 then begin procedure ENX(X, N1, N2, A); code 35086; array B[N:N]; ENX(X, N, N, B); W := B[N] × EXP(X) end else begin integer K, K1; real UE, VE, WE, WE1, UO, VO, WO, WO1, R, S; UE := 1; VE := WE := 1/(X + N); WE1 := 0; UO := 1; VO := -N/(X × (X + N + 1)); WO1 := 1/X; WO := VO + WO1; W := (WE + WO)/2; K1 := 1; for K := K1 while WO-WE > 10-15 × W ∧ WE > WE1 ∧ WO < WO1 do begin WE1 := WE; WO1 := WO; R := N + K; S := R + X + K; UE := 1/(1-K × (R-1) × UE/((S-2) × S)); UO := 1/(1-K × R × UO/( S × S-1)); VE := VE × (UE-1); VO := VO × (UO-1); WE := WE + VE; WO := WO + VO; W := (WE + WO)/2; K1 := K1 + 1 end end; AN := W; if N ≤ N2 ∧ N ≥ N1 then A[N] := W; for I := N-1 step -1 until N1 do begin W := (1 - I × W)/X; if I ≤ N2 then A[I] := W end; W := AN; for I := N + 1 step 1 until N2 do begin W := (1 - X × W)/(I - 1); if I ≥ N1 then A[I] := W end end EXPENX; comment ================== 35084 ================= ; procedure SINCOSINT(X, SI, CI); value X; real X, SI, CI; begin real ABSX, Z, F, G; procedure SINCOSFG(X, F, G); code 35085; real procedure CHEPOLSER(N, X, A); code 31046; ABSX := ABS(X); if ABSX ≤ 4 then begin real array A[0:10]; real Z2; A[0] := + 2.736870680363010+00; A[1] := -1.110631410789410+00; A[2] := + 1.417656219466610-01; A[3] := -1.025265257917410-02; A[4] := + 4.649461561988010-04; A[5] := -1.436173089664210-05; A[6] := + 3.209368494822910-07; A[7] := -5.425199077016210-09; A[8] := + 7.177628863989510-11; A[9] := -7.633549372348210-13; A[10] := + 6.667995834698310-15; Z := X / 4; Z2 := Z × Z; G := Z2 + Z2 - 1; SI := Z × CHEPOLSER(10, G, A); A[0] := + 2.965960140072710+00; A[1] := -9.429719834183010-01; A[2] := + 8.611034273816910-02; A[3] := -4.777608454713910-03; A[4] := + 1.752916120514610-04; A[5] := -4.544872780375210-06; A[6] := + 8.751583918006010-08; A[7] := -1.299869993810910-09; A[8] := + 1.533897489883110-11; A[9] := -1.472425607027710-13; A[10] := + 1.172142079842910-15; CI := .577215664901533 + LN(ABSX) - Z2 × CHEPOLSER(10, G, A) end else begin real CX, SX; SINCOSFG(X, F, G); CX := COS(X); SX := SIN(X); SI := 1.570796326794897; if X < 0 then SI := -SI; SI := SI - F × CX - G × SX; CI := F × SX - G × CX end end SINCOSINT; comment ================== 35085 ================= ; procedure SINCOSFG(X, F, G); value X; real X, F, G; begin real ABSX, SI, CI; procedure SINCOSINT(X, SI, CI); code 35084; real procedure CHEPOLSER(N, X, A); code 31046; ABSX := ABS(X); if ABSX ≤ 4 then begin real CX, SX; SINCOSINT(X, SI, CI); CX := COS(X); SX := SIN(X); SI := SI - 1.570796326794897; F := CI × SX - SI × CX; G := -CI × CX - SI × SX end else begin real array A[0:23]; A[0] := + 9.657882803518510-01; A[1] := -4.306083777859710-02; A[2] := -7.314371174810410-03; A[3] := + 1.470523578986810-03; A[4] := -9.865768573270210-05; A[5] := -2.274320220465510-05; A[6] := + 9.824025732252610-06; A[7] := -1.897343014871310-06; A[8] := + 1.006343594155810-07; A[9] := + 8.081936482224110-08; A[10] := -3.897628287528810-08; A[11] := + 1.033565032549710-08; A[12] := -1.410434487589710-09; A[13] := -2.523207839968310-10; A[14] := + 2.569983132596110-10; A[15] := -1.059788925394810-10; A[16] := + 2.897003157021410-11; A[17] := -4.102314256308310-12; A[18] := -1.043769373001810-12; A[19] := + 1.099418452054710-12; A[20] := -5.221423940167910-13; A[21] := + 1.746992078782910-13; A[22] := -3.847001297927910-14; F := CHEPOLSER(22, 8/ABSX-1, A) / X; A[0] := + 2.280122063824110-01; A[1] := -2.686972741109710-02; A[2] := -3.510715728095810-03; A[3] := + 1.239800863518610-03; A[4] := -1.567294511686210-04; A[5] := -1.066414179809410-05; A[6] := + 1.117062934357410-05; A[7] := -3.175401165561410-06; A[8] := + 4.431747352039810-07; A[9] := + 5.510869687446310-08; A[10] := -5.924307871174310-08; A[11] := + 2.210257338155510-08; A[12] := -5.025682754062310-09; A[13] := + 3.151916825942410-10; A[14] := + 3.630699084897910-10; A[15] := -2.297476423459110-10; A[16] := + 8.553030942404810-11; A[17] := -2.118306772444310-11; A[18] := + 1.713366264509210-12; A[19] := + 1.723887751724810-12; A[20] := -1.293028136681110-12; A[21] := + 5.747233922373110-13; A[22] := -1.841546826831410-13; A[23] := + 3.593725657143410-14; G := 4 × CHEPOLSER(23, 8/ABSX-1, A) / ABSX /ABSX end end SINCOSFG; comment ================== 35060 ================= ; real procedure RECIP GAMMA(X, ODD, EVEN); value X; real X, ODD, EVEN; begin integer I; real ALFA, BETA, X2; array B[1:12]; B[ 1] := -.28387 65422 76024; B[ 2] := -.07685 28408 44786; B[ 3] := + .00170 63050 71096; B[ 4] := + .00127 19271 36655; B[ 5] := + .00007 63095 97586; B[ 6] := -.00000 49717 36704; B[ 7] := -.00000 08659 20800; B[ 8] := -.00000 00331 26120; B[ 9] := + .00000 00017 45136; B[10] := + .00000 00002 42310; B[11] := + .00000 00000 09161; B[12] := -.00000 00000 00170; X2 := X × X × 8; ALFA := -.00000 00000 00001; BETA := 0; for I := 12 step - 2 until 2 do begin BETA := -(ALFA × 2 + BETA); ALFA := - BETA × X2 - ALFA + B[I] end; EVEN := (BETA / 2 + ALFA) × X2 - ALFA + .92187 02936 50453; ALFA := -.00000 00000 00034; BETA := 0; for I := 11 step - 2 until 1 do begin BETA := -(ALFA × 2 + BETA); ALFA := - BETA × X2 - ALFA + B[I] end; ODD := (ALFA + BETA) × 2; RECIP GAMMA := ODD × X + EVEN end RECIP GAMMA; comment ================== 35061 ================= ; real procedure GAMMA(X); value X; real X; begin real Y, S, F, G, ODD, EVEN; Boolean INV; real procedure RECIP GAMMA(X, ODD, EVEN); value X; real X, ODD, EVEN; code 35060; real procedure LOG GAMMA(X); value X; real X; code 35062; if X < .5 then begin Y := X - ENTIER(X / 2) × 2; S := 3.14159 26535 8979; if Y ≥ 1 then begin S := - S; Y := 2 - Y end; if Y ≥ .5 then Y := 1 - Y; INV := true; X := 1 - X; F := S / SIN(3.14159 26535 8979 × Y) end else INV := false; if X > 22 then G := EXP(LOG GAMMA(X)) else begin S := 1; NEXT: if X > 1.5 then begin X := X - 1; S := S × X; goto NEXT end; G := S / RECIP GAMMA(1 - X, ODD, EVEN) end; GAMMA := if INV then F / G else G end GAMMA; comment ================== 35062 ================= ; real procedure LOG GAMMA(X); value X; real X; if X > 13 then begin real R, X2; R := 1; NEXT: if X ≤ 22 then begin R := R / X; X := X + 1; goto NEXT end; X2 := - 1 / (X × X); R := LN(R); LOG GAMMA := LN(X) × (X - .5) - X + R + .91893 85332 04672 + (((.59523 80952 3809510-3 × X2 + .79365 07936 5079410-3) × X2 + .27777 77777 7777810-2) × X2 + .83333 33333 3333310-1) / X end else begin real Y, F, U0, U1, U, Z; integer I; array B[1:18]; F := 1; U0 := U1 := 0; B[ 1] := -.07611 41616 704358; B[ 2] := + .00843 23249 659328; B[ 3] := -.00107 94937 263286; B[ 4] := + .00014 90074 800369; B[ 5] := -.00002 15123 998886; B[ 6] := + .00000 31979 329861; B[ 7] := -.00000 04851 693012; B[ 8] := + .00000 00747 148782; B[ 9] := -.00000 00116 382967; B[10] := + .00000 00018 294004; B[11] := -.00000 00002 896918; B[12] := + .00000 00000 461570; B[13] := -.00000 00000 073928; B[14] := + .00000 00000 011894; B[15] := -.00000 00000 001921; B[16] := + .00000 00000 000311; B[17] := -.00000 00000 000051; B[18] := + .00000 00000 000008; if X < 1 then begin F := 1 / X; X := X + 1 end else NEXT: if X > 2 then begin X := X - 1; F := F × X; goto NEXT end; F := LN(F); Y := X + X - 3; Z := Y + Y; for I := 18 step - 1 until 1 do begin U := U0; U0 := Z × U0 + B[I] - U1; U1 := U end; LOG GAMMA := (U0 × Y + .49141 53930 29387 - U1) × (X - 1) × (X - 2) + F end LOG GAMMA; comment ================== 35030 ================= ; procedure INCOMGAM(X, A, KLGAM, GRGAM, GAM, EPS); value X, A, EPS; real X, A, KLGAM, GRGAM, GAM, EPS; begin real C0, C1, C2, D0, D1, D2, X2, AX, P, Q, R, S, R1, R2, SCF; integer N; S := EXP(-X + A × LN(X)); SCF := 10+300; if X ≤ (if A < 3 then 1 else A) then begin X2 := X × X; AX := A × X; D0 := 1; P := A; C0 := S; D1 := (A + 1) × (A + 2-X); C1 := ((A + 1) × (A + 2) + X) × S; R2 := C1/D1; for N := 1, N + 1 while ABS((R2-R1)/R2) > EPS do begin P := 2 + P; Q := (P + 1) × (P × (P + 2)-AX); R := N × (N + A) × (P + 2) × X2; C2 := (Q × C1 + R × C0)/P; D2 := (Q × D1 + R × D0)/P; R1 := R2; R2 := C2/D2; C0 := C1; C1 := C2; D0 := D1; D1 := D2; if ABS(C1) > SCF ∨ ABS(D1) > SCF then begin C0 := C0/SCF; C1 := C1/SCF; D0 := D0/SCF; D1 := D1/SCF end end; KLGAM := R2/A; GRGAM := GAM - KLGAM end else begin C0 := A × S; C1 := (1 + X) × C0; Q := X + 2 - A; D0 := X; D1 := X × Q; R2 := C1/D1; for N := 1, N + 1 while ABS((R2-R1)/R2) > EPS do begin Q := 2 + Q; R := N × (N + 1-A); C2 := Q × C1-R × C0; D2 := Q × D1-R × D0; R1 := R2; R2 := C2/D2; C0 := C1; C1 := C2; D0 := D1; D1 := D2; if ABS(C1) > SCF ∨ ABS(D1) > SCF then begin C0 := C0/SCF; C1 := C1/SCF; D0 := D0/SCF; D1 := D1/SCF end end; GRGAM := R2/A; KLGAM := GAM - GRGAM end end INCOMGAM; comment ================== 35050 ================= ; real procedure INCBETA(X, P, Q, EPS); value X, P, Q, EPS; real X, P, Q, EPS; begin integer M, N; real G, F, FN, FN1, FN2, GN, GN1, GN2, DN, PQ; Boolean N EVEN, RECUR; real procedure GAMMA(X); value X; real X; code 35061; if X = 0 ∨ X = 1 then INCBETA := X else begin if X > .5 then begin F := P; P := Q; Q := F; X := 1-X; RECUR := true end else RECUR := false; G := FN2 := 0; M := 0; PQ := P + Q; F := FN1 := GN1 := GN2 := 1; N EVEN := false; for N := 1, N + 1 while ABS((F-G)/F) > EPS do begin if N EVEN then begin M := M + 1; DN := M × X × (Q-M)/(P + N-1)/(P + N) end else DN := -X × (P + M) × (PQ + M)/(P + N-1)/(P + N); G := F; FN := FN1 + DN × FN2; GN := GN1 + DN × GN2; N EVEN := ¬N EVEN; F := FN/GN; FN2 := FN1; FN1 := FN; GN2 := GN1; GN1 := GN end; F := F × X⭡P × (1-X)⭡Q × GAMMA(P + Q)/GAMMA(P + 1)/GAMMA(Q); if RECUR then F := 1-F; INCBETA := F end end INCBETA; comment ================== 35051 ================= ; procedure IBPPLUSN(X, P, Q, NMAX, EPS, I); value X, P, Q, NMAX, EPS; integer NMAX; real X, P, Q, EPS; array I; begin integer N; procedure IXQFIX(X, P, Q, NMAX, EPS, I); value X, P, Q, NMAX, EPS; real X, P, Q, EPS; integer NMAX; array I; code 35053; procedure IXPFIX(X, P, Q, NMAX, EPS, I); value X, P, Q, NMAX, EPS; real X, P, Q, EPS; integer NMAX; array I; code 35054; if X = 0 ∨ X = 1 then begin for N := 0 step 1 until NMAX do I[N] := X end else begin if X ≤ .5 then IXQFIX(X, P, Q, NMAX, EPS, I) else begin IXPFIX(1-X, Q, P, NMAX, EPS, I); for N := 0 step 1 until NMAX do I[N] := 1-I[N] end end end IBPPLUSN; comment ================== 35052 ================= ; procedure IBQPLUSN(X, P, Q, NMAX, EPS, I); value X, P, Q, NMAX, EPS; integer NMAX; real X, P, Q, EPS; array I; begin integer N; procedure IXQFIX(X, P, Q, NMAX, EPS, I); value X, P, Q, NMAX, EPS; real X, P, Q, EPS; integer NMAX; array I; code 35053; procedure IXPFIX(X, P, Q, NMAX, EPS, I); value X, P, Q, NMAX, EPS; real X, P, Q, EPS; integer NMAX; array I; code 35054; if X = 0 ∨ X = 1 then begin for N := 0 step 1 until NMAX do I[N] := X end else begin if X ≤ .5 then IXPFIX(X, P, Q, NMAX, EPS, I) else begin IXQFIX(1-X, Q, P, NMAX, EPS, I); for N := 0 step 1 until NMAX do I[N] := 1-I[N] end end end IBQPLUSN; comment ================== 35053 ================= ; procedure IXQFIX(X, P, Q, NMAX, EPS, I); value X, P, Q, NMAX, EPS; real X, P, Q, EPS; integer NMAX; array I; begin integer M, MMAX; real S, IQ0, IQ1, Q0; real procedure INCBETA(X, P, Q, EPS); value X, P, Q, EPS; real X, P, Q, EPS; code 35050; procedure FORWARD(X, P, Q, I0, I1, NMAX, I); value X, P, Q, I0, I1, NMAX; integer NMAX; real X, P, Q, I0, I1; array I; code 35055; procedure BACKWARD(X, P, Q, I0, NMAX, EPS, I); value X, P, Q, I0, NMAX, EPS; integer NMAX; real X, P, Q, I0, EPS; array I; code 35056; M := ENTIER(Q); S := Q-M; Q0 := if S > 0 then S else S + 1; MMAX := if S > 0 then M else M-1; IQ0 := INCBETA(X, P, Q0, EPS); if MMAX > 0 then IQ1 := INCBETA(X, P, Q0 + 1, EPS); begin array IQ[0:MMAX]; FORWARD(X, P, Q0, IQ0, IQ1, MMAX, IQ); BACKWARD(X, P, Q, IQ[MMAX], NMAX, EPS, I) end end IXQFIX; comment ================== 35054 ================= ; procedure IXPFIX(X, P, Q, NMAX, EPS, I); value X, P, Q, NMAX, EPS; real X, P, Q, EPS; integer NMAX; array I; begin integer M, MMAX; real S, P0, I0, I1, IQ0, IQ1; real procedure INCBETA(X, P, Q, EPS); value X, P, Q, EPS; real X, P, Q, EPS; code 35050; procedure FORWARD(X, P, Q, I0, I1, NMAX, I); value X, P, Q, I0, I1, NMAX; integer NMAX; real X, P, Q, I0, I1; array I; code 35055; procedure BACKWARD(X, P, Q, I0, NMAX, EPS, I); value X, P, Q, I0, NMAX, EPS; integer NMAX; real X, P, Q, I0, EPS; array I; code 35056; M := ENTIER(P); S := P-M; P0 := if S > 0 then S else S + 1; MMAX := if S > 0 then M else M-1; I0 := INCBETA(X, P0, Q, EPS); I1 := INCBETA(X, P0, Q + 1, EPS); begin array IP[0:MMAX]; BACKWARD(X, P0, Q, I0, MMAX, EPS, IP); IQ0 := IP[MMAX]; BACKWARD(X, P0, Q + 1, I1, MMAX, EPS, IP); IQ1 := IP[MMAX] end; FORWARD(X, P, Q, IQ0, IQ1, NMAX, I) end IXPFIX; comment ================== 35055 ================= ; procedure FORWARD(X, P, Q, I0, I1, NMAX, I); value X, P, Q, I0, I1, NMAX; integer NMAX; real X, P, Q, I0, I1; array I; begin integer M, N; real Y, R, S; I[0] := I0; if NMAX > 0 then I[1] := I1; M := NMAX-1; R := P + Q-1; Y := 1-X; for N := 1 step 1 until M do begin S := (N + R) × Y; I[N + 1] := ((N + Q + S) × I[N]-S × I[N-1])/(N + Q) end end FORWARD; comment ================== 35056 ================= ; procedure BACKWARD(X, P, Q, I0, NMAX, EPS, I); value X, P, Q, I0, NMAX, EPS; integer NMAX; real X, P, Q, I0, EPS; array I; begin integer M, N, NU; real R, PQ, Y, LOGX; array IAPPROX[0:NMAX]; I[0] := I0; if NMAX > 0 then begin for N := 1 step 1 until NMAX do IAPPROX[N] := 0; PQ := P + Q-1; LOGX := LN(X); R := NMAX + (LN(EPS) + Q × LN(NMAX))/LOGX; NU := ENTIER(R-Q × LN(R)/LOGX); L1: N := NU; R := X; L2: Y := (N + PQ) × X; R := Y/(Y + (N + P) × (1-R)); if N ≤ NMAX then I[N] := R; N := N-1; if N ≥ 1 then goto L2; R := I0; for N := 1 step 1 until NMAX do R := I[N] := I[N] × R; for N := 1 step 1 until NMAX do if ABS((I[N]-IAPPROX[N])/I[N]) > EPS then begin for M := 1 step 1 until NMAX do IAPPROX[M] := I[M]; NU := NU + 5; goto L1 end end end BACKWARD; comment ================== 34150 ================= ; Boolean procedure ZEROIN(X, Y, FX, TOLX); real X, Y, FX, TOLX; begin integer EXT; real C, FC, B, FB, A, FA, D, FD, FDB, FDA, W, MB, TOL, M, P, Q, DW; DW := DWARF; B := X; FB := FX; A := X := Y; FA := FX; INTERPOLATE: C := A; FC := FA; EXT := 0; EXTRAPOLATE: if ABS(FC) < ABS(FB) then begin if C ≠ A then begin D := A; FD := FA end; A := B; FA := FB; B := X := C; FB := FC; C := A; FC := FA end INTERCHANGE; TOL := TOLX; M := (C + B) × 0.5; MB := M - B; if ABS(MB) > TOL then begin if EXT > 2 then W := MB else begin TOL := TOL × SIGN(MB); P := (B - A) × FB; if EXT ≤ 1 then Q := FA - FB else begin FDB := (FD - FB) / (D - B); FDA := (FD - FA) / (D - A); P := FDA × P; Q := FDB × FA - FDA × FB end; if P < 0 then begin P := -P; Q := -Q end; W := if P < DW ∨ P ≤ Q × TOL then TOL else if P < MB × Q then P / Q else MB end; D := A; FD := FA; A := B; FA := FB; X := B := B + W; FB := FX; if (if FC ≥ 0 then FB ≥ 0 else FB ≤ 0) then goto INTERPOLATE else begin EXT := if W = MB then 0 else EXT + 1; goto EXTRAPOLATE end end; Y := C; ZEROIN := if FC ≥ 0 then FB ≤ 0 else FB ≥ 0 end ZEROIN; comment ================== 34440 ================= ; procedure MARQUARDT(M, N, PAR, G, V, FUNCT, JACOBIAN, IN, OUT); value M, N; integer M, N; array PAR, G, V, IN, OUT; Boolean procedure FUNCT; procedure JACOBIAN; begin integer MAXFE, FE, IT, I, J, ERR; real VV, WW, W, MU, RES, FPAR, FPARPRES, LAMBDA, LAMBDAMIN, P, PW, RELTOLRES, ABSTOLRES; array EM[0:7], VAL, B, BB, PARPRES[1:N], JAC[1:M, 1:N]; procedure MULCOL(L, U, S, T, A, B, X); code 31022; procedure DUPVEC(L, U, S, A, B); code 31030; real procedure VECVEC(L, U, S, A, B); code 34010; real procedure MATVEC(L, U, S, A, B); code 34011; real procedure TAMVEC(L, U, S, A, B); code 34012; real procedure MATTAM(L, U, S, T, A, B); code 34015; integer procedure QRISNGVALDEC(A, M, N, VAL, V, EM); code 34273; procedure LOCFUNCT(M, N, PAR, G); integer M, N; array PAR, G; begin FE := FE + 1; if FE ≥ MAXFE then ERR := 1 else if ¬FUNCT(M, N, PAR, G) then ERR := 2; if ERR ≠ 0 then goto EXIT end LOCFUNCT; VV := 10; W := 0.5; MU := 0.01; WW := (if IN[6] < 10-7 then 10-8 else 10-1 × IN[6]); EM[0] := EM[2] := EM[6] := IN[0]; EM[4] := 10 × N; RELTOLRES := IN[3]; ABSTOLRES := IN[4]⭡2; MAXFE := IN[5]; ERR := 0; FE := IT := 1; P := FPAR := RES := 0; PW := -LN(WW × IN[0])/2.30; if ¬FUNCT(M, N, PAR, G) then begin ERR := 3; goto ESCAPE end; FPAR := VECVEC(1, M, 0, G, G); OUT[3] := SQRT(FPAR); for IT := 1, IT + 1 while FPAR > ABSTOLRES ∧ RES > RELTOLRES × FPAR + ABSTOLRES do begin JACOBIAN(M, N, PAR, G, JAC, LOCFUNCT); I := QRISNGVALDEC(JAC, M, N, VAL, V, EM); if IT = 1 then LAMBDA := IN[6] × VECVEC(1, N, 0, VAL, VAL) else if P = 0 then LAMBDA := LAMBDA × W else P := 0; for I := 1 step 1 until N do B[I] := VAL[I] × TAMVEC(1, M, I, JAC, G); L: for I := 1 step 1 until N do BB[I] := B[I]/(VAL[I] × VAL[I] + LAMBDA); for I := 1 step 1 until N do PARPRES[I] := PAR[I] - MATVEC(1, N, I, V, BB); LOCFUNCT(M, N, PARPRES, G); FPARPRES := VECVEC(1, M, 0, G, G); RES := FPAR-FPARPRES; if RES < MU × VECVEC(1, N, 0, B, BB) then begin P := P + 1; LAMBDA := VV × LAMBDA; if P = 1 then begin LAMBDAMIN := WW × VECVEC(1, N, 0, VAL, VAL); if LAMBDA < LAMBDAMIN then LAMBDA := LAMBDAMIN end; if P < PW then goto L else begin ERR := 4; goto EXIT end; end; DUPVEC(1, N, 0, PAR, PARPRES); FPAR := FPARPRES end ITERATION; EXIT: for I := 1 step 1 until N do MULCOL(1, N, I, I, JAC, V, 1/(VAL[I] + IN[0])); for I := 1 step 1 until N do for J := 1 step 1 until I do V[I, J] := V[J, I] := MATTAM(1, N, I, J, JAC, JAC); LAMBDA := LAMBDAMIN := VAL[1]; for I := 2 step 1 until N do if VAL[I] > LAMBDA then LAMBDA := VAL[I] else if VAL[I] < LAMBDAMIN then LAMBDAMIN := VAL[I]; OUT[7] := (LAMBDA/(LAMBDAMIN + IN[0]))⭡2; OUT[2] := SQRT(FPAR); OUT[6] := SQRT(RES + FPAR)-OUT[2]; ESCAPE: OUT[4] := FE; OUT[5] := IT-1; OUT[1] := ERR end MARQUARDT; comment ================== 33135 ================= ; procedure IMPEX (N, T0, TEND, Y0, DERIV, AVAILABLE, H0, HMAX, PRESCH, EPS, WEIGHTS, UPDATE, FAIL, CONTROL); value N; integer N; real T0, TEND, H0, HMAX, EPS; Boolean PRESCH, FAIL; array Y0, WEIGHTS; Boolean procedure AVAILABLE; procedure DERIV, UPDATE, CONTROL; begin integer I, K, ECI; real T, T1, T2, T3, TP, H, H2, HNEW, ALF, LQ; array Y, Z, S1, S2, S3, U1, U3, W1, W2, W3, EHR[1:N], R, RF[1:5, 1:N], ERR[1:3], A1, A2[1:N, 1:N]; integer array PS1, PS2[1:N]; Boolean START, TWO, HALV; procedure INIVEC(L, U, A, X); code 31010; procedure INIMAT(LR, UR, LC, UC, A, X); code 31011; procedure MULVEC(L, U, SHIFT, A, B, X); code 31020; procedure MULROW(L, U, I, J, A, B, X); code 31021; procedure DUPVEC(L, U, SHIFT, A, B); code 31030; procedure DUPROWVEC(L, U, I, A, B); code 31032; procedure DUPMAT(L, U, I, J, A, B); code 31035; real procedure VECVEC(L, U, SHIFT, A, B); code 34010; real procedure MATVEC(L, U, I, A, B); code 34011; real procedure MATMAT(L, U, I, J, A, B); code 34013; procedure ELMVEC(L, U, SHIFT, A, B, X); code 34020; procedure ELMROW(L, U, I, J, A, B, X); code 34024; procedure DEC(A, N, AUX, P); code 34300; procedure SOL(A, N, P, B); code 34051; procedure DFDY(T, Y, A); real T; array Y, A; begin integer I, J; real SL; array F1, F2[1:N]; DERIV(T, Y, F1, N); for I := 1 step 1 until N do begin SL := 10-6 × Y[I]; if ABS(SL) < 10-6 then SL := 10-6; Y[I] := Y[I] + SL; DERIV(T, Y, F2, N); for J := 1 step 1 until N do A[J, I] := (F2[J]-F1[J])/SL; Y[I] := Y[I]-SL; end end DFDY; procedure STARTV(Y, T); value T; real T; array Y; begin real A, B, C; A := (T-T1)/(T1-T2); B := (T-T2)/(T1-T3); C := (T-T1)/(T2-T3) × B; B := A × B; A := 1 + A + B; B := A + C-1; MULVEC(1, N, 0, Y, S1, A); ELMVEC(1, N, 0, Y, S2, -B); ELMVEC(1, N, 0, Y, S3, C) end STARTV; procedure ITERATE(Z, Y, A, H, T, WEIGHTS, FAIL, PS); array Z, Y, A, WEIGHTS; real H, T; label FAIL; integer array PS; begin integer IT, LIT; real MAX, MAX1, CONV; array DZ, F1[1:N]; for I := 1 step 1 until N do Z[I] := (Z[I] + Y[I])/2; IT := LIT := 1; CONV := 1; ATER: DERIV(T, Z, F1, N); for I := 1 step 1 until N do F1[I] := DZ[I] := Z[I]-H × F1[I]/2-Y[I]; SOL(A, N, PS, DZ); ELMVEC(1, N, 0, Z, DZ, -1); MAX := 0; for I := 1 step 1 until N do MAX := MAX + (WEIGHTS[I] × DZ[I])⭡2; MAX := SQRT(MAX); if MAX × CONV < EPS/10 then goto OUT; IT := IT + 1; if IT = 2 then goto ASS; CONV := MAX/MAX1; if CONV > .2 then begin if LIT = 0 then goto FAIL; LIT := 0; CONV := 1; IT := 1; RECOMP(A, H, T, Z, FAIL, PS); end; ASS: MAX1 := MAX; goto ATER; OUT: for I := 1 step 1 until N do Z[I] := 2 × Z[I]-Y[I]; end ITERATE; procedure RECOMP(A, H, T, Y, FAIL, PS); real H, T; array A, Y; label FAIL; integer array PS; begin real SL; array AUX[1:3]; SL := H/2; if ¬AVAILABLE(T, Y, A, N) then DFDY(T, Y, A); for I := 1 step 1 until N do begin MULROW(1, N, I, I, A, A, -SL); A[I, I] := 1 + A[I, I] end; AUX[2] := 10-14; DEC(A, N, AUX, PS); if AUX[3] < N then goto FAIL end RECOMP; procedure INITIALIZATION; begin H2 := HNEW; H := H2/2; DUPVEC(1, N, 0, S1, Y0); DUPVEC(1, N, 0, S2, Y0); DUPVEC(1, N, 0, S3, Y0); DUPVEC(1, N, 0, W1, Y0); DUPROWVEC(1, N, 1, R, Y0); INIVEC(1, N, U1, 0); INIVEC(1, N, W2, 0); INIMAT(2, 5, 1, N, R, 0); INIMAT(1, 5, 1, N, RF, 0); T := T1 := T0; T2 := T0-2 × H-106; T3 := 2 × T2 + 1; RECOMP(A1, H, T, S1, MISS, PS1); RECOMP(A2, H2, T, W1, MISS, PS2); end procedure ONE LARGE STEP; begin STARTV(Z, T + H); ITERATE(Z, S1, A1, H, T + H/2, WEIGHTS, MISS, PS1); DUPVEC(1, N, 0, Y, Z); STARTV(Z, T + H2); ITERATE(Z, Y, A1, H, T + 3 × H/2, WEIGHTS, MISS, PS1); DUPVEC(1, N, 0, U3, U1); DUPVEC(1, N, 0, U1, Y); DUPVEC(1, N, 0, S3, S2); DUPVEC(1, N, 0, S2, S1); DUPVEC(1, N, 0, S1, Z); ELMVEC(1, N, 0, Z, W1, 1); ELMVEC(1, N, 0, Z, S2, -1); ITERATE(Z, W1, A2, H2, T + H, WEIGHTS, MISS, PS2); T3 := T2; T2 := T1; T1 := T + H2; DUPVEC(1, N, 0, W3, W2); DUPVEC(1, N, 0, W2, W1); DUPVEC(1, N, 0, W1, Z); end; procedure CHANGE OF INFORMATION; begin real ALF1, C1, C2, C3; array KOF[2:4, 2:4], E, D[1:4]; C1 := HNEW/H2; C2 := C1 × C1; C3 := C2 × C1; KOF[2, 2] := C1; KOF[2, 3] := (C1-C2)/2; KOF[2, 4] := C3/6-C2/2 + C1/3; KOF[3, 3] := C2; KOF[3, 4] := C2-C3; KOF[4, 4] := C3; for I := 1 step 1 until N do U1[I] := R[2, I] + R[3, I]/2 + R[4, I]/3; ALF1 := MATVEC(1, N, 1, RF, U1)/VECVEC(1, N, 0, U1, U1); ALF := (ALF + ALF1) × C1; for I := 1 step 1 until N do begin E[1] := RF[1, I]-ALF1 × U1[I]; E[2] := RF[2, I]-ALF1 × 2 × R[3, I]; E[3] := RF[3, I]-ALF1 × 4 × R[4, I]; E[4] := RF[4, I]; D[1] := R[1, I]; RF[1, I] := E[1] := E[1] × C2; for K := 2 step 1 until 4 do begin R[K, I] := D[K] := MATMAT(K, 4, K, I, KOF, R); RF[K, I] := E[K] := C2 × MATVEC(K, 4, K, KOF, E) end K; S1[I] := D[1] + E[1]; W1[I] := D[1] + 4 × E[1]; S2[I] := S1[I]-(D[2] + E[2]/2); S3[I] := S2[I]-(D[2] + E[2]) + (D[3] + E[3]/2); end I; T3 := T-HNEW; T2 := T-HNEW/2; T1 := T; H2 := HNEW; H := H2/2; ERR[1] := 0; if HALV then begin DUPVEC(1, N, 0, PS2, PS1); DUPMAT(1, N, 1, N, A2, A1) end; if TWO then begin DUPVEC(1, N, 0, PS1, PS2); DUPMAT(1, N, 1, N, A1, A2) end else RECOMP(A1, HNEW/2, T, S1, MISS, PS1); if ¬HALV then RECOMP(A2, HNEW, T, W1, MISS, PS2); end; procedure BACKWARD DIFFERENCES; for I := 1 step 1 until N do begin real B0, B1, B2, B3; B1 := (U1[I] + 2 × S2[I] + U3[I])/4; B2 := (W1[I] + 2 × W2[I] + W3[I])/4; B3 := (S3[I] + 2 × U3[I] + S2[I])/4; B2 := (B2-B1)/3; B0 := B1-B2; B2 := B2-(S1[I]-2 × S2[I] + S3[I])/16; B1 := 2 × B3-(B2 + RF[1, I])-(B0 + R[1, I])/2; B3 := 0; for K := 1 step 1 until 4 do begin B1 := B1-B3; B3 := R[K, I]; R[K, I] := B0; B0 := B0-B1 end; R[5, I] := B0; for K := 1 step 1 until 4 do begin B3 := RF[K, I]; RF[K, I] := B2; B2 := B2-B3 end; RF[5, I] := B2; end; procedure ERROR ESTIMATES; begin real C0, C1, C2, C3, B0, B1, B2, B3, W, SL1, SN, LR; C0 := C1 := C2 := C3 := 0; for I := 1 step 1 until N do begin W := WEIGHTS[I]⭡2; B0 := RF[4, I]/36; C0 := C0 + B0 × B0 × W; LR := ABS(B0); B1 := RF[1, I] + ALF × R[2, I]; C1 := C1 + B1 × B1 × W; B2 := RF[3, I]; C2 := C2 + B2 × B2 × W; SL1 := ABS(RF[1, I]-RF[2, I]); SN := if SL1 < 10-10 then 1 else ABS(RF[1, I]-R[4, I]/6)/SL1; if SN > 1 then SN := 1; if START then begin SN := SN⭡4; LR := LR × 4 end; EHR[I] := B3 := SN × EHR[I] + LR; C3 := C3 + B3 × B3 × W; end I; B0 := ERR[1]; ERR[1] := B1 := SQRT(C0); ERR[2] := SQRT(C1); ERR[3] := SQRT(C3) + SQRT(C2)/2; LQ := EPS/(if B0 < B1 then B1 else B0); if B0 < B1 ∧ LQ ≥ 80 then LQ := 10; end; procedure REJECT; if START then begin HNEW := LQ⭡(1/5) × H/2; goto INIT end else begin for K := 1, 2, 3, 4, 1, 2, 3 do ELMROW(1, N, K, K + 1, R, R, -1); for K := 1, 2, 3, 4 do ELMROW(1, N, K, K + 1, RF, RF, -1); T := T-H2; HALV := true; HNEW := H; goto MSTP end; procedure STEPSIZE; if LQ < 2 then begin HALV := true; HNEW := H end else begin if LQ > 80 then HNEW := (if LQ > 5120 then (LQ/5)⭡(1/5) else 2) × H2; if HNEW > HMAX then HNEW := HMAX; if TEND > T ∧ TEND-T < HNEW then HNEW := TEND-T; TWO := HNEW = 2 × H2; end; if PRESCH then H := H0 else begin if H0 > HMAX then H := HMAX else H := H0; if H > (TEND-T0)/4 then H := (TEND-T0)/4; end; HNEW := H; ALF := 0; T := TP := T0; INIVEC(1, 3, ERR, 0); INIVEC(1, N, EHR, 0); DUPROWVEC(1, N, 1, R, Y0); CONTROL(TP, T, H, HNEW, R, ERR, N); INIT: INITIALIZATION; START := true; for ECI := 0, 1, 2, 3 do begin ONE LARGE STEP; T := T + H2; if ECI > 0 then begin BACKWARD DIFFERENCES; UPDATE(WEIGHTS, S2, N) end end; ECI := 4; MSTP: if HNEW ≠ H2 then begin ECI := 1; CHANGE OF INFORMATION; ONE LARGE STEP; T := T + H2; ECI := 2; end; ONE LARGE STEP; BACKWARD DIFFERENCES; UPDATE(WEIGHTS, S2, N); ERROR ESTIMATES; if ECI < 4 ∧ LQ > 80 then LQ := 20; HALV := TWO := false; if PRESCH then goto TRYCK; if LQ < 1 then REJECT else STEPSIZE; TRYCK: if TP ≤ T then CONTROL(TP, T, H, HNEW, R, ERR, N); if START then START := false; if HNEW = H2 then T := T + H2; ECI := ECI + 1; if T < TEND + H2 then goto MSTP else goto END; MISS: FAIL := PRESCH; if ¬FAIL then begin if ECI > 1 then T := T-H2; HALV := TWO := false; HNEW := H2/2; if START then goto INIT else goto TRYCK end; END: end IMPEX; comment ================== 35021 ================= ; procedure ERRORFUNCTION(X, ERF, ERFC); value X; real X, ERF, ERFC; if X > 26 then begin ERF := 1; ERFC := 0 end else if X < -5.5 then begin ERF := -1; ERFC := 2 end else begin real ABSX, C, P, Q; real procedure NONEXPERFC(X); code 35022; ABSX := ABS(X); if ABSX ≤ 0.5 then begin C := X × X; P := ((-0.35609 84370 1815410-1 × C + 0.69963 83488 6191410+1) × C + 0.21979 26161 8294210+2) × C + 0.24266 79552 3053210+3; Q := ((C + 0.15082 79763 0407810+2) × C + 0.91164 90540 4514910+2) × C + 0.21505 88758 6986110+3; ERF := X × P / Q; ERFC := 1 - ERF end else begin ERFC := EXP(-X × X) × NONEXPERFC(ABSX); ERF := 1 - ERFC; if X < 0 then begin ERF := -ERF; ERFC := 2 - ERFC end end end ERRORFUNCTION; comment ================== 35022 ================= ; real procedure NONEXPERFC(X); value X; real X; begin real ABSX, ERF, ERFC, C, P, Q; procedure ERRORFUNCTION(X, ERF, ERFC); code 35021; ABSX := ABS(X); if ABSX ≤ 0.5 then begin ERRORFUNCTION(X, ERF, ERFC); NONEXPERFC := EXP(X × X) × ERFC end else if ABSX < 4 then begin C := ABSX; P := ((((((-0.13686 48573 8271710-6 × C + 0.56419 55174 7897410+0) × C + 0.72117 58250 8830910+1) × C + 0.43162 22722 2056710+2) × C + 0.15298 92850 4694010+3) × C + 0.33932 08167 3434410+3) × C + 0.45191 89537 1187310+3) × C + 0.30045 92610 2016210+3; Q := ((((((C + 0.12782 72731 9629410+2) × C + 0.77000 15293 5229510+2) × C + 0.27758 54447 4398810+3) × C + 0.63898 02644 6563110+3) × C + 0.93135 40948 5061010+3) × C + 0.79095 09253 2789810+3) × C + 0.30045 92609 5698310+3; NONEXPERFC := if X > 0 then P / Q else EXP(X × X) × 2 - P / Q end else begin C := 1 / X / X; P := (((0.22319 24597 3418510-1 × C + 0.27866 13086 0964810-0) × C + 0.22695 65935 3968710-0) × C + 0.49473 09106 2325110-1) × C + 0.29961 07077 0354210-2; Q := (((C + 0.19873 32018 1713510+1) × C + 0.10516 75107 0679310+1) × C + 0.19130 89261 0783010+0) × C + 0.10620 92305 2846810-1; C := (C × (-P) / Q + 0.56418 95835 47756) / ABSX; NONEXPERFC := if X > 0 then C else EXP(X × X) × 2 - C end end NONEXPERFC; comment ================== 35027 ================= ; procedure FRESNEL(X, C, S); value X; real X, C, S; begin real ABSX, X3, X4, A, P, Q, F, G, C1, S1; procedure FG(X, F, G); code 35028; ABSX := ABS(X); if ABSX ≤ 1.2 then begin A := X × X; X3 := A × X; X4 := A × A; P := (((5.47711 38568 268710-6 × X4 - 5.28079 65137 262310-4) × X4 + 1.76193 95254 349110-2) × X4 - 1.99460 89882 618410-1) × X4 + 1; Q := (((1.18938 90142 287610-7 × X4 + 1.55237 88527 699410-5) × X4 + 1.09957 21502 564210-3) × X4 + 4.72792 11201 045310-2) × X4 + 1; C := X × P / Q; P := (((6.71748 46662 514110-7 × X4 - 8.45557 28435 277710-5) × X4 + 3.87782 12346 368310-3) × X4 - 7.07489 91514 452310-2) × X4 + 5.23598 77559 829910-1; Q := (((5.95281 22767 841010-8 × X4 + 9.62690 87593 903410-6) × X4 + 8.17091 94215 213410-4) × X4 + 4.11223 15114 238410-2) × X4 + 1; S := X3 × P / Q end else if ABSX ≤ 1.6 then begin A := X × X; X3 := A × X; X4 := A × A; P := ((((-5.68293 31012 187110-8 × X4 + 1.02365 43505 610610-5) × X4 - 6.71376 03469 492210-4) × X4 + 1.91870 27943 174710-2) × X4 - 2.07073 36033 532410-1) × X4 + 1.00000 00000 011110+0; Q := ((((4.41701 37406 501010-10 × X4 + 8.77945 37789 236910-8) × X4 + 1.01344 63086 674910-5) × X4 + 7.88905 24505 236010-4) × X4 + 3.96667 49695 232310-2) × X4 + 1; C := X × P / Q; P := ((((-5.76765 81559 308910-9 × X4 + 1.28531 04374 272510-6) × X4 - 1.09540 02391 143510-4) × X4 + 4.30730 52650 436710-3) × X4 - 7.37766 91401 019110-2) × X4 + 5.23598 77559 834410-1; Q := ((((2.05539 12445 858010-10 × X4 + 5.03090 58124 661210-8) × X4 + 6.87086 26571 862010-6) × X4 + 6.18224 62019 547310-4) × X4 + 3.53398 34276 747210-2) × X4 + 1; S := X3 × P / Q end else if ABSX < 1015 then begin FG(X, F, G); A := X × X; A := (A - ENTIER(A / 4) × 4) × 1.57079 63267 9490; C1 := COS(A); S1 := SIN(A); A := if X < 0 then -0.5 else 0.5; C := F × S1 - G × C1 + A; S := -F × C1 - G × S1 + A end else C := S := SIGN(X) × 0.5 end FRESNEL; comment ================== 35028 ================= ; procedure FG(X, F, G); value X; real X, F, G; begin real ABSX, C, S, C1, S1, A, XINV, X3INV, C4, P, Q; procedure FRESNEL(X, C, S); code 35027; ABSX := ABS(X); if ABSX ≤ 1.6 then begin FRESNEL(X, C, S); A := X × X × 1.57079 63267 9490; C1 := COS(A); S1 := SIN(A); A := if X < 0 then -0.5 else 0.5; P := A - C; Q := A - S; F := Q × C1 - P × S1; G := P × C1 + Q × S1 end else if ABSX ≤ 1.9 then begin XINV := 1 / X; A := XINV × XINV; X3INV := A × XINV; C4 := A × A; P := (((1.35304 23554 038810+1 × C4 + 6.98534 26160 102110+1) × C4 + 4.80340 65557 792510+1) × C4 + 8.03588 12280 394210+0) × C4 + 3.18309 26850 490610-1; Q := (((6.55630 64008 391610+1 × C4 + 2.49561 99380 517210+2) × C4 + 1.57611 00558 012310+2) × C4 + 2.55491 61843 579510+1) × C4 + 1; F := XINV × P / Q; P := ((((2.05421 43249 850110+1 × C4 + 1.96232 03797 166310+2) × C4 + 1.99182 81867 890310+2) × C4 + 5.31122 81348 098910+1) × C4 + 4.44533 82755 051210+0) × C4 + 1.01320 61881 027510-1; Q := ((((1.01379 48339 600310+3 × C4 + 3.48112 14785 654510+3) × C4 + 2.54473 13318 182210+3) × C4 + 5.83590 57571 642910+2) × C4 + 4.53925 01967 368910+1) × C4 + 1; G := X3INV × P / Q end else if ABSX ≤ 2.4 then begin XINV := 1 / X; A := XINV × XINV; X3INV := A × XINV; C4 := A × A; P := ((((7.17703 24936 514010+2 × C4 + 3.09145 16157 443010+3) × C4 + 1.93007 64078 671610+3) × C4 + 3.39837 13492 698410+2) × C4 + 1.95883 94102 196910+1) × C4 + 3.18309 88182 201710-1; Q := ((((3.36121 69918 055110+3 × C4 + 1.09334 24898 880910+4) × C4 + 6.33747 15585 114410+3) × C4 + 1.08535 06750 065010+3) × C4 + 6.18427 13817 288710+1) × C4 + 1; F := XINV × P / Q; P := ((((3.13330 16306 875610+2 × C4 + 1.59268 00608 535410+3) × C4 + 9.08311 74952 959410+2) × C4 + 1.40959 61791 131610+2) × C4 + 7.11205 00178 978310+0) × C4 + 1.01321 16176 180510-1; Q := ((((1.15149 83237 626110+4 × C4 + 2.41315 56721 337010+4) × C4 + 1.06729 67803 058110+4) × C4 + 1.49051 92279 732910+3) × C4 + 7.17128 59693 930210+1) × C4 + 1; G := X3INV × P / Q end else begin XINV := 1 / X; A := XINV × XINV; X3INV := A × XINV; C4 := A × A; P := ((((2.61294 75322 514210+4 × C4 + 6.13547 11361 470010+4) × C4 + 1.34922 02817 185710+4) × C4 + 8.16343 40178 437510+2) × C4 + 1.64797 71284 124610+1) × C4 + 9.67546 03296 709010-2; Q := ((((1.37012 36481 722610+6 × C4 + 1.00105 47890 079110+6) × C4 + 1.65946 46262 185310+5) × C4 + 9.01827 59623 152410+3) × C4 + 1.73871 69067 364910+2) × C4 + 1; F := (C4 × (-P) / Q + 0.31830 98861 83791) × XINV; P := (((((1.72590 22465 483710+6 × C4 + 6.66907 06166 863610+6) × C4 + 1.77758 95083 803010+6) × C4 + 1.35678 86781 375610+5) × C4 + 3.87754 14174 637810+3) × C4 + 4.31710 15782 335810+1) × C4 + 1.53989 73381 976910-1; Q := (((((1.40622 44112 358010+8 × C4 + 9.38695 86253 163510+7) × C4 + 1.62095 60050 023210+7) × C4 + 1.02878 69305 668810+6) × C4 + 2.69183 18039 624310+4) × C4 + 2.86733 19497 589910+2) × C4 + 1; G := (C4 × (-P) / Q + 0.10132 11836 42338) × X3INV end end FG; comment ================== 34453 ================= ; Boolean procedure ZEROINDER(X, Y, FX, DFX, TOLX); real X, Y, FX, DFX, TOLX; begin integer EXT; real B, FB, DFB, A, FA, DFA, C, FC, DFC, D, W, MB, TOL, M, P, Q, DW; real procedure DWARF; code 30003; DW := DWARF; B := X; FB := FX; DFB := DFX; A := X := Y; FA := FX; DFA := DFX; INTERPOLATE: C := A; FC := FA; DFC := DFA; EXT := 0; EXTRAPOLATE: if ABS(FC) < ABS(FB) then begin A := B; FA := FB; DFA := DFB; B := X := C; FB := FC; DFB := DFC; C := A; FC := FA; DFC := DFA end INTERCHANGE; TOL := TOLX; M := (C + B) × 0.5; MB := M - B; if ABS(MB) > TOL then begin if EXT > 2 then W := MB else begin TOL := TOL × SIGN(MB); D := if EXT = 2 then DFA else (FB - FA) / (B - A); P := FB × D × (B - A); Q := FA × DFB - FB × D; if P < 0 then begin P := -P; Q := -Q end; W := if P < DW ∨ P ≤ Q × TOL then TOL else if P < MB × Q then P / Q else MB; end; A := B; FA := FB; DFA := DFB; X := B := B + W; FB := FX; DFB := DFX; if (if FC ≥ 0 then FB ≥ 0 else FB ≤ 0) then goto INTERPOLATE else begin EXT := if W = MB then 0 else EXT + 1; goto EXTRAPOLATE end end; Y := C; ZEROINDER := if FC ≥ 0 then FB ≤ 0 else FB ≥ 0 end ZEROINDER; comment ================== 34432 ================= ; procedure PRAXIS(N, X, FUNCT, IN, OUT); value N; integer N; array X, IN, OUT; real procedure FUNCT; begin comment THIS PROCEDURE MINIMIZES FUNCT(N, X), WITH THE PRINCIPAL AXIS METHOD (SEE BRENT, R.P, 1973, ALGORITHMS FOR MINIMIZATION WITHOUT DERIVATIVES, CH.7); procedure INIVEC(L, U, A, X); code 31010; procedure INIMAT(L, U, K, V, A, X); code 31011; procedure DUPVEC(L, U, K, A, X); code 31030; procedure DUPMAT(L, U, K, V, A, B); code 31035; procedure DUPCOLVEC(L, U, K, A, B); code 31034; procedure MULROW(L, U, I, J, A, B, X); code 31021; procedure MULCOL(L, U, I, J, A, B, X); code 31022; real procedure VECVEC(L, U, S, A, B); code 34010; real procedure TAMMAT(L, U, I, J, A, B); code 34014; real procedure MATTAM(L, U, I, J, A, B); code 34015; procedure ICHROWCOL(L, U, I, J, A); code 34033; procedure ELMVECCOL(L, U, I, A, B, X); code 34021; integer procedure QRISNGVALDEC(A, M, N, VAL, V, EM); code 34273; procedure SETRANDOM(X); code 11014; real procedure RANDOM; code 11015; real procedure DWARF; code 30003; procedure SORT; begin integer I, J, K; real S; for I := 1 step 1 until N - 1 do begin K := I; S := D[I]; for J := I + 1 step 1 until N do if D[J] > S then begin K := J; S := D[J] end; if K > I then begin D[K] := D[I]; D[I] := S; for J := 1 step 1 until N do begin S := V[J, I]; V[J, I] := V[J, K]; V[J, K] := S end end end end SORT; procedure MIN(J, NITS, D2, X1, F1, FK); value J, NITS, FK; integer J, NITS; real D2, X1, F1; Boolean FK; begin real procedure FLIN(L); value L; real L; begin integer I; array T[1:N]; if J > 0 then begin for I := 1 step 1 until N do T[I] := X[I] + L × V[I, J] end else begin comment SEARCH ALONG PARABOLIC SPACE CURVE; QA := L × (L - QD1) / (QD0 × (QD0 + QD1)); QB := (L + QD0) × (QD1 - L) /(QD0 × QD1); QC := L × (L + QD0) / (QD1 × (QD0 + QD1)); for I := 1 step 1 until N do T[I] := QA × Q0[I] + QB × X[I] + QC × Q1[I] end; NF := NF + 1; FLIN := FUNCT(N, T) end FLIN; integer K; Boolean DZ; real X2, XM, F0, F2, FM, D1, T2, S, SF1, SX1; SF1 := F1; SX1 := X1; K := 0; XM := 0; F0 := FM := FX; DZ := D2 < RELTOL; S := SQRT(VECVEC(1, N, 0, X, X)); T2 := M4 × SQRT(ABS(FX) / (if DZ then DMIN else D2) + S × LDT) + M2 × LDT; S := S × M4 + ABSTOL; if DZ ∧ T2 > S then T2 := S; if T2 < SMALL then T2 := SMALL; if T2 > 0.01 × H then T2 := 0.01 × H; if FK ∧ F1 ≤ FM then begin XM := X1; FM := F1 end; if ¬FK ∨ ABS(X1) < T2 then begin X1 := if X1 > 0 then T2 else -T2; F1 := FLIN(X1) end; if F1 ≤ FM then begin XM := X1; FM := F1 end; L0: if DZ then begin comment EVALUATE FLIN AT ANOTHER POINT AND ESTIMATE THE SECOND DERIVATIVE; X2 := if F0 < F1 then -X1 else X1 × 2; F2 := FLIN(X2); if F2 ≤ FM then begin XM := X2; FM := F2 end; D2 := (X2 × (F1-F0)-X1 × (F2-F0))/(X1 × X2 × (X1-X2)) end; comment ESTIMATE FIRST DERIVATIVE AT 0; D1 := (F1-F0)/X1-X1 × D2; DZ := true; X2 := if D2 ≤ SMALL then (if D1 < 0 then H else -H) else -0.5 × D1/D2; if ABS(X2) > H then X2 := if X2 > 0 then H else -H; L1: F2 := FLIN(X2); if K < NITS ∧ F2 > F0 then begin K := K + 1; if F0 < F1 ∧ X1 × X2 > 0 then goto L0; X2 := 0.5 × X2; goto L1 end; NL := NL + 1; if F2 > FM then X2 := XM else FM := F2; D2 := if ABS(X2 × (X2-X1)) > SMALL then (X2 × (F1-F0)-X1 × (FM-F0))/(X1 × X2 × (X1-X2)) else if K > 0 then 0 else D2; if D2 ≤ SMALL then D2 := SMALL; X1 := X2; FX := FM; if SF1 < FX then begin FX := SF1; X1 := SX1 end; if J > 0 then ELMVECCOL(1, N, J, X, V, X1) end MIN; procedure QUAD; begin integer I; real L, S; S := FX; FX := QF1; QF1 := S; QD1 := 0; for I := 1 step 1 until N do begin S := X[I]; X[I] := L := Q1[I]; Q1[I] := S; QD1 := QD1 + (S - L) ⭡ 2 end; L := QD1 := SQRT(QD1); S := 0; if (QD0 × QD1 > DWARF) ∧ NL ≥ 3 × N × N then begin MIN(0, 2, S, L, QF1, true); QA := L × (L-QD1)/(QD0 × (QD0 + QD1)); QB := (L + QD0) × (QD1-L)/(QD0 × QD1); QC := L × (L + QD0)/(QD1 × (QD0 + QD1)) end else begin FX := QF1; QA := QB := 0; QC := 1 end; QD0 := QD1; for I := 1 step 1 until N do begin S := Q0[I]; Q0[I] := X[I]; X[I] := QA × S + QB × X[I] + QC × Q1[I] end end QUAD; Boolean ILLC; integer I, J, K, K2, NL, MAXF, NF, KL, KT, KTM; real S, SL, DN, DMIN, FX, F1, LDS, LDT, SF, DF, QF1, QD0, QD1, QA, QB, QC, M2, M4, SMALL, VSMALL, LARGE, VLARGE, SCBD, LDFAC, T2, MACHEPS, RELTOL, ABSTOL, H; array V[1:N, 1:N], D, Y, Z, Q0, Q1[1:N]; MACHEPS := IN[0]; RELTOL := IN[1]; ABSTOL := IN[2]; MAXF := IN[5]; H := IN[6]; SCBD := IN[7]; KTM := IN[8]; ILLC := IN[9] < 0; SMALL := MACHEPS ⭡ 2; VSMALL := SMALL ⭡ 2; LARGE := 1/SMALL; VLARGE := 1/VSMALL; M2 := RELTOL; M4 := SQRT(M2); SETRANDOM(0.5); LDFAC := if ILLC then 0.1 else 0.01; KT := NL := 0; NF := 1; OUT[3] := QF1 := FX := FUNCT(N, X); ABSTOL := T2 := SMALL + ABS(ABSTOL); DMIN := SMALL; if H < ABSTOL × 100 then H := ABSTOL × 100; LDT := H; INIMAT(1, N, 1, N, V, 0); for I := 1 step 1 until N do V[I, I] := 1; D[1] := QD0 := 0; DUPVEC(1, N, 0, Q1, X); INIVEC(1, N, Q0, 0); comment MAIN LOOP; L0: SF := D[1]; D[1] := S := 0; MIN(1, 2, D[1], S, FX, false); if S ≤ 0 then MULCOL(1, N, 1, 1, V, V, -1); if SF ≤ 0.9 × D[1] ∨ 0.9 × SF ≥ D[1] then INIVEC(2, N, D, 0); for K := 2 step 1 until N do begin DUPVEC(1, N, 0, Y, X); SF := FX; ILLC := ILLC ∨ KT > 0; L1: KL := K; DF := 0; if ILLC then begin comment RANDOM STOP TO GET OFF RESULTION VALLEY; for I := 1 step 1 until N do begin S := Z[I] := (0.1 × LDT + T2 × 10⭡KT) × (RANDOM-0.5); ELMVECCOL(1, N, I, X, V, S) end; FX := FUNCT(N, X); NF := NF + 1 end; for K2 := K step 1 until N do begin SL := FX; S := 0; MIN (K2, 2, D[K2], S, FX, false); S := if ILLC then D[K2] × (S + Z[K2]) ⭡ 2 else SL-FX; if DF < S then begin DF := S; KL := K2 end; end; if ¬ILLC ∧ DF < ABS(100 × MACHEPS × FX) then begin ILLC := true; goto L1 end; for K2 := 1 step 1 until K-1 do begin S := 0; MIN(K2, 2, D[K2], S, FX, false) end; F1 := FX; FX := SF; LDS := 0; for I := 1 step 1 until N do begin SL := X[I]; X[I] := Y[I]; SL := Y[I] := SL - Y[I]; LDS := LDS + SL × SL end; LDS := SQRT(LDS); if LDS > SMALL then begin for I := KL - 1 step -1 until K do begin for J := 1 step 1 until N do V[J, I + 1] := V[J, I]; D[I + 1] := D[I] end; D[K] := 0; DUPCOLVEC(1, N, K, V, Y); MULCOL(1, N, K, K, V, V, 1 / LDS); MIN(K, 4, D[K], LDS, F1, true); if LDS ≤ 0 then begin LDS := LDS; MULCOL(1, N, K, K, V, V, -1) end end; LDT := LDFAC × LDT; if LDT < LDS then LDT := LDS; T2 := M2 × SQRT(VECVEC(1, N, 0, X, X)) + ABSTOL; KT := if LDT > 0.5 × T2 then 0 else KT + 1; if KT > KTM then begin OUT[1] := 0; goto L2 end end; QUAD; DN := 0; for I := 1 step 1 until N do begin D[I] := 1/SQRT(D[I]); if DN < D[I] then DN := D[I] end; for J := 1 step 1 until N do begin S := D[J]/DN; MULCOL(1, N, J, J, V, V, S) end; if SCBD > 1 then begin S := VLARGE; for I := 1 step 1 until N do begin SL := Z[I] := SQRT(MATTAM(1, N, I, I, V, V)); if SL < M4 then Z[I] := M4; if S > SL then S := SL end; for I := 1 step 1 until N do begin SL := S/Z[I]; Z[I] := 1/SL; if Z[I] > SCBD then begin SL := 1/SCBD; Z[I] := SCBD end; MULROW(1, N, I, I, V, V, SL) end end; for I := 1 step 1 until N do ICHROWCOL(I + 1, N, I, I, V); begin array A[1:N, 1:N], EM[0:7]; EM[0] := EM[2] := MACHEPS; EM[4] := 10 × N; EM[6] := VSMALL; DUPMAT(1, N, 1, N, A, V); if QRISNGVALDEC(A, N, N, D, V, EM) ≠ 0 then begin OUT[1] := 2; goto L2 end; end; if SCBD > 1 then begin for I := 1 step 1 until N do MULROW(1, N, I, I, V, V, Z[I]); for I := 1 step 1 until N do begin S := SQRT(TAMMAT(1, N, I, I, V, V)); D[I] := S × D[I]; S := 1/S; MULCOL(1, N, I, I, V, V, S) end end; for I := 1 step 1 until N do begin S := DN × D[I]; D[I] := if S > LARGE then VSMALL else if S < SMALL then VLARGE else S ⭡ (-2) end; SORT; DMIN := D[N]; if DMIN < SMALL then DMIN := SMALL; ILLC := (M2 × D[1]) > DMIN; if NF < MAXF then goto L0 else OUT[1] := 1; L2: OUT[2] := FX; OUT[4] := NF; OUT[5] := NL; OUT[6] := LDT end PRAXIS; comment ================== 31061 ================= ; real procedure INFNRMVEC(L, U, K, A); value L, U; integer L, U, K; array A; begin real R, MAX; MAX := 0; K := L; for L := L step 1 until U do begin R := ABS(A[L]); if R > MAX then begin MAX := R; K := L end end; INFNRMVEC := MAX end INFNRMVEC; comment ================== 31062 ================= ; real procedure INFNRMROW(L, U, I, K, A); value L, U, I; integer L, U, I, K; array A; begin real R, MAX; MAX := 0; K := L; for L := L step 1 until U do begin R := ABS(A[I, L]); if R > MAX then begin MAX := R; K := L end end; INFNRMROW := MAX end INFNRMROW; comment ================== 31063 ================= ; real procedure INFNRMCOL(L, U, J, K, A); value L, U, J; integer L, U, J, K; array A; begin real R, MAX; MAX := 0; K := L; for L := L step 1 until U do begin R := ABS(A[L, J]); if R > MAX then begin MAX := R; K := L end end; INFNRMCOL := MAX end INFNRMCOL; comment ================== 31064 ================= ; real procedure INFNRMMAT(LR, UR, LC, UC, KR, A); value LR, UR, LC, UC; integer LR, UR, LC, UC, KR; array A; begin real R, MAX; real procedure ONENRMROW(L, U, I, A); code 31066; MAX := 0; KR := LR; for LR := LR step 1 until UR do begin R := ONENRMROW(LC, UC, LR, A); if R > MAX then begin MAX := R; KR := LR end end; INFNRMMAT := MAX end INFNRMMAT; comment ================== 31065 ================= ; real procedure ONENRMVEC(L, U, A); value L, U; integer L, U; array A; begin real SUM; SUM := 0; for L := L step 1 until U do SUM := SUM + ABS(A[L]); ONENRMVEC := SUM end ONENRMVEC; comment ================== 31066 ================= ; real procedure ONENRMROW(L, U, I, A); value L, U, I; integer L, U, I; array A; begin real SUM; SUM := 0; for L := L step 1 until U do SUM := SUM + ABS(A[I, L]); ONENRMROW := SUM end ONENRMROW; comment ================== 31067 ================= ; real procedure ONENRMCOL(L, U, J, A); value L, U, J; integer L, U, J; array A; begin real SUM; SUM := 0; for L := L step 1 until U do SUM := SUM + ABS(A[L, J]); ONENRMCOL := SUM end ONENRMCOL; comment ================== 31068 ================= ; real procedure ONENRMMAT(LR, UR, LC, UC, KC, A); value LR, UR, LC, UC; integer LR, UR, LC, UC, KC; array A; begin real MAX, R; real procedure ONENRMCOL(L, U, J, A); code 31067; MAX := 0; KC := LC; for LC := LC step 1 until UC do begin R := ONENRMCOL(LR, UR, LC, A); if R > MAX then begin MAX := R; KC := LC end end; ONENRMMAT := MAX end ONENRMMAT; comment ================== 31069 ================= ; real procedure ABSMAXMAT(LR, UR, LC, UC, I, J, A); value LR, UR, LC, UC; integer LR, UR, LC, UC, I, J; array A; begin integer II; real MAX, R; real procedure INFNRMCOL(L, U, I, K, A); code 31063; MAX := 0; I := LR; J := LC; for LC := LC step 1 until UC do begin R := INFNRMCOL(LR, UR, LC, II, A); if R > MAX then begin MAX := R; I := II; J := LC end end; ABSMAXMAT := MAX end ABSMAXMAT; comment ================== 35140 ================= ; procedure AIRY(Z, AI, AID, BI, BID, EXPON, FIRST); value Z, FIRST; Boolean FIRST; real Z, AI, AID, BI, BID, EXPON; begin real S, T, U, V, SC, TC, UC, VC, X, K1, K2, K3, K4, C, ZT, SI, CO, EXPZT, SQRTZ, WWL, PL, PL1, PL2, PL3; own real C1, C2, SQRT3, SQRT1OPI, PIO4; own real array XX, WW[1:10]; integer N, L; if FIRST then begin SQRT3 := 1.73205080756887729; SQRT1OPI := 0.56418958354775629; PIO4 := 0.78539816339744831; C1 := 0.35502 80538 87817; C2 := 0.25881 94037 92807; XX[ 1] := 1.40830 81072 18096410+1; XX[ 2] := 1.02148 85479 19733110+1; XX[ 3] := 7.44160 18450 450930 ; XX[ 4] := 5.30709 43061 781927 ; XX[ 5] := 3.63401 35029 132462 ; XX[ 6] := 2.33106 52303 052450 ; XX[ 7] := 1.34479 70824 609268 ; XX[ 8] := 6.41888 58369 56729610-1; XX[ 9] := 2.01003 45998 12104610-1; XX[10] := 8.05943 59172 05283310-3; WW[ 1] := 3.15425 15762 96478710-14; WW[ 2] := 6.63942 10819 58492110-11; WW[ 3] := 1.75838 89061 34566910-8; WW[ 4] := 1.37123 92370 43581510-6; WW[ 5] := 4.43509 66639 28435010-5; WW[ 6] := 7.15550 10917 71825510-4; WW[ 7] := 6.48895 66103 33538110-3; WW[ 8] := 3.64404 15875 77328210-2; WW[ 9] := 1.43997 92418 59099910-1; WW[10] := 8.12311 41336 26148610-1; end; EXPON := 0; if Z ≥ -5.0 ∧ Z ≤ 8 then begin U := V := T := UC := VC := TC := 1; S := SC := 0.5; N := 0; X := Z × Z × Z; for N := N + 3 while ABS(U) + ABS(V) + ABS(S) + ABS(T) > 10-18 do begin U := U × X/(N × (N-1)); V := V × X/(N × (N + 1)); S := S × X/(N × (N + 2)); T := T × X/(N × (N-2)); UC := UC + U; VC := VC + V; SC := SC + S; TC := TC + T end; BI := SQRT3 × (C1 × UC + C2 × Z × VC); BID := SQRT3 × (C1 × Z × Z × SC + C2 × TC); if Z < 2.5 then begin AI := C1 × UC - C2 × Z × VC; AID := C1 × SC × Z × Z - C2 × TC; goto END end end; K1 := K2 := K3 := K4 := 0; SQRTZ := SQRT(ABS(Z)); ZT := 0.66666 66666 66667 × ABS(Z) × SQRTZ; C := SQRT1OPI/SQRT(SQRTZ); if Z < 0 then begin Z := -Z; CO := COS(ZT-PIO4); SI := SIN(ZT-PIO4); for L := 1 step 1 until 10 do begin WWL := WW[L]; PL := XX[L]/ZT; PL2 := PL × PL; PL1 := 1 + PL2; PL3 := PL1 × PL1; K1 := K1 + WWL/PL1; K2 := K2 + WWL × PL/PL1; K3 := K3 + WWL × PL × (1 + PL × (2/ZT + PL))/PL3; K4 := K4 + WWL × (-1-PL × (1 + PL × (ZT-PL))/ZT)/PL3; end; AI := C × (CO × K1 + SI × K2); AID := 0.25 × AI/Z - C × SQRTZ × (CO × K3 + SI × K4); BI := C × (CO × K2-SI × K1); BID := 0.25 × BI/Z - C × SQRTZ × (CO × K4-SI × K3); end else begin if Z < 9 then EXPZT := EXP(ZT) else begin EXPZT := 1; EXPON := ZT end; for L := 1 step 1 until 10 do begin WWL := WW[L]; PL := XX[L]/ZT; PL1 := 1 + PL; PL2 := 1-PL; K1 := K1 + WWL/PL1; K2 := K2 + WWL × PL/(ZT × PL1 × PL1); K3 := K3 + WWL/PL2; K4 := K4 + WWL × PL/(ZT × PL2 × PL2); end; AI := 0.5 × C × K1/EXPZT; AID := AI × (-.25/Z-SQRTZ) + 0.5 × C × SQRTZ × K2/EXPZT; if Z ≥ 8 then begin BI := C × K3 × EXPZT; BID := BI × (SQRTZ-0.25/Z) - C × K4 × SQRTZ × EXPZT; end; end; END: end AIRY; comment ================== 35145 ================= ; real procedure AIRYZEROS(N, D, ZAI, VAI); value N, D; integer N, D; array ZAI, VAI; begin Boolean A, FOUND; integer I; real C, E, R, ZAJ, ZAK, VAJ, DAJ, KAJ, ZZ; procedure AIRY(A, B, C, D, E, F, G); code 35140; A := D = 0 ∨ D = 2; R := if D = 0 ∨ D = 3 then -1.1780 97245 09617 else -3.5342 91735 28852; comment R := if D = 0 ∨ D = 3 then -3 × PI / 8 else -9 × PI / 8; AIRY(0, ZAJ, VAJ, DAJ, KAJ, ZZ, true); for I := 1 step 1 until N do begin R := R + 4.7123 88980 38469; comment R := R + 3 × PI / 2; ZZ := R × R; ZAJ := if I = 1 ∧ D = 1 then -1.01879 297 else if I = 1 ∧ D = 2 then -1.17371 322 else R ⭡ 0.66666 66666 66667 × ( if A then - ( 1 + ( 5/48 - ( 5/36 - ( 77125/82944 - ( 1080 56875 / 69 67296 - (16 23755 96875 / 3344 30208) /ZZ)/ZZ)/ZZ)/ZZ)/ZZ) else - ( 1 - ( 7/48 - ( 35/288 - ( 1 81223 / 2 07360 - ( 186 83371 / 12 44160 - ( 9 11458 84361 / 1911 02976 ) /ZZ)/ZZ)/ZZ)/ZZ)/ZZ)); if D ≤ 1 then AIRY(ZAJ, VAJ, DAJ, C, E, ZZ, false) else AIRY(ZAJ, C, E, VAJ, DAJ, ZZ, false); FOUND := ABS( if A then VAJ else DAJ ) < 10-12; for C := C while ¬FOUND do begin if A then begin KAJ := VAJ / DAJ; ZAK := ZAJ - KAJ × (1 + ZAJ × KAJ × KAJ) end else begin KAJ := DAJ / (ZAJ × VAJ); ZAK := ZAJ - KAJ × (1 + KAJ × (KAJ × ZAJ + 1 / ZAJ)) end; if D ≤ 1 then AIRY(ZAK, VAJ, DAJ, C, E, ZZ, false) else AIRY(ZAK, C, E, VAJ, DAJ, ZZ, false); FOUND := ABS(ZAK - ZAJ) < 10-14 × ABS(ZAK) ∨ ABS(if A then VAJ else DAJ) < 10-12; ZAJ := ZAK end; VAI[I] := if A then DAJ else VAJ; ZAI[I] := ZAJ; end; AIRYZEROS := ZAI[N]; end AIRYZEROS; comment ================== 31040 ================= ; real procedure POL(N, X, A); value N, X; integer N; real X; array A; begin real R; R := 0; for N := N step -1 until 0 do R := R × X + A[N]; POL := R end POL; comment ================== 31241 ================= ; procedure TAYPOL(N, K, X, A); value N, K, X; integer N, K; real X; array A; if X ≠ 0 then begin integer I, J, NM1; real XJ, AA, H; XJ := 1; for J := 1 step 1 until N do begin XJ := XJ × X; A[J] := A[J] × XJ end; AA := A[N]; NM1 := N-1; for J := 0 step 1 until K do begin H := AA; for I := NM1 step -1 until J do H := A[ I] := A[I] + H end end else for K := K step -1 until 1 do A[K] := 0; comment ================== 31242 ================= ; procedure NORDERPOL (N, K, X, A); value N, K, X; integer N, K; real X; array A; if X ≠ 0 then begin integer I, J, NM1; real XJ, AA, H; array XX[0:N]; XJ := 1; for J := 1 step 1 until N do begin XJ := XX[J] := XJ × X; A[J] := A[J] × XJ end; H := AA := A[N]; NM1 := N-1; for I := NM1 step -1 until 0 do H := A[I] := A[I] + H; for J := 1 step 1 until K do begin H := AA; for I := NM1 step -1 until J do H := A[ I] := A[I] + H; A[J] := H/XX[J] end end NORDERPOL ; comment ================== 31243 ================= ; procedure DERPOL (N, K, X, A); value N, K, X; integer N, K; real X; array A; begin integer J; real FAC; procedure NORDERPOL(N, K, X, A); code 31242; FAC := 1; NORDERPOL (N, K, X, A); for J := 2 step 1 until K do begin FAC := FAC × J; A[J] := A[J] × FAC end end DERPOL ; comment ================== 32075 ================= ; real procedure TRICUB(XI, YI, XJ, YJ, XK, YK, G, RE, AE); value XI, YI, XJ, YJ, XK, YK, RE, AE; real XI, YI, XJ, YJ, XK, YK, RE, AE; real procedure G; begin real SURF, SURFMIN, XZ, YZ, GI, GJ, GK; real procedure INT(AX1, AY1, AF1, AX2, AY2, AF2, AX3, AY3, AF3, BX1, BY1, BF1, BX2, BY2, BF2, BX3, BY3, BF3, PX, PY, PF); value BX1, BY1, BF1, BX2, BY2, BF2, BX3, BY3, BF3, PX, PY, PF; real BX1, BY1, BF1, BX2, BY2, BF2, BX3, BY3, BF3, PX, PY, PF, AX1, AY1, AF1, AX2, AY2, AF2, AX3, AY3, AF3; begin real E, I3, I4, I5, A, B, C, SX1, SY1, SX2, SY2, SX3, SY3, CX1, CY1, CF1, CX2, CY2, CF2, CX3, CY3, CF3, DX1, DY1, DF1, DX2, DY2, DF2, DX3, DY3, DF3; A := AF1 + AF2 + AF3; B := BF1 + BF2 + BF3; I3 := 3 × A + 27 × PF + 8 × B; E := ABS(I3) × RE + AE; if SURF < SURFMIN ∨ ABS(5 × A + 45 × PF - I3) < E then INT := I3 × SURF else begin CX1 := AX1 + PX; CY1 := AY1 + PY; CF1 := G(CX1, CY1); CX2 := AX2 + PX; CY2 := AY2 + PY; CF2 := G(CX2, CY2); CX3 := AX3 + PX; CY3 := AY3 + PY; CF3 := G(CX3, CY3); C := CF1 + CF2 + CF3; I4 := A + 9 × PF + 4 × B + 12 × C; if ABS(I3 - I4) < E then INT := I4 × SURF else begin SX1 := .5 × BX1; SY1 := .5 × BY1; DX1 := AX1 + SX1; DY1 := AY1 + SY1; DF1 := G(DX1, DY1); SX2 := .5 × BX2; SY2 := .5 × BY2; DX2 := AX2 + SX2; DY2 := AY2 + SY2; DF2 := G(DX2, DY2); SX3 := .5 × BX3; SY3 := .5 × BY3; DX3 := AX3 + SX3; DY3 := AY3 + SY3; DF3 := G(DX3, DY3); I5 := (51 × A + 2187 × PF + 276 × B + 972 × C - 768 × (DF1 + DF2 + DF3))/63; if ABS(I4 - I5) < E then INT := I5 × SURF else begin SURF := .25 × SURF; INT := INT(SX1, SY1, BF1, SX2, SY2, BF2, SX3, SY3, BF3, DX1, DY1, DF1, DX2, DY2, DF2, DX3, DY3, DF3, PX, PY, PF) + INT(AX1, AY1, AF1, SX3, SY3, BF3, SX2, SY2, BF2, DX1, DY1, DF1, AX1 + SX2, AY1 + SY2, G(AX1 + SX2, AY1 + SY2), AX1 + SX3, AY1 + SY3, G(AX1 + SX3, AY1 + SY3), .5 × CX1, .5 × CY1, CF1) + INT(AX2, AY2, AF2, SX3, SY3, BF3, SX1, SY1, BF1, DX2, DY2, DF2, AX2 + SX1, AY2 + SY1, G(AX2 + SX1, AY2 + SY1), AX2 + SX3, AY2 + SY3, G(AX2 + SX3, AY2 + SY3), .5 × CX2, .5 × CY2, CF2) + INT(AX3, AY3, AF3, SX1, SY1, BF1, SX2, SY2, BF2, DX3, DY3, DF3, AX3 + SX2, AY3 + SY2, G(AX3 + SX2, AY3 + SY2), AX3 + SX1, AY3 + SY1, G(AX3 + SX1, AY3 + SY1), .5 × CX3, .5 × CY3, CF3); SURF := 4 × SURF end end end end INT; SURF := 0.5 × ABS(XJ × YK - XK × YJ + XI × YJ - XJ × YI + XK × YI - XI × YK); SURFMIN := SURF × RE; RE := 30 × RE; AE := 30 × AE/SURF; XZ := (XI + XJ + XK)/3; YZ := (YI + YJ + YK)/3; GI := G(XI, YI); GJ := G(XJ, YJ); GK := G(XK, YK); XI := XI × .5; YI := YI × .5; XJ := XJ × .5; YJ := YJ × .5; XK := XK × .5; YK := YK × .5; TRICUB := INT(XI, YI, GI, XJ, YJ, GJ, XK, YK, GK, XJ + XK, YJ + YK, G(XJ + XK, YJ + YK), XK + XI, YK + YI, G(XK + XI, YK + YI), XI + XJ, YI + YJ, G(XI + XJ, YI + YJ), .5 × XZ, .5 × YZ, G(XZ, YZ))/60 end TRICUB; comment ================== 34444 ================= ; procedure PEIDE(N, M, NOBS, NBP, PAR, RES, BP, JTJINV, IN, OUT, DERIV, JAC DFDY, JAC DFDP, CALL YSTART, DATA, MONITOR); value N, M, NOBS; integer N, M, NOBS, NBP; array PAR, RES, JTJINV, IN, OUT; integer array BP; procedure CALL YSTART, DATA, MONITOR; Boolean procedure DERIV, JAC DFDY, JACDFDP; begin integer I, J, EXTRA, WEIGHT, NCOL, NROW, AWAY, NPAR, II, JJ, MAX, NFE, NIS; real EPS, EPS1, XEND, C, X, T, HMIN, HMAX, RES1, IN3, IN4, FAC3, FAC4; array AUX[1:3], OBS[1:NOBS], SAVE[-38:6 × N], TOBS[0:NOBS], YP[1:NBP + NOBS, 1:NBP + M], YMAX[1:N], Y[1:6 × N × (NBP + M + 1)], FY[1:N, 1:N], FP[1:N, 1:M + NBP]; integer array COBS[1:NOBS]; Boolean FIRST, SEC, CLEAN; procedure INIVEC(L, U, A, X); code 31010; procedure INIMAT(L1, U1, L2, U2, A, X); code 31011; procedure MULVEC(L, U, S, A, B, X); code 31020; procedure MULROW(L, U, I, J, A, B, X); code 31021; procedure DUPVEC(L, U, S, A, B); code 31030; procedure DUPMAT(L1, U1, L2, U2, A, B); code 31035; real procedure VECVEC(L, U, S, A, B); code 34010; real procedure MATVEC(L, U, I, A, B); code 34011; procedure ELMVEC(L, U, S, A, B, X); code 34020; procedure SOL(A, N, P, B); code 34051; procedure DEC(A, N, AUX, P); code 34300; procedure MARQUARDT(M, N, P, R, C, F, J, I, O); code 34440; real procedure INTERPOL(STARTINDEX, JUMP, K, TOBSDIF); value STARTINDEX, JUMP, K, TOBSDIF; integer STARTINDEX, JUMP, K; real TOBSDIF; begin integer I; real S, R; S := Y[STARTINDEX]; R := TOBSDIF; for I := 1 step 1 until K do begin STARTINDEX := STARTINDEX + JUMP; S := S + Y[STARTINDEX] × R; R := R × TOBSDIF end; INTERPOL := S end INTERPOL; procedure JAC DYDP(NROW, NCOL, PAR, RES, JAC, LOCFUNCT); value NROW, NCOL; integer NROW, NCOL; array PAR, RES, JAC; procedure LOCFUNCT; begin DUPMAT(1, NROW, 1, NCOL, JAC, YP) end JACOBIAN; Boolean procedure FUNCT(NROW, NCOL, PAR, RES); value NROW, NCOL; integer NROW, NCOL; array PAR, RES; begin integer L, K, KNEW, FAILS, SAME, KPOLD, N6, NNPAR, J5N, COBSII; real XOLD, HOLD, A0, TOLUP, TOL, TOLDWN, TOLCONV, H, CH, CHNEW, ERROR, DFI, TOBSDIF; Boolean EVALUATE, EVALUATED, DECOMPOSE, CONV; array A[0:5], DELTA, LAST DELTA, DF, Y0[1:N], JACOB[1:N, 1:N]; integer array P[1:N]; real procedure NORM2(AI); real AI; begin real S, A; S := 10-100; for I := 1 step 1 until N do begin A := AI/YMAX[I]; S := S + A × A end; NORM2 := S end NORM2; procedure RESET; begin if CH < HMIN/HOLD then CH := HMIN/HOLD else if CH > HMAX/HOLD then CH := HMAX/HOLD; X := XOLD; H := HOLD × CH; C := 1; for J := 0 step N until K × N do begin for I := 1 step 1 until N do Y[J + I] := SAVE[J + I] × C; C := C × CH end; DECOMPOSE := true end RESET; procedure ORDER; begin C := EPS × EPS; J := (K-1) × (K + 8)/2 - 38; for I := 0 step 1 until K do A[I] := SAVE[I + J]; J := J + K + 1; TOLUP := C × SAVE[J]; TOL := C × SAVE[J + 1]; TOLDWN := C × SAVE[J + 2]; TOLCONV := EPS/(2 × N × (K + 2)); A0 := A[0]; DECOMPOSE := true; end ORDER; procedure EVALUATE JACOBIAN; begin EVALUATE := false; DECOMPOSE := EVALUATED := true; if ¬JAC DFDY(PAR, Y, X, FY) then begin SAVE[-3] := 4; goto RETURN end; end EVALUATE JACOBIAN; procedure DECOMPOSE JACOBIAN; begin DECOMPOSE := false; C := -A0 × H; for J := 1 step 1 until N do begin for I := 1 step 1 until N do JACOB[I, J] := FY[I, J] × C; JACOB[J, J] := JACOB[J, J] + 1 end; DEC(JACOB, N, AUX, P) end DECOMPOSE JACOBIAN; procedure CALCULATE STEP AND ORDER; begin real A1, A2, A3; A1 := if K ≤ 1 then 0 else 0.75 × (TOLDWN/NORM2(Y[K × N + I])) ⭡ (0.5/K); A2 := 0.80 × (TOL/ERROR) ⭡ (0.5/(K + 1)); A3 := if K ≥ 5 ∨ FAILS ≠ 0 then 0 else 0.70 × (TOLUP/NORM2(DELTA[I] - LAST DELTA[I]))⭡ (0.5/(K + 2)); if A1 > A2 ∧ A1 > A3 then begin KNEW := K-1; CHNEW := A1 end else if A2 > A3 then begin KNEW := K ; CHNEW := A2 end else begin KNEW := K + 1; CHNEW := A3 end end CALCULATE STEP AND ORDER; if SEC then begin SEC := false; goto RETURN end; NPAR := M; EXTRA := NIS := 0; II := 1; JJ := if NBP = 0 then 0 else 1; N6 := N × 6; INIVEC(-3, -1, SAVE, 0); INIVEC(N6 + 1, (6 + M) × N, Y, 0); INIMAT(1, NOBS + NBP, 1, M + NBP, YP, 0); T := TOBS[1]; X := TOBS[0]; CALL YSTART(PAR, Y, YMAX); HMAX := TOBS[1]-TOBS[0]; HMIN := HMAX × IN[1]; EVALUATE JACOBIAN; NNPAR := N × NPAR; NEW START: K := 1; KPOLD := 0; SAME := 2; ORDER; if ¬DERIV(PAR, Y, X, DF) then begin SAVE[-3] := 3; goto RETURN end; H := SQRT(2 × EPS/SQRT(NORM2 (MATVEC(1, N, I, FY, DF)))); if H > HMAX then H := HMAX else if H < HMIN then H := HMIN; XOLD := X; HOLD := H; CH := 1; for I := 1 step 1 until N do begin SAVE[I] := Y[I]; SAVE[N + I] := Y[N + I] := DF[I] × H end; FAILS := 0; for L := 0 while X < XEND do begin if X + H ≤ XEND then X := X + H else begin H := XEND-X; X := XEND; CH := H/HOLD; C := 1; for J := N step N until K × N do begin C := C × CH; for I := J + 1 step 1 until J + N do Y[I] := Y[I] × C end; SAME := if SAME < 3 then 3 else SAME + 1; end; comment PREDICTION; for L := 1 step 1 until N do begin for I := L step N until (K-1) × N + L do for J := (K-1) × N + L step -N until I do Y[J] := Y[J] + Y[J + N]; DELTA[L] := 0 end; EVALUATED := false; comment CORRECTION AND ESTIMATION LOCAL ERROR; for L := 1, 2, 3 do begin if ¬DERIV(PAR, Y, X, DF) then begin SAVE[-3] := 3; goto RETURN end; for I := 1 step 1 until N do DF[I] := DF[I] × H - Y[N + I]; if EVALUATE then EVALUATE JACOBIAN; if DECOMPOSE then DECOMPOSE JACOBIAN; SOL(JACOB, N, P, DF); CONV := true; for I := 1 step 1 until N do begin DFI := DF[I]; Y[ I] := Y[ I] + A0 × DFI; Y[N + I] := Y[N + I] + DFI; DELTA[I] := DELTA[I] + DFI; CONV := CONV ∧ ABS(DFI) < TOLCONV × YMAX[I] end; if CONV then begin ERROR := NORM2(DELTA[I]); goto CONVERGENCE end end; comment ACCEPTANCE OR REJECTION; if ¬CONV then begin if ¬EVALUATED then EVALUATE := true else begin CH := CH/4; if H < 4 × HMIN then begin SAVE[-1] := SAVE[-1] + 10; HMIN := HMIN/10; if SAVE[-1] > 40 then goto RETURN end end; RESET end else CONVERGENCE: if ERROR > TOL then begin FAILS := FAILS + 1; if H > 1.1 × HMIN then begin if FAILS > 2 then begin RESET; goto NEW START end else begin CALCULATE STEP AND ORDER; if KNEW ≠ K then begin K := KNEW; ORDER end; CH := CH × CHNEW; RESET end end else begin if K = 1 then begin comment VIOLATE EPS CRITERION; SAVE[-2] := SAVE[-2] + 1; SAME := 4; goto ERROR TEST OK end; K := 1; RESET; ORDER; SAME := 2 end end else ERROR TEST OK: begin FAILS := 0; for I := 1 step 1 until N do begin C := DELTA[I]; for L := 2 step 1 until K do Y[L × N + I] := Y[L × N + I] + A[L] × C; if ABS(Y[I]) > YMAX[I] then YMAX[I] := ABS(Y[I]) end; SAME := SAME-1; if SAME = 1 then DUPVEC(1, N, 0, LAST DELTA, DELTA) else if SAME = 0 then begin CALCULATE STEP AND ORDER; if CHNEW > 1.1 then begin if K ≠ KNEW then begin if KNEW > K then MULVEC(KNEW × N + 1, KNEW × N + N, -KNEW × N, Y, DELTA, A[K]/KNEW); K := KNEW; ORDER end; SAME := K + 1; if CHNEW × H > HMAX then CHNEW := HMAX/H; H := H × CHNEW; C := 1; for J := N step N until K × N do begin C := C × CHNEW; MULVEC(J + 1, J + N, 0, Y, Y, C) end; DECOMPOSE := true end else SAME := 10 end OF A SINGLE INTEGRATION STEP OF Y; NIS := NIS + 1; comment START OF A INTEGRATION STEP OF YP; if CLEAN then begin HOLD := H; XOLD := X; KPOLD := K; CH := 1; DUPVEC(1, K × N + N, 0, SAVE, Y) end else begin if H ≠ HOLD then begin CH := H/HOLD; C := 1; for J := N6 + NNPAR step NNPAR until KPOLD × NNPAR + N6 do begin C := C × CH; for I := J + 1 step 1 until J + NNPAR do Y[I] := Y[I] × C end; HOLD := H end; if K > KPOLD then INIVEC(N6 + K × NNPAR + 1, N6 + K × NNPAR + NNPAR, Y, 0); XOLD := X; KPOLD := K; CH := 1; DUPVEC(1, K × N + N, 0, SAVE, Y); EVALUATE JACOBIAN; DECOMPOSE JACOBIAN; if ¬JAC DFDP(PAR, Y, X, FP) then begin SAVE[-3] := 5; goto RETURN end; if NPAR > M then INIMAT(1, N, M + 1, NPAR, FP, 0); comment PREDICTION; for L := 0 step 1 until K-1 do for J := K-1 step -1 until L do ELMVEC(J × NNPAR + N6 + 1, J × NNPAR + N6 + NNPAR, NNPAR, Y, Y, 1); comment CORRECTION; for J := 1 step 1 until NPAR do begin J5N := (J + 5) × N; DUPVEC(1, N, J5N, Y0, Y); for I := 1 step 1 until N do DF[I] := H × (FP[I, J] + MATVEC(1, N, I, FY, Y0)) -Y[NNPAR + J5N + I]; SOL(JACOB, N, P, DF); for L := 0 step 1 until K do begin I := L × NNPAR + J5N; ELMVEC(I + 1, I + N, -I, Y, DF, A[L]) end end end; for L := 0 while X ≥ T do begin comment CALCULATION OF A ROW OF THE JACOBIAN MATRIX AND AN ELEMENT OF THE RESIDUAL VECTOR; TOBSDIF := (TOBS[II]-X)/H; COBSII := COBS[II]; RES[II] := INTERPOL(COBSII, N, K, TOBSDIF)-OBS[II]; if ¬CLEAN then begin for I := 1 step 1 until NPAR do YP[II, I] := INTERPOL(COBSII + (I + 5) × N, NNPAR, K, TOBSDIF); comment INTRODUCING OF BREAK-POINTS; if BP[JJ] ≠ II then else if FIRST ∧ ABS(RES[II]) < EPS1 then begin NBP := NBP-1; DUPVEC(JJ, NBP, 1, BP, BP); BP[NBP + 1] := 0 end else begin EXTRA := EXTRA + 1; if FIRST then PAR[M + JJ] := OBS[II]; comment INTRODUCING A JACOBIAN ROW AND A RESIDUAL VECTOR ELEMENT FOR CONTINUITY REQUIREMENTS; YP[NOBS + JJ, M + JJ] := -WEIGHT; MULROW(1, NPAR, NOBS + JJ, II, YP, YP, WEIGHT); RES[NOBS + JJ] := WEIGHT × (RES[II] + OBS[II]- PAR[M + JJ]) end end; if II = NOBS then goto RETURN else begin T := TOBS[II + 1]; if BP[JJ] = II ∧ JJ < NBP then JJ := JJ + 1; HMAX := T-TOBS[II]; HMIN := HMAX × IN[1]; II := II + 1 end; end; comment BREAK-POINTS INTRODUCE NEW INITIAL VALUES FOR Y AND YP; if EXTRA > 0 then begin for I := 1 step 1 until N do begin Y[I] := INTERPOL(I, N, K, TOBSDIF); for J := 1 step 1 until NPAR do Y[I + (J + 5) × N] := INTERPOL(I + (J + 5) × N, NNPAR, K, TOBSDIF) end; for L := 1 step 1 until EXTRA do begin COBSII := COBS[BP[NPAR-M + L]]; Y[COBSII] := PAR[NPAR + L]; for I := 1 step 1 until NPAR + EXTRA do Y[COBSII + (5 + I) × N] := 0; INIVEC(1 + NNPAR + (L + 5) × N, NNPAR + (L + 6) × N, Y, 0); Y[COBSII + (5 + NPAR + L) × N] := 1 end; NPAR := NPAR + EXTRA; EXTRA := 0; X := TOBS[II-1]; EVALUATE JACOBIAN; NNPAR := N × NPAR; goto NEW START end end end STEP; RETURN: if SAVE[-2] > MAX then MAX := SAVE[-2]; FUNCT := SAVE[-1] ≤ 40 ∧ SAVE[-3] = 0; if ¬FIRST then MONITOR(1, NCOL, NROW, PAR, RES, WEIGHT, NIS) end FUNCT; I := -39; for C := 1, 1, 9, 4, 0, 2/3, 1, 1/3, 36, 20.25, 1, 6/11, 1, 6/11, 1/11, 84.028, 53.778, 0.25, .48, 1, .7, .2, .02, 156.25, 108.51, .027778, 120/274, 1, 225/274, 85/274, 15/274, 1/274, 0, 187.69, .0047361 do begin I := I + 1; SAVE[I] := C end; DATA(NOBS, TOBS, OBS, COBS); WEIGHT := 1; FIRST := SEC := false; CLEAN := NBP > 0; AUX[2] := 10-12; EPS := IN[2]; EPS1 := 1010; XEND := TOBS[NOBS]; OUT[1] := 0; BP[0] := MAX := 0; comment SMOOTH INTEGRATION WITHOUT BREAK-POINTS; if ¬FUNCT(NOBS, M, PAR, RES) then goto ESCAPE; RES1 := SQRT(VECVEC(1, NOBS, 0, RES, RES)); NFE := 1; if IN[5] = 1 then begin OUT[1] := 1; goto ESCAPE end; if CLEAN then begin FIRST := true; CLEAN := false; FAC3 := SQRT(SQRT(IN[3]/RES1)); FAC4 := SQRT(SQRT(IN[4]/RES1)); EPS1 := RES1 × FAC4; if ¬FUNCT(NOBS, M, PAR, RES) then goto ESCAPE; FIRST := false end else NFE := 0; NCOL := M + NBP; NROW := NOBS + NBP; SEC := true; IN3 := IN[3]; IN4 := IN[4]; IN[3] := RES1; begin real W; array AID[1:NCOL, 1:NCOL]; WEIGHT := AWAY := 0; OUT[4] := OUT[5] := W := 0; for WEIGHT := (SQRT(WEIGHT) + 1)⭡2 while WEIGHT ≠ 16 ∧ NBP > 0 do begin if AWAY = 0 ∧ W ≠ 0 then begin comment IF NO BREAK-POINTS WERE OMITTED THEN ONE FUNCTION EVALUATION IS SAVED; W := WEIGHT/W; for I := NOBS + 1 step 1 until NROW do begin for J := 1 step 1 until NCOL do YP[I, J] := W × YP[I, J]; RES[I] := W × RES[I] end; SEC := true; NFE := NFE-1 end; IN[3] := IN[3] × FAC3 × WEIGHT; IN[4] := EPS1; MONITOR(2, NCOL, NROW, PAR, RES, WEIGHT, NIS); MARQUARDT(NROW, NCOL, PAR, RES, AID, FUNCT, JAC DYDP, IN, OUT); if OUT[1] > 0 then goto ESCAPE; comment THE RELATIVE STARTING VALUE OF LAMBDA IS ADJUSTED TO THE LAST VALUE OF LAMBDA USED; AWAY := OUT[4]-OUT[5]-1; IN[6] := IN[6] × 5⭡AWAY × 2⭡(AWAY-OUT[5]); NFE := NFE + OUT[4]; W := WEIGHT; EPS1 := (SQRT(WEIGHT) + 1)⭡2 × IN[4] × FAC4; AWAY := 0; comment USELESS BREAK-POINTS ARE OMITTED; for J := 1 step 1 until NBP do begin if ABS(OBS[BP[J]] + RES[BP[J]]-PAR[J + M]) < EPS1 then begin NBP := NBP-1; DUPVEC(J, NBP, 1, BP, BP); DUPVEC(J + M, NBP + M, 1, PAR, PAR); J := J-1; AWAY := AWAY + 1; BP[NBP + 1] := 0 end end; NCOL := NCOL-AWAY; NROW := NROW-AWAY end; IN[3] := IN3; IN[4] := IN4; NBP := 0; WEIGHT := 1; MONITOR(2, M, NOBS, PAR, RES, WEIGHT, NIS); MARQUARDT(NOBS, M, PAR, RES, JTJINV, FUNCT, JAC DYDP, IN, OUT); NFE := OUT[4] + NFE end; ESCAPE: if OUT[1] = 3 then OUT[1] := 2 else if OUT[1] = 4 then OUT[1] := 6; if SAVE[-3] ≠ 0 then OUT[1] := SAVE[-3]; OUT[3] := RES1; OUT[4] := NFE; OUT[5] := MAX end PEIDE; comment ================== 33300 ================= ; procedure FEM LAG SYM(X, Y, N, P, R, F, ORDER, E); integer N, ORDER; real procedure P, R, F; array X, Y, E; begin integer L, L1; real XL1, XL, H, A12, B1, B2, TAU1, TAU2, CH, TL, G, YL, PP, P1, P2, P3, P4, R1, R2, R3, R4, F1, F2, F3, F4, E1, E2, E3, E4, E5, E6; array T, SUB, CHI, GI[0:N-1]; procedure ELEMENT MAT VEC EVALUATION 1; begin real H2; if L = 1 then begin P2 := P(XL1); R2 := R(XL1); F2 := F(XL1) end; P1 := P2; P2 := P(XL); R1 := R2; R2 := R(XL); F1 := F2; F2 := F(XL); H2 := H/2; B1 := H2 × F1; B2 := H2 × F2; TAU1 := H2 × R1; TAU2 := H2 × R2; A12 := -0.5 × (P1 + P2)/H end ELAN. M.V. EV.; procedure ELEMENT MAT VEC EVALUATION 2; begin real X2, H6, H15, B3, TAU3, C12, C32, A13, A22, A23; if L = 1 then begin P3 := P(XL1); R3 := R(XL1); F3 := F(XL1) end; X2 := (XL1 + XL)/2; H6 := H/6; H15 := H/1.5; P1 := P3; P2 := P(X2); P3 := P(XL); R1 := R3; R2 := R(X2); R3 := R(XL); F1 := F3; F2 := F(X2); F3 := F(XL); B1 := H6 × F1; B2 := H15 × F2; B3 := H6 × F3; TAU1 := H6 × R1; TAU2 := H15 × R2; TAU3 := H6 × R3; A12 := -(2 × P1 + P3/1.5)/H; A13 := (0.5 × (P1 + P3) - P2/1.5)/H; A22 := (P1 + P3)/H/0.375 + TAU2; A23 := -(P1/3 + P3) × 2/H; comment STATIC CONDENSATION; C12 := - A12/A22; C32 := - A23/A22; A12 := A13 + C32 × A12; B1 := B1 + C12 × B2; B2 := B3 + C32 × B2; TAU1 := TAU1 + C12 × TAU2; TAU2 := TAU3 + C32 × TAU2 end ELEMENT MAT VEC EVALUATION 2; procedure ELEMENT MAT VEC EVALUATION 3; begin real X2, X3, H12, H24, DET, C12, C13, C42, C43, A13, A14, A22, A23, A24, A33, A34, B3, B4, TAU3, TAU4; if L = 1 then begin P4 := P(XL1); R4 := R(XL1); F4 := F(XL1) end; X2 := XL1 + 0.27639320225 × H; X3 := XL - X2 + XL1; H12 := H/12; H24 := H/2.4; P1 := P4; P2 := P(X2); P3 := P(X3); P4 := P(XL); R1 := R4; R2 := R(X2); R3 := R(X3); R4 := R(XL); F1 := F4; F2 := F(X2); F3 := F(X3); F4 := F(XL); B1 := H12 × F1; B2 := H24 × F2; B3 := H24 × F3; B4 := H12 × F4; TAU1 := H12 × R1; TAU2 := H24 × R2; TAU3 := H24 × R3; TAU4 := H12 × R4; A12 := -( + 4.04508497187450 × P1 + 0.57581917135425 × P3 + 0.25751416197911 × P4)/H; A13 := ( + 1.5450849718747 × P1 - 1.5075141619791 × P2 + 0.6741808286458 × P4)/H; A14 := ((P2 + P3)/2.4 - (P1 + P4)/2)/H; A22 := (5.454237476562 × P1 + P3/.48 + .79576252343762 × P4)/H + TAU2; A23 := - (P1 + P4)/(H × 0.48); A24 := ( + 0.67418082864575 × P1 - 1.50751416197910 × P3 + 1.54508497187470 × P4)/H; A33 := (.7957625234376 × P1 + P2/.48 + 5.454237476562 × P4)/H + TAU3; A34 := -( + 0.25751416197911 × P1 + 0.57581917135418 × P2 + 4.0450849718747 × P4)/H; comment STATIC CONDENSATION; DET := A22 × A33 - A23 × A23; C12 := (A13 × A23 - A12 × A33)/DET; C13 := (A12 × A23 - A13 × A22)/DET; C42 := (A23 × A34 - A24 × A33)/DET; C43 := (A24 × A23 - A34 × A22)/DET; TAU1 := TAU1 + C12 × TAU2 + C13 × TAU3; TAU2 := TAU4 + C42 × TAU2 + C43 × TAU3; A12 := A14 + C42 × A12 + C43 × A13; B1 := B1 + C12 × B2 + C13 × B3; B2 := B4 + C42 × B2 + C43 × B3 end ELEMENT MAT VEC EVALUATION 3; procedure BOUNDARY CONDITIONS; if L = 1 ∧ E2 = 0 then begin TAU1 := 1; B1 := E3/E1; B2 := B2 - A12 × B1; TAU2 := TAU2 - A12; A12 := 0 end else if L = 1 ∧ E2 ≠ 0 then begin real AUX; AUX := P1/E2; TAU1 := TAU1 - AUX × E1 ; B1 := B1 - E3 × AUX end else if L = N ∧ E5 = 0 then begin TAU2 := 1; B2 := E6/E4; B1 := B1 - A12 × B2; TAU1 := TAU1 - A12; A12 := 0 end else if L = N ∧ E5 ≠ 0 then begin real AUX; AUX := P2/E5; TAU2 := TAU2 + AUX × E4; B2 := B2 + AUX × E6 end B.C.1; procedure FORWARD BABUSHKA; if L = 1 then begin CHI[0] := CH := TL := TAU1; T[0] := TL; GI[0] := G := YL := B1; Y[0] := YL; SUB[0] := A12; PP := A12/(CH - A12); CH := TAU2 - CH × PP; G := B2 - G × PP; TL := TAU2; YL := B2 end else begin CHI[L1] := CH := CH + TAU1; GI[L1] := G := G + B1; SUB[L1] := A12; PP := A12/(CH - A12); CH := TAU2 - CH × PP; G := B2 - G × PP; T[L1] := TL + TAU1; TL := TAU2; Y[L1] := YL + B1; YL := B2 end FORWARD BABUSHKA 1; procedure BACKWARD BABUSHKA; begin PP := YL; Y[N] := G/CH; G := PP; CH := TL; L := N; for L := L - 1 while L ≥ 0 do begin PP := SUB[L]; PP := PP/(CH - PP); TL := T[L]; CH := TL - CH × PP; YL := Y[L]; G := YL - G × PP; Y[L] := (GI[L] + G - YL)/(CHI[L] + CH - TL) end end BACKWARD BABUSHKA; L := 0; XL := X[0]; E1 := E[1]; E2 := E[2]; E3 := E[3]; E4 := E[4]; E5 := E[5]; E6 := E[6]; for L := L + 1 while L ≤ N do begin L1 := L - 1; XL1 := XL; XL := X[L]; H := XL - XL1; if ORDER = 2 then ELEMENT MAT VEC EVALUATION 1 else if ORDER = 4 then ELEMENT MAT VEC EVALUATION 2 else ELEMENT MAT VEC EVALUATION 3; if L = 1 ∨ L = N then BOUNDARY CONDITIONS; FORWARD BABUSHKA end; BACKWARD BABUSHKA; end FEM LAG SYM; comment ================== 33301 ================= ; procedure FEM LAG(X, Y, N, R, F, ORDER, E); value N, ORDER; integer N, ORDER; real procedure R, F; array X, Y, E; begin integer L, L1; real XL1, XL, H, A12, B1, B2, TAU1, TAU2, CH, TL, G, YL, PP, E1, E2, E3, E4, E5, E6; array T, SUB, CHI, GI[0: N-1]; procedure ELEMENT MAT VEC EVALUATION 1; begin own real F2, R2; real R1, F1, H2; if L = 1 then begin F2 := F(XL1); R2 := R(XL1) end; A12 := - 1/H; H2 := H/2; R1 := R2; R2 := R(XL); F1 := F2; F2 := F(XL); B1 := H2 × F1; B2 := H2 × F2; TAU1 := H2 × R1; TAU2 := H2 × R2 end ELEMENT MAT VEC EVALUATION 1; procedure ELEMENT MAT VEC EVALUATION 2; begin own real R3, F3; real R1, R2, F1, F2, X2, H6, H15, B3, TAU3, C12, A13, A22, A23; if L = 1 then begin R3 := R(XL1); F3 := F(XL1) end; X2 := (XL1 + XL)/2; H6 := H/6; H15 := H/1.5; R1 := R3; R2 := R(X2); R3 := R(XL); F1 := F3; F2 := F(X2); F3 := F(XL); B1 := H6 × F1; B2 := H15 × F2; B3 := H6 × F3; TAU1 := H6 × R1; TAU2 := H15 × R2; TAU3 := R3 × H6; A12 := A23 := -8/H/3; A13 := - A12/8; A22 := -2 × A12 + TAU2; comment STATIC CONDENSATION; C12 := - A12/A22; A12 := A13 + C12 × A12; B2 := C12 × B2; B1 := B1 + B2; B2 := B3 + B2; TAU2 := C12 × TAU2; TAU1 := TAU1 + TAU2; TAU2 := TAU3 + TAU2 end ELEMENT MAT VEC EVALUATION2; procedure ELEMENT MAT VEC EVALUATION 3; begin own real R4, F4; real R1, R2, R3, F1, F2, F3, X2, X3, H12, H24, DET, C12, C13, C42, C43, A13, A14, A22, A23, A24, A33, A34, B3, B4, TAU3, TAU4; if L = 1 then begin R4 := R(XL1); F4 := F(XL1) end; X2 := XL1 + 0.27639320225 × H; X3 := XL - X2 + XL1; R1 := R4; R2 := R(X2); R3 := R(X3); R4 := R(XL); F1 := F4; F2 := F(X2); F3 := F(X3); F4 := F(XL); H12 := H/12; H24 := H/2.4; B1 := F1 × H12; B2 := F2 × H24; B3 := F3 × H24; B4 := F4 × H12; TAU1 := R1 × H12; TAU2 := R2 × H24; TAU3 := R3 × H24; TAU4 := R4 × H12; A12 := A34 := -4.8784183052078/H; A13 := A24 := 0.7117516385412/H; A14 := -0.16666666666667/H; A23 := 25 × A14; A22 := -2 × A23 + TAU2; A33 := -2 × A23 + TAU3; comment STATIC CONDENSATION; DET := A22 × A33 - A23 × A23; C12 := (A13 × A23 - A12 × A33)/DET; C13 := (A12 × A23 - A13 × A22)/DET; C42 := (A23 × A34 - A24 × A33)/DET; C43 := (A24 × A23 - A34 × A22)/DET; TAU1 := TAU1 + C12 × TAU2 + C13 × TAU3; TAU2 := TAU4 + C42 × TAU2 + C43 × TAU3; A12 := A14 + C42 × A12 + C43 × A13; B1 := B1 + C12 × B2 + C13 × B3; B2 := B4 + C42 × B2 + C43 × B3 end ELEMENT MAT VEC EVALUATION3; procedure BOUNDARY CONDITIONS; if L = 1 ∧ E2 = 0 then begin TAU1 := 1; B1 := E3/E1; B2 := B2 - A12 × B1; TAU2 := TAU2 - A12; A12 := 0 end else if L = 1 ∧ E2 ≠ 0 then begin TAU1 := TAU1 - E1/E2; B1 := B1 - E3/E2 end else if L = N ∧ E5 = 0 then begin TAU2 := 1; B2 := E6/E4; B1 := B1 - A12 × B2; TAU1 := TAU1 - A12; A12 := 0 end else if L = N ∧ E5 ≠ 0 then begin TAU2 := TAU2 + E4/E5; B2 := B2 + E6/E5 end BOUNDARY CONDITIONS; procedure FORWARD BABUSHKA; if L = 1 then begin CHI[0] := CH := TL := TAU1; T[0] := TL; GI[0] := G := YL := B1; Y[0] := YL; SUB[0] := A12; PP := A12/(CH - A12); CH := TAU2 - CH × PP; G := B2 - G × PP; TL := TAU2; YL := B2 end else begin CHI[L1] := CH := CH + TAU1; GI[L1] := G := G + B1; SUB[L1] := A12; PP := A12/(CH - A12); CH := TAU2 - CH × PP; G := B2 - G × PP; T[L1] := TL + TAU1; TL := TAU2; Y[L1] := YL + B1; YL := B2 end FORWARD BABUSHKA 1; procedure BACKWARD BABUSHKA; begin PP := YL; Y[N] := G/CH; G := PP; CH := TL; L := N; for L := L - 1 while L ≥ 0 do begin PP := SUB[L]; PP := PP/(CH - PP); TL := T[L]; CH := TL - CH × PP; YL := Y[L]; G := YL - G × PP; Y[L] := ((GI[L] + G) - YL)/((CHI[L] + CH) - TL) end end BACKWARD BABUSHKA; L := 0; XL := X[0]; E1 := E[1]; E2 := E[2]; E3 := E[3]; E4 := E[4]; E5 := E[5]; E6 := E[6]; for L := L + 1 while L ≤ N do begin L1 := L - 1; XL1 := XL; XL := X[L]; H := XL - XL1; if ORDER = 2 then ELEMENT MAT VEC EVALUATION 1 else if ORDER = 4 then ELEMENT MAT VEC EVALUATION 2 else ELEMENT MAT VEC EVALUATION 3; if L = 1 ∨ L = N then BOUNDARY CONDITIONS; FORWARD BABUSHKA end; BACKWARD BABUSHKA; end FEM LAGR; comment ================== 33302 ================= ; procedure FEM LAG SKEW(X, Y, N, Q, R, F, ORDER, E); integer N, ORDER; real procedure Q, R, F; array X, Y, E; begin integer L, L1; real XL1, XL, H, A12, A21, B1, B2, TAU1, TAU2, CH, TL, G, YL, PP, E1, E2, E3, E4, E5, E6; array T, SUPER, SUB, CHI, GI[0:N-1]; procedure ELEMENT MAT VEC EVALUATION 1; begin own real Q2, R2, F2; real Q1, R1, F1, H2, S12; if L = 1 then begin Q2 := Q(XL1); R2 := R(XL1); F2 := F(XL1) end; H2 := H/2; S12 := - 1/H; Q1 := Q2; Q2 := Q(XL); R1 := R2; R2 := R(XL); F1 := F2; F2 := F(XL); B1 := H2 × F1; B2 := H2 × F2; TAU1 := H2 × R1; TAU2 := H2 × R2; A12 := S12 + Q1/2; A21 := S12 - Q2/2 end ELEMENT MAT VEC EV.; procedure ELEMENT MAT VEC EVALUATION 2; begin own real Q3, R3, F3; real Q1, Q2, R1, R2, F1, F2, S12, S13, S22, X2, H6, H15, C12, C32, A13, A31, A22, A23, A32, B3, TAU3; if L = 1 then begin Q3 := Q(XL1); R3 := R(XL1); F3 := F(XL1) end; X2 := (XL1 + XL)/2; H6 := H/6; H15 := H/1.5; Q1 := Q3; Q2 := Q(X2); Q3 := Q(XL); R1 := R3; R2 := R(X2); R3 := R(XL); F1 := F3; F2 := F(X2); F3 := F(XL); B1 := H6 × F1; B2 := H15 × F2; B3 := H6 × F3; TAU1 := H6 × R1; TAU2 := H15 × R2; TAU3 := H6 × R3; S12 := - 1/H/0.375; S13 := - S12/8; S22 := - 2 × S12; A12 := S12 + Q1/1.5; A13 := S13 - Q1/6; A21 := S12 - Q2/1.5; A23 := S12 + Q2/1.5; A22 := S22 + TAU2; A31 := S13 + Q3/6; A32 := S12 - Q3/1.5; comment STATIC CONDENSATION; C12 := - A12/A22; C32 := - A32/A22; A12 := A13 + C12 × A23; A21 := A31 + C32 × A21; B1 := B1 + C12 × B2; B2 := B3 + C32 × B2; TAU1 := TAU1 + C12 × TAU2; TAU2 := TAU3 + C32 × TAU2 end ELEMENT MAT VEC EVALUATION 2; procedure ELEMENT MAT VEC EVALUATION 3; begin own real Q4, R4, F4; real Q1, Q2, Q3, R1, R2, R3, F1, F2, F3, S12, S13, S14, S22, S23, X2, X3, H12, H24, DET, C12, C13, C42, C43, A13, A14, A22, A23, A24, A31, A32, A33, A34, A41, A42, A43, B3, B4, TAU3, TAU4; if L = 1 then begin Q4 := Q(XL1); R4 := R(XL1); F4 := F(XL1) end; X2 := XL1 + 0.27639320225 × H; X3 := XL - X2 + XL1; H12 := H/12; H24 := H/2.4; Q1 := Q4; Q2 := Q(X2); Q3 := Q(X3); Q4 := Q(XL); R1 := R4; R2 := R(X2); R3 := R(X3); R4 := R(XL); F1 := F4; F2 := F(X2); F3 := F(X3); F4 := F(XL); S12 := -4.8784183052080/H; S13 := 0.7117516385414/H; S14 := -.16666666666667/H; S23 := 25 × S14; S22 := -2 × S23; B1 := H12 × F1; B2 := H24 × F2; B3 := H24 × F3; B4 := H12 × F4; TAU1 := H12 × R1; TAU2 := H24 × R2; TAU3 := H24 × R3; TAU4 := H12 × R4; A12 := S12 + 0.67418082864578 × Q1; A13 := S13 - 0.25751416197912 × Q1; A14 := S14 + Q1/12; A21 := S12 - 0.67418082864578 × Q2; A22 := S22 + TAU2; A23 := S23 + 0.93169499062490 × Q2; A24 := S13 - 0.25751416197912 × Q2; A31 := S13 + 0.25751416197912 × Q3; A32 := S23 - 0.93169499062490 × Q3; A33 := S22 + TAU3; A34 := S12 + 0.67418082864578 × Q3; A41 := S14 - Q4/12; A42 := S13 + 0.25751416197912 × Q4; A43 := S12 - 0.67418082864578 × Q4; comment STATIC CONDENSATION; DET := A22 × A33 - A23 × A32; C12 := (A13 × A32 - A12 × A33)/DET; C13 := (A12 × A23 - A13 × A22)/DET; C42 := (A32 × A43 - A42 × A33)/DET; C43 := (A42 × A23 - A43 × A22)/DET; TAU1 := TAU1 + C12 × TAU2 + C13 × TAU3 ; TAU2 := TAU4 + C42 × TAU2 + C43 × TAU3; A12 := A14 + C12 × A24 + C13 × A34; A21 := A41 + C42 × A21 + C43 × A31; B1 := B1 + C12 × B2 + C13 × B3; B2 := B4 + C42 × B2 + C43 × B3 end ELEMENT MAT VEC EVALUATION 3; procedure BOUNDARY CONDITIONS; if L = 1 ∧ E2 = 0 then begin TAU1 := 1; B1 := E3/E1; A12 := 0 end else if L = 1 ∧ E2 ≠ 0 then begin TAU1 := TAU1 - E1/E2; B1 := B1 - E3/E2 end else if L = N ∧ E5 = 0 then begin TAU2 := 1; A21 := 0; B2 := E6/E4; end else if L = N ∧ E5 ≠ 0 then begin TAU2 := TAU2 + E4/E5; B2 := B2 + E6/E5 end B.C.1; procedure FORWARD BABUSKA; if L = 1 then begin CHI[0] := CH := TL := TAU1; T[0] := TL; GI[0] := G := YL := B1; Y[0] := YL; SUB[0] := A21; SUPER[0] := A12; PP := A21/(CH - A12); CH := TAU2 - CH × PP; G := B2 - G × PP; TL := TAU2; YL := B2 end else begin CHI[L1] := CH := CH + TAU1; GI[L1] := G := G + B1; SUB[L1] := A21; SUPER[L1] := A12; PP := A21/(CH - A12); CH := TAU2 - CH × PP; G := B2 - G × PP; T[L1] := TL + TAU1; TL := TAU2; Y[L1] := YL + B1; YL := B2 end FORWARD BABUSKA; procedure BACKWARD BABUSKA; begin PP := YL; Y[N] := G/CH; G := PP; CH := TL; L := N; for L := L - 1 while L ≥ 0 do begin PP := SUPER[L]/(CH - SUB[L]); TL := T[L]; CH := TL - CH × PP; YL := Y[L]; G := YL - G × PP; Y[L] := (GI[L] + G - YL)/(CHI[L] + CH - TL) ; end end BACKWARD BABUSKA; L := 0; XL := X[0]; E1 := E[1]; E2 := E[2]; E3 := E[3]; E4 := E[4]; E5 := E[5]; E6 := E[6]; comment ELEMENTWISE ASSEMBLAGE OF MATRIX AND VECTOR COMBINED WITH FORWARD BABUSKA SUBSTITUTION; for L := L + 1 while L ≤ N do begin XL1 := XL; L1 := L - 1; XL := X[L]; H := XL - XL1; if ORDER = 2 then ELEMENT MAT VEC EVALUATION 1 else if ORDER = 4 then ELEMENT MAT VEC EVALUATION 2 else ELEMENT MAT VEC EVALUATION 3; if L = 1 ∨ L = N then BOUNDARY CONDITIONS; FORWARD BABUSKA end; BACKWARD BABUSKA; end FEM LAGR; comment ================== 33303 ================= ; procedure FEM HERM SYM(X, Y, N, P, Q, R, F, ORDER, E); value N, ORDER; integer N, ORDER; array X, Y, E; real procedure P, Q, R, F; begin integer L, N2, V, W; array A[1:8 × (N - 1)], EM[2:3]; real A11, A12, A13, A14, A22, A23, A24, A33, A34, A44, YA, YB, ZA, ZB, B1, B2, B3, B4, D1, D2, E1, R1, R2, XL1, XL; procedure CHLDECSOLBND(A, N, W, AUX, B); code 34333; procedure ELEMENTMATVECEVALUATION; if ORDER = 4 then begin real X2, H, H2, H3, P1, P2, Q1, Q2, R1, R2, F1, F2, B11, B12, B13, B14, B22, B23, B24, B33, B34, B44, S11, S12, S13, S14, S22, S23, S24, S33, S34, S44, M11, M12, M13, M14, M22, M23, M24, M33, M34, M44; own real P3, Q3, R3, F3; H := XL - XL1; H2 := H × H; H3 := H × H2; X2 := (XL1 + XL)/2; if L = 1 then begin P3 := P(XL1); Q3 := Q(XL1); R3 := R(XL1); F3 := F(XL1) end; comment ELEMENT BENDING MATRIX; P1 := P3; P2 := P(X2); P3 := P(XL); B11 := 6 × (P1 + P3); B12 := 4 × P1 + 2 × P3; B13 := - B11; B14 := B11 - B12; B22 := (4 × P1 + P2 + P3)/1.5; B23 := - B12; B24 := B12 - B22; B33 := B11; B34 := - B14; B44 := B14 - B24; comment ELEMENT STIFFNESS MATRIX; Q1 := Q3; Q2 := Q(X2); Q3 := Q(XL); S11 := 1.5 × Q2; S12 := Q2/4; S13 := - S11; S14 := S12; S24 := Q2/24; S22 := Q1/6 + S24; S23 := - S12; S33 := S11; S34 := - S12; S44 := S24 + Q3/6; comment ELEMENT MASS MATRIX; R1 := R3; R2 := R(X2); R3 := R(XL); M11 := (R1 + R2)/6; M12 := R2/24; M13 := R2/6; M14 := - M12; M22 := R2/96; M23 := - M14; M24 := - M22; M33 := (R2 + R3)/6; M34 := M14; M44 := M22; comment ELEMENT LOAD VECTOR; F1 := F3; F2 := F(X2); F3 := F(XL); B1 := H × (F1 + 2 × F2)/6; B3 := H × (F3 + 2 × F2)/6; B2 := H2 × F2/12; B4 := - B2; A11 := B11/H3 + S11/H + M11 × H; A12 := B12/H2 + S12 + M12 × H2; A13 := B13/H3 + S13/H + M13 × H; A14 := B14/H2 + S14 + M14 × H2; A22 := B22/H + S22 × H + M22 × H3; A23 := B23/H2 + S23 + M23 × H2; A24 := B24/H + S24 × H + M24 × H3; A34 := B34/H2 + S34 + M34 × H2; A33 := B33/H3 + S33/H + M33 × H; A44 := B44/H + S44 × H + M44 × H3 end else if ORDER = 6 then begin own real P4, Q4, R4, F4; real H, H2, H3, X2, X3, P1, P2, P3, Q1, Q2, Q3, R1, R2, R3, F1, F2, F3, B11, B12, B13, B14, B15, B22, B23, B24, B25, B33, B34, B35, B44, B45, B55, S11, S12, S13, S14, S15, S22, S23, S24, S25, S33, S34, S35, S44, S45, S55, M11, M12, M13, M14, M15, M22, M23, M24, M25, M33, M34, M35, M44, M45, M55, A15, A25, A35, A45, A55, C1, C2, C3, C4, B5; if L = 1 then begin P4 := P(XL1); Q4 := Q(XL1); R4 := R(XL1); F4 := F(XL1) end; H := XL - XL1; H2 := H × H; H3 := H × H2; X2 := 0.27639320225 × H + XL1; X3 := XL1 + XL - X2; comment ELEMENT BENDING MATRIX; P1 := P4; P2 := P(X2); P3 := P(X3); P4 := P(XL); B11 := + 4.033333333333310+1 × P1 + 1.112491386673810-1 × P2 + 1.442208419466410+1 × P3 + 8.333333333333310+0 × P4; B12 := + 1.466666666666710+1 × P1 - 3.319142509165910-1 × P2 + 2.798580917581810+0 × P3 + 1.666666666666710+0 × P4; B13 := + 1.833333333333310+1 × (P1 + P4) + 1.266666666666710+0 × (P2 + P3); B15 := - (B11 + B13); B14 := - (B12 + B13 + B15/2); B22 := + 5.333333333333310+0 × P1 + 9.902734644167410-1 × P2 + 5.430598689162410-1 × P3 + 3.333333333333310-1 × P4; B23 := + 6.666666666666710+0 × P1 - 3.779127846416710+0 × P2 + 2.457945130829510-1 × P3 + 3.666666666666710+0 × P4; B25 := - (B12 + B23); B24 := - (B22 + B23 + B25/2); B33 := + 8.333333333333310+0 × P1 + 1.442208419466610+1 × P2 + 1.112491386672610-1 × P3 + 4.033333333333310+1 × P4; B35 := - (B13 + B33); B34 := - (B23 + B33 + B35/2); B45 := - (B14 + B34); B44 := - (B24 + B34 + B45/2); B55 := - (B15 + B35); comment ELEMENT STIFFNESS MATRIX; Q1 := Q4; Q2 := Q(X2); Q3 := Q(X3); Q4 := Q(XL); S11 := + 2.884416838933010+0 × Q2 + 2.224982773344810-2 × Q3; S12 := + 2.567105187249810-1 × Q2 + 3.289481274999410-3 × Q3; S13 := + 2.533333333333310-1 × (Q2 + Q3); S14 := - 3.745355992500510-2 × Q2 - 2.254644007498810-2 × Q3; S15 := - (S13 + S11); S22 := + 8.333333333333310-2 × Q1 + 2.284700655416410-2 × Q2 + 4.863267791644510-4 × Q3; S23 := + 2.254644007500210-2 × Q2 + 3.745355992487310-2 × Q3; S24 := - 3.333333333333310-3 × (Q2 + Q3); S25 := - (S12 + S23); S33 := + 2.224982773347110-2 × Q2 + 2.884416838933010+0 × Q3; S34 := - 3.289481275012710-3 × Q2 - 2.567105187249610-1 × Q3; S35 := - (S13 + S33); S44 := + 4.863267791678810-4 × Q2 + 2.284700655416110-2 × Q3 + 8.333333333333810-2 × Q4; S45 := - (S14 + S34); S55 := - (S15 + S35); comment ELEMENT MASS MATRIX; R1 := R4; R2 := R(X2); R3 := R(X3); R4 := R(XL); M11 := + 8.333333333333310-2 × R1 + 1.012907608608310-1 × R2 + 7.375905805838010-3 × R3; M12 := + 1.329618127333310-2 × R2 + 1.370485393335310-3 × R3; M13 := - 2.733333333333310-2 × (R2 + R3); M14 := + 5.078689325833510-3 × R2 + 3.587977340833310-3 × R3; M15 := + 1.314798711599910-1 × R2 - 3.547987115999110-2 × R3; M22 := + 1.745355992500010-3 × R2 + 2.546440075005910-4 × R3; M23 := - 3.587977340833610-3 × R2 - 5.078689325838510-3 × R3; M24 := + 6.666666666666710-4 × (R2 + R3); M25 := + 1.725902921333310-2 × R2 - 6.592362546671910-3 × R3; M33 := + 7.375905805838010-3 × R2 + 1.012907608608310-1 × R3 + 8.333333333333310-2 × R4; M34 := - 1.370485393333310-3 × R2 - 1.329618127333310-2 × R3; M35 := - 3.547987115999210-2 × R2 + 1.314798711599910-1 × R3; M44 := + 2.546440075000810-4 × R2 + 1.745355992499710-3 × R3; M45 := + 6.592362546665610-3 × R2 - 1.725902921333010-2 × R3; M55 := + .1706666666666710+0 × (R2 + R3); comment ELEMENT LOAD VECTOR; F1 := F4; F2 := F(X2); F3 := F(X3); F4 := F(XL); B1 := + 8.333333333333310-2 × F1 + 2.054372986874910-1 × F2 - 5.543729868748910-2 × F3; B2 := + 2.696723314583210-2 × F2 - 1.030056647917510-2 × F3; B3 := - 5.543729868748910-2 × F2 + 2.054372986874910-1 × F3 + 8.333333333333310-2 × F4; B4 := + 1.030056647916510-2 × F2 - 2.696723314583010-2 × F3; B5 := + 2.666666666666710-1 × (F2 + F3); A11 := H2 × (H2 × M11 + S11) + B11; A12 := H2 × (H2 × M12 + S12) + B12; A13 := H2 × (H2 × M13 + S13) + B13; A14 := H2 × (H2 × M14 + S14) + B14; A15 := H2 × (H2 × M15 + S15) + B15; A22 := H2 × (H2 × M22 + S22) + B22; A23 := H2 × (H2 × M23 + S23) + B23; A24 := H2 × (H2 × M24 + S24) + B24; A25 := H2 × (H2 × M25 + S25) + B25; A33 := H2 × (H2 × M33 + S33) + B33; A34 := H2 × (H2 × M34 + S34) + B34; A35 := H2 × (H2 × M35 + S35) + B35; A44 := H2 × (H2 × M44 + S44) + B44; A45 := H2 × (H2 × M45 + S45) + B45; A55 := H2 × (H2 × M55 + S55) + B55; comment STATIC CONDENSATION; C1 := A15/A55; C2 := A25/A55; C3 := A35/A55; C4 := A45/A55; B1 := (B1 - C1 × B5) × H; B2 := (B2 - C2 × B5) × H2; B3 := (B3 - C3 × B5) × H; B4 := (B4 - C4 × B5) × H2; A11 := (A11 - C1 × A15)/H3; A12 := (A12 - C1 × A25)/H2; A13 := (A13 - C1 × A35)/H3; A14 := (A14 - C1 × A45)/H2; A22 := (A22 - C2 × A25)/H; A23 := (A23 - C2 × A35)/H2; A24 := (A24 - C2 × A45)/H; A33 := (A33 - C3 × A35)/H3; A34 := (A34 - C3 × A45)/H2; A44 := (A44 - C4 × A45)/H; end else begin own real P5, Q5, R5, F5; real X2, X3, X4, H, H2, H3, P1, P2, P3, P4, Q1, Q2, Q3, Q4, R1, R2, R3, R4, F1, F2, F3, F4, B11, B12, B13, B14, B15, B16, B22, B23, B24, B25, B26, B33, B34, B35, B36, B44, B45, B46, B55, B56, B66, S11, S12, S13, S14, S15, S16, S22, S23, S24, S25, S26, S33, S34, S35, S36, S44, S45, S46, S55, S56, S66, M11, M12, M13, M14, M15, M16, M22, M23, M24, M25, M26, M33, M34, M35, M36, M44, M45, M46, M55, M56, M66, C15, C16, C25, C26, C35, C36, C45, C46, B5, B6, A15, A16, A25, A26, A35, A36, A45, A46, A55, A56, A66, DET; if L = 1 then begin P5 := P(XL1); Q5 := Q(XL1); R5 := R(XL1); F5 := F(XL1) end; H := XL - XL1; H2 := H × H; H3 := H × H2; X2 := XL1 + H × .172673164646; X3 := XL1 + H/2; X4 := XL1 + XL - X2; comment ELEMENT BENDING MATRIX; P1 := P5; P2 := P(X2); P3 := P(X3); P4 := P(X4); P5 := P(XL); B11 := + 105.8 × P1 + 9.8 × P5 + 7.359312130351310-2 × P2 + 2.275555555555610+1 × P3 + 7.056565608855310+0 × P4; B12 := + 27.6 × P1 + 1.4 × P5 - 3.4155482481110-1 × P2 + 2.844444444444410+0 × P3 + 1.011396094652210+0 × P4; B13 := - 32.2 × (P1 + P5) - 7.206349206350510-1 × (P2 + P4) + 2.275555555555610+1 × P3; B14 := + 4.6 × P1 + 8.4 × P5 + 1.032864122294410-1 × P2 - 2.844444444444410+0 × P3 - 3.344556253499210+0 × P4; B15 := - (B11 + B13); B16 := - (B12 + B13 + B14 + B15/2); B22 := + 7.2 × P1 + 0.2 × P5 + 1.585198402858110+0 × P2 + 3.555555555555610-1 × P3 + 1.449603273005910-1 × P4; B23 := - 8.4 × P1 - 4.6 × P5 + 3.344556253499210+0 × P2 + 2.844444444444410+0 × P3 - 1.032864122294410-1 × P4; B24 := + 1.2 × (P1 + P5) - 4.793650793650810-1 × (P2 + P4) - 3.555555555555610-1 × P3; B25 := - (B12 + B23); B26 := - (B22 + B23 + B24 + B25/2); B33 := + 7.056565608855310+0 × P2 + 2.275555555555610+1 × P3 + 7.359312130351310-2 × P4 + 105.8 × P5 + 9.8 × P1; B34 := - 1.4 × P1 - 27.6 × P5 - 1.011396094652210+0 × P2 - 2.844444444444410+0 × P3 + 3.415548248110010-1 × P4; B35 := - (B13 + B33); B36 := - (B23 + B33 + B34 + B35/2); B44 := + 7.2 × P5 + P1/5 + 1.449603273005910-1 × P2 + 3.555555555555610-1 × P3 + 1.585198402858110+0 × P4; B45 := - (B14 + B34); B46 := - (B24 + B34 + B44 + B45/2); B55 := - (B15 + B35); B56 := - (B16 + B36); B66 := - (B26 + B36 + B46 + B56/2); comment ELEMENT STIFFNESS MATRIX; Q1 := Q5; Q2 := Q(X2); Q3 := Q(X3); Q4 := Q(X4); Q5 := Q(XL); S11 := + 3.024242403795110+0 × Q2 + 3.153990913006510-2 × Q4; S12 := + 1.257552558174410-1 × Q2 + 4.176716971674210-3 × Q4; S13 := - 3.088435374149610-1 × (Q2 + Q4); S14 := + 4.089904124306210-2 × Q2 + 1.284245535557710-2 × Q4; S15 := - (S13 + S11); S16 := + 5.925486117706810-1 × Q2 + 6.051261271911610-2 × Q4; S22 := + 5.229205286542210-3 × Q2 + 5.531076386279610-4 × Q4 + Q1/20; S23 := - 1.284245535557710-2 × Q2 - 4.089904124306210-2 × Q4; S24 := + 1.700680272108810-3 × (Q2 + Q4); S25 := - (S12 + S23); S26 := + 2.463959309742610-2 × Q2 + 8.013468127064110-3 × Q4; S33 := + 3.153990913006510-2 × Q2 + 3.024242403795110+0 × Q4; S34 := - 4.176716971674210-3 × Q2 - 1.257552558174410-1 × Q4; S35 := - (S13 + S33); S36 := - 6.051261271911610-2 × Q2 - 5.925486117706810-1 × Q4; S44 := + 5.531076386279610-4 × Q2 + 5.229205286542210-3 × Q4 + Q5/20; S45 := - (S14 + S34); S46 := + 8.013468127064110-3 × Q2 + 2.463959309742610-2 × Q4; S55 := - (S15 + S35); S56 := -(S16 + S36); S66 := + 1.160997732426310-1 × (Q2 + Q4) + 3.555555555555610-1 × Q3; comment ELEMENT MASS MATRIX; R1 := R5; R2 := R(X2); R3 := R(X3); R4 := R(X4); R5 := R(XL); M11 := + 9.710702072731010-2 × R2 + 1.581025919918010-3 × R4 + R1/20; M12 := + 8.235488946025410-3 × R2 + 2.193215496007110-4 × R4; M13 := + 1.239067055393610-2 × (R2 + R4); M14 := - 1.718846624996810-3 × R2 - 1.050832675293910-3 × R4; M15 := + 5.308978971211910-2 × R2 + 6.774155866106010-3 × R4; M16 := - 1.737771285607610-2 × R2 + 2.217363001846610-3 × R4; M22 := + 6.984384617314510-4 × R2 + 3.042451202934910-5 × R4; M23 := + 1.050832675294710-3 × R2 + 1.718846624993610-3 × R4; M24 := - 1.457725947520610-4 × (R2 + R4); M25 := + 4.502458967912710-3 × R2 + 9.397179028337410-4 × R4; M26 := - 1.473775645278010-3 × R2 + 3.075948872599810-4 × R4; M33 := + 1.581025919920910-3 × R2 + 9.710702072729010-2 × R4 + R5/20; M34 := - 2.193215496013110-4 × R2 - 8.235488946025410-3 × R4; M35 := + 6.774155866112310-3 × R2 + 5.308978971211210-2 × R4; M36 := - 2.217363001849210-3 × R2 + 1.737771285607110-2 × R4; M44 := + 3.042451202945710-5 × R2 + 6.984384617315810-4 × R4; M45 := - 9.397179028354210-4 × R2 - 4.502458967913110-3 × R4; M46 := + 3.075948872606010-4 × R2 - 1.473775645277810-3 × R4; M55 := + 2.902494331065710-2 × (R2 + R4) + 3.555555555555610-1 × R3; M56 := + 9.500642840205010-3 × (R4-R2); M66 := + 3.109815354712510-3 × (R2 + R4); comment ELEMENT LOAD VECTOR; F1 := F5; F2 := F(X2); F3 := F(X3); F4 := F(X4); F5 := F(XL); B1 := + 1.625874809933610-1 × F2 + 2.074585233996910-2 × F4 + F1/20; B2 := + 1.378878058923310-2 × F2 + 2.877886077433510-3 × F4; B3 := + 2.074585233996910-2 × F2 + 1.625874809933610-1 × F4 + F5/20; B4 := - 2.877886077433510-3 × F2 - 1.378878058923310-2 × F4; B5 := + (F2 + F4)/11.25 + 3.555555555555610-1 × F3; B6 := + 2.909571869813210-2 × (F4-F2); A11 := H2 × (H2 × M11 + S11) + B11; A12 := H2 × (H2 × M12 + S12) + B12; A13 := H2 × (H2 × M13 + S13) + B13; A14 := H2 × (H2 × M14 + S14) + B14; A15 := H2 × (H2 × M15 + S15) + B15; A16 := H2 × (H2 × M16 + S16) + B16; A22 := H2 × (H2 × M22 + S22) + B22; A23 := H2 × (H2 × M23 + S23) + B23; A24 := H2 × (H2 × M24 + S24) + B24; A25 := H2 × (H2 × M25 + S25) + B25; A26 := H2 × (H2 × M26 + S26) + B26; A33 := H2 × (H2 × M33 + S33) + B33; A34 := H2 × (H2 × M34 + S34) + B34; A35 := H2 × (H2 × M35 + S35) + B35; A36 := H2 × (H2 × M36 + S36) + B36; A44 := H2 × (H2 × M44 + S44) + B44; A45 := H2 × (H2 × M45 + S45) + B45; A46 := H2 × (H2 × M46 + S46) + B46; A55 := H2 × (H2 × M55 + S55) + B55; A56 := H2 × (H2 × M56 + S56) + B56; A66 := H2 × (H2 × M66 + S66) + B66; comment STATIC CONDENSATION; DET := - A55 × A66 + A56 × A56; C15 := (A15 × A66 - A16 × A56)/DET; C16 := (A16 × A55 - A15 × A56)/DET; C25 := (A25 × A66 - A26 × A56)/DET; C26 := (A26 × A55 - A25 × A56)/DET; C35 := (A35 × A66 - A36 × A56)/DET; C36 := (A36 × A55 - A35 × A56)/DET; C45 := (A45 × A66 - A46 × A56)/DET; C46 := (A46 × A55 - A45 × A56)/DET; A11 := (A11 + C15 × A15 + C16 × A16)/H3; A12 := (A12 + C15 × A25 + C16 × A26)/H2; A13 := (A13 + C15 × A35 + C16 × A36)/H3; A14 := (A14 + C15 × A45 + C16 × A46)/H2; A22 := (A22 + C25 × A25 + C26 × A26)/H; A23 := (A23 + C25 × A35 + C26 × A36)/H2; A24 := (A24 + C25 × A45 + C26 × A46)/H; A33 := (A33 + C35 × A35 + C36 × A36)/H3; A34 := (A34 + C35 × A45 + C36 × A46)/H2; A44 := (A44 + C45 × A45 + C46 × A46)/H; B1 := (B1 + C15 × B5 + C16 × B6) × H; B2 := (B2 + C25 × B5 + C26 × B6) × H2; B3 := (B3 + C35 × B5 + C36 × B6) × H; B4 := (B4 + C45 × B5 + C46 × B6) × H2; end EL.MATVECEVAL.; L := 1; W := V := 0; N2 := N + N - 2; XL1 := X[0]; XL := X[1]; YA := E[1]; ZA := E[2]; YB := E[3]; ZB := E[4]; ELEMENTMATVECEVALUATION; EM[2] := 10-12; R1 := B3 - A13 × YA - A23 × ZA; D1 := A33; D2 := A44; R2 := B4 - A14 × YA - A24 × ZA; E1 := A34; for L := L + 1 while L < N do begin XL1 := XL; XL := X[L]; ELEMENTMATVECEVALUATION; A[W + 1] := D1 + A11; A[W + 4] := E1 + A12; A[W + 7] := A13; A[W + 10] := A14; A[W + 5] := D2 + A22; A[W + 8] := A23; A[W + 11] := A24; A[W + 14] := 0; Y[V + 1] := R1 + B1; Y[V + 2] := R2 + B2; R1 := B3; R2 := B4; V := V + 2; W := W + 8; D1 := A33; D2 := A44; E1 := A34 end; L := N; XL1 := XL; XL := X[L]; ELEMENTMATVECEVALUATION; Y[N2 - 1] := R1 + B1 - A13 × YB - A14 × ZB; Y[N2] := R2 + B2 - A23 × YB - A24 × ZB; A[W + 1] := D1 + A11; A[W + 4] := E1 + A12; A[W + 5] := D2 + A22; CHLDECSOLBND(A, N2, 3, EM, Y) end FEMHERM; comment ================== 34600 ================= ; procedure QZIVAL(N, A, B, ALFR, ALFI, BETA, ITER, EM); value N; integer N; array A, B, ALFR, ALFI, BETA, EM; integer array ITER; begin real DWARF, EPS, EPSA, EPSB; procedure ELMCOL(L, U, I, J, A, B, X); code 34023; procedure HSHDECMUL(N, A, B, DWARF); code 34602; procedure HESTGL2(N, A, B); code 34604; procedure HSH2ROW2(LA, LB, UA, UB, J, A1, A2, A, B); code 34608; procedure HSH3ROW2(LA, LB, U, J, A1, A2, A3, A, B); code 34610; procedure HSH2COL(LA, LB, U, I, A1, A2, A, B); code 34605; procedure HSH3COL(LA, LB, U, I, A1, A2, A3, A, B); code 34606; procedure CHSH2(A1R, A1I, A2R, A2I, C, SR, SI); code 34611; procedure HSHVECMAT(LR, UR, LC, UC, X, U, A); code 31070; procedure HSHVECTAM(LR, UR, LC, UC, X, U, A); code 31073; procedure QZIT(N, A, B, EPS, EPSA, EPSB, ITER); value N, EPS; real EPS, EPSA, EPSB; integer N; integer array ITER; array A, B; begin real ANORM, BNORM, ANI, BNI, CONST, A10, A20, A30, B11, B22, B33, B44, A11, A12, A21, A22, A33, A34, A43, A44, B12, B34, OLD1, OLD2; integer I, Q, M, M1, Q1, J, K, K1, K2, K3, KM1; Boolean STATIONARY; ANORM := BNORM := 0; for I := 1 step 1 until N do begin BNI := 0; ITER[I] := 0; ANI := if I > 1 then ABS(A[I, I-1]) else 0; for J := I step 1 until N do begin ANI := ANI + ABS(A[I, J]); BNI := BNI + ABS(B[I, J]) end; if ANI > ANORM then ANORM := ANI; if BNI > BNORM then BNORM := BNI end; if ANORM = 0 then ANORM := EPS; if BNORM = 0 then BNORM := EPS; EPSA := EPS × ANORM; EPSB := EPS × BNORM; for M := N, M while M ≥ 3 do begin for I := M + 1, I-1 while (if I > 1 then ABS(A[I, I-1]) > EPSA else false) do Q := I-1; if Q > 1 then A[Q, Q-1] := 0; L: if Q ≥ M-1 then M := Q-1 else begin if ABS(B[Q, Q]) ≤ EPSB then begin B[Q, Q] := 0; Q1 := Q + 1; HSH2COL(Q, Q, M, Q, A[Q, Q], A[Q1, Q], A, B); A[Q1, Q] := 0; Q := Q1; goto L end else M1 := M-1; Q1 := Q + 1; CONST := 0.75; ITER[M] := ITER[M] + 1; STATIONARY := if ITER[M] = 1 then true else ABS(A[M, M-1]) ≥ CONST × OLD1 ∧ ABS(A[M-1, M-2]) ≥ CONST × OLD2; if ITER[M] > 30 ∧ STATIONARY then begin for I := 1 step 1 until M do ITER[I] := -1; goto OUT end; if ITER[M] = 10 ∧ STATIONARY then begin A10 := 0; A20 := 1; A30 := 1.1605 end else begin B11 := B[Q, Q]; B22 := if ABS(B[Q1, Q1]) < EPSB then EPSB else B[Q1, Q1]; B33 := if ABS(B[M1, M1]) < EPSB then EPSB else B[M1, M1]; B44 := if ABS(B[M, M]) < EPSB then EPSB else B[M, M] ; A11 := A[Q, Q]/B11; A12 := A[Q, Q1]/B22; A21 := A[Q1, Q]/B11; A22 := A[Q1, Q1]/B22; A33 := A[M1, M1]/B33; A34 := A[M1, M]/B44; A43 := A[M, M1]/B33; A44 := A[M, M]/B44; B12 := B[Q, Q1]/B22; B34 := B[M1, M]/B44; A10 := ((A33-A11) × (A44-A11)-A34 × A43 + A43 × B34 × A11)/A21 + A12-A11 × B12; A20 := (A22-A11-A21 × B12)-(A33-A11)-(A44-A11) + A43 × B34; A30 := A[Q + 2, Q1]/B22 end; OLD1 := ABS(A[M, M-1]); OLD2 := ABS(A[M-1, M-2]); for K := Q step 1 until M1 do begin K1 := K + 1; K2 := K + 2; K3 := if K + 3 > M then M else K + 3; KM1 := if K-1 < Q then Q else K-1; if K ≠ M1 then begin if K = Q then begin HSH3COL(KM1, KM1, M, K, A[K, KM1], A[K1, KM1], A[K2, KM1], A, B); A[K1, KM1] := A[K2, KM1] := 0 end; HSH3ROW2(Q, Q, K3, K, B[K2, K2], B[K2, K1], B[K2, K], A, B); B[K2, K] := B[K2, K1] := 0 ; end else begin HSH2COL(KM1, KM1, M, K, A[K, KM1], A[K1, KM1], A, B); A[K1, KM1] := 0 end; HSH2ROW2(Q, Q, K3, K3, K, B[K1, K1], B[K1, K], A, B); B[K1, K] := 0 end end; OUT: end end QZIT; comment ================== 34601 ================= ; procedure QZI(N, A, B, X, ALFR, ALFI, BETA, ITER, EM); value N; integer N; array A, B, X, ALFR, ALFI, BETA, EM; integer array ITER; begin real DWARF, EPS, EPSA, EPSB; real procedure MATMAT(L, U, I, J, A, B); code 34013; procedure HSHDECMUL(N, A, B, DWARF); code 34602; procedure HESTGL3(N, A, B, X); code 34603; procedure HSH2ROW3(L, UA, UB, UX, J, A1, A2, A, B, X); code 34607; procedure HSH3ROW3(L, U, UX, J, A1, A2, A3, A, B, X); code 34609; procedure HSH2COL(LA, LB, U, I, A1, A2, A, B); code 34605; procedure HSH3COL(LA, LB, U, I, A1, A2, A3, A, B); code 34606; procedure CHSH2(A1R, A1I, A2R, A2I, C, SR, SI); code 34611; procedure COMDIV(XR, XI, YR, YI, ZR, ZI); code 34342; procedure QZIT(N, A, B, X, EPS, EPSA, EPSB, ITER); value N, EPS; real EPS, EPSA, EPSB; integer N; integer array ITER; array A, B, X; begin real ANORM, BNORM, ANI, BNI, CONST, A10, A20, A30, B11, B22, B33, B44, A11, A12, A21, A22, A33, A34, A43, A44, B12, B34, OLD1, OLD2; integer I, Q, M, M1, Q1, J, K, K1, K2, K3, KM1; Boolean STATIONARY; ANORM := BNORM := 0; for I := 1 step 1 until N do begin BNI := 0; ITER[I] := 0; ANI := if I > 1 then ABS(A[I, I-1]) else 0; for J := I step 1 until N do begin ANI := ANI + ABS(A[I, J]); BNI := BNI + ABS(B[I, J]) end; if ANI > ANORM then ANORM := ANI; if BNI > BNORM then BNORM := BNI end; if ANORM = 0 then ANORM := EPS; if BNORM = 0 then BNORM := EPS; EPSA := EPS × ANORM; EPSB := EPS × BNORM; for M := N, M while M ≥ 3 do begin for I := M + 1, I-1 while (if I > 1 then ABS(A[I, I-1]) > EPSA else false) do Q := I-1; if Q > 1 then A[Q, Q-1] := 0; L: if Q ≥ M-1 then M := Q-1 else begin if ABS(B[Q, Q]) ≤ EPSB then begin B[Q, Q] := 0; Q1 := Q + 1; HSH2COL(Q, Q, N, Q, A[Q, Q], A[Q1, Q], A, B); A[Q1, Q] := 0; Q := Q1; goto L end else M1 := M-1; Q1 := Q + 1; CONST := 0.75; ITER[M] := ITER[M] + 1; STATIONARY := if ITER[M] = 1 then true else ABS(A[M, M-1]) ≥ CONST × OLD1 ∧ ABS(A[M-1, M-2]) ≥ CONST × OLD2; if ITER[M] > 30 ∧ STATIONARY then begin for I := 1 step 1 until M do ITER[I] := -1; goto OUT end; if ITER[M] = 10 ∧ STATIONARY then begin A10 := 0; A20 := 1; A30 := 1.1605 end else begin B11 := B[Q, Q]; B22 := if ABS(B[Q1, Q1]) < EPSB then EPSB else B[Q1, Q1]; B33 := if ABS(B[M1, M1]) < EPSB then EPSB else B[M1, M1]; B44 := if ABS(B[M, M]) < EPSB then EPSB else B[M, M] ; A11 := A[Q, Q]/B11; A12 := A[Q, Q1]/B22; A21 := A[Q1, Q]/B11; A22 := A[Q1, Q1]/B22; A33 := A[M1, M1]/B33; A34 := A[M1, M]/B44; A43 := A[M, M1]/B33; A44 := A[M, M]/B44; B12 := B[Q, Q1]/B22; B34 := B[M1, M]/B44; A10 := ((A33-A11) × (A44-A11)-A34 × A43 + A43 × B34 × A11)/A21 + A12-A11 × B12; A20 := (A22-A11-A21 × B12)-(A33-A11)-(A44-A11) + A43 × B34; A30 := A[Q + 2, Q1]/B22 end; OLD1 := ABS(A[M, M-1]); OLD2 := ABS(A[M-1, M-2]); for K := Q step 1 until M1 do begin K1 := K + 1; K2 := K + 2; K3 := if K + 3 > M then M else K + 3; KM1 := if K-1 < Q then Q else K-1; if K ≠ M1 then begin if K = Q then HSH3COL(KM1, KM1, N, K, A10, A20, A30, A, B) else begin HSH3COL(KM1, KM1, N, K, A[K, KM1], A[K1, KM1], A[K2, KM1], A, B); A[K1, KM1] := A[K2, KM1] := 0 end; HSH3ROW3(1, K3, N, K, B[K2, K2], B[K2, K1], B[K2, K], A, B, X); B[K2, K] := B[K2, K1] := 0 ; end else begin HSH2COL(KM1, KM1, N, K, A[K, KM1], A[K1, KM1], A, B); A[K1, KM1] := 0 end; HSH2ROW3(1, K3, K3, N, K, B[K1, K1], B[K1, K], A, B, X); B[K1, K] := 0 end end end; OUT: end QZIT; procedure QZVAL(N, A, B, X, EPSA, EPSB, ALFR, ALFI, BETA); value N; real EPSA, EPSB; integer N; array ALFR, ALFI, BETA, A, B, X; begin integer M, L, J; real AN, BN, A11, A12, A21, A22, B11, B12, B22, E, C, D, ER, EI, A11R, A11I, A12R, A12I, A21R, A21I, A22R, A22I, CZ, SZR, SZI, CQ, SQR, SQI, SSR, SSI, TR, TI, BDR, BDI, R; for M := N, M while M > 0 do if (if M > 1 then A[M, M-1] = 0 else true) then begin ALFR[M] := A[M, M]; BETA[M] := B[M, M]; ALFI[M] := 0; M := M-1 end else begin L := M-1; if ABS(B[L, L]) ≤ EPSB then begin B[L, L] := 0; HSH2COL(L, L, N, L, A[L, L], A[M, L], A, B); A[M, L] := B[M, L] := 0; ALFR[L] := A[L, L]; ALFR[M] := A[M, M]; BETA[L] := B[L, L]; BETA[M] := B[M, M]; ALFI[M] := ALFI[L] := 0; end else if ABS(B[M, M]) ≤ EPSB then begin B[M, M] := 0; HSH2ROW3(1, M, M, N, L, A[M, M], A[M, L], A, B, X); A[M, L] := B[M, L] := 0; ALFR[L] := A[L, L]; ALFR[M] := A[M, M]; BETA[L] := B[L, L]; BETA[M] := B[M, M]; ALFI[M] := ALFI[L] := 0; end else begin AN := ABS(A[L, L]) + ABS(A[L, M]) + ABS(A[M, L]) + ABS(A[M, M]); BN := ABS(B[L, L]) + ABS(B[L, M]) + ABS(B[M, M]); A11 := A[L, L]/AN; A12 := A[L, M]/AN; A21 := A[M, L]/AN; A22 := A[M, M]/AN; B11 := B[L, L]/BN; B12 := B[L, M]/BN; B22 := B[M, M]/BN; E := A11/B11; C := ((A22-E × B22)/B22-(A21 × B12)/(B11 × B22))/2; D := C × C + (A21 × (A12-E × B12))/(B11 × B22); if D ≥ 0 then begin E := E + (if C < 0 then C-SQRT(D) else C + SQRT(D)); A11 := A11-E × B11; A12 := A12-E × B12; A22 := A22-E × B22; if ABS(A11) + ABS(A12) ≥ ABS(A21) + ABS(A22) then HSH2ROW3(1, M, M, N, L, A12, A11, A, B, X) else HSH2ROW3(1, M, M, N, L, A22, A21, A, B, X); if AN ≥ ABS(E) × BN then HSH2COL(L, L, N, L, B[L, L], B[M, L], A, B) else HSH2COL(L, L, N, L, A[L, L], A[M, L], A, B); A[M, L] := B[M, L] := 0; ALFR[L] := A[L, L]; ALFR[M] := A[M, M]; BETA[L] := B[L, L]; BETA[M] := B[M, M]; ALFI[M] := ALFI[L] := 0; end else begin ER := E + C; EI := SQRT(-D); A11R := A11-ER × B11; A11I := EI × B11; A12R := A12-ER × B12; A12I := EI × B12; A21R := A21; A21I := 0; A22R := A22-ER × B22; A22I := EI × B22; if ABS(A11R) + ABS(A11I) + ABS(A12R) + ABS(A12I) ≥ ABS(A21R) + ABS(A22R) + ABS(A22I) then CHSH2(A12R, A12I, -A11R, -A11I, CZ, SZR, SZI) else CHSH2(A22R, A22I, -A21R, -A21I, CZ, SZR, SZI); if AN ≥ (ABS(ER) + ABS(EI)) × BN then CHSH2(CZ × B11 + SZR × B12, SZI × B12, SZR × B22, SZI × B22, CQ, SQR, SQI) else CHSH2(CZ × A11 + SZR × A12, SZI × A12, CZ × A21 + SZR × A22, SZI × A22, CQ, SQR, SQI); SSR := SQR × SZR + SQI × SZI; SSI := SQR × SZI-SQI × SZR; TR := CQ × CZ × A11 + CQ × SZR × A12 + SQR × CZ × A21 + SSR × A22; TI := CQ × SZI × A12-SQI × CZ × A21 + SSI × A22; BDR := CQ × CZ × B11 + CQ × SZR × B12 + SSR × B22; BDI := CQ × SZI × B12 + SSI × B22; R := SQRT(BDR × BDR + BDI × BDI); BETA[L] := BN × R; ALFR[L] := AN × (TR × BDR + TI × BDI)/R; ALFI[L] := AN × (TR × BDI-TI × BDR)/R; TR := SSR × A11-SQR × CZ × A12-CQ × SZR × A21 + CQ × CZ × A22; TI := -SSI × A11-SQI × CZ × A12 + CQ × SZI × A21; BDR := SSR × B11-SQR × CZ × B12 + CQ × CZ × B22; BDI := -SSI × B11-SQI × CZ × B12; R := SQRT(BDR × BDR + BDI × BDI); BETA[M] := BN × R; ALFR[M] := AN × (TR × BDR + TI × BDI)/R; ALFI[M] := AN × (TR × BDI-TI × BDR)/R; end end; M := M-2 end end QZVAL; comment ================== 34602 ================= ; procedure HSHDECMUL(N, A, B, DWARF); value N, DWARF; integer N; real DWARF; array A, B; begin array V[1:N]; integer J, K, K1, N1; real R, T, C; real procedure TAMMAT(L, U, I, J, A, B); code 34014; procedure HSHVECMAT(LR, UR, LC, UC, X, U, A); code 31070; K := 1; N1 := N + 1; for K1 := 2 step 1 until N1 do begin R := TAMMAT(K1, N, K, K, B, B); if R > DWARF then begin R := if B[K, K] < 0 then -SQRT(R + B[K, K] × B[K, K]) else SQRT(R + B[K, K] × B[K, K]); T := B[K, K] + R; C := -T/R; B[K, K] := -R; V[K] := 1; for J := K1 step 1 until N do V[J] := B[J, K]/T; HSHVECMAT(K, N, K1, N, C, V, B); HSHVECMAT(K, N, 1, N, C, V, A) end; K := K1 end end HSHDECMUL; comment ================== 34603 ================= ; procedure HESTGL3(N, A, B, X); value N; integer N; array A, B, X; begin integer NM1, K, L, K1, L1; procedure HSH2COL(LA, LB, U, I, A1, A2, A, B); code 34605; procedure HSH2ROW3(L, UA, UB, UX, J, A1, A2, A, B, X); code 34607; if N > 2 then begin for K := 2 step 1 until N do for L := 1 step 1 until K-1 do B[K, L] := 0; NM1 := N-1; K := 1; for K1 := 2 step 1 until NM1 do begin L1 := N; for L := N-1 step -1 until K1 do begin HSH2COL(K, L, N, L, A[L, K], A[L1, K], A, B); A[L1, K] := 0; HSH2ROW3(1, N, L1, N, L, B[L1, L1], B[L1, L], A, B, X); B[L1, L] := 0; L1 := L end; K := K1 end end end HESTGL3; comment ================== 34604 ================= ; procedure HESTGL2(N, A, B); value N; integer N; array A, B; begin integer NM1, K, L, K1, L1; procedure HSH2COL(LA, LB, U, I, A1, A2, A, B); code 34605; procedure HSH2ROW2(LA, LB, UA, UB, A1, A2, A, B); code 34608; if N > 2 then begin for K := 2 step 1 until N do for L := 1 step 1 until K-1 do B[K, L] := 0; NM1 := N-1; K := 1; for K1 := 2 step 1 until NM1 do begin L1 := N; for L := N-1 step -1 until K1 do begin HSH2COL(K, L, N, L, A[L, K], A[L1, K], A, B); A[L1, K] := 0; HSH2ROW2(1, 1, N, L1, L, B[L1, L1], B[L1, L], A, B); B[L1, L] := 0; L1 := L end; K := K1 end end end HESTGL2; comment ================== 34605 ================= ; procedure HSH2COL(LA, LB, U, I, A1, A2, A, B); value LA, LB, U, I, A1, A2; integer LA, LB, U, I; real A1, A2; array A, B; if A2 ≠ 0 then begin real R, T, C; array V[I:I + 1]; procedure HSHVECMAT(LR, UR, LC, UC, X, U, A); code 31070; R := if A1 < 0 then -SQRT(A1 × A1 + A2 × A2) else SQRT(A1 × A1 + A2 × A2); T := A1 + R; C := -T/R; V[I] := 1; V[I + 1] := A2/T; HSHVECMAT(I, I + 1, LA, U, C, V, A); HSHVECMAT(I, I + 1, LB, U, C, V, B) end HSH2COL; comment ================== 34606 ================= ; procedure HSH3COL(LA, LB, U, I, A1, A2, A3, A, B); value LA, LB, U, I, A1, A2, A3; integer LA, LB, I, U; real A1, A2, A3; array A, B; if A2 ≠ 0 ∨ A3 ≠ 0 then begin real R, T, C; array V[I:I + 2]; procedure HSHVECMAT(LR, UR, LC, UC, X, U, A); code 31070; R := if A1 < 0 then -SQRT(A1 × A1 + A2 × A2 + A3 × A3) else SQRT(A1 × A1 + A2 × A2 + A3 × A3); T := A1 + R; C := -T/R; V[I] := 1; V[I + 1] := A2/T; V[I + 2] := A3/T; HSHVECMAT(I, I + 2, LA, U, C, V, A); HSHVECMAT(I, I + 2, LB, U, C, V, B) end HSH3COL; comment ================== 34607 ================= ; procedure HSH2ROW3(L, UA, UB, UX, J, A1, A2, A, B, X); value L, UA, UB, UX, J, A1, A2; integer L, UA, UB, UX, J; real A1, A2; array A, B, X; if A2 ≠ 0 then begin real R, T, C; integer K; array V[J:J + 1]; procedure HSHVECTAM(LR, UR, LC, UC, X, U, A); code 31073; R := if A1 < 0 then -SQRT(A1 × A1 + A2 × A2) else SQRT(A1 × A1 + A2 × A2); T := A1 + R; C := -T/R; V[J + 1] := 1; V[J] := A2/T; HSHVECTAM(L, UA, J, J + 1, C, V, A); HSHVECTAM(L, UB, J, J + 1, C, V, B); HSHVECTAM(1, UX, J, J + 1, C, V, X) end HSH2ROW3; comment ================== 34608 ================= ; procedure HSH2ROW2(LA, LB, UA, UB, J, A1, A2, A, B); value LA, LB, UA, UB, J, A1, A2; integer LA, LB, UA, UB, J; real A1, A2; array A, B; if A2 ≠ 0 then begin real R, T, C; integer K; array V[J:J + 1]; procedure HSHVECTAM(LR, UR, LC, UC, X, U, A); code 31073; R := if A1 < 0 then -SQRT(A1 × A1 + A2 × A2) else SQRT(A1 × A1 + A2 × A2); T := A1 + R; C := -T/R; V[J + 1] := 1; V[J] := A2/T; HSHVECTAM(LA, UA, J, J + 1, C, V, A); HSHVECTAM(LB, UB, J, J + 1, C, V, B) end HSH2ROW2; comment ================== 34609 ================= ; procedure HSH3ROW3(L, U, UX, J, A1, A2, A3, A, B, X); value L, U, UX, J, A1, A2, A3; integer L, J, U, UX; real A1, A2, A3; array A, B, X; if A2 ≠ 0 ∨ A3 ≠ 0 then begin real R, T, C; array V[J:J + 2]; integer K; procedure HSHVECTAM(LR, UR, LC, UC, X, U, A); code 31073; R := if A1 < 0 then -SQRT(A1 × A1 + A2 × A2 + A3 × A3) else SQRT(A1 × A1 + A2 × A2 + A3 × A3); T := A1 + R; C := -T/R; V[J + 2] := 1; V[J + 1] := A2/T; V[J] := A3/T; HSHVECTAM(L, U, J, J + 2, C, V, A); HSHVECTAM(L, U, J, J + 2, C, V, B); HSHVECTAM(L, UX, J, J + 2, C, V, X) end HSH3ROW3; comment ================== 34610 ================= ; procedure HSH3ROW2(LA, LB, U, J, A1, A2, A3, A, B); value LA, LB, U, J, A1, A2, A3; integer LA, LB, U, J; real A1, A2, A3; array A, B; if A2 ≠ 0 ∨ A3 ≠ 0 then begin real R, T, C; array V[J:J + 2]; procedure HSHVECTAM(LR, UR, LC, UC, X, U, A); code 31073; R := if A1 < 0 then -SQRT(A1 × A1 + A2 × A2 + A3 × A3) else SQRT(A1 × A1 + A2 × A2 + A3 × A3); T := A1 + R; C := -T/R; V[J + 2] := 1; V[J + 1] := A2/T; V[J] := A3/T; HSHVECTAM(LA, U, J, J + 2, C, V, A); HSHVECTAM(LB, U, J, J + 2, C, V, B) end HSH3ROW2; comment ================== 31070 ================= ; procedure HSHVECMAT(LR, UR, LC, UC, X, U, A); value LR, UR, LC, UC, X; integer LR, UR, LC, UC; real X; array U, A; begin real procedure TAMVEC(L, U, I, A, B); code 34012; procedure ELMCOLVEC(L, U, I, A, B, X); code 34022; for LC := LC step 1 until UC do ELMCOLVEC(LR, UR, LC, A, U, TAMVEC(LR, UR, LC, A, U) × X) end; comment ================== 31071 ================= ; procedure HSHCOLMAT(LR, UR, LC, UC, I, X, U, A); value LR, UR, LC, UC, I, X; integer LR, UR, LC, UC, I; real X; array U, A; begin real procedure TAMMAT(L, U, I, J, A, B); code 34014; procedure ELMCOL(L, U, I, J, A, B, X); code 34023; for LC := LC step 1 until UC do ELMCOL(LR, UR, LC, I, A, U, TAMMAT(LR, UR, LC, I, A, U) × X) end; comment ================== 31072 ================= ; procedure HSHROWMAT(LR, UR, LC, UC, I, X, U, A); value LR, UR, LC, UC, I, X; integer LR, UR, LC, UC, I; real X; array U, A; begin real procedure MATMAT(L, U, I, J, A, B); code 34013; procedure ELMCOLROW(L, U, I, J, A, B, X); code 34029; for LC := LC step 1 until UC do ELMCOLROW(LR, UR, LC, I, A, U, MATMAT(LR, UR, I, LC, U, A) × X) end; comment ================== 31073 ================= ; procedure HSHVECTAM(LR, UR, LC, UC, X, U, A); value LR, UR, LC, UC, X; integer LR, UR, LC, UC; real X; array U, A; begin real procedure MATVEC(L, U, I, A, B); code 34011; procedure ELMROWVEC(L, U, I, A, B, X); code 34027; for LR := LR step 1 until UR do ELMROWVEC(LC, UC, LR, A, U, MATVEC(LC, UC, LR, A, U) × X) end; comment ================== 31074 ================= ; procedure HSHCOLTAM(LR, UR, LC, UC, I, X, U, A); value LR, UR, LC, UC, I, X; integer LR, UR, LC, UC, I; real X; array U, A; begin real procedure MATMAT(L, U, I, J, A, B); code 34013; procedure ELMROWCOL(L, U, I, J, A, B, X); code 34028; for LR := LR step 1 until UR do ELMROWCOL(LC, UC, LR, I, A, U, MATMAT(LC, UC, LR, I, A, U) × X) end; comment ================== 31075 ================= ; procedure HSHROWTAM(LR, UR, LC, UC, I, X, U, A); value LR, UR, LC, UC, I, X; integer LR, UR, LC, UC, I; real X; array U, A; begin real procedure MATTAM(L, U, I, J, A, B); code 34015; procedure ELMROW(L, U, I, J, A, B, X); code 34024; for LR := LR step 1 until UR do ELMROW(LC, UC, LR, I, A, U, MATTAM(LC, UC, LR, I, A, U) × X) end; comment ================== 30006 ================= ; real procedure PI; PI := 3.14159265358979; comment ================== 30007 ================= ; real procedure E; E := 2.71828182845905; comment ================== 34410 ================= ; procedure LNGVECVEC(L, U, SHIFT, A, B, C, CC, D, DD); value L, U, SHIFT, C, CC; integer L, U, SHIFT; real C, CC, D, DD; array A, B; begin real E, EE; procedure DPMUL(A, B, C, CC); code 31103; procedure LNGADD(A, AA, B, BB, C, CC); code 31105; for L := L step 1 until U do begin DPMUL(A[L], B[L + SHIFT], E, EE); LNGADD(C, CC, E, EE, C, CC) end; D := C; DD := CC end LNGVECVEC; comment ================== 34411 ================= ; procedure LNGMATVEC(L, U, I, A, B, C, CC, D, DD); value L, U, I, C, CC; integer L, U, I; real C, CC, D, DD; array A, B; begin real E, EE; procedure DPMUL(A, B, C, CC); code 31103; procedure LNGADD(A, AA, B, BB, C, CC); code 31105; for L := L step 1 until U do begin DPMUL(A[I, L], B[I], E, EE); LNGADD(C, CC, E, EE, C, CC) end; D := C; DD := CC end LNGMATVEC; comment ================== 34412 ================= ; procedure LNGTAMVEC(L, U, I, A, B, C, CC, D, DD); value L, U, I, C, CC; integer L, U, I; real C, CC, D, DD; array A, B; begin real E, EE; procedure DPMUL(A, B, C, CC); code 31103; procedure LNGADD(A, AA, B, BB, C, CC); code 31105; for L := L step 1 until U do begin DPMUL(A[L, I], B[I], E, EE); LNGADD(C, CC, E, EE, C, CC) end; D := C; DD := CC end LNGTAMVEC; comment ================== 34413 ================= ; procedure LNGMATMAT(L, U, I, J, A, B, C, CC, D, DD); value L, U, I, J, C, CC; integer L, U, I, J; real C, CC, D, DD; array A, B; begin real E, EE; procedure DPMUL(A, B, C, CC); code 31103; procedure LNGADD(A, AA, B, BB, C, CC); code 31105; for L := L step 1 until U do begin DPMUL(A[I, L], B[L, J], E, EE); LNGADD(C, CC, E, EE, C, CC) end; D := C; DD := CC end LNGMATMAT; comment ================== 34414 ================= ; procedure LNGTAMMAT(L, U, I, J, A, B, C, CC, D, DD); value L, U, I, J, C, CC; integer L, U, I, J; real C, CC, D, DD; array A, B; begin real E, EE; procedure DPMUL(A, B, C, CC); code 31103; procedure LNGADD(A, AA, B, BB, C, CC); code 31105; for L := L step 1 until U do begin DPMUL(A[L, I], B[L, J], E, EE); LNGADD(C, CC, E, EE, C, CC) end; D := C; DD := CC end LNGTAMMAT; comment ================== 34415 ================= ; procedure LNGMATTAM(L, U, I, J, A, B, C, CC, D, DD); value L, U, I, J, C, CC; integer L, U, I, J; real C, CC, D, DD; array A, B; begin real E, EE; procedure DPMUL(A, B, C, CC); code 31103; procedure LNGADD(A, AA, B, BB, C, CC); code 31105; for L := L step 1 until U do begin DPMUL(A[I, L], B[J, L], E, EE); LNGADD(C, CC, E, EE, C, CC) end; D := C; DD := CC end LNGMATTAM; comment ================== 34416 ================= ; procedure LNGSEQVEC(L, U, IL, SHIFT, A, B, C, CC, D, DD); value L, U, IL, SHIFT, C, CC; integer L, U, IL, SHIFT; real C, CC, D, DD; array A, B; begin real E, EE; procedure DPMUL(A, B, C, CC); code 31103; procedure LNGADD(A, AA, B, BB, C, CC); code 31105; for L := L step 1 until U do begin DPMUL(A[IL], B[L + SHIFT], E, EE); IL := IL + L; LNGADD(C, CC, E, EE, C, CC) end; D := C; DD := CC end LNGSEQVEC; comment ================== 31507 ================= ; procedure LNGFULSYMMATVEC(LR, UR, LC, UC, A, B, C); value LR, UR, LC, UC, B; integer LR, UR, LC, UC; array A, B, C; begin real D, DD; procedure LNGSYMMATVEC(L, U, I, A, B, C, CC, D, DD); code 34418; for LR := LR step 1 until UR do begin LNGSYMMATVEC(LC, UC, LR, A, B, 0, 0, D, DD); C[LR] := D + DD end end LNGFULSYMMATVEC; comment ================== 31508 ================= ; procedure LNGRESVEC(LR, UR, LC, UC, A, B, C, X); value LR, UR, LC, UC, X; integer LR, UR, LC, UC; real X; array A, B, C; begin real D, DD, E, EE; procedure DPMUL(X, Y, E, EE); code 31103; procedure LNGMATVEC(L, U, I, A, B, C, CC, D, DD); code 34411; for LR := LR step 1 until UR do begin DPMUL(C[LR], X, E, EE); LNGMATVEC(LC, UC, LR, A, B, E, EE, D, DD); C[LR] := D + DD end end LNGRESVEC; comment ================== 31509 ================= ; procedure LNGSYMRESVEC(LR, UR, LC, UC, A, B, C, X); value LR, UR, LC, UC, B, X; integer LR, UR, LC, UC; real X; array A, B, C; begin real D, DD, E, EE; procedure DPMUL(X, Y, E, EE); code 31103; procedure LNGSYMMATVEC(L, U, I, A, B, C, CC, D, DD); code 34418; for LR := LR step 1 until UR do begin DPMUL(C[LR], X, E, EE); LNGSYMMATVEC(LC, UC, LR, A, B, E, EE, D, DD); C[LR] := D + DD end end LNGSYMRESVEC; comment ================== 34357 ================= ; procedure ROTCOMCOL(L, U, I, J, AR, AI, CR, CI, S); value L, U, I, J, CR, CI, S; integer L, U, I, J; real CR, CI, S; array AR, AI; begin real ARLI, AILI, ARLJ, AILJ; for L := L step 1 until U do begin ARLI := AR[L, I]; AILI := AI[L, I]; ARLJ := AR[L, J]; AILJ := AI[L, J]; AR[L, I] := CR × ARLI + CI × AILI - S × ARLJ; AI[L, I] := CR × AILI - CI × ARLI - S × AILJ; AR[L, J] := CR × ARLJ - CI × AILJ + S × ARLI; AI[L, J] := CR × AILJ + CI × ARLJ + S × AILI; end end ROTCOMCOL; comment ================== 34358 ================= ; procedure ROTCOMROW(L, U, I, J, AR, AI, CR, CI, S); value L, U, I, J, CR, CI, S; integer L, U, I, J; real CR, CI, S; array AR, AI; begin real ARIL, AIIL, ARJL, AIJL; for L := L step 1 until U do begin ARIL := AR[I, L]; AIIL := AI[I, L]; ARJL := AR[J, L]; AIJL := AI[J, L]; AR[I, L] := CR × ARIL + CI × AIIL + S × ARJL; AI[I, L] := CR × AIIL - CI × ARIL + S × AIJL; AR[J, L] := CR × ARJL - CI × AIJL - S × ARIL; AI[J, L] := CR × AIJL + CI × ARJL - S × AIIL; end end ROTCOMROW; comment ================== 34611 ================= ; procedure CHSH2(A1R, A1I, A2R, A2I, C, SR, SI); value A1R, A1I, A2R, A2I; real A1R, A1I, A2R, A2I, C, SR, SI; begin real R; if A2R ≠ 0 ∨ A2I ≠ 0 then begin if A1R ≠ 0 ∨ A1I ≠ 0 then begin R := SQRT(A1R × A1R + A1I × A1I); C := R; SR := (A1R × A2R + A1I × A2I)/R; SI := (A1R × A2I-A1I × A2R)/R; R := SQRT(C × C + SR × SR + SI × SI); C := C/R; SR := SR/R; SI := SI/R end else begin SI := C := 0; SR := 1 end end else begin C := 1; SR := SI := 0 end end CHSH2; comment ================== 33314 ================= ; procedure NONLIN FEM LAG SKEW(X, Y, N, F, FY, FZ, NC, E); integer N, NC; real procedure F, FY, FZ; array X, Y, E; begin integer L, L1, IT; real XL1, XL, H, A12, A21, B1, B2, TAU1, TAU2, CH, TL, G, YL, PP, PLM, PRM, PL1, PL3, PL1PL2, PL1PL3, PL2PL2, PL2PL3, PR1PR2, PR1PR3, PR2PR3, PL1QL2, PL1QL3, PL2QL1, PL2QL2, PL2QL3, PL3QL1, PL3QL2, PR1QR2, PR1QR3, PR2QR1, PR2QR2, PR2QR3, PR3QR1, PR3QR2, H2RM, ZL1, ZL, E1, E2, E3, E4, E5, E6, EPS, RHO; array T, SUPER, SUB, CHI, GI[0:N-1], Z[0:N]; procedure DUPVEC(L, U, S, A, B); code 31030; procedure ELEMENT MAT VEC EVALUATION 1; begin real XM, VL, VR, WL, WR, PR, QM, RM, FM, XL12, XL1XL, XL2, ZM, ZACCM; if NC = 0 then VL := VR := 0.5 else if NC = 1 then begin VL := (XL1 × 2 + XL)/6; VR := (XL1 + XL × 2)/6 end else begin XL12 := XL1 × XL1/12; XL1XL := XL1 × XL/6; XL2 := XL × XL/12; VL := 3 × XL12 + XL1XL + XL2; VR := 3 × XL2 + XL1XL + XL12 end; WL := H × VL; WR := H × VR; PR := VR/(VL + VR); XM := XL1 + H × PR; ZM := PR × ZL + (1 - PR) × ZL1; ZACCM := (ZL - ZL1)/H ; QM := FZ(XM, ZM, ZACCM); RM := FY(XM, ZM, ZACCM); FM := F(XM, ZM, ZACCM); TAU1 := WL × RM; TAU2 := WR × RM; B1 := WL × FM - ZACCM × (VL + VR); B2 := WR × FM + ZACCM × (VL + VR); A12 := - (VL + VR)/H + VL × QM + (1 - PR) × PR × RM × (WL + WR); A21 := - (VL + VR)/H - VR × QM + (1 - PR) × PR × RM × (WL + WR); end ELEM. M.V. EV.; procedure BOUNDARY CONDITIONS; if L = 1 ∧ E2 = 0 then begin TAU1 := 1; B1 := A12 := 0 end else if L = 1 ∧ E2 ≠ 0 then begin TAU1 := TAU1 - E1/E2 end else if L = N ∧ E5 = 0 then begin TAU2 := 1; B2 := A21 := 0 end else if L = N ∧ E5 ≠ 0 then begin TAU2 := TAU2 + E4/E5 end B.C.1; procedure FORWARD BABUSKA; if L = 1 then begin CHI[0] := CH := TL := TAU1; T[0] := TL; GI[0] := G := YL := B1; Y[0] := YL; SUB[0] := A21; SUPER[0] := A12; PP := A21/(CH - A12); CH := TAU2 - CH × PP; G := B2 - G × PP; TL := TAU2; YL := B2 end else begin CHI[L1] := CH := CH + TAU1; GI[L1] := G := G + B1; SUB[L1] := A21; SUPER[L1] := A12; PP := A21/(CH - A12); CH := TAU2 - CH × PP; G := B2 - G × PP; T[L1] := TL + TAU1; TL := TAU2; Y[L1] := YL + B1; YL := B2 end FORWARD BABUSKA; procedure BACKWARD BABUSKA; begin PP := YL; Y[N] := G/CH; G := PP; CH := TL; L := N; for L := L - 1 while L ≥ 0 do begin PP := SUPER[L]/(CH - SUB[L]); TL := T[L]; CH := TL - CH × PP; YL := Y[L]; G := YL - G × PP; Y[L] := (GI[L] + G - YL)/(CHI[L] + CH - TL) ; end end BACKWARD BABUSKA; DUPVEC(0, N, 0, Z, Y); E1 := E[1]; E2 := E[2]; E3 := E[3]; E4 := E[4]; E5 := E[5]; E6 := E[6]; for IT := 1, IT + 1 while EPS > RHO do begin L := 0; XL := X[0]; ZL := Z[0]; for L := L + 1 while L ≤ N do begin XL1 := XL; L1 := L - 1; XL := X[L]; H := XL - XL1; ZL1 := ZL; ZL := Z[L]; ELEMENT MAT VEC EVALUATION 1; if L = 1 ∨ L = N then BOUNDARY CONDITIONS; FORWARD BABUSKA end; BACKWARD BABUSKA; EPS := 0; RHO := 1; for L := 0 step 1 until N do begin RHO := RHO + ABS(Z[L]); EPS := EPS + ABS(Y[L]); Z[L] := Z[L] - Y[L] end; RHO := 10-14 × RHO end; DUPVEC(0, N, 0, Y, Z) end NONLIN FEM LAG SKEW;