newnumal5p2.txt. May 13, 1992.
The set of plaintext ASCII files numalinx.txt newnumal5p1.txt newnumal5p2.txt newnumal5p3.txt together contains an update of the index and manual of the library NUMAL of Algol 60 procedures in numerical mathematics as published in the Mathematical Centre publication: P.W. Hemker (ed.)[1981]: NUMAL. Numerical Procedures in ALGOL 60. 7 volumes. MC Syllabus 47, Mathematical Centre, Amsterdam.
Size 772.7 kB - File type text/plainFile contents
1SECTION 3.3.1.1.1 (JULY 1974) PAGE 1
AUTHORS: T.J.DEKKER AND W.HOFFMANN.
CONTRIBUTORS: W.HOFFMANN, J.G.VERWER.
INSTITUTE: MATHEMATICAL CENTRE.
RECEIVED: 730716.
BRIEF DESCRIPTION:
THIS SECTION CONTAINS FOUR PROCEDURES FOR CALCULATING EIGENVALUES
OR EIGENVECTORS OF A SYMMETRIC TRIDIAGONAL MATRIX.
VALSYMTRI CALCULATES ALL, OR SOME CONSECUTIVE, EIGENVALUES OF A
SYMMETRIC TRIDIAGONAL MATRIX BY MEANS OF LINEAR INTERPOLATION USING
A STURM SEQUENCE;
VECSYMTRI CALCULATES THE CORRESPONDING EIGENVECTORS BY MEANS OF
INVERSE ITERATION.
QRIVALSYMTRI CALCULATES ALL EIGENVALUES OF A SYMMETRIC TRIDIAGONAL
MATRIX BY MEANS OF QR ITERATION;
QRISYMTRI CALCULATES THE EIGENVECTORS AS WELL.
WHEN ALL EIGENVALUES HAVE TO BE CALCULATED, QRIVALSYMTRI IS
PREFERABLE WITH RESPECT TO THE RUNNING TIME; WHEN THE EIGENVECTORS
ALSO HAVE TO BE CALCULATED, INVERSE ITERATION IS PREFERABLE.
KEYWORDS:
EIGENVALUES,
EIGENVECTORS,
TRIDIAGONAL MATRIX,
STURM-SEQUENCE,
INVERSE ITERATION,
QR ITERATION.
1SECTION 3.3.1.1.1 (DECEMBER 1975) PAGE 2
SUBSECTION: VALSYMTRI.
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE IS:
"PROCEDURE" VALSYMTRI(D, BB, N, N1, N2, VAL, EM);
"VALUE" N, N1, N2; "INTEGER" N, N1, N2;
"ARRAY" D, BB, VAL, EM;
"CODE" 34151;
THE MEANING OF THE FORMAL PARAMETERS IS:
N: <ARITHMETIC EXPRESSION>;
THE ORDER OF THE GIVEN MATRIX;
D: <ARRAY IDENTIFIER>;
"ARRAY" D[1:N];
ENTRY: THE MAIN DIAGONAL OF THE SYMMETRIC TRIDIAGONAL
MATRIX;
BB: <ARRAY IDENTIFIER>;
"ARRAY" BB[1:N-1];
ENTRY: THE SQUARES OF THE CODIAGONAL ELEMENTS OF THE
SYMMETRIC TRIDIAGONAL MATRIX;
N1,N2: <ARITHMETIC EXPRESSION>;
THE SERIAL NUMBER OF THE FIRST AND LAST EIGENVALUE TO BE
CALCULATED, RESPECTIVELY;
VAL: <ARRAY IDENTIFIER>;
"ARRAY" VAL[N1:N2];
EXIT: THE N2-N1+1 CALCULATED CONSECUTIVE EIGENVALUES IN
NONINCREASING ORDER;
EM: <ARRAY IDENTIFIER>;
"ARRAY" EM[0:3];
ENTRY: EM[0], THE MACHINE PRECISION,
EM[1], AN UPPERBOUND FOR THE MODULI OF THE
EIGENVALUES OF THE GIVEN MATRIX,
EM[2], A RELATIVE TOLERANCE FOR THE EIGENVALUES;
EXIT: EM[3], THE TOTAL NUMBER OF ITERATIONS USED FOR
CALCULATING THE EIGENVALUES.
PROCEDURES USED:
ZEROIN = CP34150.
RUNNING TIME:
DEPENDS STRONGLY ON THE DISTANCE OF SUCCESSIVE EIGENVALUES.
LANGUAGE: ALGOL 60.
METHOD AND PERFORMANCE:
LET T DENOTE THE GIVEN SYMMETRIC TRIDIAGONAL MATRIX OF ORDER N AND
I THE IDENTITY MATRIX. THE EIGENVALUES OF T ARE THE ZEROES OF THE
N-TH DEGREE POLYNOMIAL P(N,X) = DET(T - X*I). INSTEAD OF SEARCHING
FOR THE ZEROES OF P(N,X) WE LOOK FOR THE ZEROES OF THE FUNCTION
F(N,X) = P(N,X) / P(N-1,X). MAINTAINING A LOWER BOUND FOR
ABS(P(N-1,X)) WE DO AVOID OVERFLOW OF THE REAL NUMBER CAPACITY IN
THE COMPUTATION OF F(N,X). THIS FUNCTION CAN BE CALCULATED AS
FOLLOWS:
1SECTION 3.3.1.1.1 (JULY 1974) PAGE 3
F(1,X) = D[1] - X,
F(K,X) = D[K] - X - BB[K-1] /
("IF" ABS(F(K-1,X)) > MACHTOL "THEN" F(K-1,X)
"ELSE" "IF" F(K-1,X) <= 0 "THEN" -MACHTOL
"ELSE" MACHTOL), K = 2, . . . ,N,
WHERE MACHTOL EQUALS EM[0] * EM[1].
USING THE STURM SEQUENCE PROPERTY OF (F(K,X)), K=1,2,...,N, WE CAN
LOCATE THE DESIRED EIGENVALUES BY MEANS OF THE PROCEDURE ZEROIN
(SECTION 5.1.1.1). FOR FURTHER DETAILS SEE REF[1], REF[2].
SUBSECTION: VECSYMTRI.
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE IS:
"PROCEDURE" VECSYMTRI(D, B, N, N1, N2, VAL, VEC, EM);
"VALUE" N, N1, N2; "INTEGER" N, N1, N2;
"ARRAY" D, B, VAL, VEC, EM;
"CODE" 34152;
THE MEANING OF THE FORMAL PARAMETERS IS:
N: <ARITHMETIC EXPRESSION>;
THE ORDER OF THE GIVEN MATRIX;
D: <ARRAY IDENTIFIER>;
"ARRAY" D[1:N],
ENTRY: THE MAIN DIAGONAL OF THE SYMMETRIC TRIDIAGONAL
MATRIX;
B: <ARRAY IDENTIFIER>;
"ARRAY" B[1:N];
ENTRY: THE CODIAGONAL OF THE SYMMETRIC TRIDIAGONAL MATRIX
FOLLOWED BY AN ADDITIONAL ELEMENT 0;
N1, N2: <ARITHMETIC EXPRESSION>;
LOWER AND UPPER BOUND OF THE ARRAY VAL (SEE ALSO METHOD AND
PERFORMANCE);
VAL: <ARRAY IDENTIFIER>;
"ARRAY" VAL[N1:N2];
ENTRY: A ROW OF NONINCREASING EIGENVALUES AS DELIVERED BY
VALSYMTRI;
VEC: <ARRAY IDENTIFIER>;
"ARRAY" VEC[1:N,N1:N2];
EXIT: THE EIGENVECTORS CORRESPONDING WITH THE GIVEN
EIGENVALUES (SEE ALSO METHOD AND PERFORMANCE);
EM: <ARRAY IDENTIFIER>;
"ARRAY" EM[0:9];
ENTRY: EM[0], THE MACHINE PRECISION,
EM[1], A NORM OF THE GIVEN MATRIX,
EM[4], THE ORTHOGONALISATION PARAMETER (SEE ALSO
METHOD AND PERFORMANCE),
EM[6], THE RELATIVE TOLERANCE FOR THE EIGENVECTORS,
EM[8], THE MAXIMUM NUMBER OF ITERATIONS ALLOWED
FOR THE CALCULATION OF EACH EIGENVECTOR;
1SECTION 3.3.1.1.1 (JULY 1974) PAGE 4
EXIT: EM[5], THE NUMBER OF EIGENVECTORS INVOLVED IN THE
LAST GRAM-SCHMIDT ORTHOGONALISATION (SEE
METHOD AND PERFORMANCE),
EM[7], THE MAXIMUM EUCLIDEAN NORM OF THE RESIDUES,
EM[9], THE LARGEST NUMBER OF ITERATIONS PERFORMED
FOR THE CALCULATION OF SOME EIGENVECTOR (SEE
METHOD AND PERFORMANCE).
PROCEDURES USED:
VECVEC = CP34010,
TAMVEC = CP34012,
ELMVECCOL= CP34021.
REQUIRED CENTRAL MEMORY:
EXECUTION FIELD LENGTH: FIVE AUXILIARY ONE-DIMENSIONAL REAL ARRAYS
AND ONE BOOLEAN ARRAY, ALL OF LENGTH N, ARE USED.
RUNNING TIME: THE PROCESS IS OF ORDER N FOR EACH EIGENVECTOR.
LANGUAGE: ALGOL 60.
METHOD AND PERFORMANCE:
AN EIGENVECTOR OF A SYMMETRIC TRIDIAGONAL MATRIX T, CORRESPONDING
TO AN EIGENVALUE LAMBDA, IS CALCULATED BY MEANS OF INVERSE
ITERATION; I.E. STARTING FROM SOME INITIAL VECTOR X, THE LINEAR
SYSTEM (T - LAMBDA * I)Y = X IS SOLVED ITERATIVELY, THE SOLUTION Y,
DIVIDED BY ITS EUCLIDEAN NORM REPLACING X EACH TIME.
IF THE DISTANCE BETWEEN SOME APPROXIMATE EIGENVALUES IS SMALLER
THAN MACHTOL (=EM[0] * EM[1]), THEN THEY ARE SLIGHTLY MODIFIED SUCH
THAT THE DISTANCE BETWEEN THEM EQUALS MACHTOL. IF THE DISTANCE
BETWEEN SOME EIGENVALUES IS SMALLER THAN THE ORTHOGONALISATION
PARAMETER (=EM[4]) TIMES EM[1], THEN IN EACH ITERATION STEP GRAM-
SCHMIDT ORTHOGONALISATION IS CARRIED OUT, SO THAT THE EIGENVECTORS
OBTAINED ARE ORTHOGONAL WITHIN WORKING PRECISION. THE ITERATION
ENDS AS SOON AS EITHER THE EUCLIDEAN NORM OF THE RESIDUE IS SMALLER
THAN EM[1] * EM[6], OR THE MAXIMUM ALLOWED NUMBER OF ITERATIONS
(=EM[8]) HAS BEEN PERFORMED. IN THE LATTER CASE EM[9]:= EM[8] + 1.
IF N1 > 1, THEN VECSYMTRI SHOULD BE PRECEDED BY ONE OR MORE CALLS
OF VECSYMTRI PRODUCING A NUMBER OF EIGENVECTORS CORRESPONDING TO
THE PRECEDING EIGENVALUES. MOREOVER ONE MUST GIVE EM[5], AS
PRODUCED BY THE LAST CALL OF VECSYMTRI; THE K-TH TO N2-TH
EIGENVALUES, WHERE K = N1 - EM[5], MUST BE GIVEN IN ARRAY VAL[K:N2]
IN MONOTONICALLY NONINCREASING ORDER (THE K-TH TO (N1-1)-TH
EIGENVALUES BEING NEEDED FOR THE MODIFYING MENTIONED ABOVE), AND
THE CORRESPONDING EIGENVECTORS UP TO THE (N1-1)-TH (WHICH ARE
NEEDED FOR THE GRAM-SCHMIDT ORTHOGONALISATION) IN THE CORRESPONDING
COLUMNS OF ARRAY VEC[1:N,K:N2].
THE TOLERANCES SHOULD SATISFY: EM[0] ( < EM[2]) < EM[6] AND
EM[4] >= EM[0] / EM[6]. FOR FURTHER DETAILS SEE REF[1].
1SECTION 3.3.1.1.1 (JULY 1974) PAGE 5
SUBSECTION: QRIVALSYMTRI.
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE IS:
"INTEGER" "PROCEDURE" QRIVALSYMTRI(D, BB, N, EM);
"VALUE" N; "INTEGER" N; "ARRAY" D, BB, EM;
"CODE" 34160;
THE MEANING OF THE FORMAL PARAMETERS IS:
N: <ARITHMETIC EXPRESSION>;
THE ORDER OF THE GIVEN MATRIX;
D: <ARRAY IDENTIFIER>;
"ARRAY" D[1:N];
ENTRY: THE MAIN DIAGONAL OF THE SYMMETRIC TRIDIAGONAL
MATRIX;
EXIT: THE EIGENVALUES OF THE MATRIX IN SOME ARBITRARY
ORDER;
BB: <ARRAY IDENTIFIER>;
"ARRAY" BB[1:N];
ENTRY: THE SQUARES OF THE CODIAGONAL ELEMENTS OF THE
SYMMETRIC TRIDIAGONAL MATRIX FOLLOWED BY AN
ADDITONAL ELEMENT O;
EXIT: THE SQUARES OF THE CODIAGONAL ELEMENTS OF THE
SYMMETRIC TRIDIAGONAL MATRIX RESULTING FROM THE QR
ITERATION;
EM: <ARRAY IDENTIFIER>;
"ARRAY" EM[0:5];
ENTRY: EM[0], THE MACHINE PRECISION;
EM[1], A NORM OF THE GIVEN MATRIX;
EM[2], A RELATIVE TOLERANCE FOR THE EIGENVALUES;
EM[4], THE MAXIMUM ALLOWED NUMBER OF ITERATIONS;
EXIT: EM[3], THE MAXIMUM ABSOLUTE VALUE OF THE CODIAGONAL
ELEMENTS NEGLECTED;
EM[5], THE NUMBER OF ITERATIONS PERFORMED.
MOREOVER:
QRIVALSYMTRI:= THE NUMBER OF EIGENVALUES NOT CALCULATED.
PROCEDURES USED: NONE.
RUNNING TIME: THE PROCESS IS OF ORDER N SQUARED.
LANGUAGE: ALGOL 60.
1SECTION 3.3.1.1.1 (DECEMBER 1975) PAGE 6
METHOD AND PERFORMANCE:
IN QRIVALSYMTRI THE EIGENVALUES OF A SYMMETRIC TRIDIAGONAL MATRIX
ARE CALCULATED BY MEANS OF QR-ITERATION. FOR THIS PROCEDURE WE USED
ESSENTIALLY THE SQUARE-ROOT-FREE VERSION OF THE QR ALGORITHM DUE TO
REINSCH[3].
IN ADDITION TO THE RELATIVE ERROR, WHICH IS SUPPOSED TO BE BOUNDED
BY EM[1] * EM[2] (I.E. MATRIX NORM TIMES RELATIVE TOLERANCE), THE
CALCULATED EIGENVALUES HAVE AN ABSOLUTE ERROR WHICH IS BOUNDED BY
BY EM[0] * EM[1] (I.E. MACHINE PRECISION TIMES MATRIX NORM).
IN PARTICULAR, WHEN SOME EIGENVALUES ARE VERY SMALL COMPARED TO THE
MATRIX NORM, THE ACCURACY OF THE CALCULATED EIGENVALUES CAN BE
INCREASED BY GIVING EM[0] A (POSITIVE) VALUE WHICH IS LESS THAN
THE MACHINE PRECISION.
A PARTICULAR CHOICE OF EM[0] IS HARMLESS FOR THE PROCEDURE
PROVIDED THAT FOR EACH I THE CALCULATION OF BB[I] / EM[0] ** 2
CAUSES NO OVERFLOW AND THE CALCULATION OF (EM[0] * EM[1]) ** 2
CAUSES NO UNDERFLOW.
ONE SHOULD NOTICE THAT THE NUMBER OF QR ITERATIONS INCREASES BY A
SMALLER CHOICE OF EM[0].
FOR FURTHER DETAILS SEE [2], [3].
SUBSECTION: QRISYMTRI.
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE IS:
"INTEGER" "PROCEDURE" QRISYMTRI(A, N, D, B, BB, EM);
"VALUE" N; "INTEGER" N; "ARRAY" A, D, B, BB, EM;
"CODE" 34161;
THE MEANING OF THE FORMAL PARAMETERS IS:
N: <ARITHMETIC EXPRESSION>;
THE ORDER OF THE GIVEN MATRIX;
D: <ARRAY IDENTIFIER>;
"ARRAY" D[1:N];
ENTRY: THE MAIN DIAGONAL OF THE SYMMETRIC TRIDIAGONAL
MATRIX;
EXIT: THE EIGENVALUES OF THE MATRIX IN SOME ARBITRARY
ORDER;
B: <ARRAY IDENTIFIER>;
"ARRAY" B[1:N];
ENTRY: THE CODIAGONAL OF THE SYMMETRIC TRIDIAGONAL MATRIX
FOLLOWED BY AN ADDITIONAL ELEMENT 0;
EXIT: THE CODIAGONAL OF THE SYMMETRIC TRIDIAGONAL MATRIX
RESULTING FROM THE QR ITERATION, FOLLOWED BY AN
ADDITIONAL ELEMENT 0;
BB: <ARRAY IDENTIFIER>;
"ARRAY" BB[1:N];
ENTRY: THE SQUARED CODIAGONAL ELEMENTS OF THE SYMMETRIC
TRIDIAGONAL MATRIX, FOLLOWED BY AN ADDITIONAL
ELEMENT O;
EXIT: THE SQUARED CODIAGONAL ELEMENTS OF THE SYMMETRIC
TRIDIAGONAL MATRIX RESULTING FROM THE QR ITERATION;
1SECTION 3.3.1.1.1 (JULY 1974) PAGE 7
A: <ARRAY IDENTIFIER>;
"ARRAY" A[1:N,1:N];
ENTRY: SOME MATRIX S, SAY, (POSSIBLY THE IDENTITY MATRIX);
EXIT: THE EIGENVECTORS OF THE ORIGINAL SYMMETRIC
TRIDIAGONAL MATRIX, PREMULTIPLIED BY S (SEE METHOD
AND PERFORMANCE);
EM: <ARRAY IDENTIFIER>;
"ARRAY" EM[0:5];
ENTRY: EM[0], THE MACHINE PRECISION;
EM[1], A NORM OF THE GIVEN MATRIX;
EM[2], A RELATIVE TOLERANCE FOR THE QR ITERATION;
EM[4], THE MAXIMUM ALLOWED NUMBER OF ITERATIONS;
EXIT: EM[3], THE MAXIMUM ABSOLUTE VALUE OF THE CODIAGONAL
ELEMENTS NEGLECTED;
EM[5], THE NUMBER OF ITERATIONS PERFORMED.
MOREOVER:
QRISYMTRI:= THE NUMBER OF EIGENVALUES AND -VECTORS NOT
CALCULATED.
PROCEDURES USED:
ROTCOL = CP34040.
RUNNING TIME: THE PROCESS IS OF ORDER N CUBED.
LANGUAGE: ALGOL 60.
METHOD AND PERFORMANCE:
IN QRISYMTRI THE EIGENVALUES AND EIGENVECTORS OF A SYMMETRIC
TRIDIAGONAL MATRIX ARE COMPUTED SIMULTANEOUSLY.
IN MOST APPLICATIONS QRISYMTRI IS USED IN THE COMPUTATION OF
EIGENVALUES AND -VECTORS OF A GENERAL SYMMETRIC MATRIX (SEE QRISYM
SECTION 3.3.1.1.2); IN THAT CASE ARRAY A IS INITIALLY GIVEN THE
VALUE OF THE TRANSFORMING MATRIX (TFMPREVEC SECTION 3.2.1.2.1.1).
FOR THE COMPUTATION OF EIGENVALUES AND EIGENVECTORS OF A SYMMETRIC
TRIDIAGONAL MATRIX, ARRAY A HAS TO BE INITIALIZED TO THE IDENTITY
MATRIX. THE AVERAGE NUMBER OF ITERATIONS IS ABOUT 3N. WHEN THE
PROCESS IS COMPLETED WITHIN EM[4] ITERATIONS, THEN QRISYMTRI:= 0;
OTHERWISE QRISYMTRI:= THE NUMBER, K, OF EIGENVALUES NOT CALCULATED,
EM[5]:= EM[4] + 1 AND ONLY THE LAST N - K ELEMENTS OF D AND THE
LAST N - K COLUMNS OF A ARE APPROXIMATE EIGENVALUES AND -VECTORS
RESPECTIVELY, OF THE ORIGINAL MATRIX.
FOR FURTHER DETAILS SEE REF[1], REF[2].
1SECTION 3.3.1.1.1 (JULY 1974) PAGE 8
REFERENCES:
[1] DEKKER, T.J. AND HOFFMANN, W.
ALGOL 60 PROCEDURES IN NUMERICAL ALGEBRA, PART 2,
MATHEMATICAL CENTRE TRACTS 23,
MATHEMATISCH CENTRUM, AMSTERDAM, 1968;
[2] WILKINSON, J.H.
THE ALGEBRAIC EIGENVALUE PROBLEM,
CLARENDON PRESS, OXFORD 1965.
[3] REINSCH, CHR.H.
A STABLE, RATIONAL QR ALGORITHM FOR THE COMPUTATION OF THE
EIGENVALUES OF AN HERMITIAN, TRIDIAGONAL MATRIX.
MATH. OF COMP. VOL 25(1971) PP. 591-597.
EXAMPLE OF USE:
THE FIRST AND SECOND EIGENVALUE IN MONOTONICALLY NON-INCREASING
ORDER AND THE CORRESPONDING EIGENVECTORS OF T, WITH N = 4 AND
T[I,J] = "IF" I = J "THEN" 2 "ELSE" "IF" ABS(I - J) = 1 "THEN" - 1
"ELSE" 0, MAY BE OBTAINED BY THE FOLLOWING PROGRAM:
"BEGIN"
"INTEGER" J;
"ARRAY" B, D[1:4], BB[1:3], VAL[1:2], EM[0:9], VEC[1:4,1:2];
EM[0]:= "-14; EM[1]:= 4; EM[2]:= "-12;
EM[4]:= "-3; EM[6]:= "-10; EM[8]:= 5;
"FOR" J:= 1, 2, 3, 4 "DO" D[J]:= 2; B[4]:= 0;
"FOR" J:= 1, 2, 3 "DO"
"BEGIN" BB[J]:= 1; B[J]:= -1 "END";
VALSYMTRI(D, BB, 4, 1, 2, VAL, EM);
VECSYMTRI(D, B, 4, 1, 2, VAL, VEC, EM);
OUTPUT(61, "("2(+.13D"+2D, 2B), 2/")", VAL[1], VAL[2]);
"FOR" J:= 1, 2, 3, 4 "DO"
OUTPUT(61, "("2(+.13D"+2D, 2B), /")", VEC[J,1], VEC[J,2]);
OUTPUT(61, "("/, .2D"+2D, /, 3(2ZD, /)")",
EM[7], EM[3], EM[5], EM[9])
"END"
THE PROGRAM DELIVERS:
THE EIGENVALUES: +.3618033988751"+01 +.2618033988750"+01
THE EIGENVECTORS: +.3717480344602"+00 +.6015009550075"+00
+.6015009550075"+00 +.3717480344602"+00
+.6015009550075"+00 -.3717480344602"+00
+.3717480344602"+00 -.6015009550075"+00
EM[7] = .15"-11
EM[3] = 24
EM[5] = 1
EM[9] = 1 .
1SECTION 3.3.1.1.1 (JULY 1974) PAGE 9
SOURCE TEXT(S):
0"CODE" 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 "OR" 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;
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
1SECTION 3.3.1.1.1 (JULY 1974) PAGE 10
;
"EOP"
0"CODE" 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];
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
1SECTION 3.3.1.1.1 (JULY 1974) PAGE 11
;
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 "OR" 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
1SECTION 3.3.1.1.1 (JULY 1974) PAGE 12
;
"EOP"
0"CODE" 34160;
"INTEGER" "PROCEDURE" QRIVALSYMTRI(D, BB, N, EM); "VALUE" N;
"INTEGER" N; "ARRAY" D, BB, EM;
"BEGIN" "INTEGER" I, I1, LOW, OLDLOW, N1, COUNT, MAX;
"REAL" BBTOL, BBMAX, BBI, BBN1, MACHTOL, DN, DELTA, F, NUM,
SHIFT, G, H, T, P, R, S, C, OLDG;
BBTOL:= (EM[2] * EM[1]) ** 2; MACHTOL:= EM[0] * EM[1];
MAX:= EM[4]; BBMAX:= 0; COUNT:= 0; OLDLOW:= N;
"FOR" N1:= N - 1 "WHILE" N > 0 "DO"
"BEGIN"
"FOR" I:= N, I - 1 "WHILE" ("IF" I >= 1 "THEN"
BB[I] > BBTOL "ELSE" "FALSE") "DO" LOW:= I;
"IF" LOW > 1 "THEN" "BEGIN" "IF" BB[LOW-1] > BBMAX "THEN"
BBMAX:= BB[LOW-1] "END";
"IF" LOW = N "THEN" N:= N1 "ELSE"
"BEGIN" DN:= D[N]; DELTA:= D[N1] - DN;
BBN1:= BB[N1];
"IF" ABS(DELTA) < MACHTOL "THEN" R:= SQRT(BBN1) "ELSE"
"BEGIN"
F:= 2 / DELTA; NUM:= BBN1 * F;
R:= -NUM / (SQRT(NUM * F + 1) + 1)
"END";
"IF" LOW = N1 "THEN"
"BEGIN" D[N]:= DN + R; D[N1]:= D[N1] - R; N:= N - 2
"END"
"ELSE"
"BEGIN" COUNT:= COUNT + 1;
"IF" COUNT > MAX "THEN" "GOTO" END;
"IF" LOW < OLDLOW "THEN"
"BEGIN" SHIFT:= 0; OLDLOW:= LOW "END"
"ELSE" SHIFT:= DN + R;
H:= D[LOW] - SHIFT;
"IF" ABS(H) < MACHTOL "THEN" H:= "IF" H <= 0 "THEN"
-MACHTOL "ELSE" MACHTOL;
G:= H; T:= G * H;
BBI:= BB[LOW]; P:= T + BBI; I1:= LOW;
"FOR" I:= LOW + 1 "STEP" 1 "UNTIL" N "DO"
"BEGIN" S:= BBI / P; C:= T / P;
H:= D[I] - SHIFT - BBI / H;
"IF" ABS(H) < MACHTOL "THEN" H:= "IF" H <= 0
"THEN" -MACHTOL "ELSE" MACHTOL;
OLDG:= G; G:= H * C; T:= G * H;
D[I1]:= OLDG - G + D[I];
BBI:= "IF" I = N "THEN" 0 "ELSE" BB[I];
P:= T + BBI; BB[I1]:= S * P; I1:= I
"END";
D[N]:= G + SHIFT
"END" QRSTEP
"END"
"END";
END: EM[3]:= SQRT(BBMAX); EM[5]:= COUNT; QRIVALSYMTRI:= N
"END" QRIVALSYMTRI
1SECTION 3.3.1.1.1 (JULY 1974) PAGE 13
;
"EOP"
0"CODE" 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;
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;
"EOP"
1SECTION 3.3.1.1.2 (JULY 1974) PAGE 1
AUTHORS: T.J.DEKKER AND W.HOFFMANN.
CONTRIBUTORS: W.HOFFMANN, J.G.VERWER.
INSTITUTE: MATHEMATICAL CENTRE.
RECEIVED: 730924.
BRIEF DESCRIPTION:
THIS SECTION CONTAINS SEVEN PROCEDURES.
A) EIGVALSYM1 AND EIGVALSYM2 CALCULATE ALL EIGENVALUES, OR SOME
CONSECUTIVE EIGENVALUES INCLUDING THE LARGEST, OF A SYMMETRIC
MATRIX USING LINEAR INTERPOLATION ON A FUNCTION DERIVED FROM A
STURM SEQUENCE,
B) EIGSYM1 AND EIGSYM2 CALCULATE THE CORRESPONDING EIGENVECTORS
AS WELL, BY MEANS OF INVERSE ITERATION,
C) QRIVALSYM1 AND QRIVALSYM2 CALCULATE ALL EIGENVALUES OF A
SYMMETRIC MATRIX BY MEANS OF QR ITERATION,
D) QRISYM CALCULATES ALL EIGENVECTORS AS WELL IN THE SAME ITERATION
PROCESS.
EIGVALSYM1, EIGSYM1 AND QRIVALSYM1 USE IONAL ARRAY FOR
THE GIVEN SYMMETRIC MATRIX; THE OTHER PROCEDURES EXPECT THE MATRIX
TO BE STORED IN "ARRAY".
QRISYM DELIVERS THE EIGENVECTORS IN THE ARRAY THAT WAS USED FOR THE
ORIGINAL MATRIX IN CONTRAST WITH EIGSYM1 AND EIGSYM2 WHICH DELIVER
THE EIGENVECTORS IN AN EXTRA ARRAY.
WHEN ALL EIGENVALUES HAVE TO BE CALCULATED, THE PROCEDURES USING QR
ITERATION ARE PREFERABLE WITH RESPECT TO THEIR RUNNING TIME. WHEN
ALSO THE EIGENVECTORS HAVE TO BE CALCULATED THE PROCEDURES USING
INVERSE ITERATION ARE FASTER; HOWEVER, THE ONE USING QR ITERATION
USES LESS MEMORY SPACE.
KEYWORDS:
EIGENVALUES,
EIGENVECTORS,
SYMMETRIC MATRIX,
STURM-SEQUENCE,
INVERSE ITERATION,
QR ITERATION.
1SECTION 3.3.1.1.2 (JULY 1974) PAGE 2
SUBSECTION: EIGVALSYM2.
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE IS:
"PROCEDURE" EIGVALSYM2(A, N, NUMVAL, VAL, EM);
"VALUE" N, NUMVAL; "INTEGER" N, NUMVAL; "ARRAY" A, VAL, EM;
"CODE" 34153;
THE MEANING OF THE FORMAL PARAMETERS IS:
N: <ARITHMETIC EXPRESSION>;
THE ORDER OF THE GIVEN MATRIX;
NUMVAL: <ARITHMETIC EXPRESSION>;
THE SERIAL NUMBER OF THE LAST EIGENVALUE TO BE CALCULATED;
A: <ARRAY IDENTIFIER>;
"ARRAY" A[1:N,1:N];
ENTRY: THE UPPER TRIANGLE OF THE SYMMETRIC MATRIX MUST BE
GIVEN IN THE UPPER TRIANGULAR PART OF A (THE
ELEMENTS A[I,J], I<= J);
EXIT: THE DATA FOR HOUSEHOLDER'S BACK TRANSFORMATION
(WHICH ISN'T USED BY THIS PROCEDURE) IS DELIVERED
IN THE UPPER TRIANGULAR PART OF A;
THE ELEMENTS A[I,J] FOR I > J ARE NEITHER USED NOR CHANGED;
VAL: <ARRAY IDENTIFIER>;
"ARRAY" VAL[1:NUMVAL];
EXIT: THE NUMVAL LARGEST EIGENVALUES IN MONOTONICALLY
NON-INCREASING ORDER;
EM: <ARRAY IDENTIFIER>;
"ARRAY" EM[0:3];
ENTRY: EM[0], THE MACHINE PRECISION,
EM[2], THE RELATIVE TOLERANCE FOR THE EIGENVALUES;
EXIT: EM[1], THE INFINITY NORM OF THE ORIGINAL MATRIX,
EM[3], THE NUMBER OF ITERATIONS USED FOR
CALCULATING THE NUMVAL EIGENVALUES.
PROCEDURES USED:
TFMSYMTRI2 = CP34140,
VALSYMTRI = CP34151.
REQUIRED CENTRAL MEMORY:
EXECUTION FIELD LENGTH:
THREE ONE-DIMENSIONAL REAL ARRAYS OF LENGTH N ARE USED.
RUNNING TIME:
ROUGHLY PROPORTIONAL TO N CUBED.
LANGUAGE: ALGOL 60.
METHOD AND PERFORMANCE:
THE BODY OF EIGVALSYM2 CONSISTS OF TWO PROCEDURE STATEMENTS; THE
FIRST IS A CALL OF TFMSYMTRI2 TO TRANSFORM THE SYMMETRIC MATRIX
INTO A SIMILAR TRIDIAGONAL MATRIX BY MEANS OF HOUSEHOLDER'S
TRANSFORMATION; THE SECOND IS A CALL OF VALSYMTRI TO CALCULATE THE
DESIRED EIGENVALUES. OPERATION DETAILS OF BOTH PROCEDURES ARE GIVEN
IN THEIR DESCRIPTION.
1SECTION 3.3.1.1.2 (JULY 1974) PAGE 3
SUBSECTION: EIGVALSYM1.
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE IS:
"PROCEDURE" EIGVALSYM1(A, N, NUMVAL, VAL, EM);
"VALUE" N, NUMVAL; "INTEGER" N, NUMVAL; "ARRAY" A, VAL, EM;
"CODE" 34155;
THE MEANING OF THE FORMAL PARAMETERS IS:
N: <ARITHMETIC EXPRESSION>;
THE ORDER OF THE GIVEN MATRIX;
NUMVAL: <ARITHMETIC EXPRESSION>;
THE SERIAL NUMBER OF THE LAST EIGENVALUE TO BE CALCULATED;
A: <ARRAY IDENTIFIER>;
"ARRAY" A[1:(N+1)*N//2];
ENTRY: THE UPPER TRIANGLE OF THE SYMMETRIC MATRIX MUST BE
GIVEN IN SUCH A WAY THAT THE (I,J)-TH ELEMENT OF
THE MATRIX IS A[(J-1)*J//2+I], 1 <= I <= J <= N;
EXIT: THE DATA FOR HOUSEHOLDER'S BACK TRANSFORMATION
(WHICH ISN'T USED BY THIS PROCEDURE).
VAL: <ARRAY IDENTIFIER>;
"ARRAY" VAL[1:NUMVAL];
EXIT: THE NUMVAL LARGEST EIGENVALUES IN MONOTONICALLY
NON-INCREASING ORDER;
EM: <ARRAY IDENTIFIER>;
"ARRAY" EM[0:3];
ENTRY: EM[0], THE MACHINE PRECISION,
EM[2], THE RELATIVE TOLERANCE FOR THE EIGENVALUES;
EXIT: EM[1], THE INFINITY NORM OF THE ORIGINAL MATRIX,
EM[3], THE NUMBER OF ITERATIONS USED FOR
CALCULATING THE NUMVAL EIGENVALUES.
PROCEDURES USED:
TFMSYMTRI1 = CP34143,
VALSYMTRI = CP34151.
REQUIRED CENTRAL MEMORY:
EXECUTION FIELD LENGTH:
THREE ONE-DIMENSIONAL REAL ARRAYS OF LENGTH N ARE USED.
RUNNING TIME:
ROUGHLY PROPORTIONAL TO N CUBED.
LANGUAGE: ALGOL 60.
METHOD AND PERFORMANCE:
THE BODY OF EIGVALSYM1 CONSISTS OF TWO PROCEDURE STATEMENTS; THE
FIRST IS A CALL OF TFMSYMTRI1 TO TRANSFORM THE SYMMETRIC MATRIX
INTO A SIMILAR TRIDIAGONAL MATRIX BY MEANS OF HOUSEHOLDER'S
TRANSFORMATION; THE SECOND IS A CALL OF VALSYMTRI TO CALCULATE THE
DESIRED EIGENVALUES. OPERATION DETAILS OF BOTH PROCEDURES ARE GIVEN
IN THEIR DESCRIPTION.
1SECTION 3.3.1.1.2 (JULY 1974) PAGE 4
SUBSECTION: EIGSYM2.
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE IS:
"PROCEDURE" EIGSYM2(A, N, NUMVAL, VAL, VEC, EM);
"VALUE" N, NUMVAL; "INTEGER" N, NUMVAL; "ARRAY" A, VAL, VEC, EM;
"CODE" 34154;
THE MEANING OF THE FORMAL PARAMETERS IS:
N: <ARITHMETIC EXPRESSION>;
THE ORDER OF THE GIVEN MATRIX;
NUMVAL: <ARITHMETIC EXPRESSION>;
THE SERIAL NUMBER OF THE LAST EIGENVALUE TO BE CALCULATED;
A: <ARRAY IDENTIFIER>;
"ARRAY" A[1:N,1:N];
ENTRY: THE UPPER TRIANGLE OF THE SYMMETRIC MATRIX MUST BE
GIVEN IN THE UPPER TRIANGULAR PART OF A (THE
ELEMENTS A[I,J], I<= J);
EXIT: THE DATA FOR HOUSEHOLDER'S BACK TRANSFORMATION
IS DELIVERED IN THE UPPER TRIANGULAR PART OF A;
THE ELEMENTS A[I,J] FOR I > J ARE NEITHER USED NOR CHANGED;
VAL: <ARRAY IDENTIFIER>;
"ARRAY" VAL[1:NUMVAL];
EXIT: THE NUMVAL LARGEST EIGENVALUES IN MONOTONICALLY
NON-INCREASING ORDER;
VEC: <ARRAY IDENTIFIER>;
"ARRAY" VEC[1:N,1:NUMVAL];
EXIT: THE NUMVAL CALCULATED EIGENVECTORS, STORED COLUMN-
WISE, CORRESPONDING TO THE CALCULATED EIGENVALUES;
EM: <ARRAY IDENTIFIER>;
"ARRAY" EM[0:9];
ENTRY: EM[0], THE MACHINE PRECISION,
EM[2], THE RELATIVE TOLERANCE FOR THE EIGENVALUES,
EM[4], THE ORTHOGONALISATION PARAMETER (SEE METHOD
AND PERFORMANCE),
EM[6], THE TOLERANCE FOR THE EIGENVECTORS,
EM[8], THE MAXIMUM NUMBER OF INVERSE ITERATIONS
ALLOWED FOR THE CALCULATION OF EACH EIGEN-
VECTOR;
EXIT: EM[1], THE INFINITY NORM OF THE MATRIX,
EM[3], THE NUMBER OF ITERATIONS USED FOR
CALCULATING THE NUMVAL EIGENVALUES,
EM[5], THE NUMBER OF EIGENVECTORS INVOLVED IN THE
LAST GRAM-SCHMIDT ORTHOGONALISATION,
EM[7], THE MAXIMUM EUCLIDEAN NORM OF THE RESIDUES
OF THE CALCULATED EIGENVECTORS,
EM[9], THE LARGEST NUMBER OF INVERSE ITERATIONS
PERFORMED FOR THE CALCULATION OF SOME EIGEN-
VECTOR.
1SECTION 3.3.1.1.2 (JULY 1974) PAGE 5
PROCEDURES USED:
TFMSYMTRI2 = CP34140,
VALSYMTRI = CP34151,
VECSYMTRI = CP34152,
BAKSYMTRI2 = CP34141.
REQUIRED CENTRAL MEMORY:
EXECUTION FIELD LENGTH:
THREE ONE-DIMENSIONAL REAL ARRAYS OF LENGTH N ARE DECLARED;
MOREOVER, VECSYMTRI USES FIVE ONE-DIMENSIONAL REAL ARRAYS
OF LENGTH N AND ONE BOOLEAN ARRAY OF LENGTH N.
RUNNING TIME:
ROUGHLY PROPORTIONAL TO N CUBED.
LANGUAGE: ALGOL 60.
METHOD AND PERFORMANCE:
THE BODY OF EIGSYM2 CONSISTS OF FOUR PROCEDURE STATEMENTS;
THE FIRST IS A CALL OF TFMSYMTRI2 TO TRANSFORM THE SYMMETRIC
MATRIX INTO A SIMILAR TRIDIAGONAL MATRIX BY MEANS OF
HOUSEHOLDERS TRANSFORMATION,
THE SECOND IS A CALL OF VALSYMTRI TO CALCULATE THE DESIRED
EIGENVALUES,
THE THIRD IS A CALL OF VECSYMTRI TO CALCULATE THE CORRESPONDING
EIGENVECTORS AND
THE FOURTH IS A CALL OF BAKSYMTRI2 TO PERFORM THE BACK
TRANSFORMATION.
THE PARAMETERS EM[5], EM[7] AND EM[9] ARE GIVEN ITS VALUE IN THE
PROCEDURE VECSYMTRI. FOR A POSSIBLY SUBSEQUENT CALL OF VECSYMTRI
THE VALUE OF EM[5] IS NEEDED. WHEN CONSECUTIVE EIGENVALUES ARE TOO
CLOSE TOGETHER, THE CORRESPONDING EIGENVECTORS ARE NOT NECESSARILY
DELIVERED ORTHOGONAL BY INVERSE ITERATION (THE METHOD WHICH IS USED
IN VECSYMTRI). THEREFORE GRAM-SCHMIDT ORTHOGONALISATION IS APPLIED
ON THE EIGENVECTORS WHEN THE DISTANCE BETWEEN TWO CONSECUTIVE
EIGENVALUES IS SMALLER THAN EM[4].
FOR FURTHER DETAILS ONE IS REFERRED TO THE SPECIFIC PROCEDURE
DESCRIPTIONS.
1SECTION 3.3.1.1.2 (JULY 1974) PAGE 6
SUBSECTION: EIGSYM1.
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE IS:
"PROCEDURE" EIGSYM1(A, N, NUMVAL, VAL, VEC, EM);
"VALUE" N, NUMVAL; "INTEGER" N, NUMVAL; "ARRAY" A, VAL, VEC, EM;
"CODE" 34156;
THE MEANING OF THE FORMAL PARAMETERS IS:
N: <ARITHMETIC EXPRESSION>;
THE ORDER OF THE GIVEN MATRIX;
NUMVAL: <ARITHMETIC EXPRESSION>;
THE SERIAL NUMBER OF THE LAST EIGENVALUE TO BE CALCULATED;
A: <ARRAY IDENTIFIER>;
"ARRAY" A[1:(N+1)*N//2];
ENTRY: THE UPPER TRIANGLE OF THE SYMMETRIC MATRIX MUST BE
GIVEN IN SUCH A WAY THAT THE (I,J)-TH ELEMENT OF
THE MATRIX IS A[(J-1)*J//2+I], 1 <= I <= J <= N;
EXIT: THE DATA FOR HOUSEHOLDER'S BACK TRANSFORMATION;
VAL: <ARRAY IDENTIFIER>;
"ARRAY" VAL[1:NUMVAL];
EXIT: THE NUMVAL LARGEST EIGENVALUES IN MONOTONICALLY
NON-INCREASING ORDER;
VEC: <ARRAY IDENTIFIER>;
"ARRAY" VEC[1:N,1:NUMVAL];
EXIT: THE NUMVAL CALCULATED EIGENVECTORS, STORED COLUMN-
WISE, CORRESPONDING TO THE CALCULATED EIGENVALUES;
EM: <ARRAY IDENTIFIER>;
"ARRAY" EM[0:9];
ENTRY: EM[0], THE MACHINE PRECISION,
EM[2], THE RELATIVE TOLERANCE FOR THE EIGENVALUES,
EM[4], THE ORTHOGONALISATION PARAMETER (SEE METHOD
AND PERFORMANCE),
EM[6], THE TOLERANCE FOR THE EIGENVECTORS,
EM[8], THE MAXIMUM NUMBER OF INVERSE ITERATIONS
ALLOWED FOR THE CALCULATION OF EACH EIGEN-
VECTOR;
EXIT: EM[1], THE INFINITY NORM OF THE MATRIX,
EM[3], THE NUMBER OF ITERATIONS USED FOR
CALCULATING THE NUMVAL EIGENVALUES,
EM[5], THE NUMBER OF EIGENVECTORS INVOLVED IN THE
LAST GRAM-SCHMIDT ORTHOGONALISATION,
EM[7], THE MAXIMUM EUCLIDEAN NORM OF THE RESIDUES
OF THE CALCULATED EIGENVECTORS,
EM[9], THE LARGEST NUMBER OF INVERSE ITERATIONS
PERFORMED FOR THE CALCULATION OF SOME EIGEN-
VECTOR.
1SECTION 3.3.1.1.2 (JULY 1974) PAGE 7
PROCEDURES USED:
TFMSYMTRI1 = CP34143,
VALSYMTRI = CP34151,
VECSYMTRI = CP34152,
BAKSYMTRI1 = CP34144.
REQUIRED CENTRAL MEMORY:
EXECUTION FIELD LENGTH:
THREE ONE-DIMENSIONAL REAL ARRAYS OF LENGTH N ARE DECLARED;
MOREOVER, VECSYMTRI AND BAKSYMTRI1 USE A TOTAL AMOUNT OF
SIX ONE-DIMENSIONAL REAL ARRAYS OF LENGTH N AND ONE BOOLEAN
ARRAY OF LENGTH N.
RUNNING TIME:
ROUGHLY PROPORTIONAL TO N CUBED.
LANGUAGE: ALGOL 60.
METHOD AND PERFORMANCE:
THE BODY OF EIGSYM1 CONSISTS OF FOUR PROCEDURE STATEMENTS;
THE FIRST IS A CALL OF TFMSYMTRI1 TO TRANSFORM THE SYMMETRIC
MATRIX INTO A SIMILAR TRIDIAGONAL MATRIX BY MEANS OF
HOUSEHOLDERS TRANSFORMATION,
THE SECOND IS A CALL OF VALSYMTRI TO CALCULATE THE DESIRED
EIGENVALUES,
THE THIRD IS A CALL OF VECSYMTRI TO CALCULATE THE CORRESPONDING
EIGENVECTORS AND
THE FOURTH IS A CALL OF BAKSYMTRI1 TO PERFORM THE BACK
TRANSFORMATION.
FOR DETAILS ONE IS REFERRED TO EIGSYM2 OR TO THE DESCRIPTIONS OF
THE FOUR PROCEDURES USED.
1SECTION 3.3.1.1.2 (JULY 1974) PAGE 8
SUBSECTION: QRIVALSYM2.
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE IS:
"INTEGER" "PROCEDURE" QRIVALSYM2(A, N, VAL, EM);
"VALUE" N; "INTEGER" N; "ARRAY" A, VAL, EM;
"CODE" 34162;
THE MEANING OF THE FORMAL PARAMETERS IS:
N: <ARITHMETIC EXPRESSION>;
THE ORDER OF THE GIVEN MATRIX;
A: <ARRAY IDENTIFIER>;
"ARRAY" A[1:N,1:N];
ENTRY: THE UPPER TRIANGLE OF THE SYMMETRIC MATRIX MUST BE
GIVEN IN THE UPPER TRIANGULAR PART OF A (THE
ELEMENTS A[I,J], I<= J);
EXIT: THE DATA FOR HOUSEHOLDER'S BACK TRANSFORMATION
(WHICH ISN'T USED BY THIS PROCEDURE) IS DELIVERED
IN THE UPPER TRIANGULAR PART OF A;
THE ELEMENTS A[I,J] FOR I > J ARE NEITHER USED NOR CHANGED;
VAL: <ARRAY IDENTIFIER>;
"ARRAY" VAL[1:N];
EXIT: THE EIGENVALUES OF THE MATRIX IN SOME ARBITRARY
ORDER;
EM: <ARRAY IDENTIFIER>;
"ARRAY" EM[0:5];
ENTRY: EM[0], THE MACHINE PRECISION,
EM[2], THE RELATIVE TOLERANCE FOR THE EIGENVALUES,
EM[4], THE MAXIMUM ALLOWED NUMBER OF ITERATIONS;
EXIT: EM[1], THE INFINITY NORM OF THE MATRIX,
EM[3], THE MAXIMUM ABSOLUTE VALUE OF THE CODIAGONAL
ELEMENTS NEGLECTED,
EM[5], THE NUMBER OF ITERATIONS PERFORMED;
MOREOVER:
QRIVALSYM2:= THE NUMBER OF EIGENVALUES NOT CALCULATED.
PROCEDURES USED:
TFMSYMTRI2 = CP34140,
QRIVALSYMTRI = CP34160.
REQUIRED CENTRAL MEMORY:
EXECUTION FIELD LENGTH:
IONAL REAL ARRAYS OF LENGTH N ARE USED.
RUNNING TIME:
ROUGHLY PROPORTIONAL TO N CUBED.
LANGUAGE: ALGOL 60.
1SECTION 3.3.1.1.2 (JULY 1974) PAGE 9
METHOD AND PERFORMANCE:
THE BODY OF QRIVALSYM2 CONSISTS OF TWO PROCEDURE STATEMENTS; THE
FIRST IS A CALL OF TFMSYMTRI2 TO TRANSFORM THE SYMMETRIC MATRIX
INTO A SIMILAR TRIDIAGONAL MATRIX BY MEANS OF HOUSEHOLDER'S
TRANSFORMATION; THE SECOND IS A CALL OF QRIVALSYMTRI TO CALCULATE
THE EIGENVALUES. WHEN THE PROCESS IS COMPLETED WITHIN EM[4]
ITERATIONS THEN QRIVALSYM2:= 0; OTHERWISE QRIVALSYM2:= THE NUMBER,
K, OF EIGENVALUES NOT CALCULATED, EM[5]:= EM[4] + 1 AND ONLY THE
LAST N - K ELEMENTS OF VAL ARE APPROXIMATE EIGENVALUES OF THE GIVEN
MATRIX. OPERATION DETAILS OF BOTH PROCEDURES USED ARE GIVEN IN
THEIR DESCRIPTION.
SUBSECTION: QRIVALSYM1.
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE IS:
"INTEGER" "PROCEDURE" QRIVALSYM1(A, N, VAL, EM);
"VALUE" N; "INTEGER" N; "ARRAY" A, VAL, EM;
"CODE" 34164;
THE MEANING OF THE FORMAL PARAMETERS IS:
N: <ARITHMETIC EXPRESSION>;
THE ORDER OF THE GIVEN MATRIX;
A: <ARRAY IDENTIFIER>;
"ARRAY" A[1:(N+1)*N//2];
ENTRY: THE UPPER TRIANGLE OF THE SYMMETRIC MATRIX MUST BE
GIVEN IN SUCH A WAY THAT THE (I,J)-TH ELEMENT OF
THE MATRIX IS A[(J-1)*J//2+I], 1 <= I <= J <= N;
EXIT: THE DATA FOR HOUSEHOLDER'S BACK TRANSFORMATION
(WHICH ISN'T USED BY THIS PROCEDURE).
VAL: <ARRAY IDENTIFIER>;
"ARRAY" VAL[1:N];
EXIT: THE EIGENVALUES OF THE MATRIX IN SOME ARBITRARY
ORDER;
EM: <ARRAY IDENTIFIER>;
"ARRAY" EM[0:5];
ENTRY: EM[0], THE MACHINE PRECISION,
EM[2], THE RELATIVE TOLERANCE FOR THE EIGENVALUES,
EM[4], THE MAXIMUM ALLOWED NUMBER OF ITERATIONS;
EXIT: EM[1], THE INFINITY NORM OF THE MATRIX,
EM[3], THE MAXIMUM ABSOLUTE VALUE OF THE CODIAGONAL
ELEMENTS NEGLECTED,
EM[5], THE NUMBER OF ITERATIONS PERFORMED;
MOREOVER:
QRIVALSYM1:= THE NUMBER OF EIGENVALUES NOT CALCULATED.
PROCEDURES USED:
TFMSYMTRI1 = CP34143,
QRIVALSYMTRI = CP34160.
REQUIRED CENTRAL MEMORY:
EXECUTION FIELD LENGTH:
TWO ONE-DIMENSIONAL REAL ARRAYS OF LENGTH N ARE USED.
1SECTION 3.3.1.1.2 (JULY 1974) PAGE 10
RUNNING TIME:
ROUGHLY PROPORTIONAL TO N CUBED.
LANGUAGE: ALGOL 60.
METHOD AND PERFORMANCE:
THE BODY OF QRIVALSYM1 CONSISTS OF TWO PROCEDURE STATEMENTS; THE
FIRST IS A CALL OF TFMSYMTRI1 TO TRANSFORM THE SYMMETRIC MATRIX
INTO A SIMILAR TRIDIAGONAL MATRIX BY MEANS OF HOUSEHOLDER'S
TRANSFORMATION; THE SECOND IS A CALL OF QRIVALSYMTRI TO CALCULATE
THE EIGENVALUES. WHEN THE PROCESS IS COMPLETED WITHIN EM[4]
ITERATIONS THEN QRIVALSYM1:= 0; OTHERWISE QRIVALSYM1:= THE NUMBER,
K, OF EIGENVALUES NOT CALCULATED, EM[5]:= EM[4] + 1 AND ONLY THE
LAST N - K ELEMENTS OF VAL ARE APPROXIMATE EIGENVALUES OF THE GIVEN
MATRIX. OPERATION DETAILS OF BOTH PROCEDURES USED ARE GIVEN IN
THEIR DESCRIPTION.
SUBSECTION: QRISYM.
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE IS:
"INTEGER" "PROCEDURE" QRISYM(A, N, VAL, EM);
"VALUE" N; "INTEGER" N; "ARRAY" A, VAL, EM;
"CODE" 34163;
THE MEANING OF THE FORMAL PARAMETERS IS:
N: <ARITHMETIC EXPRESSION>;
THE ORDER OF THE GIVEN MATRIX;
A: <ARRAY IDENTIFIER>;
"ARRAY" A[1:N,1:N];
ENTRY: THE UPPER TRIANGLE OF THE SYMMETRIC MATRIX MUST BE
GIVEN IN THE UPPER TRIANGULAR PART OF A (THE
ELEMENTS A[I,J], I<= J);
EXIT: THE EIGENVECTORS OF THE SYMMETRIC MATRIX, STORED
COLUMNWISE;
VAL: <ARRAY IDENTIFIER>;
"ARRAY" VAL[1:N];
EXIT: THE EIGENVALUES OF THE MATRIX CORRESPONDING TO THE
CALCULATED EIGENVECTORS;
EM: <ARRAY IDENTIFIER>;
"ARRAY" EM[0:5];
ENTRY: EM[0], THE MACHINE PRECISION,
EM[2], THE RELATIVE TOLERANCE FOR THE QR ITERATION,
EM[4], THE MAXIMUM ALLOWED NUMBER OF ITERATIONS;
EXIT: EM[1], THE INFINITY NORM OF THE MATRIX,
EM[3], THE MAXIMUM ABSOLUTE VALUE OF THE CODIAGONAL
ELEMENTS NEGLECTED,
EM[5], THE NUMBER OF ITERATIONS PERFORMED;
MOREOVER:
QRISYM := THE NUMBER OF EIGENVALUES AND -VECTORS NOT
CALCULATED.
1SECTION 3.3.1.1.2 (JULY 1974) PAGE 11
PROCEDURES USED:
TFMSYMTRI2 = CP34140,
TFMPREVEC = CP34142,
QRISYMTRI = CP34161.
REQUIRED CENTRAL MEMORY:
EXECUTION FIELD LENGTH:
TWO ONE-DIMENSIONAL REAL ARRAYS OF LENGTH N ARE USED.
RUNNING TIME:
PROPORTIONAL TO N CUBED.
LANGUAGE: ALGOL 60.
METHOD AND PERFORMANCE:
THE BODY OF QRISYM CONSISTS OF THREE PROCEDURE STATEMENTS; THE
FIRST IS A CALL OF TFMSYMTRI2 TO TRANSFORM THE SYMMETRIC MATRIX
INTO A SIMILAR TRIDIAGONAL MATRIX BY MEANS OF HOUSEHOLDER'S
TRANSFORMATION, THE SECOND IS A CALL OF TFMPREVEC TO PERFORM THE
DESIRED BACK TRANSFORMATION ON THE EIGENVECTORS IN ADVANCE AND THE
THIRD IS A CALL OF QRISYMTRI TO CALCULATE THE EIGENVALUES AND
THE EIGENVECTORS. WHEN THE PROCESS IS COMPLETED WITHIN EM[4]
ITERATIONS THEN QRISYM:= 0; OTHERWISE QRISYM:= THE NUMBER, K, OF
EIGENVALUES AND -VECTORS NOT CALCULATED, EM[5]:= EM[4] + 1 AND ONLY
THE LAST N - K ELEMENTS OF VAL AND THE LAST N - K COLUMNS OF A ARE
APPROXIMATE EIGENVALUES AND EIGENVECTORS RESPECTIVELY OF THE GIVEN
MATRIX. OPERATION DETAILS OF THE PROCEDURES USED ARE GIVEN IN
THEIR DESCRIPTION.
EXAMPLES OF USE:
THE TWO LARGEST EIGENVALUES IN MONOTONICALLY NON INCREASING ORDER
AND THE CORRESPONDING EIGENVECTORS OF M, WITH N = 4 AND M[I,J] =
1 / (I + J - 1), MAY BE OBTAINED BY THE FOLLOWING PROGRAM:
"BEGIN"
"INTEGER" I, J;
"ARRAY" A[1:10], VAL[1:2], EM[0:9], VEC[1:4,1:2];
EM[0]:= "-14; EM[2]:= "-12; EM[4]:= "-3;
EM[6]:= 10"-10; EM[8]:= 5;
"FOR" I:= 1 "STEP" 1 "UNTIL" 4 "DO"
"FOR" J:= I "STEP" 1 "UNTIL" 4 "DO"
A[(J * J - J) / 2 + I]:= 1 / (I + J - 1);
EIGSYM1(A, 4, 2, VAL, VEC, EM);
OUTPUT(61, "("2(+.13D"+2D, 2B), 2/")", VAL[1], VAL[2]);
"FOR" I:= 1, 2, 3, 4 "DO"
OUTPUT(61, "("2(+.13D"+2D, 2B), /")", VEC[I,1], VEC[I,2]);
OUTPUT(61, "("2(.2D"+2D, /), 3(2ZD, /)")",
EM[1], EM[7], EM[3], EM[5], EM[9])
"END"
1SECTION 3.3.1.1.2 (JULY 1974) PAGE 12
THE PROGRAM DELIVERS(THE RESULTS ARE CORRECT UP TO TWELVE DIGITS):
THE EIGENVALUES: +.1500214280059"+01 +.1691412202214"+00
THE EIGENVECTORS: -.7926082911638"+00 +.5820756994972"+00
-.4519231209016"+00 -.3705021850671"+00
-.3224163985818"+00 -.5095786345018"+00
-.2521611696882"+00 -.5140482722222"+00
EM[1] = .21"+01
EM[7] = .92"-14
EM[3] = 32
EM[5] = 1
EM[9] = 1 .
THE TWO LARGEST EIGENVALUES OF M, WITH N = 4 AND M[I,J] =
1 / (I + J - 1), MAY BE OBTAINED IN MONOTONICALLY NON INCREASING
ORDER BY THE FOLLOWING PROGRAM:
"BEGIN"
"INTEGER" I, J;
"ARRAY" A[1:4,1:4], VAL[1:2], EM[0:3];
EM[0]:= "-14; EM[2]:= "-12;
"FOR" I:= 1 "STEP" 1 "UNTIL" 4 "DO"
"FOR" J:= I "STEP" 1 "UNTIL" 4 "DO" A[I,J]:= 1 / (I + J -1);
EIGVALSYM2(A, 4, 2, VAL, EM);
OUTPUT(61, "("2(+.13D"+2D, 2B)")", VAL[1], VAL[2]);
OUTPUT(61, "("2/, .2D"+2D, /, 2ZD")", EM[1], EM[3])
"END"
THE PROGRAM DELIVERS(THE RESULTS ARE CORRECT UP TO TWELVE DIGITS):
THE EIGENVALUES: +.1500214280059"+01 +.1691412202214"+00
EM[3] = .21"+01
EM[1] = 32 .
1SECTION 3.3.1.1.2 (JULY 1974) PAGE 13
SOURCE TEXT(S) :
0"CODE" 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];
TFMSYMTRI2(A, N, D, B, BB, EM);
VALSYMTRI(D, BB, N, 1, NUMVAL, VAL, EM)
"END" EIGVALSYM2;
"EOP"
0"CODE" 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];
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;
"EOP"
0"CODE" 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];
TFMSYMTRI1(A, N, D, B, BB, EM);
VALSYMTRI(D, BB, N, 1, NUMVAL, VAL, EM)
"END" EIGVALSYM1
1SECTION 3.3.1.1.2 (JULY 1974) PAGE 14
;
"EOP"
0"CODE" 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];
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;
"EOP"
0"CODE" 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];
TFMSYMTRI2(A, N, VAL, B, BB, EM);
QRIVALSYM2:= QRIVALSYMTRI(VAL, BB, N, EM)
"END" QRIVALSYM2
1SECTION 3.3.1.1.2 (JULY 1974) PAGE 15
;
"EOP"
0"CODE" 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];
TFMSYMTRI2(A, N, VAL, B, BB, EM); TFMPREVEC(A, N);
QRISYM:= QRISYMTRI(A, N, VAL, B, BB, EM)
"END" QRISYM;
"EOP"
0"CODE" 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];
TFMSYMTRI1(A, N, VAL, B, BB, EM);
QRIVALSYM1:= QRIVALSYMTRI(VAL, BB, N, EM)
"END" QRIVALSYM1;
"EOP"
1SECTION : 3.3.1.1.3.1 (NOVEMBER 1976) PAGE 1
AUTHORS: J.J.G. ADMIRAAL, A.C. YSSELSTEIN.
CONTRIBUTOR: J.J.G. ADMIRAAL.
INSTITUTE: UNIVERSITY OF AMSTERDAM.
RECEIVED: 761101.
BRIEF DESCRIPTION:
THIS SECTION CONTAINS THREE PROCEDURES FOR SORTING THE
ELEMENTS OF A VECTOR AND CORRESPONDINGLY PERMUTING THE
ELEMENTS OF A VECTOR OR A MATRIX ROW.
A) MERGESORT DELIVERS A PERMUTATION OF INDICES
CORRESPONDING TO SORTING THE ELEMENTS OF A GIVEN
VECTOR INTO NON-DECREASING ORDER.
B) VECPERM PERMUTES THE ELEMENTS OF A GIVEN VECTOR
CORRESPONDING TO A GIVEN PERMUTATION OF INDICES.
C) ROWPERM PERMUTES THE ELEMENTS OF A GIVEN ROW OF A
MATRIX CORRESPONDING TO A GIVEN PERMUTATION OF
INDICES.
KEYWORDS:
SORTING,
PERMUTING.
SUBSECTION: MERGESORT.
CALLING SEQUENCE:
THE DECLARATION OF THE PROCEDURE IN THE CALLING PROGRAM READS:
"PROCEDURE" MERGESORT(VEC1,VEC2,LOW,UPP);
"VALUE" LOW,UPP;"INTEGER" LOW,UPP;"ARRAY" VEC1;
"INTEGER""ARRAY" VEC2; "CODE" 36405;
THE MEANING OF THE FORMAL PARAMETERS IS:
VEC1 :<ARRAY IDENTIFIER>;
"ARRAY" VEC1[LOW:UPP];
ENTRY: THE VECTOR TO BE SORTED INTO
NONDECREASING ORDER;
EXIT: THE CONTENTS OF VEC1 ARE LEFT INVARIANT;
VEC2 :<ARRAY IDENTIFIER>;
"INTEGER""ARRAY" VEC2[LOW:UPP];
EXIT: THE PERMUTATION OF INDICES CORRESPONDING TO
SORTING THE ELEMENTS OF VEC1 INTO
NON-DECREASING ORDER;
LOW : <ARITHMETIC EXPRESSION>;
THE LOWER INDEX OF THE ARRAYS VEC1 AND VEC2;
UPP : <ARITHMETIC EXPRESSION>;
THE UPPER INDEX OF THE ARRAYS VEC1 AND VEC2;
1SECTION : 3.3.1.1.3.1 (NOVEMBER 1976) PAGE 2
PROCEDURES USED: NONE.
REQUIRED CENTRAL MEMORY: ONE LOCAL INTEGER ARRAY OF
LENGTH N,WHERE N = UPP - LOW + 1.
RUNNING TIME: AVERAGE PROPORTIONAL TO N * LN(N).
LANGUAGE: ALGOL 60.
METHOD AND PERFORMANCE: SORTING BY MERGING. ([1],[2])
EXAMPLE OF USE: THE PROCEDURE MERGESORT IS USED IN SYMEIGIMP
(SECTION 3.3.1.1.3.3).
SUBSECTION: VECPERM.
CALLING SEQUENCE:
THE DECLARATION OF THE PROCEDURE IN THE CALLING PROGRAM READS:
"PROCEDURE" VECPERM(PERM,LOW,UPP,VECTOR);
"VALUE" LOW,UPP; "INTEGER" LOW,UPP;
"INTEGER" "ARRAY" PERM;"ARRAY" VECTOR;
"CODE" 36404;
THE MEANING OF THE FORMAL PARAMETERS IS:
PERM :<ARRAY IDENTIFIER>;
"INTEGER" "ARRAY" PERM[LOW:UPP];
ENTRY: A GIVEN PERMUTATION (E.G.AS PRODUCED BY
MERGESORT) OF THE NUMBERS IN THE ARRAY VECTOR;
LOW :<ARITHMETIC EXPRESSION>;
THE LOWER INDEX OF THE ARRAYS PERM AND VECTOR;
UPP :<ARITHMETIC EXPRESSION>;
THE UPPER INDEX OF THE ARRAYS PERM AND VECTOR;
VECTOR :<ARRAY IDENTIFIER>;
"ARRAY" VECTOR[LOW:UPP];
ENTRY: THE REAL VECTOR TO BE PERMUTED;
EXIT: THE PERMUTED VECTOR ELEMENTS.
PROCEDURE USED: NONE.
REQUIRED CENTRAL MEMORY :
ONE LOCAL BOOLEAN ARRAY OF LENGTH N IS DECLARED.
RUNNING TIME: PROPORTIONAL TO N.
LANGUAGE: ALGOL 60.
EXAMPLE OF USE: THE PROCEDURE VECPERM IS USED IN SYMEIGIMP;
(SECTION 3.3.1.1.3.3).
1SECTION : 3.3.1.1.3.1 (NOVEMBER 1976) PAGE 3
SUBSECTION: ROWPERM.
CALLING SEQUENCE:
THE DECLARATION OF THE PROCEDURE IN THE CALLING PROGRAM READS:
"PROCEDURE" ROWPERM(PERM,LOW,UPP,I,MATRIX);
"VALUE" LOW,UPP,I;"INTEGER" LOW,UPP,I;
"INTEGER" "ARRAY" PERM;"ARRAY" MATRIX;
"CODE" 36403;
THE MEANING OF THE FORMAL PARAMETERS IS:
PERM :<ARRAY IDENTIFIER>;
"INTEGER" "ARRAY" PERM[LOW:UPP];
ENTRY: A GIVEN PERMUTATION (E.G. AS PRODUCED BY
MERGESORT) OF THE NUMBERS IN THE ARRAY VECTOR;
LOW :<ARITHMETIC EXPRESSION>;
THE LOWER INDEX OF THE ARRAY PERM;
UPP :<ARITHMETIC EXPRESSION>;
THE UPPER INDEX OF THE ARRAY PERM;
I :<ARITHMETIC EXPRESSION>;
THE ROW INDEX OF THE MATRIX ELEMENTS;
MATRIX :<ARRAY IDENTIFIER>:
"ARRAY" MATRIX [I :I, LOW : UP];
ENTRY:MATRIX [I, LOW : UP] SHOULD CONTAIN THE
ELEMENTS TO BE PERMUTED;
EXIT: MATRIX[I, LOW : UP] CONTAINS THE ROW OF
PERMUTED ELEMENTS;
PROCEDURES USED: NONE.
REQUIRED CENTRAL MEMORY:
ONE LOCAL BOOLEAN ARRAY OF LENGTH N IS DECLARED.
RUNNING TIME: PROPORTIONAL TO N, WHERE N = UPP - LOW + 1.
LANGUAGE: ALGOL 60.
EXAMPLE OF USE: THE PROCEDURE ROWPERM IS USED IN SYMEIGIMP.
(SECTION 3.3.1.1.3.3).
REFERENCES:
[1] D.E. KNUTH , THE ART OF COMPUTER PROGRAMMING,
VOL. 3/ SORTING AND SEARCHING,ADDISON-WESLEY 1973.
(SECTION 5.2.4 P.159-173).
[2] A.V. AHO, J.E. HOPCROFT & J.D. ULLMAN,
THE DESIGN AND ANALYSIS OF COMPUTER ALGORITHMS,
ADDISON-WESLEY 1974.
(SECTION I.M, P65-67).
1SECTION : 3.3.1.1.3.1 (NOVEMBER 1976) PAGE 4
SOURCE TEXTS:
0"CODE" 36405;
"PROCEDURE" MERGESORT(A,P,LOW,UP);"VALUE" LOW,UP;
"INTEGER" LOW,UP;"ARRAY" A;"INTEGER" "ARRAY" P;
"BEGIN" "INTEGER" I,L,R,PL,PR,LO,STEP,STAP,UMLP1,UMSP1,REST,RESTV;
"BOOLEAN" ROUT,LOUT; "INTEGER" "ARRAY" HP[LOW:UP];
"PROCEDURE" MERGE(LO,LS,RS);"VALUE" LO,LS,RS;"INTEGER" LO,LS,RS;
"BEGIN" L:=LO; R:=LO+LS; LOUT:=ROUT:="FALSE";
"FOR" I:=LO,I+1 "WHILE" ^(LOUT "OR" ROUT) "DO"
"BEGIN" PL:=P[L];PR:=P[R];"IF" A[PL]>A[PR] "THEN"
"BEGIN" HP[I]:=PR;R:=R+1;ROUT:=R=LO+LS+RS "END" "ELSE"
"BEGIN" HP[I]:=PL;L:=L+1;LOUT:=L=LO+LS "END"
"END" FOR I;
"IF" ROUT "THEN"
"BEGIN" "FOR" I:=LO+LS-1 "STEP" -1 "UNTIL" L "DO"
P[I+RS]:=P[I];R:=L+RS
"END";
"FOR" I:=R-1 "STEP" -1 "UNTIL" LO "DO" P[I]:=HP[I];
"END" MERGE;
"FOR" I:=LOW "STEP" 1 "UNTIL" UP "DO" P[I]:=I;RESTV:=0;
UMLP1:=UP-LOW+1;
"FOR" STEP:=1, STEP*2 "WHILE" STEP < UMLP1 "DO"
"BEGIN" STAP:=2*STEP;UMSP1:=UP-STAP+1;
"FOR" LO:=LOW "STEP" STAP "UNTIL" UMSP1 "DO"
MERGE(LO,STEP,STEP); REST:=UP-LO+1;
"IF" REST>RESTV & RESTV>0 "THEN" MERGE(LO,REST-RESTV,RESTV);
RESTV:=REST
"END" FOR STEP
"END" MERGESORT
1SECTION : 3.3.1.1.3.1 (NOVEMBER 1976) PAGE 5
;
"EOP"
"CODE" 36404;
"PROCEDURE" VECPERM(PERM,LOW,UPP,VECTOR);"VALUE" LOW,UPP;
"INTEGER" LOW,UPP;"INTEGER" "ARRAY" PERM;"REAL" "ARRAY" VECTOR;
"BEGIN" "INTEGER" T,J,K;"REAL" A;"BOOLEAN" "ARRAY" TODO[LOW:UPP];
"FOR" T:=LOW "STEP" 1 "UNTIL" UPP "DO" TODO[T]:="TRUE";
"FOR" T:=LOW "STEP" 1 "UNTIL" UPP "DO"
"BEGIN" "IF" TODO[T] "THEN"
"BEGIN" K:=T;A:=VECTOR[K];
"FOR" J:=PERM[K] "WHILE" J^=T "DO"
"BEGIN" VECTOR[K]:=VECTOR[J];TODO[K]:="FALSE";K:=J
"END";VECTOR[K]:=A;TODO[K]:="FALSE"
"END" CYCLE;
"END" FOR T;
"END" VECPERM;
"EOP"
"CODE" 36403;
"PROCEDURE" ROWPERM(PERM,LOW,UPP,I,MAT);"VALUE" LOW,UPP,I;
"INTEGER" LOW,UPP,I;"INTEGER" "ARRAY" PERM;"REAL" "ARRAY" MAT;
"BEGIN" "INTEGER" T,J,K;"REAL" A;"BOOLEAN" "ARRAY" TODO[LOW:UPP];
"FOR" T:=LOW "STEP" 1 "UNTIL" UPP "DO" TODO[T]:="TRUE";
"FOR" T:=LOW "STEP" 1 "UNTIL" UPP "DO"
"BEGIN" "IF" TODO[T] "THEN"
"BEGIN" K:=T;A:=MAT[I,K];
"FOR" J:=PERM[K] "WHILE" J^=T "DO"
"BEGIN" MAT[I,K]:=MAT[I,J];TODO[K]:="FALSE";K:=J
"END";MAT[I,K]:=A;TODO[K]:="FALSE"
"END" CYCLE;
"END" FOR T;
"END" ROWPERM;
"EOP"
1SECTION : 3.3.1.1.3.2 (NOVEMBER 1976) PAGE 1
AUTHOR/CONTRIBUTOR: J.J.G. ADMIRAAL.
INSTITUTE: UNIVERSITY OF AMSTERDAM.
RECEIVED: 761101.
BRIEF DESCRIPTION:
THE PROCEDURE ORTHOG ORTHOGONALIZES SOME ADJACENT MATRIX COLUMNS
ACCORDING TO THE MODIFIED GRAM SCHMIDT METHOD (SEE [1]).
KEYWORDS:
MATRIX COLUMNS,
MODIFIED GRAM SCHMIDT ORTHOGONALIZATION.
CALLING SEQUENCE:
THE DECLARATION OF THE PROCEDURE IN THE CALLING PROGRAM READS:
"PROCEDURE" ORTHOG(N,LC,UC,X);
"VALUE" N,LC,UC; "INTEGER" N,LC,UC;"ARRAY" X;
"CODE" 36402;
THE MEANING OF THE FORMAL PARAMETERS IS:
N :<ARITHMETIC EXPRESSION>;
THE ORDER OF THE MATRIX X;
LC :<ARITHMETIC EXPRESSIOM>;
THE LOWER COLUMN INDEX OF THE MATRIX COLUMNS;
UC :<ARITHMETIC EXPRESSION>;
THE UPPER COLUMN INDEX OF THE MATRIX COLUMNS;
X :<ARRAY IDENTIFIER>;
"ARRAY" X[1:N,LC:UC];
ENTRY: THE MATRIX COLUMNS,TO BE
ORTHOGONALIZED;
EXIT: THE ORTHOGONALIZED MATRIX COLUMNS.
PROCEDURES USED:
TAMMAT = CP34014,
ELMCOL = CP34023.
REQUIRED CENTRAL MEMORY: NO LOCAL ARRAYS ARE DECLARED.
RUNNING TIME: PROPORTIONAL TO N**3.
1SECTION : 3.3.1.1.3.2 (NOVEMBER 1976) PAGE 2
LANGUAGE: ALGOL 60.
METHOD AND PERFORMANCE:
THE MODIFIED GRAM SCHMIDT METHOD (SEE [1],CHAPTER 4.54).
EXAMPLE OF USE: THE PROCEDURE ORTHOG IS USED IN SYMEIGIMP.
(SECTION 3.3.1.1.3.3).
REFERENCES:
[1] J.H. WILKINSON.
THE ALGEBRAIC EIGENVALUE PROBLEM.
CLARENDON PRESS,OXFORD,1965.
SOURCE TEXT:
0"CODE" 36402;
"PROCEDURE" ORTHOG(N,LC,UC,X);"VALUE" N,LC,UC;
"INTEGER" N,LC,UC;"ARRAY" X;
"BEGIN" "INTEGER" I,J,K; "REAL" NORMX;
"FOR" J:=LC "STEP" 1 "UNTIL" UC "DO"
"BEGIN" NORMX:=SQRT(TAMMAT(1,N,J,J,X,X));
"FOR" I:=1 "STEP" 1 "UNTIL" N "DO" X[I,J]:=X[I,J]/NORMX;
"FOR" K:=J+1 "STEP" 1 "UNTIL" UC "DO"
ELMCOL(1,N,K,J,X,X,-TAMMAT(1,N,K,J,X,X))
"END"
"END" ORTHOG;
"EOP"
1SECTION : 3.3.1.1.3.3 (DECEMBER 1979) PAGE 1
AUTHOR/CONTRIBUTOR: J.J.G. ADMIRAAL.
INSTITUTE: UNIVERSITY OF AMSTERDAM.
RECEIVED: 761101.
BRIEF DESCRIPTION:
THE PROCEDURE SYMEIGIMP IMPROVES A GIVEN APPROXIMATION OF
A REAL SYMMETRIC EIGENSYSTEM AND CALCULATES ERROR BOUNDS
FOR THE EIGENVALUES.
KEYWORDS:
EIGENVALUES.
EIGENVECTORS.
SYMMETRIC MATRIX.
RAYLEIGH QUOTIENTS.
ERROR BOUNDS.
IMPROVED EIGENSYSTEM.
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE IS :
"PROCEDURE" SYMEIGIMP(N,A,VEC,VAL1,VAL2,LBOUND,UBOUND,AUX);
"VALUE" N;"INTEGER" N;
"ARRAY" A,VEC,VAL1,VAL2,LBOUND,UBOUND,AUX;
"CODE" 36401;
THE MEANING OF THE FORMAL PARAMETERS IS:
N: <ARITHMETIC EXPRESSION>;
THE ORDER OF MATRIX A;
A: <ARRAY IDENTIFIER>;
"ARRAY" A[1:N,1:N] CONTAINS A REAL SYMMETRIC MATRIX
WHOSE EIGENSYSTEM HAS TO BE IMPROVED;
VEC: <ARRAY IDENTIFIER>;
"ARRAY" VEC[1:N,1:N] CONTAINS A MATRIX WHOSE COLUMNS ARE
A SYSTEM OF APPROXIMATE EIGENVECTORS OF MATRIX A;
ENTRY: INITIAL APPROXIMATIONS;
EXIT: IMPROVED APPROXIMATIONS;
VAL1: <ARRAY IDENTIFIER>;
"ARRAY" VAL1[1:N];
ENTRY: INITIAL APPROXIMATIONS OF THE EIGENVALUES OF A;
EXIT: THE HEAD PARTS OF THE DOUBLE PRECISION IMPROVED
APPROXIMATIONS OF THE EIGENVALUES OF A;
VAL2: <ARRAY IDENTIFIER>;
"ARRAY" VAL2[1:N];
EXIT: THE TAIL PARTS OF THE DOUBLE PRECISION
IMPROVED EIGENVALUES OF A;
1SECTION : 3.3.1.1.3.3 (DECEMBER 1979) PAGE 2
LBOUND,
UBOUND: <ARRAY IDENTIFIER>;
EXIT: "ARRAY" LBOUND, UBOUND [1:N] CONTAIN THE LOWER
AND UPPER ERRORBOUNDS RESPECTIVELY FOR THE EIGENVALUE
APPROXIMATIONS IN VAL1,VAL2[1:N] SUCH THAT THE
I-TH EXACT EIGENVALUE LIES BETWEEN VAL1[I]+VAL2[I]
-LBOUND[I] AND VAL1[I]+VAL2[I]+UBOUND[I];
AUX: <ARRAY IDENTIFIER>;
"ARRAY" AUX[0:5];
ENTRY: AUX[0]= THE RELATIVE PRECISION OF THE ELEMENTS OF A;
AUX[2]= THE RELATIVE TOLERANCE FOR THE RESIDUAL
MATRIX; THE ITERATION ENDS WHEN THE MAXIMUM
ABSOLUTE VALUE OF THE RESIDUAL ELEMENTS IS
SMALLER THAN AUX[2]*AUX[1].
AUX[4]= THE MAXIMUM NUMBER OF ITERATIONS ALLOWED;
EXIT: AUX[1]= INFINITY NORM OF THE MATRIX A;
AUX[3]= MAXIMUM ABSOLUTE ELT. OF THE RESIDUAL MATRIX
AUX[5]= NUMBER OF ITERATIONS;
PROCEDURES USED:
LNGMATVEC = CP34411,
LNGMATMAT = CP34413,
LNGTAMMAT = CP34414,
VECVEC = CP34010,
MATMAT = CP34013,
TAMMAT = CP34014.
MERGESORT = CP36405,
VECPERM = CP36404,
ROWPERM = CP36403,
ORTHOG = CP36402,
QRISYM = CP34163,
INFNRMMAT = CP31064.
RUNNING TIME: ROUGHLY PROPORTIONAL TO N CUBED.
REQUIRED CENTRAL MEMORY:
AUXILIARY ARRAYS ARE DECLARED TO A TOTAL OF 3*N*N + 6*N REALS
AND N INTEGERS; MOREOVER, N INTEGERS OR N BOOLEANS ARE USED
BY MERGESORT, VECPERM AND ROWPERM.
METHOD AND PERFORMANCE: SEE[1].
1SECTION : 3.3.1.1.3.3 (DECEMBER 1979) PAGE 3
REFERENCES:
[1]. J.J.G. ADMIRAAL.
ITERATIEF VERBETEREN VAN REEEL SYMMETRISCH EIGENSYSTEEM
EN BEREKENEN VAN FOUTGRENZEN VOOR DE VERKREGEN EIGENWAARDEN.
DOCTORAL SCRIPTION,MARCH 1976,
UNIVERSITEIT VAN AMSTERDAM.
[2]. R.T. GREGORY AND D.L. KARNEY.
A COLLECTION OF MATRICES FOR TESTING COMPUTATIONAL
ALGORITHMS,
WILEY-INTERSCIENCE, 1969.
EXAMPLE OF USE.
"BEGIN" "INTEGER" I,J;"REAL" S;
"ARRAY" A,X[1:4,1:4],VAL1,VAL2,LBOUND,UBOUND[1:4],EM,AUX[0:5];
A[1,1]:=A[2,2]:=A[3,3]:=A[4,4]:=6;
A[1,2]:=A[2,1]:=A[3,1]:=A[1,3]:=4;
A[4,2]:=A[2,4]:=A[3,4]:=A[4,3]:=4;
A[1,4]:=A[4,1]:=A[3,2]:=A[2,3]:=1;
"FOR" I:=1 "STEP" 1 "UNTIL" 4 "DO"
"FOR" J:=I "STEP" 1 "UNTIL" 4 "DO" X[I,J]:=X[J,I]:=A[I,J];
OUTPUT(61,"(""("A")",/,4(4(+DB),/)")",A);
EM[0]:="-14;EM[4]:=100;EM[2]:="-5;
QRISYM(X,4,VAL1,EM);
AUX[0]:=0;AUX[4]:=10;AUX[2]:="-14;
SYMEIGIMP(4,A,X,VAL1,VAL2,LBOUND,UBOUND,AUX);
OUTPUT(61,"("/,"("THE EXACT EIGENVALUES ARE: -1 , +5 , +5 , +15")",
//,"("THE DIFFERENCES BETWEEN THE CALCULATED AND THE EXACT ")",
"("EIGENVALUES")",
//,4(N,/)")",(VAL1[1]+1)+VAL2[1],(VAL1[2]-5)+VAL2[2],(VAL1[3]-
5)+VAL2[3],(VAL1[4]-15)+VAL2[4]);
OUTPUT(61,"("/,"("LOWERBOUNDS UPPERBOUNDS")",//")");
"FOR" I:=1 "STEP" 1 "UNTIL" 4 "DO"
OUTPUT(61,"("2(+D.D"+DD5B),/")",LBOUND[I],UBOUND[I]);
OUTPUT(61,"("/,"("NUMBER OF ITERATIONS = ")",ZD//,
"("INFINITY NORM OF A = ")",ZD//,
"("MAXIMUM ABSOLUTE ELEMENT OF RESIDU = ")",D.D"+DD")",
AUX[5],AUX[1],AUX[3])
"END" EXAMPLE OF USE
1SECTION : 3.3.1.1.3.3 (NOVEMBER 1976) PAGE 4
DELIVERS:
A
+6 +4 +4 +1
+4 +6 +1 +4
+4 +1 +6 +4
+1 +4 +4 +6
THE EXACT EIGENVALUES ARE: -1 , +5 , +5 , +15
THE DIFFERENCES BETWEEN THE CALCULATED AND THE EXACT EIGENVALUES
-6.3423147029256"-022
+5.5934784498910"-018
+4.0389678347316"-028
-5.5947317864427"-018
LOWERBOUNDS UPPERBOUNDS
+1.2"-23 +1.2"-23
+7.5"-09 +7.5"-09
+1.0"-13 +1.0"-13
+5.6"-18 +5.6"-18
NUMBER OF ITERATIONS = 2
INFINITY NORM OF A = 15
MAXIMUM ABSOLUTE ELEMENT OF RESIDU = 2.8"-14
1SECTION : 3.3.1.1.3.3 (NOVEMBER 1976) PAGE 5
SOURCETEXT:
0"CODE" 36401;
"PROCEDURE" SYMEIGIMP(N,A,VEC,VAL1,VAL2,LBOUND,UBOUND,AUX);
"VALUE" N;"INTEGER" N;"ARRAY" A,VEC,VAL1,VAL2,LBOUND,UBOUND,AUX;
"BEGIN"
"INTEGER" K,I,J,I0,I1,ITER,MAXITP1;"REAL" S,HEAD,TAIL,MAX,TOL,
MATEPS,RELERRA,RELTOLR,NORMA;"INTEGER" "ARRAY" PERM[1:N];
"ARRAY" R,P,Y[1:N,1:N],RQ,RQT,EPS,Z,VAL3,ETA[1:N];
"PROCEDURE" BOUNDS(I0,I1,N,LBOUND,UBOUND);"VALUE" I0,I1,N;
"INTEGER" I0,I1,N;"ARRAY" LBOUND,UBOUND;
"BEGIN" "INTEGER" K,I,J,I01;"REAL" EPS2,DL,DR;
"FOR" I:=I0,I01 "WHILE" I<=I1 "DO"
"BEGIN" J:=I01:=I;
"FOR" J:=J+1 "WHILE" "IF" J>I1 "THEN" "FALSE" "ELSE"
RQ[J]-RQ[J-1]<=EPS[J]+EPS[J-1] "DO" I01:=J;
"IF" I = I01 "THEN"
"BEGIN"
"IF" I<N "THEN"
"BEGIN"
"IF" I=1 "THEN" DL:=DR:=RQ[I+1]-RQ[I]-EPS[I+1]
"ELSE" "BEGIN" DL:=RQ[I]-RQ[I-1]-EPS[I-1];
DR:=RQ[I+1]-RQ[I]-EPS[I+1]
"END"
"END" "ELSE" DL:=DR:=RQ[I]-RQ[I-1]-EPS[I-1];
EPS2:=EPS[I]*EPS[I];LBOUND[I]:=EPS2/DR+MATEPS;
UBOUND[I]:=EPS2/DL+MATEPS
"END" "ELSE"
"BEGIN" "FOR" K:=I "STEP" 1 "UNTIL" I01 "DO"
LBOUND[K]:=UBOUND[K]:=EPS[K]+MATEPS
"END";I01:=I01+1
"END"
"END" BOUNDS;
"BOOLEAN" STOP;STOP:="FALSE";NORMA:=INFNRMMAT(1,N,1,N,J,A);
RELERRA:=AUX[0];RELTOLR:=AUX[2];MAXITP1:=AUX[4]+1;
MATEPS:=RELERRA*NORMA;TOL:=RELTOLR*NORMA;
"FOR" ITER:=1 "STEP" 1 "UNTIL" MAXITP1 "DO"
"BEGIN" STOP:="TRUE";MAX:=0;
"COMMENT"
1SECTION : 3.3.1.1.3.3 (NOVEMBER 1976) PAGE 6
;
"FOR" J:=1 "STEP" 1 "UNTIL" N "DO"
"FOR" I:=1 "STEP" 1 "UNTIL" N "DO"
"BEGIN"
LNGMATVEC(J,J,I,VEC,VAL1,0,0,HEAD,TAIL);
LNGMATMAT(1,N,I,J,A,VEC,-HEAD,-TAIL,R[I,J],TAIL);
"IF"ABS(R[I,J])>MAX "THEN" MAX:=ABS(R[I,J])
"END";"IF" MAX > TOL "THEN" STOP:="FALSE";
"IF" "NOT" STOP "AND" ITER<MAXITP1 "THEN"
"BEGIN"
"FOR" I:=1 "STEP" 1 "UNTIL" N "DO"
LNGTAMMAT(1,N,I,I,VEC,R,VAL1[I],0,RQ[I],RQT[I]);
"FOR" J:=1 "STEP" 1 "UNTIL" N "DO"
"BEGIN" "FOR" I:=1 "STEP" 1 "UNTIL" N "DO"
ETA[I]:=R[I,J]-(RQ[J]-VAL1[J])*VEC[I,J];
Z[J]:=SQRT(VECVEC(1,N,0,ETA,ETA))
"END";
MERGESORT(RQ,PERM,1,N);VECPERM(PERM,1,N,RQ);
"FOR" I:=1 "STEP" 1 "UNTIL" N "DO"
"BEGIN" EPS[I]:=Z[PERM[I]];VAL3[I]:=VAL1[PERM[I]];
ROWPERM(PERM,1,N,I,VEC);ROWPERM(PERM,1,N,I,R)
"END";
"FOR" I:=1 "STEP" 1 "UNTIL" N "DO"
"FOR" J:=I "STEP" 1 "UNTIL" N "DO"
P[I,J]:=P[J,I]:=TAMMAT(1,N,I,J,VEC,R);
"END";
"FOR"I0:=1,I1+1 "WHILE" I0<=N "DO"
"BEGIN" J:=I1:=I0;
"FOR" J:=J+1 "WHILE" "IF" J>N "THEN" "FALSE" "ELSE"
RQ[J]-RQ[J-1]<=SQRT((EPS[J]+EPS[J-1])*NORMA) "DO" I1:=J;
"IF" STOP "OR" ITER=MAXITP1 "THEN"
BOUNDS(I0,I1,N,LBOUND,UBOUND) "ELSE"
"BEGIN"
"IF" I0=I1 "THEN"
"BEGIN" "FOR" K:=1 "STEP" 1 "UNTIL" N "DO"
"IF" K=I0 "THEN" Y[K,I0]:=1 "ELSE"
R[K,I0]:=P[K,I0];
VAL1[I0]:=RQ[I0];VAL2[I0]:=RQT[PERM[I0]]
"END" "ELSE"
"BEGIN""INTEGER" N1,I0M1,I1P1;"REAL" M1;"ARRAY"EM[0:5];
N1:=I1-I0+1;EM[0]:=EM[2]:="-14;EM[4]:=10*N1;
"BEGIN" "ARRAY" PP[1:N1,1:N1],VAL4[1:N1];M1:=0;
"FOR" K:=I0 "STEP" 1 "UNTIL" I1 "DO"
M1:=M1+VAL3[K];M1:=M1/N1;
"COMMENT"
1SECTION : 3.3.1.1.3.3 (DECEMBER 1979) PAGE 7
;
"FOR" I:=1 "STEP" 1 "UNTIL" N1 "DO"
"FOR" J:=1 "STEP" 1 "UNTIL" N1 "DO"
"BEGIN" PP[I,J]:=P[I+I0-1,J+I0-1];
"IF" I=J "THEN"
PP[I,J]:=PP[I,J]+VAL3[J+I0-1]-M1
"END";"FOR" I:=I0 "STEP" 1 "UNTIL" I1 "DO"
"BEGIN" VAL3[I]:=M1;VAL1[I]:=RQ[I];
VAL2[I]:=RQT[PERM[I]]
"END";
QRISYM(PP,N1,VAL4,EM);
MERGESORT(VAL4,PERM,1,N1);
"FOR" I:=1 "STEP" 1 "UNTIL" N1 "DO"
"FOR" J:=1 "STEP" 1 "UNTIL" N1 "DO"
P[I+I0-1,J+I0-1]:=PP[I,PERM[J]];
I0M1:=I0-1;I1P1:=I1+1;
"FOR" J:=I0 "STEP" 1 "UNTIL" I1 "DO"
"BEGIN" "FOR" I:=1 "STEP" 1 "UNTIL" I0M1,
I1P1 "STEP" 1 "UNTIL" N "DO"
"BEGIN" S:=0;
"FOR" K:=I0 "STEP" 1 "UNTIL" I1 "DO"
S:=S+P[I,K]*P[K,J];
R[I,J]:=S
"END";"FOR" I:=I0 "STEP" 1 "UNTIL" I1 "DO"
Y[I,J]:=P[I,J]
"END" FOR J
"END" INNERBLOCK
"END" I1>I0
"END" NOT STOP
"END" FOR I0;
"IF" "NOT" STOP "AND" ITER<MAXITP1 "THEN"
"BEGIN"
"FOR" J:=1 "STEP" 1 "UNTIL" N "DO"
"FOR" I:=1 "STEP" 1 "UNTIL" N "DO"
"IF" VAL3[I]^=VAL3[J] "THEN"
Y[I,J]:=R[I,J]/(VAL3[J]-VAL3[I]);
"FOR" I:=1 "STEP" 1 "UNTIL" N "DO"
"BEGIN" "FOR" J:=1 "STEP" 1 "UNTIL" N "DO"
Z[J]:=MATMAT(1,N,I,J,VEC,Y);
"FOR" J:=1 "STEP" 1 "UNTIL" N "DO" VEC[I,J]:=Z[J]
"END";ORTHOG(N,1,N,VEC)
"END" "ELSE"
"BEGIN" AUX[5]:=ITER-1;"GOTO" EXIT "END"
"END" FOR ITER;
EXIT: AUX[1]:=NORMA;AUX[3]:=MAX
"END" SYMEIGIMP;
"EOP"
1SECTION : 3.3.1.2.1 (JULY 1974) PAGE 1
AUTHORS: T.J. DEKKER, W. HOFFMANN.
CONTRIBUTORS: W. HOFFMANN, S.P.N. VAN KAMPEN.
INSTITUTE: MATHEMATICAL CENTRE.
RECEIVED: 731115.
BRIEF DESCRIPTION:
THIS SECTION CONTAINS FIVE PROCEDURES:
A) REAVALQRI CALCULATES THE EIGENVALUES OF A REAL UPPER-HESSEN-
BERG MATRIX, PROVIDED THAT ALL EIGENVALUES ARE REAL, BY MEANS OF
SINGLE QR ITERATION;
B) REAVECHES CALCULATES ONE EIGENVECTOR CORRESPONDING TO A GIVEN
REAL EIGENVALUE OF A REAL UPPER-HESSENBERG MATRIX BY MEANS OF
INVERSE ITERATION;
C) REAQRI CALCULATES THE EIGENVALUES AND EIGENVECTORS OF A REAL
UPPER-HESSENBERG MATRIX, PROVIDED THAT ALL EIGENVALUES ARE REAL,
BY MEANS OF SINGLE QR ITERATION;
D) COMVALQRI CALCULATES THE REAL AND COMPLEX EIGENVALUES OF A REAL
UPPER-HESSENBERG MATRIX BY MEANS OF DOUBLE QR ITERATION;
E) COMVECHES CALCULATES ONE EIGENVECTOR CORRESPONDING TO A GIVEN
COMPLEX EIGENVALUE OF A REAL UPPER-HESSENBERG MATRIX BY MEANS OF
INVERSE ITERATION.
KEYWORDS:
EIGENVALUE,
EIGENVECTOR,
UPPER-HESSENBERG MATRIX,
QR ITERATION,
INVERSE ITERATION.
1SECTION : 3.3.1.2.1 (JULY 1974) PAGE 2
SUBSECTION: REAVALQRI.
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE IS:
"INTEGER" "PROCEDURE" REAVALQRI(A, N, EM, VAL); "VALUE" N;
"INTEGER" N; "ARRAY" A, EM, VAL;
"CODE" 34180;
THE MEANING OF THE FORMAL PARAMETERS IS:
A: <ARRAY IDENTIFIER>;
"ARRAY" A[1:N,1:N];
ENTRY: THE ELEMENTS OF THE REAL UPPER-HESSENBERG MATRIX
MUST BE GIVEN IN THE UPPER TRIANGLE AND THE FIRST
SUBDIAGONAL OF ARRAY A;
EXIT: THE HESSENBERG PART OF ARRAY A IS ALTERED;
N: <ARITHMETIC EXPRESSION>;
THE ORDER OF THE GIVEN MATRIX;
EM: <ARRAY IDENTIFIER>;
"ARRAY" EM[0:5];
ENTRY: EM[0], THE MACHINE PRECISION;
EM[1], A NORM OF THE GIVEN MATRIX;
EM[2], THE RELATIVE TOLERANCE USED FOR THE QR
ITERATION;
IF THE ABSOLUTE VALUE OF SOME SUBDIAGONAL
ELEMENT IS SMALLER THAN EM[1] * EM[2], THEN
THIS ELEMENT IS NEGLECTED AND THE MATRIX IS
PARTITIONED;
EM[4], THE MAXIMUM ALLOWED NUMBER OF ITERATIONS;
FOR THE CD CYBER 73-28 SUITABLE VALUES OF THE
DATA TO BE GIVEN IN EM ARE:
EM[0] = "-14,
EM[2] > EM[0] (E.G. EM[2] = "-13),
EM[4] = 10 * N;
EXIT: EM[3], THE MAXIMUM ABSOLUTE VALUE OF THE SUBDIAGONAL
ELEMENTS NEGLECTED;
EM[5], THE NUMBER OF QR ITERATIONS PERFORMED;
IF THE ITERATION PROCESS IS NOT COMPLETED
WITHIN EM[4] ITERATIONS, THE VALUE EM[4] + 1
IS DELIVERED AND IN THIS CASE ONLY THE LAST
N - K ELEMENTS OF VAL ARE APPROXIMATE EIGEN-
VALUES OF THE GIVEN MATRIX, WHERE K IS
DELIVERED IN REAVALQRI;
VAL: <ARRAY IDENTIFIER>;
"ARRAY" VAL[1:N];
THE EIGENVALUES OF THE GIVEN MATRIX ARE DELIVERED IN VAL.
MOREOVER:
REAVALQRI DELIVERS 0, PROVIDED THAT THE PROCESS IS COMPLETED WITHIN
EM[4] ITERATIONS; OTHERWISE REAVALQRI DELIVERS THE NUMBER OF EIGEN-
VALUES NOT CALCULATED.
1SECTION : 3.3.1.2.1 (JULY 1974) PAGE 3
PROCEDURES USED:
ROTCOL = CP34040,
ROTROW = CP34041.
RUNNING TIME: ROUGHLY PROPORTIONAL TO N CUBED.
LANGUAGE: ALGOL 60.
METHOD AND PERFORMANCE:
THE METHOD USED IN THE PROCEDURE REAVALQRI IS THE SINGLE QR
ITERATION OF FRANCIS (SEE REF[1], P. 54, REF[2] P. 515 - 543 AND
REF[3]). THE EIGENVALUES OF A REAL UPPER-HESSENBERG MATRIX ARE
CALCULATED, PROVIDED THAT THE MATRIX HAS REAL EIGENVALUES ONLY.
REFERENCES:
[1]. T.J. DEKKER AND W. HOFFMANN.
ALGOL 60 PROCEDURES IN NUMERICAL ALGEBRA, PART 2.
MC TRACT 23, 1968, MATH. CENTR., AMSTERDAM.
[2]. J.H. WILKINSON.
THE ALGEBRAIC EIGENVALUE PROBLEM.
CLARENDON PRESS, OXFORD, 1965.
[3]. J.G. FRANCIS.
THE QR TRANSFORMATION, PARTS 1 AND 2.
COMP. J. 4 (1961), 265 - 271 AND 332 - 345.
EXAMPLE OF USE:
THE PROCEDURE REAVALQRI IS USED IN REAEIGVAL, SECTION 3.3.1.2.2.
1SECTION : 3.3.1.2.1 (JULY 1974) PAGE 4
SUBSECTION: REAVECHES.
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE IS:
"PROCEDURE" REAVECHES(A, N, LAMBDA, EM, V); "VALUE" N, LAMBDA;
"INTEGER" N; "REAL" LAMBDA; "ARRAY" A, EM, V;
"CODE" 34181;
THE MEANING OF THE FORMAL PARAMETERS IS:
A: <ARRAY IDENTIFIER>;
"ARRAY" A[1:N,1:N];
ENTRY: THE ELEMENTS OF THE REAL UPPER-HESSENBERG MATRIX
MUST BE GIVEN IN THE UPPER TRIANGLE AND THE FIRST
SUBDIAGONAL OF ARRAY A;
EXIT: THE HESSENBERG PART OF ARRAY A IS ALTERED;
N: <ARITHMETIC EXPRESSION>;
THE ORDER OF THE GIVEN MATRIX;
LAMBDA: <ARITHMETIC EXPRESSION>;
THE GIVEN REAL EIGENVALUE OF THE UPPER-HESSENBERG MATRIX;
EM: <ARRAY IDENTIFIER>;
"ARRAY" EM[0:9];
ENTRY: EM[0], THE MACHINE PRECISION;
EM[1], A NORM OF THE GIVEN MATRIX;
EM[6], THE TOLERANCE USED FOR THE EIGENVECTOR; THE
INVERSE ITERATION ENDS IF THE EUCLIDIAN
NORM OF THE RESIDUE VECTOR IS SMALLER THAN
EM[1] * EM[6];
EM[8], THE MAXIMUM ALLOWED NUMBER OF ITERATIONS;
FOR THE CD CYBER 73-28 SUITABLE VALUES OF THE
DATA TO BE GIVEN IN EM ARE:
EM[0] = "-14,
EM[6] = "-10,
EM[8] = 5;
EXIT: EM[7], THE EUCLIDIAN NORM OF THE RESIDUE VECTOR OF
THE CALCULATED EIGENVECTOR;
EM[9], THE NUMBER OF INVERSE ITERATIONS PERFORMED;
IF EM[7] REMAINS LARGER THAN EM[1] * EM[6]
DURING EM[8] ITERATIONS, THE VALUE EM[8] + 1
IS DELIVERED;
V: <ARRAY IDENTIFIER>;
"ARRAY" V[1:N];
THE CALCULATED EIGENVECTOR IS DELIVERED IN V.
1SECTION : 3.3.1.2.1 (JULY 1974) PAGE 5
PROCEDURES USED:
VECVEC = CP34010,
MATVEC = CP34011.
RUNNING TIME: ROUGHLY PROPORTIONAL TO N SQUARED.
LANGUAGE: ALGOL 60.
METHOD AND PERFORMANCE:
THE PROCEDURE REAVECHES CALCULATES AN EIGENVECTOR CORRESPONDING TO
A GIVEN APPROXIMATE REAL EIGENVALUE OF A REAL UPPER-HESSENBERG
MATRIX, BY MEANS OF INVERSE ITERATION (SEE REF[1], P. 55, REF[2],
P. 619 - 629 AND REF[3]).
REFERENCES:
[1]. T.J. DEKKER AND W. HOFFMANN.
ALGOL 60 PROCEDURES IN NUMERICAL ALGEBRA, PART 2.
MC TRACT 23, 1968, MATH. CENTR., AMSTERDAM.
[2]. J.H. WILKINSON.
THE ALGEBRAIC EIGENVALUE PROBLEM.
CLARENDON PRESS, OXFORD, 1965.
[3]. J.M. VARAH.
EIGENVECTORS OF A REAL MATRIX BY INVERSE ITERATION.
STANFORD UNIVERSITY, TECH. REP. NO. CS 34, 1966.
EXAMPLE OF USE:
THE PROCEDURE REAVECHES IS USED IN REAEIG1, SECTION 3.3.1.2.2.
1SECTION : 3.3.1.2.1 (JULY 1974) PAGE 6
SUBSECTION: REAQRI.
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE IS:
"INTEGER" "PROCEDURE" REAQRI(A, N, EM, VAL, VEC); "VALUE" N;
"INTEGER" N; "ARRAY" A, EM, VAL, VEC;
"CODE" 34186;
THE MEANING OF THE FORMAL PARAMETERS IS:
A: <ARRAY IDENTIFIER>;
"ARRAY" A[1:N,1:N];
ENTRY: THE ELEMENTS OF THE REAL UPPER-HESSENBERG MATRIX
MUST BE GIVEN IN THE UPPER TRIANGLE AND THE FIRST
SUBDIAGONAL OF ARRAY A;
EXIT: THE HESSENBERG PART OF ARRAY A IS ALTERED;
N: <ARITHMETIC EXPRESSION>;
THE ORDER OF THE GIVEN MATRIX;
EM: <ARRAY IDENTIFIER>;
"ARRAY" EM[0:5];
ENTRY: EM[0], THE MACHINE PRECISION;
EM[1], A NORM OF THE GIVEN MATRIX;
EM[2], THE RELATIVE TOLERANCE USED FOR THE QR
ITERATION;
IF THE ABSOLUTE VALUE OF SOME SUBDIAGONAL
ELEMENT IS SMALLER THAN EM[1] * EM[2], THEN
THIS ELEMENT IS NEGLECTED AND THE MATRIX IS
PARTITIONED;
EM[4], THE MAXIMUM ALLOWED NUMBER OF ITERATIONS;
FOR THE CD CYBER 73-28 SUITABLE VALUES OF THE
DATA TO BE GIVEN IN EM ARE:
EM[0] = "-14,
EM[2] > EM[0] (E.G. EM[2] = "-13),
EM[4] = 10 * N;
EXIT: EM[3], THE MAXIMUM ABSOLUTE VALUE OF THE SUBDIAGONAL
ELEMENTS NEGLECTED;
EM[5], THE NUMBER OF QR ITERATIONS PERFORMED;
IF THE ITERATION PROCESS IS NOT COMPLETED
WITHIN EM[4] ITERATIONS, THE VALUE EM[4] + 1
IS DELIVERED; IN THIS CASE ONLY THE LAST
N - K ELEMENTS OF VAL AND THE LAST N - K
COLUMNS OF VEC ARE APPROXIMATED EIGENVALUES
AND EIGENVECTORS OF THE GIVEN MATRIX, WHERE K
IS DELIVERED IN REAQRI;
VAL: <ARRAY IDENTIFIER>;
"ARRAY" VAL[1:N];
THE EIGENVALUES OF THE GIVEN MATRIX ARE DELIVERED IN VAL;
VEC: <ARRAY IDENTIFIER>;
"ARRAY" VEC[1:N,1:N];
THE CALCULATED EIGENVECTORS, CORRESPONDING TO THE EIGEN-
VALUES IN ARRAY VAL[1:N], ARE DELIVERED IN THE COLUMNS OF
ARRAY VEC.
1SECTION : 3.3.1.2.1 (JULY 1974) PAGE 7
MOREOVER:
REAQRI DELIVERS 0, PROVIDED THAT THE PROCESS IS COMPLETED WITHIN
EM[4] ITERATIONS; OTHERWISE REAQRI DELIVERS THE NUMBER OF EIGEN-
VALUES AND EIGENVECTORS NOT CALCULATED.
PROCEDURES USED:
MATVEC = CP34011,
ROTCOL = CP34040,
ROTROW = CP34041.
RUNNING TIME: ROUGHLY PROPORTIONAL TO N CUBED.
LANGUAGE: ALGOL 60.
METHOD AND PERFORMANCE:
THE PROCEDURE REAQRI CALCULATES THE EIGENVALUES OF AN UPPER-
HESSENBERG MATRIX BY MEANS OF SINGLE QR ITERATION (SEE METHOD
AND PERFORMANCE OF REAVALQRI, THIS SECTION).
THE EIGENVECTORS ARE CALCULATED BY A DIRECT METHOD (SEE REF[1],
P. 55-56), IN CONTRAST WITH REAVECHES WHICH USES INVERSE ITERATION.
IF THE HESSENBERG MATRIX IS NOT TOO ILL-CONDITIONED WITH RESPECT
TO ITS EIGENVALUE PROBLEM, THEN THIS METHOD YIELDS NUMERICALLY
INDEPENDENT EIGENVECTORS AND IS COMPETITIVE WITH INVERSE ITERATION
AS TO ACCURACY AND COMPUTATION TIME.
IF THE QR ITERATION PROCESS IS NOT COMPLETED WITHIN THE GIVEN
NUMBER OF ITERATIONS, NOT ALL EIGENVALUES AND EIGENVECTORS ARE
DELIVERED.
THE PROCEDURE REAQRI SHOULD BE USED ONLY IF ALL EIGENVALUES ARE
REAL.
REFERENCES:
[1]. T.J. DEKKER AND W. HOFFMANN.
ALGOL 60 PROCEDURES IN NUMERICAL ALGEBRA, PART 2.
MC TRACT 23, 1968, MATH. CENTR., AMSTERDAM.
EXAMPLE OF USE:
THE PROCEDURE REAQRI IS USED IN REAEIG3, SECTION 3.3.1.2.2.
1SECTION : 3.3.1.2.1 (JULY 1974) PAGE 8
SUBSECTION: COMVALQRI.
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE IS:
"INTEGER" "PROCEDURE" COMVALQRI(A, N, EM, RE, IM); "VALUE" N;
"INTEGER" N; "ARRAY" A, EM, RE, IM;
"CODE" 34190;
THE MEANING OF THE FORMAL PARAMETERS IS:
A: <ARRAY IDENTIFIER>;
"ARRAY" A[1:N,1:N];
ENTRY: THE ELEMENTS OF THE REAL UPPER-HESSENBERG MATRIX
MUST BE GIVEN IN THE UPPER TRIANGLE AND THE FIRST
SUBDIAGONAL OF ARRAY A;
EXIT: THE HESSENBERG PART OF ARRAY A IS ALTERED;
N: <ARITHMETIC EXPRESSION>;
THE ORDER OF THE GIVEN MATRIX;
EM: <ARRAY IDENTIFIER>;
"ARRAY" EM[0:5];
ENTRY: EM[0], THE MACHINE PRECISION;
EM[1], A NORM OF THE GIVEN MATRIX;
EM[2], THE RELATIVE TOLERANCE USED FOR THE QR
ITERATION;
IF THE ABSOLUTE VALUE OF SOME SUBDIAGONAL
ELEMENT IS SMALLER THAN EM[1] * EM[2], THEN
THIS ELEMENT IS NEGLECTED AND THE MATRIX IS
PARTITIONED;
EM[4], THE MAXIMUM ALLOWED NUMBER OF ITERATIONS;
FOR THE CD CYBER 73-28 SUITABLE VALUES OF THE
DATA TO BE GIVEN IN EM ARE:
EM[0] = "-14,
EM[2] > EM[0] (E.G. EM[2] = "-13),
EM[4] = 10 * N;
EXIT: EM[3], THE MAXIMUM ABSOLUTE VALUE OF THE SUBDIAGONAL
ELEMENTS NEGLECTED;
EM[5], THE NUMBER OF QR ITERATIONS PERFORMED;
IF THE ITERATION PROCESS IS NOT COMPLETED
WITHIN EM[4] ITERATIONS, THE VALUE EM[4] + 1
IS DELIVERED AND IN THIS CASE ONLY THE LAST
N - K ELEMENTS OF RE AND IM ARE APPROXIMATE
EIGENVALUES OF THE GIVEN MATRIX, WHERE K IS
DELIVERED IN COMVALQRI;
RE,IM: <ARRAY IDENTIFIER>;
"ARRAY" RE, IM[1:N];
THE REAL AND IMAGINARY PARTS OF THE CALCULATED EIGENVALUES
OF THE GIVEN MATRIX ARE DELIVERED IN ARRAY RE, IM[1:N], THE
MEMBERS OF EACH NONREAL COMPLEX CONJUGATE PAIR BEING
CONSECUTIVE.
MOREOVER:
COMVALQRI DELIVERS 0, PROVIDED THAT THE PROCESS IS COMPLETED WITHIN
EM[4] ITERATIONS; OTHERWISE COMVALQRI DELIVERS THE NUMBER OF EIGEN-
VALUES NOT CALCULATED.
1SECTION : 3.3.1.2.1 (JULY 1974) PAGE 9
PROCEDURES USED: NONE.
RUNNING TIME: ROUGHLY PROPORTIONAL TO N CUBED.
LANGUAGE: ALGOL 60.
METHOD AND PERFORMANCE:
THE METHOD USED IN THE PROCEDURE COMVALQRI FOR CALCULATING THE REAL
AND COMPLEX EIGENVALUES OF A REAL UPPER-HESSENBERG MATRIX IS THE
DOUBLE QR ITERATION OF FRANCIS (SEE REF[1], P. 74, REF[2]
P. 528 - 537 AND REF[3]).
REFERENCES:
[1]. T.J. DEKKER AND W. HOFFMANN.
ALGOL 60 PROCEDURES IN NUMERICAL ALGEBRA, PART 2.
MC TRACT 23, 1968, MATH. CENTR., AMSTERDAM.
[2]. J.H. WILKINSON.
THE ALGEBRAIC EIGENVALUE PROBLEM.
CLARENDON PRESS, OXFORD, 1965.
[3]. J.G. FRANCIS.
THE QR TRANSFORMATION, PARTS 1 AND 2.
COMP. J. 4 (1961), 265 - 271 AND 332 - 345.
EXAMPLE OF USE:
THE COMPLEX EIGENVALUES AND -VECTORS OF H, WITH N = 4 AND H[I,J] =
"IF" I = 1 "THEN" -1 "ELSE" "IF" I - J = 1 "THEN" 1 "ELSE" 0, MAY
BE OBTAINED BY THE FOLLOWING PROGRAM:
"BEGIN" "INTEGER" I, J, M;
"ARRAY" A[1:4,1:4], RE, IM[1:4], EM[0:9];
EM[0]:= "-14; EM[2]:= "-13; EM[1]:= 4; EM[4]:= 40;
EM[6]:= "-10; EM[8]:= 5;
"FOR" I:= 1, 2, 3, 4 "DO" "FOR" J:= 1, 2, 3, 4 "DO" A[I,J]:=
"IF" I = 1 "THEN" -1 "ELSE" "IF" I - J = 1 "THEN" 1 "ELSE" 0;
M:= COMVALQRI(A, 4, EM, RE, IM); OUTPUT(61, "("D, /")", M);
1SECTION : 3.3.1.2.1 (JULY 1974) PAGE 9
"FOR" J:= M + 1 "STEP" 1 "UNTIL" 4 "DO"
"BEGIN" "INTEGER" K; "ARRAY" U, V[1:4];
"FOR" I:= 1, 2, 3, 4 "DO" "FOR" K:= 1, 2, 3, 4 "DO"
A[I,K]:= "IF" I = 1 "THEN" -1 "ELSE"
"IF" I - K = 1 "THEN" 1 "ELSE" 0;
COMVECHES(A, 4, RE[J], IM[J], EM, U, V);
OUTPUT(61, "("/, 2(+.13D"+2D, 2B), 2/")", RE[J], IM[J]);
"FOR" I:= 1, 2, 3, 4 "DO"
OUTPUT(61, "("21B, 2(+.13D"+2D, 2B), /")", U[I], V[I])
"END";
OUTPUT(61, "("/, 2(.2D"+2D, /), 2(ZD, /)")",
EM[3], EM[7], EM[5], EM[9])
"END"
THE PROGRAM DELIVERS (THE RESULTS ARE CORRECT UP TO TWELVE DIGITS):
THE NUMBER OF NOT CALCULATED EIGENVALUES: 0
THE EIGENVALUES AND -VECTORS:
+.3090169943750"+00 +.9510565162952"+00
-.2527643931136"+00 -.4314048696688"+00
-.4883989055049"+00 +.1070817869743"+00
-.4908273055667"-01 +.4975850535950"+00
+.4580641097602"+00 +.2004426884413"+00
+.3090169943750"+00 -.9510565162952"+00
-.2527643931136"+00 +.4314048696688"+00
-.4883989055049"+00 -.1070817869743"+00
-.4908273055667"-01 -.4975850535950"+00
+.4580641097602"+00 -.2004426884413"+00
-.8090169943749"+00 +.5877852522924"+00
+.1095191711534"+00 -.4878581260468"+00
-.3753586823743"+00 +.3303117611685"+00
+.4978239349006"+00 -.4659753040772"-01
-.4301373647081"+00 -.2549153731770"+00
-.8090169943749"+00 -.5877852522924"+00
+.1095191711534"+00 +.4878581260468"+00
-.3753586823743"+00 -.3303117611685"+00
+.4978239349006"+00 +.4659753040772"-01
-.4301373647081"+00 +.2549153731770"+00
THE ARRAY EM: EM[3] = .67"-22
EM[7] = .17"-13
EM[5] = 9
EM[9] = 1 .
1SECTION : 3.3.1.2.1 (JULY 1974) PAGE 11
SUBSECTION: COMVECHES.
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE IS:
"PROCEDURE" COMVECHES(A, N, LAMBDA, MU, EM, U, V);
"VALUE" N, LAMBDA, MU;
"INTEGER" N; "REAL" LAMBDA, MU; "ARRAY" A, EM, U, V;
"CODE" 34191;
THE MEANING OF THE FORMAL PARAMETERS IS:
A: <ARRAY IDENTIFIER>;
"ARRAY" A[1:N,1:N];
ENTRY: THE ELEMENTS OF THE REAL UPPER-HESSENBERG MATRIX
MUST BE GIVEN IN THE UPPER TRIANGLE AND THE FIRST
SUBDIAGONAL OF ARRAY A;
EXIT: THE HESSENBERG PART OF ARRAY A IS ALTERED;
N: <ARITHMETIC EXPRESSION>;
THE ORDER OF THE GIVEN MATRIX;
LAMBDA, MU:
<ARITHMETIC EXPRESSION>;
THE REAL AND IMAGINARY PART OF THE GIVEN EIGENVALUE;
EM: <ARRAY IDENTIFIER>;
"ARRAY" EM[0:9];
ENTRY: EM[0], THE MACHINE PRECISION;
EM[1], A NORM OF THE GIVEN MATRIX;
EM[6], THE TOLERANCE USED FOR THE EIGENVECTOR; THE
INVERSE ITERATION ENDS IF THE EUCLIDIAN
NORM OF THE RESIDUE VECTOR IS SMALLER THAN
EM[1] * EM[6];
EM[8], THE MAXIMUM ALLOWED NUMBER OF ITERATIONS;
FOR THE CD CYBER 73-28 SUITABLE VALUES OF THE
DATA TO BE GIVEN IN EM ARE:
EM[0] = "-14,
EM[6] = "-10,
EM[8] = 5;
EXIT: EM[7], THE EUCLIDIAN NORM OF THE RESIDUE VECTOR OF
THE CALCULATED EIGENVECTOR;
EM[9], THE NUMBER OF INVERSE ITERATIONS PERFORMED;
IF EM[7] REMAINS LARGER THAN EM[1] * EM[6]
DURING EM[8] ITERATIONS, THE VALUE EM[8] + 1
IS DELIVERED;
U, V: <ARRAY IDENTIFIER>;
"ARRAY" U, V[1:N];
THE REAL AND IMAGINARY PARTS OF THE CALCULATED EIGENVECTOR
ARE DELIVERED IN THE ARRAYS U, V[1:N].
1SECTION : 3.3.1.2.1 (JULY 1974) PAGE 12
PROCEDURES USED:
VECVEC = CP34010,
MATVEC = CP34011,
TAMVEC = CP34012.
RUNNING TIME: ROUGHLY PROPORTIONAL TO N SQUARED.
LANGUAGE: ALGOL 60.
METHOD AND PERFORMANCE:
THE PROCEDURE COMVECHES CALCULATES AN EIGENVECTOR CORRESPONDING TO
A GIVEN APPROXIMATE EIGENVALUE OF A REAL UPPER-HESSENBERG MATRIX,
BY MEANS OF INVERSE ITERATION (SEE REF[1], P. 75, REF[2],
P. 629 - 633 AND REF[3]).
REFERENCES:
[1]. T.J. DEKKER AND W. HOFFMANN.
ALGOL 60 PROCEDURES IN NUMERICAL ALGEBRA, PART 2.
MC TRACT 23, 1968, MATH. CENTR., AMSTERDAM.
[2]. J.H. WILKINSON.
THE ALGEBRAIC EIGENVALUE PROBLEM.
CLARENDON PRESS, OXFORD, 1965.
[3]. J.M. VARAH.
EIGENVECTORS OF A REAL MATRIX BY INVERSE ITERATION.
STANFORD UNIVERSITY, TECH. REP. NO. CS 34, 1966.
EXAMPLE OF USE:
SEE EXAMPLE OF USE OF COMVALQRI, THIS SECTION.
SOURCE TEXT(S) :
0"CODE" 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;
"COMMENT"
1SECTION : 3.3.1.2.1 (JULY 1974) PAGE 13
;
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
1SECTION : 3.3.1.2.1 (JULY 1974) PAGE 14
;
"EOP"
0"CODE" 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];
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
1SECTION : 3.3.1.2.1 (JULY 1974) PAGE 15
;
"EOP"
0"CODE" 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];
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"
1SECTION : 3.3.1.2.1 (JULY 1974) PAGE 16
"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
1SECTION : 3.3.1.2.1 (JULY 1974) PAGE 17
;
"EOP"
0"CODE" 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;
"COMMENT"
1SECTION : 3.3.1.2.1 (JULY 1974) PAGE 18
;
"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
1SECTION : 3.3.1.2.1 (JULY 1974) PAGE 19
;
"EOP"
0"CODE" 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];
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"
1SECTION : 3.3.1.2.1 (JULY 1974) PAGE 20
;
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;
"EOP"
1SECTION 3.3.1.2.2 (JULY 1974) PAGE 1
AUTHORS : T.J. DEKKER, W. HOFFMANN.
CONTRIBUTORS: W. HOFFMANN, S.P.N. VAN KAMPEN, J.G. VERWER.
INSTITUTE: MATHEMATICAL CENTRE.
RECEIVED: 731205.
BRIEF DESCRIPTION:
THIS SECTION CONTAINS FIVE PROCEDURES FOR CALCULATING EIGENVALUES
AND / OR EIGENVECTORS OF REAL MATRICES:
A) REAEIGVAL CALCULATES THE EIGENVALUES OF A MATRIX, PROVIDED THAT
ALL EIGENVALUES ARE REAL,
B) REAEIG1 CALCULATES THE EIGENVALUES, PROVIDED THAT THEY ARE ALL
REAL, AND THE EIGENVECTORS OF A MATRIX,
C) REAEIG3 CALCULATES THE EIGENVALUES, PROVIDED THAT THEY ARE ALL
REAL, AND THE EIGENVECTORS OF A MATRIX,
D) COMEIGVAL CALCULATES THE EIGENVALUES OF A MATRIX,
E) COMEIG1 CALCULATES THE EIGENVALUES AND EIGENVECTORS OF A MATRIX.
KEYWORDS:
EIGENVALUES,
EIGENVECTORS.
1SECTION 3.3.1.2.2 (JULY 1974) PAGE 2
SUBSECTION: REAEIGVAL.
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE IS:
"INTEGER" "PROCEDURE" REAEIGVAL(A, N, EM, VAL); "VALUE" N;
"INTEGER" N; "ARRAY" A, EM, VAL;
"CODE" 34182;
THE MEANING OF THE FORMAL PARAMETERS IS:
A: <ARRAY IDENTIFIER>;
"ARRAY" A[1:N,1:N];
ENTRY: THE MATRIX WHOSE EIGENVALUES ARE TO BE CALCULATED;
EXIT: THE ARRAY ELEMENTS ARE ALTERED;
N: <ARITHMETIC EXPRESSION>;
THE ORDER OF THE GIVEN MATRIX;
EM: <ARRAY IDENTIFIER>;
"ARRAY" EM[0:5];
ENTRY: EM[0], THE MACHINE PRECISION;
EM[2], THE RELATIVE TOLERANCE USED FOR THE QR
ITERATION;
EM[4], THE MAXIMUM ALLOWED NUMBER OF ITERATIONS;
FOR THE CD CYBER 73-28 SUITABLE VALUES OF THE
DATA TO BE GIVEN IN EM ARE:
EM[0] = "-14,
EM[2] > EM[0] (E.G. EM[2] = "-13),
EM[4] = 10 * N;
EXIT: EM[1], THE INFINITY NORM OF THE EQUILIBRATED MATRIX;
EM[3], THE MAXIMUM ABSOLUTE VALUE OF THE SUBDIAGONAL
ELEMENTS NEGLECTED;
EM[5], THE NUMBER OF QR ITERATIONS PERFORMED;
IF THE ITERATION PROCESS IS NOT COMPLETED
WITHIN EM[4] ITERATIONS, THE VALUE EM[4] + 1
IS DELIVERED AND IN THIS CASE ONLY THE LAST
N - K ELEMENTS OF VAL ARE APPROXIMATE EIGEN-
VALUES OF THE GIVEN MATRIX, WHERE K IS
DELIVERED IN REAEIGVAL;
VAL: <ARRAY IDENTIFIER>;
"ARRAY" VAL[1:N];
EXIT: THE EIGENVALUES OF THE GIVEN MATRIX ARE DELIVERED
IN MONOTONICALLY NONINCREASING ORDER;
MOREOVER:
REAEIGVAL DELIVERS 0, PROVIDED THAT THE PROCESS IS COMPLETED WITHIN
EM[4] ITERATIONS; OTHERWISE REAEIGVAL DELIVERS K, THE NUMBER OF
EIGENVALUES NOT CALCULATED.
1SECTION 3.3.1.2.2 (JULY 1974) PAGE 3
PROCEDURES USED:
EQILBR = CP34173,
TFMREAHES = CP34170,
REAVALQRI = CP34180.
REQUIRED CENTRAL MEMORY:
EXECUTION FIELD LENGTH: 3N.
RUNNING TIME: ROUGHLY PROPORTIONAL TO N CUBED.
LANGUAGE: ALGOL 60.
METHOD AND PERFORMANCE:
THE GIVEN MATRIX IS EQUILIBRATED BY CALLING EQILBR (SEE SECTION
3.2.1.1.1) AND TRANSFORMED TO A SIMILAR UPPER-HESSENBERG MATRIX
BY CALLING TFMREAHES (SEE SECTION 3.2.1.2.1.2). THE EIGENVALUES
ARE THEN CALCULATED BY CALLING REAVALQRI, WHICH USES SINGLE QR
ITERATION (SEE SECTION 3.3.1.2.1).
THE PROCEDURE REAEIGVAL SHOULD BE USED ONLY IF ALL EIGENVALUES ARE
REAL.
FOR FURTHER DETAILS SEE REFERENCES [1], [2] AND [3].
SUBSECTION: REAEIG1.
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE IS:
"INTEGER" "PROCEDURE" REAEIG1(A, N, EM, VAL, VEC); "VALUE" N;
"INTEGER" N; "ARRAY" A, EM, VAL, VEC;
"CODE" 34184;
THE MEANING OF THE FORMAL PARAMETERS IS:
A: <ARRAY IDENTIFIER>;
"ARRAY" A[1:N,1:N];
ENTRY: THE MATRIX WHOSE EIGENVALUES AND EIGENVECTORS ARE TO
BE CALCULATED;
EXIT: THE ARRAY ELEMENTS ARE ALTERED;
N: <ARITHMETIC EXPRESSION>;
THE ORDER OF THE GIVEN MATRIX;
1SECTION 3.3.1.2.2 (JULY 1974) PAGE 4
EM: <ARRAY IDENTIFIER>;
"ARRAY" EM[0:9];
ENTRY: EM[0], THE MACHINE PRECISION;
EM[2], THE RELATIVE TOLERANCE USED FOR THE QR
ITERATION;
EM[4], THE MAXIMUM ALLOWED NUMBER OF QR
ITERATIONS;
EM[6], THE TOLERANCE USED FOR THE EIGENVECTORS;
FOR EACH EIGENVECTOR THE INVERSE ITERATION
ENDS IF THE EUCLIDEAN NORM OF THE RESIDUE
VECTOR IS SMALLER THAN EM[1] * EM[6];
EM[8], THE MAXIMUM ALLOWED NUMBER OF INVERSE
ITERATIONS FOR THE CALCULATION OF EACH
EIGENVECTOR;
FOR THE CD CYBER 73-28 SUITABLE VALUES OF THE
DATA TO BE GIVEN IN EM ARE:
EM[0] = "-14,
EM[2] > EM[0] (E.G. EM[2] = "-13),
EM[4] = 10 * N,
EM[6] > EM[2] (E.G. EM[6] = "-10),
EM[8] = 5;
EXIT: EM[1], THE INFINITY NORM OF THE EQUILIBRATED MATRIX;
EM[3], THE MAXIMUM ABSOLUTE VALUE OF THE SUBDIAGONAL
ELEMENTS NEGLECTED;
EM[5], THE NUMBER OF QR ITERATIONS PERFORMED;
IF THE ITERATION PROCESS IS NOT COMPLETED
WITHIN EM[4] ITERATIONS, THE VALUE EM[4] + 1
IS DELIVERED AND IN THIS CASE ONLY THE LAST
N - K ELEMENTS OF VAL AND COLUMNS OF VEC ARE
APPROXIMATE EIGENVALUES AND EIGENVECTORS OF
THE GIVEN MATRIX, WHERE K IS DELIVERED IN
REAEIG1;
EM[7], THE MAXIMUM EUCLIDIAN NORM OF THE RESIDUES
OF THE CALCULATED EIGENVECTORS (OF THE TRANS-
FORMED MATRIX);
EM[9], THE LARGEST NUMBER OF INVERSE ITERATIONS
PERFORMED FOR THE CALCULATION OF SOME EIGEN-
VECTOR; IF, FOR SOME EIGENVECTOR THE
EUCLIDEAN NORM OF THE RESIDUE REMAINS
LARGER THAN EM[1] * EM[6], THE VALUE
EM[8] + 1 IS DELIVERED; NEVERTHELESS THE
EIGENVECTORS MAY THEN VERY WELL BE USEFUL,
THIS SHOULD BE JUDGED FROM THE VALUE
DELIVERED IN EM[7] OR FROM SOME OTHER TEST;
VAL: <ARRAY IDENTIFIER>;
"ARRAY" VAL[1:N];
EXIT: THE EIGENVALUES OF THE GIVEN MATRIX ARE DELIVERED
IN MONOTONICALLY DECREASING ORDER;
VEC: <ARRAY IDENTIFIER>;
"ARRAY" VEC[1:N,1:N];
EXIT: THE CALCULATED EIGENVECTORS, CORRESPONDING TO THE
EIGENVALUES IN ARRAY VAL[1:N], ARE DELIVERED IN THE
COLUMNS OF ARRAY VEC;
1SECTION 3.3.1.2.2 (JULY 1974) PAGE 5
MOREOVER:
REAEIG1 DELIVERS 0, PROVIDED THAT THE PROCESS IS COMPLETED WITHIN
EM[4] ITERATIONS; OTHERWISE REAEIG1 DELIVERS K, THE NUMBER OF
EIGENVALUES AND EIGENVECTORS NOT CALCULATED.
PROCEDURES USED:
EQILBR = CP34173,
TFMREAHES = CP34170,
BAKREAHES2 = CP34172,
BAKLBR = CP34174,
REAVALQRI = CP34180,
REAVECHES = CP34181,
REASCL = CP34183.
REQUIRED CENTRAL MEMORY:
EXECUTION FIELD LENGTH: N * N + 5N.
RUNNING TIME: ROUGHLY PROPORTIONAL TO N CUBED.
OPTIONS: F.
METHOD AND PERFORMANCE:
THE GIVEN MATRIX IS EQUILIBRATED BY CALLING EQILBR (SEE SECTION
3.2.1.1.1) AND TRANSFORMED TO A SIMILAR UPPER-HESSENBERG MATRIX
BY CALLING TFMREAHES (SEE SECTION 3.2.1.2.1.2). THE EIGENVALUES
ARE THEN CALCULATED BY CALLING REAVALQRI, WHICH USES SINGLE QR
ITERATION (SEE SECTION 3.3.1.2.1).
FURTHERMORE, TO FIND THE EIGENVECTORS WILKINSON'S DEVICE IS FIRST
APPLIED [2, P.328 AND 628]. SUBSEQUENTLY THE EIGENVECTORS OF THE
UPPER-HESSENBERG MATRIX ARE CALCULATED BY CALLING REAVECHES,
WHICH USES INVERSE ITERATION (SEE SECTION 3.3.1.2.1). THE
CALCULATED VECTORS ARE THEN BACK-TRANSFORMED TO THE CORRESPONDING
EIGENVECTORS OF THE GIVEN MATRIX BY CALLING BAKREAHES2 AND BAKLBR
(SEE SECTIONS 3.2.1.2.1.2 AND 3.2.1.1.1). FINALLY THE APPROXIMATE
EIGENVECTORS ARE NORMALIZED BY CALLING REASCL (SEE SECTION 1.1.9)
SUCH THAT, IN EACH EIGENVECTOR, AN ELEMENT OF MAXIMUM ABSOLUTE
VALUE EQUALS 1.
THE PROCEDURE REAEIG1 SHOULD BE USED ONLY IF ALL EIGENVALUES ARE
REAL.
FOR FURTHER DETAILS SEE THE GIVEN REFERENCES.
1SECTION 3.3.1.2.2 (JULY 1974) PAGE 6
SUBSECTION: REAEIG3.
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE IS:
"INTEGER" "PROCEDURE" REAEIG3(A, N, EM, VAL, VEC); "VALUE" N;
"INTEGER" N; "ARRAY" A, EM, VAL, VEC;
"CODE" 34187;
THE MEANING OF THE FORMAL PARAMETERS IS:
A: <ARRAY IDENTIFIER>;
"ARRAY" A[1:N,1:N];
ENTRY: THE MATRIX WHOSE EIGENVALUES AND EIGENVECTORS ARE TO
BE CALCULATED;
EXIT: THE ARRAY ELEMENTS ARE ALTERED;
N: <ARITHMETIC EXPRESSION>;
THE ORDER OF THE GIVEN MATRIX;
EM: <ARRAY IDENTIFIER>;
"ARRAY" EM[0:5];
ENTRY: EM[0], THE MACHINE PRECISION;
EM[2], THE RELATIVE TOLERANCE USED FOR THE QR
ITERATION;
EM[4], THE MAXIMUM ALLOWED NUMBER OF QR
ITERATIONS;
FOR THE CD CYBER 73-28 SUITABLE VALUES OF THE
DATA TO BE GIVEN IN EM ARE:
EM[0] = "-14,
EM[2] > EM[0] (E.G. EM[2] = "-13),
EM[4] = 10 * N;
EXIT: EM[1], THE INFINITY NORM OF THE EQUILIBRATED MATRIX;
EM[3], THE MAXIMUM ABSOLUTE VALUE OF THE SUBDIAGONAL
ELEMENTS NEGLECTED;
EM[5], THE NUMBER OF QR ITERATIONS PERFORMED;
IF THE ITERATION PROCESS IS NOT COMPLETED
WITHIN EM[4] ITERATIONS, THE VALUE EM[4] + 1
IS DELIVERED. IN THIS CASE ONLY THE LAST
N - K ELEMENTS OF VAL ARE APPROXIMATE
EIGENVALUES OF THE GIVEN MATRIX AND NO USEFUL
EIGENVECTORS ARE DELIVERED. THE VALUE K IS
DELIVERED IN REAEIG3;
VAL: <ARRAY IDENTIFIER>;
"ARRAY" VAL[1:N];
EXIT: THE EIGENVALUES OF THE GIVEN MATRIX ARE DELIVERED;
VEC: <ARRAY IDENTIFIER>;
"ARRAY" VEC[1:N,1:N];
EXIT: THE CALCULATED EIGENVECTORS, CORRESPONDING TO THE
EIGENVALUES IN ARRAY VAL[1:N], ARE DELIVERED IN THE
COLUMNS OF ARRAY VEC;
MOREOVER:
REAEIG3 DELIVERS 0, PROVIDED THAT THE PROCESS IS COMPLETED WITHIN
EM[4] ITERATIONS; OTHERWISE REAEIG3 DELIVERS K, THE NUMBER OF
EIGENVALUES NOT CALCULATED.
1SECTION 3.3.1.2.2 (JULY 1974) PAGE 7
PROCEDURES USED:
EQILBR = CP34173,
TFMREAHES = CP34170,
BAKREAHES2 = CP34172,
BAKLBR = CP34174,
REAQRI = CP34186,
REASCL = CP34183.
REQUIRED CENTRAL MEMORY:
EXECUTION FIELD LENGTH: 4N.
RUNNING TIME: ROUGHLY PROPORTIONAL TO N CUBED.
LANGUAGE: ALGOL 60.
METHOD AND PERFORMANCE:
THE GIVEN MATRIX IS EQUILIBRATED BY CALLING EQILBR (SEE SECTION
3.2.1.1.1) AND TRANSFORMED TO A SIMILAR UPPER-HESSENBERG MATRIX
BY CALLING TFMREAHES (SEE SECTION 3.2.1.2.1.2). THE EIGENVALUES
AND EIGENVECTORS OF THE UPPER-HESSENBERG MATRIX ARE THEN
CALCULATED BY CALLING REAQRI, WHICH USES SINGLE QR ITERATION
FOR THE EIGENVALUES AND A DIRECT METHOD FOR THE EIGENVECTORS (SEE
SECTION 3.3.1.2.1). FINALLY THE EIGENVECTORS OF THE UPPER-
HESSENBERG MATRIX ARE BACK-TRANSFORMED TO THE CORRESPONDING EIGEN-
VECTORS OF THE GIVEN MATRIX BY CALLING BAKREAHES2 (SEE SECTION
3.1.2.1.2.1) AND NORMALIZED BY CALLING REASCL (SEE SECTION 1.1.9)
SUCH THAT, IN EACH EIGENVECTOR, AN ELEMENT OF MAXIMUM ABSOLUTE
VALUE EQUALS 1.
THE PROCEDURE REAEIG3 SHOULD BE USED ONLY IF ALL EIGENVALUES ARE
REAL.
FOR FURTHER DETAILS SEE THE GIVEN REFERENCES.
1SECTION 3.3.1.2.2 (JULY 1974) PAGE 8
SUBSECTION: COMEIGVAL.
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE IS:
"INTEGER" "PROCEDURE" COMEIGVAL(A, N, EM, RE, IM); "VALUE" N;
"INTEGER" N; "ARRAY" A, EM, RE, IM;
"CODE" 34192;
THE MEANING OF THE FORMAL PARAMETERS IS:
A: <ARRAY IDENTIFIER>;
"ARRAY" A[1:N,1:N];
ENTRY: THE MATRIX WHOSE EIGENVALUES ARE TO BE CALCULATED;
EXIT: THE ARRAY ELEMENTS ARE ALTERED;
N: <ARITHMETIC EXPRESSION>;
THE ORDER OF THE GIVEN MATRIX;
EM: <ARRAY IDENTIFIER>;
"ARRAY" EM[0:5];
ENTRY: EM[0], THE MACHINE PRECISION;
EM[2], THE RELATIVE TOLERANCE USED FOR THE QR
ITERATION;
EM[4], THE MAXIMUM ALLOWED NUMBER OF ITERATIONS;
FOR THE CD CYBER 73-28 SUITABLE VALUES OF THE
DATA TO BE GIVEN IN EM ARE:
EM[0] = "-14,
EM[2] > EM[0] (E.G. EM[2] = "-13),
EM[4] = 10 * N;
EXIT: EM[1], THE INFINITY NORM OF THE EQUILIBRATED MATRIX;
EM[3], THE MAXIMUM ABSOLUTE VALUE OF THE SUBDIAGONAL
ELEMENTS NEGLECTED;
EM[5], THE NUMBER OF QR ITERATIONS PERFORMED;
IF THE ITERATION PROCESS IS NOT COMPLETED
WITHIN EM[4] ITERATIONS, THE VALUE EM[4] + 1
IS DELIVERED AND IN THIS CASE ONLY THE LAST
N - K ELEMENTS OF RE AND IM ARE APPROXIMATE
EIGENVALUES OF THE GIVEN MATRIX, WHERE K IS
DELIVERED IN COMEIGVAL;
RE,IM: <ARRAY IDENTIFIER>;
"ARRAY" RE, IM[1:N];
EXIT: THE REAL AND IMAGINARY PARTS OF THE CALCULATED
EIGENVALUES OF THE GIVEN MATRIX ARE DELIVERED IN
ARRAY RE, IM[1:N], THE MEMBERS OF EACH NONREAL
COMPLEX CONJUGATE PAIR BEING CONSECUTIVE;
MOREOVER:
COMEIGVAL DELIVERS 0, PROVIDED THAT THE PROCESS IS COMPLETED WITHIN
EM[4] ITERATIONS; OTHERWISE COMEIGVAL DELIVERS K, THE NUMBER OF
EIGENVALUES NOT CALCULATED.
PROCEDURES USED:
EQILBR = CP34173,
TFMREAHES = CP34170,
COMVALQRI = CP34190.
1SECTION 3.3.1.2.2 (JULY 1974) PAGE 9
REQUIRED CENTRAL MEMORY:
EXECUTION FIELD LENGTH: 3N.
RUNNING TIME: ROUGHLY PROPORTIONAL TO N CUBED.
LANGUAGE: ALGOL 60.
METHOD AND PERFORMANCE:
THE GIVEN MATRIX IS EQUILIBRATED BY CALLING EQILBR (SEE SECTION
3.2.1.1.1) AND TRANSFORMED TO A SIMILAR UPPER-HESSENBERG MATRIX
BY CALLING TFMREAHES (SEE SECTION 3.2.1.2.1.2). THE EIGENVALUES
ARE THEN CALCULATED BY CALLING COMVALQRI, WHICH USES DOUBLE QR
ITERATION (SEE SECTION 3.3.1.2.1).
FOR FURTHER DETAILS SEE REFERENCES [1], [2] AND [3].
SUBSECTION: COMEIG1.
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE IS:
"INTEGER" "PROCEDURE" COMEIG1(A, N, EM, RE, IM, VEC); "VALUE" N;
"INTEGER" N; "ARRAY" A, EM, RE, IM, VEC;
"CODE" 34194;
THE MEANING OF THE FORMAL PARAMETERS IS:
A: <ARRAY IDENTIFIER>;
"ARRAY" A[1:N,1:N];
ENTRY: THE MATRIX WHOSE EIGENVALUES AND EIGENVECTORS ARE TO
BE CALCULATED;
EXIT: THE ARRAY ELEMENTS ARE ALTERED;
N: <ARITHMETIC EXPRESSION>;
THE ORDER OF THE GIVEN MATRIX;
EM: <ARRAY IDENTIFIER>;
"ARRAY" EM[0:9];
ENTRY: EM[0], THE MACHINE PRECISION;
EM[2], THE RELATIVE TOLERANCE USED FOR THE QR
ITERATION;
EM[4], THE MAXIMUM ALLOWED NUMBER OF QR
ITERATIONS;
EM[6], THE TOLERANCE USED FOR THE EIGENVECTORS;
FOR EACH EIGENVECTOR THE INVERSE ITERATION
ENDS IF THE EUCLIDEAN NORM OF THE RESIDUE
VECTOR IS SMALLER THAN EM[1] * EM[6];
EM[8], THE MAXIMUM ALLOWED NUMBER OF INVERSE
ITERATIONS FOR THE CALCULATION OF EACH
EIGENVECTOR;
FOR THE CD CYBER 73-28 SUITABLE VALUES OF THE
DATA TO BE GIVEN IN EM ARE:
EM[0] = "-14,
EM[2] > EM[0] (E.G. EM[2] = "-13),
EM[4] = 10 * N,
EM[6] > EM[2] (E.G. EM[6] = "-10),
EM[8] = 5;
1SECTION 3.3.1.2.2 (JULY 1974) PAGE 10
EXIT: EM[1], THE INFINITY NORM OF THE EQUILIBRATED MATRIX;
EM[3], THE MAXIMUM ABSOLUTE VALUE OF THE SUBDIAGONAL
ELEMENTS NEGLECTED;
EM[5], THE NUMBER OF QR ITERATIONS PERFORMED;
IF THE ITERATION PROCESS IS NOT COMPLETED
WITHIN EM[4] ITERATIONS, THE VALUE EM[4] + 1
IS DELIVERED AND IN THIS CASE ONLY THE LAST
N - K ELEMENTS OF RE, IM AND COLUMNS OF VEC
ARE APPROXIMATE EIGENVALUES AND EIGENVECTORS
OF THE GIVEN MATRIX, WHERE K IS DELIVERED IN
COMEIG1;
EM[7], THE MAXIMUM EUCLIDIAN NORM OF THE RESIDUES
OF THE CALCULATED EIGENVECTORS (OF THE TRANS-
FORMED MATRIX);
EM[9], THE LARGEST NUMBER OF INVERSE ITERATIONS
PERFORMED FOR THE CALCULATION OF SOME EIGEN-
VECTOR; IF THE EUCLIDIAN NORM OF THE
RESIDUE FOR ONE OR MORE EIGENVECTORS REMAINS
LARGER THAN EM[1] * EM[6], THE VALUE EM[8]+1
IS DELIVERED; NEVERTHELESS THE EIGENVECTORS
MAY THEN VERY WELL BE USEFUL, THIS SHOULD BE
JUDGED FROM THE VALUE DELIVERED IN EM[7] OR
FROM SOME OTHER TEST;
RE,IM: <ARRAY IDENTIFIER>;
"ARRAY" RE, IM[1:N];
EXIT: THE REAL AND IMAGINARY PARTS OF THE CALCULATED
EIGENVALUES OF THE GIVEN MATRIX ARE DELIVERED IN
ARRAY RE, IM[1:N], THE MEMBERS OF EACH NONREAL
COMPLEX CONJUGATE PAIR BEING CONSECUTIVE;
VEC: <ARRAY IDENTFIER>;
"ARRAY" VEC[1:N,1:N];
EXIT: THE CALCULATED EIGENVECTORS ARE DELIVERED IN THE
COLUMNS OF ARRAY VEC;
AN EIGENVECTOR, CORRESPONDING TO A REAL EIGENVALUE
GIVEN IN ARRAY RE, IS DELIVERED IN THE CORRESPONDING
COLUMN OF ARRAY VEC;
THE REAL AND IMAGINARY PART OF AN EIGENVECTOR,
CORRESPONDING TO THE FIRST MEMBER OF A NONREAL
COMPLEX CONJUGATE PAIR OF EIGENVALUES GIVEN IN THE
ARRAYS RE, IM, ARE DELIVERED IN THE TWO CONSECUTIVE
COLUMNS OF ARRAY VEC CORRESPONDING TO THIS PAIR (THE
EIGENVECTORS CORRESPONDING TO THE SECOND MEMBERS OF
NONREAL COMPLEX CONJUGATE PAIRS ARE NOT DELIVERED,
SINCE THEY ARE SIMPLY THE COMPLEX CONJUGATE OF THOSE
CORRESPONDING TO THE FIRST MEMBER OF SUCH PAIRS);
MOREOVER:
COMEIG1 DELIVERS 0, PROVIDED THAT THE PROCESS IS COMPLETED WITHIN
EM[4] ITERATIONS; OTHERWISE COMEIG1 DELIVERS K, THE NUMBER OF
EIGENVALUES AND EIGENVECTORS NOT CALCULATED.
1SECTION 3.3.1.2.2 (JULY 1974) PAGE 11
PROCEDURES USED:
EQILBR = CP34173,
TFMREAHES = CP34170,
BAKREAHES2 = CP34172,
BAKLBR = CP34174,
REAVECHES = CP34181,
COMVALQRI = CP34190,
COMVECHES = CP34191,
COMSCL = CP34193.
REQUIRED CENTRAL MEMORY:
EXECUTION FIELD LENGTH: N * N + 5N.
RUNNING TIME: ROUGHLY PROPORTIONAL TO N CUBED.
LANGUAGE: ALGOL 60.
METHOD AND PERFORMANCE:
THE GIVEN MATRIX IS EQUILIBRATED BY CALLING EQILBR (SEE SECTION
3.2.1.1.1) AND TRANSFORMED TO A SIMILAR UPPER-HESSENBERG MATRIX
BY CALLING TFMREAHES (SEE SECTION 3.2.1.2.1.2). THE EIGENVALUES
ARE THEN CALCULATED BY CALLING COMVALQRI, WHICH USES DOUBLE QR
ITERATION (SEE SECTION 3.3.1.2.1).
FURTHERMORE, TO FIND THE EIGENVECTORS WILKINSON'S DEVICE IS FIRST
APPLIED [2, P.328 AND 628]. SUBSEQUENTLY THE EIGENVECTORS OF THE
UPPER-HESSENBERG MATRIX ARE COMPUTED BY CALLING REAVECHES FOR THE
REAL EIGENVALUES AND COMVECHES FOR THE OTHERS (SECTION 3.3.1.2.1.)
THE COMPUTED VECTORS ARE THEN BACK-TRANSFORMED TO THE CORRESPONDING
EIGENVECTORS OF THE GIVEN MATRIX BY CALLING BAKREAHES2 AND BAKLBR
(SEE SECTIONS 3.2.1.2.1.2 AND 3.2.1.1.1). FINALLY THE APPROXIMATE
EIGENVECTORS ARE NORMALIZED BY CALLING COMSCL (SEE SECTION 1.1.9)
SUCH THAT, IN EACH EIGENVECTOR, AN ELEMENT OF MAXIMUM MODULUS
EQUALS 1.
FOR FURTHER DETAILS SEE THE GIVEN REFERENCES.
REFERENCES:
[1]. T.J. DEKKER AND W. HOFFMANN.
ALGOL 60 PROCEDURES IN NUMERICAL ALGEBRA, PART 2.
MC TRACT 23, 1968, MATH. CENTR., AMSTERDAM.
[2]. J.H. WILKINSON.
THE ALGEBRAIC EIGENVALUE PROBLEM.
CLARENDON PRESS, OXFORD, 1965.
[3]. J.G. FRANCIS.
THE QR TRANSFORMATION, PARTS 1 AND 2.
COMP. J. 4 (1961), 265 - 271 AND 332 - 345.
[4]. J.M. VARAH.
EIGENVECTORS OF A REAL MATRIX BY INVERSE ITERATION.
STANFORD UNIVERSITY, TECH. REP. NO. CS 34, 1966.
1SECTION 3.3.1.2.2 (JULY 1974) PAGE 12
EXAMPLE OF USE:
IN THIS SECTION WE ONLY GIVE AN EXAMPLE OF USE OF THE PROCEDURES
REAEIG3 AND COMEIGVAL, BECAUSE A CALL OF THE OTHER PROCEDURES IS
ALMOST SIMILAR.
THE EIGENVALUES AND CORRESPONDING EIGENVECTORS OF A MATRIX, STORED
IN ARRAY A, WITH A[I,J]:= "IF" I=1 "THEN" 1 "ELSE" 1 / (I + J - 1),
MAY BE OBTAINED BY THE PROCEDURE REAEIG3 IN THE FOLLOWING PROGRAM:
"BEGIN" "INTEGER" I, J, M;
"ARRAY" A, VEC[1:4,1:4], EM[0:5], VAL[1:4];
"FOR" I:= 1, 2, 3, 4 "DO" "FOR" J:= 1, 2, 3, 4 "DO"
A[I,J]:= "IF" I = 1 "THEN" 1 "ELSE" 1 / ( I + J - 1);
EM[0]:= "-14; EM[2]:= "-13; EM[4]:= 40;
M:= REAEIG3(A, 4, EM, VAL, VEC);
OUTPUT(61, "("D, /")", M);
"FOR" I:= M + 1 "STEP" 1 "UNTIL" 4 "DO"
OUTPUT(61, "("/, 2(+.13D"+2D, 2B), /, 3(21B, +.13D"+2D, /)")",
VAL[I], VEC[1,I], VEC[2,I], VEC[3,I], VEC[4,I]);
OUTPUT(61, "("/, 2(.2D"+2D, /), ZD")", EM[1], EM[3], EM[5])
"END"
THE PROGRAM DELIVERS(THE RESULTS ARE CORRECT UP TO TWELVE DIGITS):
THE NUMBER OF NOT CALCULATED EIGENVALUES: 0
THE EIGENVALUES AND CORRESPONDING EIGENVECTORS:
+.1886632138548"+01 +.1000000000000"+01
+.3942239850770"+00
+.2773202862566"+00
+.2150878672143"+00
-.1980145931103"+00 +.1000000000000"+01
-.7388484093937"+00
-.3116238593839"+00
-.1475423243327"+00
-.1228293686543"-01 -.4634736456357"+00
+.1000000000000"+01
-.1542548002737"+00
-.3765787365625"+00
-.1441323817331"-03 +.1095712655340"+00
-.6208405341138"+00
+.1000000000000"+01
-.4887465241876"+00
EM[1] = .40"+01
EM[3] = .15"-14
EM[5] = 5 .
1SECTION 3.3.1.2.2 (JULY 1974) PAGE 13
THE COMPLEX EIGENVALUES OF A MATRIX STORED IN ARRAY A WITH N = 3
AND THE ROWS (8, -1, -5), (-4, 4, -2) AND (18, -5, -7), MAY BE
OBTAINED BY THE PROCEDURE COMEIGVAL IN THE FOLLOWING PROGRAM:
"BEGIN" "INTEGER" I, M;
"ARRAY" A[1:3,1:3], EM[0:5], RE, IM[1:3];
EM[0]:= "-14; EM[2]:= "-13; EM[4]:= 30;
A[1,1]:= 8; A[1,2]:= -1; A[1,3]:= -5;
A[2,1]:= -4; A[2,2]:= 4; A[2,3]:= -2;
A[3,1]:= 18; A[3,2]:= -5; A[3,3]:= -7;
M:= COMEIGVAL(A, 3, EM, RE, IM);
OUTPUT(61, "("D, /")", M);
"FOR" I:= M + 1 "STEP" 1 "UNTIL" 3 "DO"
OUTPUT(61, "("2(+.13D"+2D, 2B), /")", RE[I], IM[I]);
OUTPUT(61, "("/, 2(.2D"+2D, /), ZD")", EM[1], EM[3], EM[5])
"END"
THE PROGRAM DELIVERS(THE RESULTS ARE CORRECT UP TO TWELVE DIGITS):
THE NUMBER OF NOT CALCULATED EIGENVALUES: 0
THE EIGENVALUES: +.2000000000000"+01 +.4000000000000"+01
+.2000000000000"+01 -.4000000000000"+01
+.9999999999998"+00 +.0000000000000"+00
THE ARRAY EM: EM[1] = .30"+02
EM[3] = .78"-17
EM[5] = 6 .
SOURCE TEXTS:
0"CODE" 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];
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
1SECTION 3.3.1.2.2 (JULY 1974) PAGE 14
;
"EOP"
0"CODE" 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];
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
1SECTION 3.3.1.2.2 (JULY 1974) PAGE 15
;
"EOP"
0"CODE" 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];
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;
"EOP"
0"CODE" 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];
EQILBR(A, N, EM, D, INT0); TFMREAHES(A, N, EM, INT);
COMEIGVAL:= COMVALQRI(A, N, EM, RE, IM)
"END" COMEIGVAL
1SECTION 3.3.1.2.2 (JULY 1974) PAGE 16
;
"EOP"
0"CODE" 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;
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;
"EOP"
1SECTION 3.3.2.1 (JULY 1974) PAGE 1
AUTHOR : C.G. VAN DER LAAN.
CONTRIBUTORS : H.FIOLET, C.G. VAN DER LAAN.
INSTITUTE : MATHEMATICAL CENTRE.
RECEIVED: 730917.
BRIEF DESCRIPTION:
THIS SECTION CONTAINS FOUR PROCEDURES FOR CALCULATING THE
EIGENVALUES OR THE EIGENVALUES AND EIGENVECTORS OF COMPLEX
HERMITIAN MATRICES.
EIGVALHRM CALCULATES THE EIGENVALUES OF A HERMITIAN MATRIX.
EIGHRM CALCULATES THE EIGENVALUES AND EIGENVECTORS OF A HERMITIAN
MATRIX.
QRIVALHRM CALCULATES THE EIGENVALUES OF A HERMITIAN MATRIX.
QRIHRM CALCULATES THE EIGENVALUES AND EIGENVECTORS OF A HERMITIAN
MATRIX.
WHEN A SMALL NUMBER OF EIGENVALUES OR EIGENVALUES AND EIGENVECTORS
IS REQUIRED, THE USE OF EIGVALHRM OR EIGHRM IS RECOMMANDED; WHEN
MORE THAN, SAY, 25 PERCENT OF THE EIGENSYSTEM IS REQUIRED. THE
PROCEDURES QRIVALHRM OR QRIHRM ARE TO BE USED.
1SECTION 3.3.2.1 (JULY 1974) PAGE 2
SUBSECTION: EIGVALHRM.
CALLING SEQUENCE :
THE HEADING OF THE PROCEDURE READS :
"PROCEDURE" EIGVALHRM(A, N, NUMVAL, VAL, EM); "VALUE" N, NUMVAL;
"INTEGER" N, NUMVAL; "ARRAY" A, VAL, EM;
"CODE" 34368;
THE MEANING OF THE FORMAL PARAMETERS IS :
A: <ARRAY IDENTIFIER>;
"ARRAY" A[1:N,1:N];
ENTRY: THE REAL PART OF THE UPPER TRIANGLE OF THE
HERMITIAN MATRIX MUST BE GIVEN IN THE UPPER
TRIANGULAR PART OF A (THE ELEMENTS A[I,J], I<=J);
THE IMAGINARY PART OF THE STRICT LOWER TRIANGLE
OF THE HERMITIAN MATRIX MUST BE GIVEN IN THE
STRICT LOWER PART OF A (THE ELEMENTS A[I,J],I>J);
THE ELEMENTS AF A ARE ALTERED;
N: <ARITHMETIC EXPRESSION>;
THE ORDER OF THE GIVEN MATRIX;
NUMVAL: <ARITHMETIC EXPRESSION>;
EIGVALHRM CALCULATES THE LARGEST NUMVAL EIGENVALUES OF
THE HERMITIAN MATRIX;
VAL: <ARRAY IDENTIFIER>;
"ARRAY" VAL[1:NUMVAL];
EXIT:
IN ARRAY VAL THE LARGEST NUMVAL EIGENVALUES ARE
DELIVERED IN MONOTONICALLY NONINCREASING ORDER;
EM: <ARRAY IDENTIFIER>;
"ARRAY" EM[0:3];
ENTRY:
EM[0]: THE MACHINE PRECISION;
EM[2]: THE RELATIVE TOLERANCE FOR THE EIGENVALUES;
MORE PRECISELY: THE TOLERANCE FOR EACH EIGENVALUE
LAMBDA, IS ABS(LAMBDA)*EM[2]+EM[1]*EM[0];
EXIT:
EM[1]: AN ESTIMATE OF A NORM OF THE ORIGINAL MATRIX;
EM[3]: THE NUMBER OF ITERATIONS PERFORMED.
PROCEDURES USED:
HSHHRMTRIVAL = CP34364,
VALSYMTRI = CP34151.
REQUIRED CENTRAL MEMORY:
TWO AUXILIARY ARRAYS OF ORDER N AND N - 1 RESPECTIVELY ARE DECLARED
RUNNING TIME: PROPORTIONAL TO N CUBED.
1SECTION 3.3.2.1 (JULY 1974) PAGE 3
LANGUAGE: ALGOL 60.
METHOD AND PERFORMANCE: SEE QRIHRM (THIS SECTION).
EXAMPLE OF USE: SEE EIGHRM (THIS SECTION).
SUBSECTION: EIGHRM.
CALLING SEQUENCE :
THE HEADING OF THE PROCEDURE READS :
"PROCEDURE" EIGHRM(A, N, NUMVAL, VAL, VECR, VECI, EM);
"VALUE" N, NUMVAL; "INTEGER" N, NUMVAL;
"ARRAY" A, VAL, VECR, VECI, EM;
"CODE" 34369;
THE MEANING OF THE FORMAL PARAMETERS IS :
A: <ARRAY IDENTIFIER>;
"ARRAY" A[1:N,1:N];
ENTRY: THE REAL PART OF THE UPPER TRIANGLE OF THE
HERMITIAN MATRIX MUST BE GIVEN IN THE UPPER
TRIANGULAR PART OF A (THE ELEMENTS A[I,J], I<=J);
THE IMAGINARY PART OF THE STRICT LOWER TRIANGLE
OF THE HERMITIAN MATRIX MUST BE GIVEN IN THE
STRICT LOWER PART OF A (THE ELEMENTS A[I,J],I>J);
THE ELEMENTS AF A ARE ALTERED;
N: <ARITHMETIC EXPRESSION>;
THE ORDER OF THE GIVEN MATRIX;
NUMVAL: <ARITHMETIC EXPRESSION>;
EIGHRM CALCULATES THE LARGEST NUMVAL EIGENVALUES OF THE
HERMITIAN MATRIX;
VAL: <ARRAY IDENTIFIER>;
"ARRAY" VAL[1:NUMVAL];
EXIT:
IN ARRAY VAL THE LARGEST NUMVAL EIGENVALUES ARE
DELIVERED IN MONOTONICALLY NONINCREASING ORDER;
VECR,VECI: <ARRAY IDENTIFIER>;
"ARRAY" VECR,VECI[1:N,1:NUMVAL];
EXIT:
THE CALCULATED EIGENVECTORS;
THE COMPLEX EIGENVECTOR WITH REAL PART VECR[1:N,I] AND
IMAGINARY PART VECI[1:N,I] CORRESPONDS TO THE EIGENVALUE
VAL[I], I=1,...,NUMVAL;
1SECTION 3.3.2.1 (JULY 1974) PAGE 4
EM: <ARRAY IDENTIFIER>;
"ARRAY" EM[0:9];
ENTRY:
EM[0]: THE MACHINE PRECISION;
EM[2]: THE RELATIVE TOLERANCE FOR THE EIGENVALUES;
MORE PRECISELY: THE TOLERANCE FOR EACH EIGENVALUE
LAMBDA, IS ABS(LAMBDA)*EM[2]+EM[1]*EM[0];
EM[4]: THE ORTHOGONALIZATION PARAMETER (E.G. .01);
EM[6]: THE TOLERANCE FOR THE EIGENVECTORS;
EM[8]: THE MAXIMUM NUMBER OF INVERSE ITERATIONS ALLOWED
FOR THE CALCULATION OF EACH EIGENVECTOR;
EXIT:
EM[1]: AN ESTIMATE OF A NORM OF THE ORIGINAL MATRIX;
EM[3]: THE NUMBER OF ITERATIONS PERFORMED;
EM[5]: THE NUMBER OF EIGENVECTORS INVOLVED IN THE LAST
GRAM-SCHMIDT ORTHOGONALIZATION;
EM[7]: THE MAXIMUM EUCLIDEAN NORM OF THE RESIDUES OF THE
CALCULATED EIGENVECTORS;
EM[9]: THE LARGEST NUMBER OF INVERSE ITERATIONS
PERFORMED FOR THE CALCULATION OF SOME
EIGENVECTOR; IF, HOWEVER, FOR SOME CALCULATED
EIGENVECTOR, THE EUCLIDEAN NORM OF THE RESIDUES
REMAINS GREATER THAN EM[1]*EM[6], THEN
EM[9]:=EM[8]+1.
PROCEDURES USED:
HSHHRMTRI = CP34363,
VALSYMTRI = CP34151,
VECSYMTRI = CP34152,
BAKHRMTRI = CP34365.
REQUIRED CENTRAL MEMORY:
THREE AUXILIARY ARRAYS OF ORDER N-1 AND TWO OF ORDER N ARE DECLARED
RUNNING TIME: PROPORTIONAL TO N CUBED.
LANGUAGE: ALGOL 60.
METHOD AND PERFORMANCE: SEE QRIHRM (THIS SECTION).
1SECTION 3.3.2.1 (JULY 1974) PAGE 5
EXAMPLE OF USE:
LET EIGHRM CALCULATE THE LARGEST EIGENVALUE AND THE CORRESPONDING
EIGENVECTOR OF THE FOLLOWING MATRIX:
(SEE GREGORY AND KARNEY, CHAPTER 6, EXAMPLE 6.6)
3 1 0 +2I
1 3 -2I 0
0 +2I 1 1
-2I 0 1 1
THE EIGENVECTORS ARE NORMALIZED BY THE PROCEDURE SCLCOM (SEE
SECTION 1.2.11. ).
"BEGIN"
"COMMENT" GREGORY AND KARNEY,CHAPTER 6, EXAMPLE 6.6;
"REAL" "ARRAY" A[1:4,1:4],VAL[1:1],VECR,VECI[1:4,1:1],EM[0:9];
"INTEGER" I;
INIMAT(1,4,1,4,A,0);
A[1,1]:=A[2,2]:=3;
A[1,2]:=A[3,3]:=A[3,4]:=A[4,4]:=1;
A[3,2]:=2;A[4,1]:=-2;
EM[0]:=5"-14;EM[2]:="-12;
EM[4]:=.01;EM[6]:="-10;EM[8]:=5;
EIGHRM(A,4,1,VAL,VECR,VECI,EM);
SCLCOM(VECR,VECI,4,1,1);
OUTPUT(61,"(""("LARGEST EIGENVALUE: ")",N/")",VAL[1]);
OUTPUT(61,"(""("CORRESPONDING EIGENVECTOR:")",/")");
"FOR" I:=1,2,3,4 "DO"
OUTPUT(61,"("+D.D,+D.DDD,"("*I")",/")",VECR[I,1],VECI[I,1]);
"FOR" I:=1,3,5,7,9 "DO"
OUTPUT(61,"("/,"("EM[")",D,"("]: ")",+D.DDD"+DD")",I,EM[I]);
"END"
DELIVERS:
LARGEST EIGENVALUE: +4.8284271247462"000
CORRESPONDING EIGENVECTOR:
+1.0+0.000*I
+1.0+0.000*I
-0.0+0.414*I
+0.0-0.414*I
EM[1]: +6.000"+00
EM[3]: +1.800"+01
EM[5]: +1.000"+00
EM[7]: +5.303"-14
EM[9]: +1.000"+00
1SECTION 3.3.2.1 (JULY 1974) PAGE 6
SUBSECTION: QRIVALHRM.
CALLING SEQUENCE :
THE HEADING OF THE PROCEDURE READS :
"INTEGER" "PROCEDURE" QRIVALHRM(A, N, VAL, EM); "VALUE" N;
"INTEGER" N; "ARRAY" A, VAL, EM;
"CODE" 34370;
THE MEANING OF THE FORMAL PARAMETERS IS:
A: <ARRAY IDENTIFIER>;
"ARRAY" A[1:N,1:N];
ENTRY: THE REAL PART OF THE UPPER TRIANGLE OF THE
HERMITIAN MATRIX MUST BE GIVEN IN THE UPPER
TRIANGULAR PART OF A (THE ELEMENTS A[I,J], I<=J);
THE IMAGINARY PART OF THE STRICT LOWER TRIANGLE
OF THE HERMITIAN MATRIX MUST BE GIVEN IN THE
STRICT LOWER PART OF A (THE ELEMENTS A[I,J],I>J);
THE ELEMENTS AF A ARE ALTERED;
N: <ARITHMETIC EXPRESSION>;
THE ORDER OF THE GIVEN MATRIX;
VAL: <ARRAY IDENTIFIER>;
"ARRAY" VAL[1:N];
EXIT:
THE CALCULATED EIGENVALUES;
EM: <ARRAY IDENTIFIER>;
"ARRAY" EM[0:5];
ENTRY:
EM[0]: THE MACHINE PRECISION;
EM[2]: THE RELATIVE TOLERANCE FOR THE QR ITERATION;
EM[4]: THE MAXIMUM ALLOWED NUMBER OF ITERATIONS;
EXIT:
EM[1]: AN ESTIMATE OF A NORM OF THE ORIGINAL MATRIX;
EM[3]: THE MAXIMUM ABSOLUTE VALUE OF THE CODIAGONAL
ELEMENTS NEGLECTED;
EM[5]: THE NUMBER OF ITERATIONS PERFORMED;
EM[5]:= EM[4]+1 IN THE CASE QRIVALHRM^=0;
QRIVALHRM:=0, PROVIDED THE QR ITERATION IS COMPLETED WITHIN EM[4]
ITERATIONS; OTHERWISE, QRIVALHRM:=THE NUMBER OF EIGENVALUES, K, NOT
CALCULATED AND ONLY THE LAST N-K ELEMENTS OF VAL ARE APPROXIMATE
EIGENVALUES OF THE ORIGINAL HERMITEAN MATRIX.
PROCEDURES USED:
HSHHRMTRIVAL = CP34364,
QRIVALSYMTRI = CP34160.
REQUIRED CENTRAL MEMORY:
TWO AUXILIARY ARRAYS OF ORDER N ARE DECLARED.
RUNNING TIME: PROPORTIONAL TO N CUBED.
1SECTION 3.3.2.1 (JULY 1974) PAGE 7
LANGUAGE: ALGOL 60.
METHOD AND PERFORMANCE: SEE QRIHRM (THIS SECTION).
EXAMPLE OF USE: SEE QRIHRM (THIS SECTION).
SUBSECTION: QRIHRM.
CALLING SEQUENCE :
THE HEADING OF THE PROCEDURE READS :
"INTEGER" "PROCEDURE" QRIHRM(A, N, VAL, VR, VI, EM); "VALUE" N;
"INTEGER" N; "ARRAY" A, VAL, VR, VI, EM;
"CODE" 34371;
THE MEANING OF THE FORMAL PARAMETERS IS:
A: <ARRAY IDENTIFIER>;
"ARRAY" A[1:N,1:N];
ENTRY: THE REAL PART OF THE UPPER TRIANGLE OF THE
HERMITIAN MATRIX MUST BE GIVEN IN THE UPPER
TRIANGULAR PART OF A (THE ELEMENTS A[I,J], I<=J);
THE IMAGINARY PART OF THE STRICT LOWER TRIANGLE
OF THE HERMITIAN MATRIX MUST BE GIVEN IN THE
STRICT LOWER PART OF A (THE ELEMENTS A[I,J],I>J);
THE ELEMENTS AF A ARE ALTERED;
N: <ARITHMETIC EXPRESSION>;
THE ORDER OF THE GIVEN MATRIX;
VAL: <ARRAY IDENTIFIER>;
"ARRAY" VAL[1:N];
EXIT:
THE CALCULATED EIGENVALUES;
VR,VI: <ARRAY IDENTIFIER>;
"ARRAY" VR,VI[1:N,1:N];
EXIT:
THE CALCULATED EIGENVECTORS;
THE COMPLEX EIGENVECTOR WITH REAL PART VR[1:N,I] AND
IMAGINARY PART VI[1:N,I] CORRESPONDS TO THE EIGENVALUE
VAL[I], I=1,...,N;
EM: <ARRAY IDENTIFIER>;
"ARRAY" EM[0:5];
ENTRY:
EM[0]: THE MACHINE PRECISION;
EM[2]: THE RELATIVE TOLERANCE FOR THE QR ITERATION;
(E.G. THE MACHINE PRECISION);
EM[4]: THE MAXIMUM ALLOWED NUMBER OF ITERATIONS;
(E.G. 10 * N);
EXIT:
EM[1]: AN ESTIMATE OF A NORM OF THE ORIGINAL MATRIX;
EM[3]: THE MAXIMUM ABSOLUTE VALUE OF THE CODIAGONAL
ELEMENTS NEGLECTED;
EM[5]: THE NUMBER OF ITERATIONS PERFORMED;
EM[5]:=EM[4]+1 IN THE CASE QRIHRM^=0;
1SECTION 3.3.2.1 (JULY 1974) PAGE 8
QRIHRM:=0, PROVIDED THE PROCESS IS COMPLETED WITHIN EM[4]
ITERATIONS; OTHERWISE, QRIHRM:= THE NUMBER OF EIGENVALUES, K, NOT
CALCULATED AND ONLY THE LAST N-K ELEMENTS OF VAL ARE APPROXIMATE
EIGENVALUES AND THE COLUMNS OF THE ARRAYS VR,VI[1:N,N-K:N] ARE
APPROXIMATE EIGENVECTORS OF THE ORIGINAL HERMITEAN MATRIX .
PROCEDURES USED:
HSHHRMTRI = CP34363,
QRISYMTRI = CP34161,
BAKHRMTRI = CP34365.
REQUIRED CENTRAL MEMORY:
TWO AUXILIARY ARRAYS OF ORDER N - 1 AND TWO OF ORDER N ARE DECLARED
RUNNING TIME: PROPORTIONAL TO N CUBED.
LANGUAGE: ALGOL 60.
THE FOLLOWING HOLDS FOR THE FOUR PROCEDURES OF THIS SECTION:
METHOD AND PERFORMANCE:
FOR THE TRANSFORMATION OF THE GIVEN HERMITIAN MATRIX INTO A REAL
SYMMETRIC TRIDIAGONAL MATRIX, AND FOR THE CORRESPONDING BACK
TRANSFORMATION, PROCEDURES OF SECTION 3.2.1.2.2.1. ARE USED.
FOR THE CALCULATION OF THE EIGENVALUES AND EIGENVECTORS OF THE
RESULTING SYMMETRIC TRIDIAGONAL MATRIX, PROCEDURES OF SECTION
3.3.1.1.1. ARE USED.
EXAMPLE OF USE:
QRIHRM CALCULATES THE EIGENVALUES AND EIGENVECTORS OF THE
FOLLOWING MATRIX:
(SEE GREGORY AND KARNEY, CHAPTER 6, EXAMPLE 6.6)
3 1 0 +2I
1 3 -2I 0
0 +2I 1 1
-2I 0 1 1
THE EIGENVECTORS ARE NORMALIZED BY THE PROCEDURE SCLCOM (SEE
SECTION 1.2.11. ).
ONLY THE EIGENVECTORS CORRESPONDING TO VAL[2] AND VAL[3] ARE
PRINTED BY THE FOLLOWING PROGRAM:
1SECTION 3.3.2.1 (JULY 1974) PAGE 9
"BEGIN"
"COMMENT" GREGORY AND KARNEY,CHAPTER 6, EXAMPLE 6.6;
"REAL" "ARRAY" A,VR,VI[1:4,1:4],VAL[1:4],EM[0:5];"INTEGER" I;
INIMAT(1,4,1,4,A,0);
A[1,1]:=A[2,2]:=3;
A[3,2]:=2;A[4,1]:=-2;
A[1,2]:=A[3,3]:=A[3,4]:=A[4,4]:=1;
EM[0]:=EM[2]:=5"-14;EM[4]:=20;
OUTPUT(61,"(""("QRIHRM: ")",D/")",QRIHRM(A,4,VAL,VR,VI,EM));
SCLCOM(VR,VI,4,2,3);
OUTPUT(61,"(""("EIGENVALUES: ")"")");
"FOR" I:=1,2,3,4 "DO" OUTPUT(61,"("/,"("VAL[")",D,"("]: ")",
+D.3DBB")",I,VAL[I]);
OUTPUT(61,"("/,"("EIGENVECTORS CORRESPONDING TO")",/,
"(" VAL[2] , VAL[3] ")",/")");
"FOR" I:=1,2,3,4 "DO"
OUTPUT(61,"("+D,+D,"("*I , ")",+D,+D,"("*I")",/")",
VR[I,2],VI[I,2],VR[I,3],VI[I,3]);
"FOR" I:=1,3,5 "DO"
OUTPUT(61,"("/,"("EM[")",D,"("]: ")",+D.DDD"+DD")",I,EM[I])
"END"
OUTPUT:
QRIHRM: 0
EIGENVALUES:
VAL[1]: +4.828
VAL[2]: +4.000
VAL[3]: -0.000
VAL[4]: -0.828
EIGENVECTORS CORRESPONDING TO
VAL[2] , VAL[3]
+1+0*I , +0-1*I
-1+0*I , +0+1*I
+0-1*I , +1+0*I
+0-1*I , +1+0*I
EM[1]: +6.000"+00
EM[3]: +3.804"-22
EM[5]: +6.000"+00
SOURCE TEXT(S) :
0"CODE" 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];
HSHHRMTRIVAL(A, N, D, BB, EM);
VALSYMTRI(D, BB, N, 1, NUMVAL, VAL, EM)
"END" EIGVALHRM
1SECTION 3.3.2.1 (JULY 1974) PAGE 10
;
"EOP"
0"CODE" 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];
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;
"EOP"
0"CODE" 34370;
"INTEGER" "PROCEDURE" QRIVALHRM(A, N, VAL, EM); "VALUE" N;
"INTEGER" N; "ARRAY" A, VAL, EM;
"BEGIN" "ARRAY" B,BB[1:N];
"INTEGER" I;
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;
"EOP"
0"CODE" 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];
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;
"EOP"
1SECTION 3.3.2.2.1 (JULY 1974) PAGE 1
AUTHOR : C.G. VAN DER LAAN.
CONTRIBUTORS : H.FIOLET, C.G. VAN DER LAAN.
INSTITUTE : MATHEMATICAL CENTRE.
RECEIVED: 731016.
BRIEF DESCRIPTION :
THIS SECTION CONTAINS THE PROCEDURES VALQRICOM AND QRICOM.
VALQRICOM CALCULATES THE EIGENVALUES OF A COMPLEX UPPER-HESSENBERG
MATRIX WITH A REAL SUBDIAGONAL.
QRICOM CALCULATES THE EIGENVECTORS AS WELL.
KEYWORDS :
EIGENVALUES,
EIGENVECTORS,
COMPLEX UPPER-HESSENBERG MATRIX,
QR-ITERATION.
1SECTION 3.3.2.2.1 (JULY 1974) PAGE 2
SUBSECTION: VALQRICOM.
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE READS:
"INTEGER" "PROCEDURE" VALQRICOM(A1, A2, B, N, EM, VAL1, VAL2);
"VALUE" N; "INTEGER" N; "ARRAY" A1, A2, B, EM, VAL1, VAL2;
"CODE" 34372;
THE MEANING OF THE FORMAL PARAMETERS IS:
A1,A2: <ARRAY IDENTIFIER>;
"ARRAY" A1,A2[1:N,1:N];
ENTRY:
THE REAL PART AND THE IMAGINARY PART OF THE UPPER
TRIANGLE OF THE UPPER-HESSENBERG MATRIX MUST BE GIVEN IN
THE CORRESPONDING PARTS OF THE ARRAYS A1 AND A2;
THE ELEMENTS IN THE UPPER TRIANGLE OF THE ARRAYS A1 AND
A2 ARE ALTERED;
B: <ARRAY IDENTIFIER>;
"ARRAY" B[1:N-1];
ENTRY:
THE REAL SUBDIAGONAL OF THE UPPER-HESSENBERG MATRIX;
THE ELEMENTS OF THE ARRAY B ARE ALTERED;
N: <ARITHMETIC EXPRESSION>;
THE ORDER OF THE GIVEN MATRIX;
EM: <ARRAY IDENTIFIER>;
"ARRAY" EM[0:5];
ENTRY:
EM[0]: THE MACHINE PRECISION;
EM[1]: AN ESTIMATE OF THE NORM OF THE UPPER-HESSENBERG
MATRIX (E.G. THE SUM OF THE INFINITY NORMS OF THE
REAL AND IMAGINARY PARTS OF THE MATRIX);
EM[2]: THE RELATIVE TOLERANCE FOR THE QR-ITERATION;
(E.G. THE MACHINE PRECISION);
EM[4]: THE MAXIMUM ALLOWED NUMBER OF ITERATIONS;
(E.G. 10 * N);
EXIT:
EM[3]: THE MAXIMUM ABSOLUTE VALUE OF THE SUBDIAGONAL
ELEMENTS NEGLECTED;
EM[5]: THE NUMBER OF ITERATIONS PERFORMED;
EM[5]:=EM[4]+1 IN THE CASE VALQRICOM^=0;
VAL1,VAL2: <ARRAY IDENTIFIER>;
"ARRAY" VAL1,VAL2[1:N];
EXIT:
THE REAL PART AND THE IMAGINARY PART OF THE CALCULATED
EIGENVALUES ARE DELIVERED IN THE ARRAYS VAL1 AND VAL2,
RESPECTIVELY;
VALQRICOM:=0, PROVIDED THE PROCESS IS COMPLETED WITHIN EM[4]
ITERATIONS; OTHERWISE, VALQRICOM:= THE NUMBER, K, OF EIGENVALUES
NOT CALCULATED AND ONLY THE LAST N-K ELEMENTS OF THE ARRAYS VAL1
AND VAL2 ARE APPROXIMATE EIGENVALUES OF THE UPPER-HESSENBERG
MATRIX.
1SECTION 3.3.2.2.1 (JULY 1974) PAGE 3
PROCEDURES USED:
COMKWD = CP34345,
ROTCOMROW = CP34358,
ROTCOMCOL = CP34357,
COMCOLCST = CP34352.
RUNNING TIME: PROPORTIONAL TO N**2 * NUMBER OF ITERATIONS.
LANGUAGE: ALGOL 60.
METHOD AND PERFORMANCE: SEE QRICOM (THIS SECTION).
EXAMPLE OF USE:
AS A FORMAL TEST OF THE PROCEDURE VALQRICOM THE ZEROS OF THE
POLYNOMIAL X**4 + (4+2*I)* X**3 + (5+6*I)* X**2 + (2+6*I)* X + 2*I
ARE OBTAINED BY MEANS OF THE CALCULATION OF THE EIGENVALUES OF THE
FOLLOWING COMPANION MATRIX:
(SEE WILKINSON AND REINSCH, 1971, CONTRIBUTION II/15)
-4-2*I -5-6*I -2-6*I -2*I
1 0 0 0
0 1 0 0
0 0 1 0
"BEGIN"
"REAL" "ARRAY" A1,A2[1:4,1:4],B[1:3],EM[0:5],VAL1,VAL2[1:4];
"INTEGER" I;
INIMAT(1,4,1,4,A1,0);INIMAT(1,4,1,4,A2,0);
A1[1,1]:=-4;A1[1,2]:=-5;A1[1,3]:=A2[1,1]:=A2[1,4]:=-2;
A2[1,2]:=A2[1,3]:=-6;
B[1]:=B[2]:=B[3]:=1;
EM[0]:=5"-14;EM[1]:=27;EM[2]:="-12;EM[4]:=15;
OUTPUT(61,"(""("VALQRICOM: ")",D/")",
VALQRICOM(A1,A2,B,4,EM,VAL1,VAL2));
OUTPUT(61,"(""("EIGENVALUES:")",/,"("REAL PART")",14B,
"("IMAGINARY PART")",/")");
"FOR" I:=1,2,3,4 "DO" OUTPUT(61,"("N,N/")",VAL1[I],VAL2[I]);
OUTPUT(61,"(""("EM[3]: ")",D.D"+DD/,"("EM[5]: ")",3D")",
EM[3],EM[5])
"END"
OUTPUT:
VALQRICOM: 0
EIGENVALUES:
REAL PART IMAGINARY PART
-1.0000001920467"+000 -1.0000000831019"+000
-9.9999980795324"-001 -9.9999991689805"-001
-1.0000000047492"+000 +1.6824958523393"-007
-9.9999999525076"-001 -1.6824956397352"-007
EM[3]: 3.2"-14
EM[5]: 010
1SECTION 3.3.2.2.1 (JULY 1974) PAGE 4
SUBSECTION: QRICOM.
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE READS:
"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;
"CODE" 34373;
THE MEANING OF THE FORMAL PARAMETERS IS:
A1,A2: <ARRAY IDENTIFIER>;
"ARRAY" A1,A2[1:N,1:N];
ENTRY:
THE REAL PART AND THE IMAGINARY PART OF THE UPPER
TRIANGLE OF THE UPPER-HESSENBERG MATRIX MUST BE GIVEN IN
THE CORRESPONDING PARTS OF THE ARRAYS A1 AND A2;
THE ELEMENTS IN THE UPPER TRIANGLE OF THE ARRAYS A1 AND
A2 ARE ALTERED;
B: <ARRAY IDENTIFIER>;
"ARRAY" B[1:N-1];
ENTRY:
THE REAL SUBDIAGONAL OF THE UPPER-HESSENBERG MATRIX;
THE ELEMENTS OF THE ARRAY B ARE ALTERED;
N: <ARITHMETIC EXPRESSION>;
THE ORDER OF THE GIVEN MATRIX;
EM: <ARRAY IDENTIFIER>;
"ARRAY" EM[0:5];
ENTRY:
EM[0]: THE MACHINE PRECISION;
EM[1]: AN ESTIMATE OF THE NORM OF THE UPPER-HESSENBERG
MATRIX (E.G. THE SUM OF THE INFINITY NORMS OF THE
REAL AND IMAGINARY PARTS OF THE MATRIX);
EM[2]: THE RELATIVE TOLERANCE FOR THE QR-ITERATION;
(E.G. THE MACHINE PRECISION);
EM[4]: THE MAXIMUM ALLOWED NUMBER OF ITERATIONS;
(E.G. 10 * N);
EXIT:
EM[3]: THE MAXIMUM ABSOLUTE VALUE OF THE SUBDIAGONAL
ELEMENTS NEGLECTED;
EM[5] THE NUMBER OF ITERATIONS PERFORMED;
EM[5]:=EM[4]+1 IN THE CASE QRICOM^=0;
VAL1,VAL2: <ARRAY IDENTIFIER>;
"ARRAY" VAL1,VAL2[1:N];
EXIT:
THE REAL PART AND THE IMAGINARY PART OF THE CALCULATED
EIGENVALUES ARE DELIVERED IN THE ARRAYS VAL1 AND VAL2,
RESPECTIVELY;
VEC1,VEC2: <ARRAY IDENTIFIER>;
"ARRAY" VEC1,VEC2[1:N,1:N];
EXIT:
THE EIGENVECTORS OF THE UPPER-HESSENBERG MATRIX;
THE EIGENVECTOR WITH REAL PART VEC1[1:N,J] AND IMAGINARY
PART VEC2[1:N,J] CORRESPONDS TO THE EIGENVALUE
VAL1[J] + VAL2[J] * I, J=1,...,N;
1SECTION 3.3.2.2.1 (JULY 1974) PAGE 5
QRICOM:=0, PROVIDED THE PROCESS IS COMPLETED WITHIN EM[4]
ITERATIONS; OTHERWISE, QRICOM:= THE NUMBER, K, OF EIGENVALUES NOT
CALCULATED AND ONLY THE LAST N-K ELEMENTS OF THE ARRAYS VAL1 AND
VAL2 ARE APPROXIMATE EIGENVALUES OF THE UPPER-HESSENBERG MATRIX,
AND NO USEFUL EIGENVECTORS ARE DELIVERED.
PROCEDURES USED:
COMKWD = CP34345,
ROTCOMROW = CP34358,
ROTCOMCOL = CP34357,
COMCOLCST = CP34352,
COMROWCST = CP34353,
MATVEC = CP34011,
COMMATVEC = CP34354,
COMDIV = CP34342.
REQUIRED CENTRAL MEMORY: TWO AUXILIARY ARRAYS OF ORDER N ARE DECLARED.
RUNNING TIME: PROPORTIONAL TO N**2 * NUMBER OF ITERATIONS.
LANGUAGE: ALGOL 60.
THE FOLLOWING HOLDS FOR BOTH PROCEDURES:
METHOD AND PERFORMANCE:
THE UPPER-HESSENBERG MATRIX IS TRANSFORMED BY MEANS OF FRANCIS' QR
ITERATION ( FRANCIS, 1961, AND WILKINSON, 1965 ) INTO A COMPLEX
UPPER TRIANGULAR MATRIX. THE EIGENVALUES ARE THE DIAGONAL ELEMENTS
OF THE LATTER MATRIX. TO CALCULATE THE EIGENVECTORS WE FIRST SOLVE
THE RESULTING TRIANGULAR SYSTEM OF LINEAR EQUATIONS AND
SUBSEQUENTLY PERFORM THE CORRESPONDING BACKTRANSFORMATION.
1SECTION 3.3.2.2.1 (JULY 1974) PAGE 6
EXAMPLE OF USE:
QRICOM CALCULATES THE EIGENVALUES AND EIGENVECTORS OF THE
FOLLOWING MATRIX:
(SEE WILKINSON AND REINSCH, 1971, CONTRIBUTION II/15)
-4-2*I -5-6*I -2-6*I -2*I
1 0 0 0
0 1 0 0
0 0 1 0
THE EIGENVECTORS ARE NORMALIZED BY THE PROCEDURE SCLCOM.
(SEE SECTION 1.2.11.).
ONLY THE EIGENVECTOR CORRESPONDING TO VAL1[1] + VAL2[1] * I IS
PRINTED BY THE FOLLOWING PROGRAM.
"BEGIN"
"REAL" "ARRAY" A1,A2,VEC1,VEC2[1:4,1:4],B[1:3],
EM[0:5],VAL1,VAL2[1:4];
"INTEGER" I;
INIMAT(1,4,1,4,A1,0);INIMAT(1,4,1,4,A2,0);
A1[1,1]:=-4;A1[1,2]:=-5;A1[1,3]:=A2[1,1]:=A2[1,4]:=-2;
A2[1,2]:=A2[1,3]:=-6;
B[1]:=B[2]:=B[3]:=1;
EM[0]:=5"-14;EM[1]:=27;EM[2]:="-12;EM[4]:=15;
OUTPUT(61,"(""("QRICOM: ")",D/")",
QRICOM(A1,A2,B,4,EM,VAL1,VAL2,VEC1,VEC2));
OUTPUT(61,"(""("EIGENVALUES:")",/,"("REAL PART")",14B,
"("IMAGINARY PART")",/")");
"FOR" I:=1,2,3,4 "DO" OUTPUT(61,"("N,N/")",VAL1[I],VAL2[I]);
SCLCOM(VEC1,VEC2,4,1,4);
OUTPUT(61,"(""("FIRST EIGENVECTOR:")",/,"("REAL PART")",14B,
"("IMAGINARY PART")",/")");
"FOR" I:=1,2,3,4 "DO" OUTPUT(61,"("N,N/")",VEC1[I,1],VEC2[I,1]);
OUTPUT(61,"(""("EM[3]: ")",D.D"+DD/,"("EM[5]: ")",3D")",
EM[3],EM[5])
"END"
1SECTION 3.3.2.2.1 (JULY 1974) PAGE 7
OUTPUT:
QRICOM: 0
EIGENVALUES:
REAL PART IMAGINARY PART
-9.9999980795324"-001 -9.9999991689805"-001
-1.0000001920467"+000 -1.0000000831019"+000
-1.0000000047492"+000 +1.6824958523393"-007
-9.9999999525076"-001 -1.6824956397352"-007
FIRST EIGENVECTOR:
REAL PART IMAGINARY PART
+1.0000000000000"+000 -1.7763568394003"-015
-5.0000004155098"-001 +5.0000009602339"-001
-5.4472417687634"-008 -5.0000013757436"-001
+2.5000014403510"-001 +2.5000006232645"-001
EM[3]: 3.2"-14
EM[5]: 010
REFERENCES:
DEKKER, T.J. (1968),
ALGOL 60 PROCEDURES IN NUMERICAL ALGEBRA, PART 1,
MATH. CENTRE TRACTS 22, MATHEMATISCH CENTRUM;
DEKKER, T.J. AND W.HOFFMANN (1968),
ALGOL 60 PROCEDURES IN NUMERICAL ALGEBRA, PART 2,
MATH. CENTRE TRACTS 23, MATHEMATISCH CENTRUM;
FRANCIS, J.G.F. (1961),
THE QR-TRANSFORMATION, PART 1 AND 2,
COMP.J. 4, P.265-271 AND P.332-345;
RUHE, A. (1966),
EIGENVALUES OF A COMPLEX MATRIX BY THE QR METHOD.
BIT, 6, P.350-358;
WILKINSON, J.H. (1965),
THE ALGEBRAIC EIGENVALUE PROBLEM,
CLARENDOM PRESS, OXFORD;
1SECTION 3.3.2.2.1 (JULY 1974) PAGE 8
SOURCE TEXT(S) :
0"CODE" 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;
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;"COMMENT"
1SECTION 3.3.2.2.1 (JULY 1974) PAGE 9
;
"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;
"EOP"
0"CODE" 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];"COMMENT"
1SECTION 3.3.2.2.1 (JULY 1974) PAGE 10
;
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"
1SECTION 3.3.2.2.1 (JULY 1974) PAGE 11
"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"; "COMMENT"
1SECTION 3.3.2.2.1 (JULY 1974) PAGE 12
;
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 "AND" 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;
"EOP"
1SECTION 3.3.2.2.2 (JULY 1974) PAGE 1
AUTHOR : C.G. VAN DER LAAN.
CONTRIBUTORS : H.FIOLET, C.G. VAN DER LAAN.
INSTITUTE : MATHEMATICAL CENTRE.
RECEIVED: 731016.
BRIEF DESCRIPTION :
THIS SECTION CONTAINS THE PROCEDURES EIGVALCOM AND EIGCOM.
EIGVALCOM CALCULATES THE EIGENVALUES OF A COMPLEX MATRIX AND
EIGCOM CALCULATES THE EIGENVECTORS AS WELL.
KEYWORDS :
EIGENVALUES,
EIGENVECTORS,
COMPLEX MATRICES,
EQUILIBRATION,
REDUCTION HESSENBERG FORM,
HOUSEHOLDER TRANSFORMATION,
QR-ITERATION.
1SECTION 3.3.2.2.2 (JULY 1974) PAGE 2
SUBSECTION: EIGVALCOM.
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE READS:
"INTEGER" "PROCEDURE" EIGVALCOM(AR, AI, N, EM, VALR, VALI);
"VALUE" N; "INTEGER" N; "ARRAY" AR, AI, EM, VALR, VALI;
"CODE" 34374;
THE MEANING OF THE FORMAL PARAMETERS IS:
AR,AI: <ARRAY IDENTIFIER>;
"ARRAY" AR,AI[1:N,1:N];
ENTRY:
THE REAL PART AND THE IMAGINARY PART OF THE MATRIX MUST
BE GIVEN IN THE ARRAYS AR AND AI, RESPECTIVELY;
THE ELEMENTS OF THE ARRAYS AR AND AI ARE ALTERED;
N: <ARITHMETIC EXPRESSION>;
THE ORDER OF THE GIVEN MATRIX;
EM: <ARRAY IDENTIFIER>;
"ARRAY" EM[0:7];
ENTRY:
EM[0]: THE MACHINE PRECISION;
EM[2]: THE RELATIVE TOLERANCE FOR THE QR-ITERATION;
(E.G. THE MACHINE PRECISION);
EM[4]: THE MAXIMUM ALLOWED NUMBER OF QR-ITERATIONS;
(E.G. 10 * N);
EM[6]: THE MAXIMUM ALLOWED NUMBER OF ITERATIONS FOR
EQUILIBRATING THE ORIGINAL MATRIX (E.G. N**2/2);
EXIT:
EM[1]: THE EUCLIDEAN NORM OF THE EQUILIBRATED MATRIX;
EM[3]: THE MAXIMUM ABSOLUTE VALUE OF THE SUBDIAGONAL
ELEMENTS NEGLECTED IN THE QR-ITERATION;
EM[5]: THE NUMBER OF QR-ITERATIONS PERFORMED;
EM[5]:=EM[4]+1 IN THE CASE EIGVALCOM^=0;
EM[7]: THE NUMBER OF ITERATIONS PERFORMED FOR
EQUILIBRATING THE ORIGINAL MATRIX;
VALR,VALI: <ARRAY IDENTIFIER>;
"ARRAY" VALR,VALI[1:N];
EXIT:
THE REAL PART AND THE IMAGINARY PART OF THE CALCULATED
EIGENVALUES ARE DELIVERED IN THE ARRAYS VALR AND VALI,
RESPECTIVELY;
EIGVALCOM:=0, PROVIDED THE QR-ITERATION IS COMPLETED WITHIN EM[4]
ITERATIONS; OTHERWISE, EIGVALCOM:= THE NUMBER, K, OF EIGENVALUES
NOT CALCULATED AND ONLY THE LAST N-K ELEMENTS OF THE ARRAYS VALR
AND VALI ARE APPROXIMATE EIGENVALUES OF THE ORIGINAL MATRIX.
PROCEDURES USED:
EQILBRCOM = CP34361,
COMEUCNRM = CP34359,
HSHCOMHES = CP34366,
VALQRICOM = CP34372.
1SECTION 3.3.2.2.2 (JULY 1974) PAGE 3
REQUIRED CENTRAL MEMORY: FIVE REAL ARRAYS OF ORDER N AND ONE INTEGER
ARRAY OF ORDER N ARE DECLARED.
RUNNING TIME: PROPORTIONAL TO N ** 2 * MAX(N,NUMBER OF ITERATIONS).
LANGUAGE: ALGOL 60.
METHOD AND PERFORMANCE: SEE EIGCOM (THIS SECTION).
EXAMPLE OF USE: SEE EIGCOM (THIS SECTION).
SUBSECTION: EIGCOM.
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE READS:
"INTEGER" "PROCEDURE" EIGCOM(AR, AI, N, EM, VALR, VALI, VR, VI);
"VALUE" N; "INTEGER" N; "ARRAY" AR, AI, EM, VALR, VALI, VR, VI;
"CODE" 34375;
THE MEANING OF THE FORMAL PARAMETERS IS:
AR,AI: <ARRAY IDENTIFIER>;
"ARRAY" AR,AI[1:N,1:N];
ENTRY:
THE REAL PART AND THE IMAGINARY PART OF THE MATRIX MUST
BE GIVEN IN THE ARRAYS AR AND AI, RESPECTIVELY;
THE ELEMENTS OF THE ARRAYS AR AND AI ARE ALTERED;
N: <ARITHMETIC EXPRESSION>;
THE ORDER OF THE GIVEN MATRIX;
EM: <ARRAY IDENTIFIER>;
"ARRAY" EM[0:7];
ENTRY:
EM[0]: THE MACHINE PRECISION;
EM[2]: THE RELATIVE TOLERANCE FOR THE QR-ITERATION;
(E.G. THE MACHINE PRECISION);
EM[4]: THE MAXIMUM ALLOWED NUMBER OF QR-ITERATIONS;
(E.G. 10 * N);
EM[6]: THE MAXIMUM ALLOWED NUMBER OF ITERATIONS FOR
EQUILIBRATING THE ORIGINAL MATRIX (E.G. N**2/2);
EXIT:
EM[1]: THE EUCLIDEAN NORM OF THE EQUILIBRATED MATRIX;
EM[3]: THE MAXIMUM ABSOLUTE VALUE OF THE SUBDIAGONAL
ELEMENTS NEGLECTED IN THE QR-ITERATION;
EM[5]: THE NUMBER OF QR-ITERATIONS PERFORMED;
EM[5]:=EM[4]+1 IN THE CASE EIGCOM^=0;
EM[7]: THE NUMBER OF ITERATIONS PERFORMED FOR
EQUILIBRATING THE ORIGINAL MATRIX;
1SECTION 3.3.2.2.2 (JULY 1974) PAGE 4
VALR,VALI: <ARRAY IDENTIFIER>;
"ARRAY" VALR,VALI[1:N];
EXIT:
THE REAL PART AND THE IMAGINARY PART OF THE CALCULATED
EIGENVALUES ARE DELIVERED IN THE ARRAYS VALR AND VALI,
RESPECTIVELY;
VR,VI: <ARRAY IDENTIFIER>;
"ARRAY" VR,VI[1:N,1:N];
EXIT:
THE EIGENVECTORS OF THE MATRIX;
THE NORMALIZED EIGENVECTOR WITH REAL PART VR[1:N,J] AND
IMAGINARY PART VI[1:N,J] CORRESPONDS TO THE EIGENVALUE
VALR[J] + VALI[J] * I, J=1,...,N;
EIGCOM:=0, PROVIDED THE QR-ITERATION IS COMPLETED WITHIN EM[4]
ITERATIONS; OTHERWISE, EIGCOM:= THE NUMBER, K, OF EIGENVALUES
NOT CALCULATED AND ONLY THE LAST N-K ELEMENTS OF THE ARRAYS VALR
AND VALI ARE APPROXIMATE EIGENVALUES OF THE ORIGINAL MATRIX AND NO
USEFUL EIGENVECTORS ARE DELIVERED.
PROCEDURES USED:
EQILBRCOM = CP34361,
COMEUCNRM = CP34359,
HSHCOMHES = CP34366,
QRICOM = CP34373,
BAKCOMHES = CP34367,
BAKLBRCOM = CP34362,
SCLCOM = CP34360.
REQUIRED CENTRAL MEMORY: FIVE REAL ARRAYS OF ORDER N AND ONE INTEGER
ARRAY OF ORDER N ARE DECLARED.
RUNNING TIME: PROPORTIONAL TO N**2 * MAX(N, NUMBER OF ITERATIONS).
LANGUAGE : ALGOL 60.
1SECTION 3.3.2.2.2 (JULY 1974) PAGE 5
THE FOLLOWING HOLDS FOR BOTH PROCEDURES:
METHOD AND PERFORMANCE:
FOR CALCULATING THE EIGENVALUES AND EIGENVECTORS OF A COMPLEX
MATRIX WE DISTINGUISH THE FOLLOWING STEPS:
1) THE MATRIX IS EQUILIBRATED (SEE ALSO SECTION 3.2.1.1.2.).
2) THE EQUILIBRATED MATRIX IS TRANSFORMED INTO HESSENBERG FORM BY
MEANS OF HOUSEHOLDER MATRICES (SEE ALSO SECTION 3.2.1.2.2.2.).
3) THE HESSENBERG MATRIX IS TRANSFORMED INTO AN UPPER TRIANGULAR
MATRIX BY MEANS OF QR-ITERATION WITH SHIFT OF ORIGIN AND
DEFLATION (SEE ALSO SECTION 3.3.2.2.1.).
THE DIAGONAL ELEMENTS OF THE UPPER TRIANGULAR MATRIX ARE THE
EIGENVALUES OF THE ORIGINAL MATRIX.
THE EIGENVECTORS OF THE ORIGINAL MATRIX ARE OBTAINED BY CALCULATING
THE EIGENVECTORS OF THE UPPER TRIANGULAR MATRIX (3) FOLLOWED BY
BACKTRANSFORMATIONS CORRESPONDING TO (2) AND (1).
REFERENCES:
DEKKER, T.J. (1968),
ALGOL 60 PROCEDURES IN NUMERICAL ALGEBRA, PART 1,
MATH. CENTRE TRACTS 22, MATHEMATISCH CENTRUM;
DEKKER, T.J. AND W.HOFFMANN (1968),
ALGOL 60 PROCEDURES IN NUMERICAL ALGEBRA, PART 2,
MATH. CENTRE TRACTS 23, MATHEMATISCH CENTRUM;
FRANCIS, J.G.F. (1961),
THE QR-TRANSFORMATION, PART 1 AND 2,
COMP.J. 4, P.265-271 AND P.332-345;
MUELLER, D.J. (1966),
HOUSEHOLDER,S METHOD FOR COMPLEX MATRICES AND EIGENSYSTEMS OF
HERMITIAN MATRICES,
NUMER.MATH., 8, P.72-92;
OSBORNE, E.E. (1960),
ON PRECONDITIONING OF MATRICES,
JACM., 7, P.338-354;
PARLETT, B.N. AND C.REINSCH (1969),
BALANCING A MATRIX FOR CALCULATION OF EIGENVALUES AND
EIGENVECTORS,
NUM. MATH., 13, P.293-304;
WILKINSON, J.H. (1965),
THE ALGEBRAIC EIGENVALUE PROBLEM,
CLARENDOM PRESS, OXFORD.
1SECTION 3.3.2.2.2 (JULY 1974) PAGE 6
EXAMPLE OF USE:
EIGCOM CALCULATES THE EIGENVALUES AND THE EIGENVECTORS OF THE
FOLLOWING MATRIX:
(SEE WILKINSON AND REINSCH, 1971, CONTRIBUTION II/15)
1+3*I 2+1*I 3+2*I 1+1*I
3+4*I 1+2*I 2+1*I 4+3*I
2+3*I 1+5*I 3+1*I 5+2*I
1+2*I 3+1*I 1+4*I 5+3*I
ONLY THE EIGENVECTOR CORRESPONDING TO VALR[1] + VALI[1] * I IS
PRINTED BY THE FOLLOWING PROGRAM.
"BEGIN"
"REAL" "ARRAY" AR,AI,VR,VI[1:4,1:4],EM[0:7],VALR,VALI[1:4];
"INTEGER" I;
AR[1,1]:=AR[1,4]:=AR[2,2]:=AR[3,2]:=AR[4,1]:=AR[4,3]:=
AI[1,2]:=AI[1,4]:=AI[2,3]:=AI[3,3]:=AI[4,2]:=1;
AR[1,2]:=AR[2,3]:=AR[3,1]:=AI[1,3]:=AI[2,2]:=AI[3,4]:=AI[4,1]:=2;
AR[1,3]:=AR[2,1]:=AR[3,3]:=AR[4,2]:=
AI[1,1]:=AI[2,4]:=AI[3,1]:=AI[4,4]:=3;
AR[2,4]:=AI[2,1]:=AI[4,3]:=4;
AR[3,4]:=AR[4,4]:=AI[3,2]:=5;
EM[0]:=5"-14;EM[2]:="-12;EM[4]:=10;EM[6]:=10;
OUTPUT(61,"(""("EIGCOM: ")",D")",
EIGCOM(AR,AI,4,EM,VALR,VALI,VR,VI));
OUTPUT(61,"("/,"("EIGENVALUES:")",/")");
"FOR" I:=1,2,3,4 "DO" OUTPUT(61,"("2(+D.4D),"(" * I")",/")",
VALR[I],VALI[I]);
OUTPUT(61,"(""("FIRST EIGENVECTOR:")",/")");
"FOR" I:=1,2,3,4 "DO" OUTPUT(61,"("2(+D.4D),"(" * I")",/")",
VR[I,1],VI[I,1]);
OUTPUT(61,"(""("EM[1]: ")",+DD.DD/,"("EM[3]: ")",+D.D"+DD/,
"("EM[5]: ")",+ZD/,"("EM[7]: ")",+ZD")",EM[1],EM[3],EM[5],EM[7]);
"END"
OUTPUT:
EIGCOM: 0
EIGENVALUES:
-3.3710-0.7705 * I
+9.7837+9.3225 * I
+1.3657-1.4011 * I
+2.2217+1.8490 * I
FIRST EIGENVECTOR:
-0.5061+0.5835 * I
+1.0000+0.0000 * I
+0.5183-0.7147 * I
-0.5535+0.0188 * I
EM[1]: +15.30
EM[3]: +6.0"-12
EM[5]: +7
EM[7]: +4
1SECTION 3.3.2.2.2 (JULY 1974) PAGE 7
SOURCE TEXT(S) :
0"CODE" 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];
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;
"EOP"
0"CODE" 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];
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;
"EOP"
1SECTION : 3.4.1.2 (FEBRUARY 1979) PAGE 1
AUTHOR: J.J.G. ADMIRAAL.
INSTITUTE: UNIVERSITY OF AMSTERDAM.
RECEIVED: 751101.
BRIEF DESCRIPTION:
THIS SECTION CONTAINS TWO MAIN AND NINE AUXILIARY PROCEDURES:
THE TWO MAIN PROCEDURES ARE:
A. QZIVAL FINDS N PAIRS OF SCALARS (ALFA[M],BETA[M]),WHERE BETA[M]
IS REAL,SUCH THAT THE MATRIX BETA[M] * A - ALFA[M] * B IS
SINGULAR.
B. QZI FINDS N PAIRS OF SCALARS (ALFA[M], BETA[M]),WHERE BETA[M] IS
REAL,SUCH THAT THE MATRIX BETA[M] * A - ALFA[M] * B IS SINGULAR;
MOREOVER THE GENERALIZED EIGENVECTORS (THE HOMOGENOUS SOLUTION
OF ( BETA[M] * A - ALFA[M] * B ) * X = 0 ) ARE CALCULATED.
THE AUXILIARY PROCEDURES ARE:
A. HSHDECMUL:
THIS PROCEDURE CALCULATES REAL MATRICES Q AND R SUCH
THAT Q.A=R WHERE A IS A GIVEN REAL SQUARE MATRIX, Q IS A
PRODUCT OF HOUSEHOLDER MATRICES AND R AN UPPERTRIANGULAR MATRIX.
MOREOVER Q.B IS FORMED WITH B, A GIVEN MATRIX.
B. HESTGL3:
GIVEN THE REAL SQUARE MATRICES A,B AND X, WITH B AN
UPPER TRIANGULAR MATRIX,HESTGL3 CALCULATES THE MATRICES Q,Z,H,R,
WHERE Q,Z ARE ORTHOGONAL, H UPPER HESSENBERG AND R AN UPPER
TRIANGULAR MATRIX SUCH THAT Q.A.Z = H AND Q.B.Z = R.
FURTHER: A:= Q.A.Z ; B:= Q.B.Z AND X:= Q.X.Z.
C. HESTGL2:
SEE HESTGL3,BUT HERE THE MATRIX X HAS BEEN LEFT OUT.
D. HSH2COL:
THIS PROCEDURE CALCULATES A HOUSEHOLDER MATRIX Q
SUCH THAT BY PREMULTIPLYING A GIVEN COLUMN VECTOR V BY Q
A ZERO ELEMENT IS FORMED IN V.
HERE THE VECTOR V IS A COLUMN OF A MATRIX.
FURTHER: A:= Q.A AND B:= Q.B
WHERE A,B ARE TWO GIVEN REAL MATRICES.
1SECTION : 3.4.1.2 (FEBRUARY 1979) PAGE 2
E. HSH3COL:
THIS PROCEDURE CALCULATES A HOUSEHOLDER MATRIX
Q SUCH THAT BY PREMULTIPLYING A GIVEN COLUMN VECTOR V BY Q TWO
SUCCESSIVE ZERO ELEMENTS ARE FORMED IN V.
HERE THE VECTOR V IS A COLUMN OF A MATRIX.
FURTHER: A:= Q.A AND B:= Q.B
WHERE A AND B ARE TWO GIVEN REAL MATRICES.
F. HSH2ROW3:
THIS PROCEDURE CALCULATES A HOUSEHOLDER MATRIX
Z SUCH THAT BY POSTMULTIPLYING A GIVEN ROWVECTOR
V BY Z A ZERO ELEMENT IS FORMED IN V.
HERE THE VECTOR V IS A ROW OF A MATRIX.
FURTHER: A:= A.Z; B:= B.Z AND X:= X.Z
WHERE A,B,X ARE THREE GIVEN REAL MATRICES.
G. HSH2ROW2:
SEE HSH2ROW3, BUT HERE THE MATRIX X HAS BEEN LEFT OUT.
H. HSH3ROW3:
THIS PROCEDURE CALCULATES A HOUSEHOLDER MATRIX
Z SUCH THAT BY POSTMULTIPLYING A GIVEN ROWVECTOR
V BY Z, TWO SUCCESSIVE ZERO ELEMENTS ARE FORMED
IN V. HERE THE VECTOR V IS A ROW OF A MATRIX.
FURTHER: A:= A.Z; B:= B.Z AND X:= X.Z
WHERE A,B AND X ARE THREE GIVEN REAL MATRICES.
I: HSH3ROW2:
SEE HSH3ROW3, BUT HERE THE MATRIX X HAS BEEN LEFT OUT.
KEYWORDS:
HOUSEHOLDER'S TRANSFORMATION,
GENERALIZED EIGENVALUES,
GENERALIZED EIGENVECTORS,
UPPER HESSENBERG MATRIX,
UPPER TRIANGULAR MATRIX.
REFERENCES:
[1]. C.B. MOLER AND G.W. STEWART.
AN ALGORITHM FOR THE GENERALIZED MATRIX EIGENVALUE
PROBLEM A * X = LAMBDA * B * X.
REPORT STANFORD UNIVERSITY
STAN-CS-232-71;
1SECTION : 3.4.1.2 (FEBRUARY 1979) PAGE 3
SUBSECTION: QZIVAL
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE IS:
"PROCEDURE" QZIVAL(N,A,B,ALFR,ALFI,BETA,ITER,EM);
"VALUE" N; "INTEGER" N; "ARRAY" A,B,ALFR,ALFI,BETA,EM;
"INTEGER" "ARRAY" ITER;
"CODE" 34600;
THE MEANING OF THE FORMAL PARAMETERS IS:
N: <ARITHMETIC EXPRESSION>;
THE NUMBER OF ROWS AND COLUMNS OF THE MATRICES A,B
A: <ARRAY IDENTIFIER>;
"ARRAY" A[1:N,1:N];
ENTRY: THE GIVEN MATRIX;
EXIT: A QUASI UPPER-TRIANGULAR MATRIX
(SEE METHOD AND PERFORMANCE);
B: <ARRAY IDENTIFIER>;
"ARRAY" B[1:N,1:N];
ENTRY: THE GIVEN MATRIX;
EXIT: AN UPPER-TRIANGULAR MATRIX;
ALFR: <ARRAY IDENTIFIER>;
"ARRAY" ALFR[1:N];
EXIT : THE REAL PARTS OF ALFA[1:N]
(SEE METHOD AND PERFORMANCE);
ALFI: <ARRAY IDENTIFIER>;
"ARRAY" ALFI[1:N];
EXIT : THE IMAGINARY PARTS OF ALFA[1:N];
BETA: <ARRAY IDENTIFIER>;
"ARRAY" BETA[1:N];
EXIT : THE REAL SCALARS BETA[N]
ITER: <ARRAY IDENTIFIER>;
"INTEGER" "ARRAY" ITER[1:N];
TROUBLE INDICATOR AND ITERATION COUNTER;
IF ITER[1]=0 THEN NO TROUBLE IS SIGNALIZED,
FURTHER SEE METHOD AND PERFORMANCE;
EM: <ARRAY IDENTIFIER>;
"ARRAY" EM[0:1];
ENTRY: EM[0]: THE SMALLEST POSITIVE MACHINE NUMBER;
EM[1]: THE RELATIVE PRECISION OF ELEMENTS OF A AND B;
1SECTION : 3.4.1.2 (FEBRUARY 1979) PAGE 4
PROCEDURES USED:
TAMMAT = CP 34014
ELMCOL = CP 34023
HSHDECMUL = CP 34602
HESTGL2 = CP 34604
HSH2COL = CP 34605
HSH3COL = CP 34606
HSH2ROW2 = CP 34608
HSH3ROW2 = CP 34610
CHSH2 = CP 34611
HSHVECMAT = CP 31070
HSHVECTAM = CP 31073
REQUIRED CENTRAL MEMORY : HSHDECMUL DECLARES AN ARRAY OF N REALS.
RUNNING TIME: PROPORTIONAL TO N ** 3
METHOD AND PERFORMANCE;
THE PROCEDURE QZIVAL SOLVES THE GENERALIZED MATRIX
EIGENVALUE PROBLEM A * X = LAMBDA * B * X BY MEANS
OF QZ ITERATION (SEE REF[1]);
QZIVAL FINDS N PAIRS OF SCALARS (ALFA[M],BETA[M])
SUCH THAT BETA[M] * A - ALFA[M] * B IS SINGULAR.
THE EIGENVALUES OF A * X - LAMBDA * B * X CAN BE OBTAINED
BY DIVIDING ALFA[M] BY BETA[M],EXCEPT BETA[M] MIGHT BE ZERO.
IN THIS ALGORITHM ONLY UNITARY TRANSFORMATIONS ARE
APPLIED; A FORTIORI NO INVERSES ARE CALCULATED, SO
EITHER A OR B (OR BOTH) MAY BE SINGULAR.
BETA[M] IS REAL, ALFA[M] IS COMPLEX.
REAL AND IMAGINARY PARTS ARE GIVEN IN ALFR[M] AND ALFI[M].
THE OCCURRENCE OF COMPLEX PAIRS IS ALWAYS IN
SUCCESSIVE ELEMENTS, SUCH THAT ALFA[M]/BETA[M] AND
ALFA[M+1]/BETA[M+1] ARE COMPLEX CONJUGATE, BUT ALFA[M]
AND ALFA[M+1] ARE NOT NECESSARILY CONJUGATE.
ONLY REAL ARITHMETIC IS USED IN THE PROCEDURE.
IF A AND B WERE REDUCED TO TRIANGULAR FORM BY UNITARY
TRANSFORMATIONS,ALFA AND BETA WOULD BE THE DIAGONALS.
A AND B ARE ACTUALLY REDUCED TO QUASI-TRIANGULAR FORM HAVING ONLY
1-BY-1 AND 2-BY-2 BLOCKS ON THE DIAGONAL OF A.
IF ALFA[M] IS NOT REAL, THEN BETA[M] IS NOT ZERO.
ITER IS THE TROUBLE INDICATOR AND ITERATION COUNTER.
IF ITER[1]=0 THEN EVERYTHING IS O.K.
ITER[M] IS THE NUMBER OF ITERATIONS NEEDED FOR THE M-TH EIGENVALUE.
IF ITER[1] THROUGH ITER[M]= -1 THEN THE ITERATION FOR THE M-TH
EIGENVALUE DID NOT CONVERGE AND ALFA[1] THROUGH ALFA[M] AND BETA[1]
THROUGH BETA[M] ARE PROBABLY INACCURATE.
EXAMPLE OF USE:
"BEGIN" "ARRAY" A,B[1:4,1:4],ALFR,ALFI,BETA[1:4],EM[0:1];
"INTEGER" "ARRAY" ITER[1:4];"INTEGER" K,L;
A[1,1]:=2; A[1,2]:=3; A[1,3]:=-3; A[1,4]:=4;
1SECTION : 3.4.1.2 (JANUARY 1976) PAGE 5
A[2,1]:=1; A[2,2]:=-1; A[2,3]:=5; A[2,4]:=1;
A[3,1]:=0; A[3,2]:=2; A[3,3]:=6; A[3,4]:=8;
A[4,1]:=1; A[4,2]:=1; A[4,3]:=0; A[4,4]:=4;
B[1,1]:=1; B[1,2]:=5; B[1,3]:=9; B[1,4]:=0;
B[2,1]:=2; B[2,2]:=6; B[2,3]:=10; B[2,4]:=2;
B[3,1]:=3; B[3,2]:=7; B[3,3]:=11; B[3,4]:=-1;
B[4,1]:=4; B[4,2]:=8; B[4,3]:=12; B[4,4]:=3;
OUTPUT(61,"(""("A")",/,4(4(+ZDBB),/),/")",A);
OUTPUT(61,"(""("B")",/,4(4(+ZDBB),/),/")",B);
EM[0]:=DWARF;EM[1]:="-15;
QZIVAL(4,A,B,ALFR,ALFI,BETA,ITER,EM);
"FOR" K:=1 "STEP" 1 "UNTIL" 4 "DO"
OUTPUT(61,"(""("ITER[")",D,"("]=")",ZD,/")",K,ITER[K]);
OUTPUT(61,"(""("ALFA(REAL PART)")"8B,"("ALFA(IMAGINARY PART)")"
3B,"("BETA")",/")");
"FOR" K:=1 "STEP" 1 "UNTIL" 4 "DO"
OUTPUT(61,"("3(N),/")",ALFR[K],ALFI[K],BETA[K]);
OUTPUT(61,"("/"("LAMBDA(REAL PART)")"6B,
"("LAMBDA(IMAGINARY PART)")"/")");
"FOR" K:=1 "STEP" 1 "UNTIL" 4 "DO"
"BEGIN" "IF" BETA[K]=0 "THEN"
OUTPUT(61,"(""("INFINITE")"15B,"("INDEFINITE")"/,")")
"ELSE" OUTPUT(61,"("2(N),/")",ALFR[K]/BETA[K],ALFI[K]/BETA[K])
"END"
"END"
A
+2 +3 -3 +4
+1 -1 +5 +1
+0 +2 +6 +8
+1 +1 +0 +4
B
+1 +5 +9 +0
+2 +6 +10 +2
+3 +7 +11 -1
+4 +8 +12 +3
ITER[1]= 0
ITER[2]= 0
ITER[3]= 0
ITER[4]= 5
ALFA(REAL PART) ALFA(IMAGINARY PART) BETA
-4.4347115652167"+000 +0.0000000000000"+000 +0.0000000000000"+000
-5.7288406521003"+000 +0.0000000000000"+000 +2.8441121744896"+000
-8.6671777386054"-001 +2.7607904944916"+000 +8.7617886336960"+000
-4.7262205157527"-001 -1.5054617625576"+000 +4.7778119295757"+000
LAMBDA(REAL PART) LAMBDA(IMAGINARY PART)
INFINITE INDEFINITE
-2.0142808372628"+000 +0.0000000000000"+000
-9.8920187429234"-002 +3.1509439566644"-001
-9.8920187429236"-002 -3.1509439566645"-001
1SECTION : 3.4.1.2 (FEBRUARY 1979) PAGE 6
SUBSECTION: QZI
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE IS:
"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;
"CODE" 34601;
THE MEANING OF THE FORMAL PARAMETERS IS;
N: <ARITHMETIC EXPRESSION>;
THE NUMBER OF ROWS AND COLUMNS OF THE MATRICES A,B AND X;
A: <ARRAY IDENTIFIER>
"ARRAY" A[1:N,1:N];
ENTRY: THE GIVEN MATRIX A;
EXIT: A QUASI UPPER TRIANGULAR MATRIX;
(SEE METHOD AND PERFORMANCE);
B: <ARRAY IDENTIFIER>;
"ARRAY" B[1:N,1:N];
ENTRY: THE GIVEN MATRIX B;
EXIT: AN UPPER-TRIANGULAR MATRIX;
X: <ARRAY IDENTIFIER>;
"ARRAY" X[1:N,1:N];
ENTR: THE N*N UNIT MATRIX;
EXIT: THE MATRIX OF EIGENVECTORS,
THE EIGENVECTORS ARE STORED IN THE ARRAY X AS FOLLOWS:
IF ALFI[M]=0 THEN X[.,M] IS THE M-TH REAL EIGENVECTOR;
OTHERWISE, FOR EACH PAIR OF CONSECUTIVE COLUMNS
X[.,M] AND X[.,M+1] ARE THE REAL
AND IMAGINARY PARTS OF THE M-TH COMPLEX EIGENVECTOR.
X[.,M] AND -X[.,M+1] ARE THE REAL AND IMAGINARY PARTS
OF THE M+1 -ST COMPLEX EIGENVECTOR.
THE EIGENVECTORS ARE NORMALIZED SUCH THAT THE LARGEST
COMPONENT IS 1 OR 1 + 0 * I.
ALFR: <ARRAY IDENTIFIER>;
"ARRAY" ALFR[1:N];
EXIT: THE REAL PARTS OF ALFA[1:N];
ALFI: <ARRAY IDENTIFIER>;
"ARRAY" ALFI[1:N];
EXIT: THE IMAGINARY PARTS OF ALFA[1:N];
BETA: <ARRAY IDENTIFIER>;
"ARRAY" BETA[1:N];
ITER: <ARRAY IDENTIFIER>;
"INTEGER" "ARRAY" ITER[1:N];
TROUBLE INDICATOR AND ITERATION COUNTER;
IF ITER[1]=0 THEN NO TROUBLE IS SIGNALIZED,
FOR FURTHER INFORMATION SEE
METHOD AND PEFORMANCE OF PROCEDURE QZIVAL (THIS SECTION).
EM: <ARRAY IDENTIFIER>;
"ARRAY" EM[0:1];
ENTRY: EM[0]: THE SMALLEST POSITIVE MACHINE NUMBER;
EM[1]: THE RELATIVE PRECISION OF ELEMENTS OF A AND B;
1SECTION : 3.4.1.2 (FEBRUARY 1979) PAGE 7
PROCEDURES USED:
MATMAT = CP 34013
TAMMAT = CP 34014
ELMCOL = CP 34023
HSHDECMUL = CP 34602
HESTGL3 = CP 34603
HSH2COL = CP 34605
HSH2ROW3 = CP 34607
HSH3ROW3 = CP 34609
HSH3COL = CP 34606
CHSH2 = CP 34611
COMDIV = CP 34342
HSHVECMAT = CP 31070
HSHVECTAM = CP 31073
RUNNING TIME: PROPORTIONAL TO N ** 3;
REQUIRED CENTRAL MEMORY : HSHDECMUL DECLARES AN ARRAY OF N REALS.
METHOD AND PERFORMANCE;
THE PROCEDURE QZI APPLIES THE SAME METHOD AS QZIVAL.
EXAMPLE OF USE:
"BEGIN" "ARRAY" A,B,X[1:4,1:4],ALFR,ALFI,BETA[1:4],EM[0:1];
"INTEGER" "ARRAY" ITER[1:4];"INTEGER" K,L;
A[1,1]:=2; A[1,2]:=3; A[1,3]:=-3; A[1,4]:=4;
A[2,1]:=1; A[2,2]:=-1; A[2,3]:=5; A[2,4]:=1;
A[3,1]:=0; A[3,2]:=2; A[3,3]:=6; A[3,4]:=8;
A[4,1]:=1; A[4,2]:=1; A[4,3]:=0; A[4,4]:=4;
B[1,1]:=1; B[1,2]:=5; B[1,3]:=9; B[1,4]:=0;
B[2,1]:=2; B[2,2]:=6; B[2,3]:=10; B[2,4]:=2;
B[3,1]:=3; B[3,2]:=7; B[3,3]:=11; B[3,4]:=-1;
B[4,1]:=4; B[4,2]:=8; B[4,3]:=12; B[4,4]:=3;
"FOR" K:=1,2,3,4 "DO" "FOR" L:=1,2,3,4 "DO"
X[K,L]:="IF" K=L "THEN" 1 "ELSE" 0;
OUTPUT(61,"(""("A")",/,4(4(+ZDBB),/),/")",A);
OUTPUT(61,"(""("B")",/,4(4(+ZDBB),/),/")",B);
EM[0]:=1.0"-280;EM[1]:="-15;
QZI(4,A,B,X,ALFR,ALFI,BETA,ITER,EM);
1SECTION : 3.4.1.2 (JANUARY 1976) PAGE 8
"FOR" K:=1 "STEP" 1 "UNTIL" 4 "DO"
OUTPUT(61,"(""("ITER[")",D,"("]=")",ZD,/")",K,ITER[K]);
OUTPUT(61,"("/"("EIGENVECTORS")",/,4(4(+D.8D"+2D2B),/),/")",X);
OUTPUT(61,"(""("ALFA(REAL PART)")"8B,"("ALFA(IMAGINARY PART)")"
9B,"("BETA")",/")");
"FOR" K:=1 "STEP" 1 "UNTIL" 4 "DO"
OUTPUT(61,"("3(N),/")",ALFR[K],ALFI[K],BETA[K]);
OUTPUT(61,"("/"("LAMBDA(REAL PART)")"6B,
"("LAMBDA(IMAGINARY PART)")"/")");
"FOR" K:=1 "STEP" 1 "UNTIL" 4 "DO"
"BEGIN" "IF" BETA[K]=0 "THEN"
OUTPUT(61,"(""("INFINITE")"15B,"("INDEFINITE")"/")")
"ELSE"
OUTPUT(61,"("2(N),/")",ALFR[K]/BETA[K],ALFI[K]/BETA[K])
"END"
"END"
A
+2 +3 -3 +4
+1 -1 +5 +1
+0 +2 +6 +8
+1 +1 +0 +4
B
+1 +5 +9 +0
+2 +6 +10 +2
+3 +7 +11 -1
+4 +8 +12 +3
ITER[1]= 0
ITER[2]= 0
ITER[3]= 0
ITER[4]= 5
EIGENVECTORS
-5.00000000"-01 +1.00000000"+00 -6.29204867"-01 +6.52026261"-01
+1.00000000"+00 -3.82541766"-02 +1.00000000"+00 +0.00000000"+00
-5.00000000"-01 -3.04677732"-02 +1.65896051"-01 +1.09306265"-01
-4.35116786"-15 -7.63328122"-01 -5.84845537"-01 +1.77430910"-01
ALFA(REAL PART) ALFA(IMAGINARY PART) BETA
-4.4347115652167"+000 +0.0000000000000"+000 +0.0000000000000"+000
-5.7288406521003"+000 +0.0000000000000"+000 +2.8441121744896"+000
-8.6671777386054"-001 +2.7607904944916"+000 +8.7617886336960"+000
-4.7262205157527"-001 -1.5054617625576"+000 +4.7778119295757"+000
LAMBDA(REAL PART) LAMBDA(IMAGINARY PART)
INFINITE INDEFINITE
-2.0142808372628"+000 +0.0000000000000"+000
-9.8920187429234"-002 +3.1509439566644"-001
-9.8920187429236"-002 -3.1509439566645"-001
1SECTION : 3.4.1.2 (FEBRUARY 1979) PAGE 9
SUBSECTION: HSHDECMUL.
CALLING SEQUENCE:
THE HEADING OF THIS PROCEDURE IS:
"PROCEDURE" HSHDECMUL(N,A,B,DWARF);
"VALUE" N,DWARF; "INTEGER"N; "REAL"DWARF; "ARRAY" A,B;
"CODE" 34602;
THE MEANING OF THE FORMAL PARAMETERS IS:
N: <ARITHMETIC EXPRESSION>;
THE ORDER OF THE GIVEN MATRICES;
A: <ARRAY IDENTIFIER>;
"REAL" "ARRAY" A[1:N,1:N];
ENTRY: THE GIVEN MATRIX A;
EXIT: THE TRANSFORMED MATRIX Q.A (SEE BRIEF DESCRIPTION);
B: <ARRAY IDENTIFIER>;
"REAL" "ARRAY" B[1:N,1:N];
ENTRY: THE GIVEN MATRIX B;
EXIT: THE UPPER TRIANGULAR MATRIX Q.B (SEE BRIEF DESCRIPTION);
DWARF: < ARITHMETIC EXPRESSION>;
THE SMALLEST POSITIVE MACHINE NUMBER.
PROCEDURES USED:
TAMMAT = CP 34014;
HSHVECMAT = CP 31070.
REQUIRED CENTRAL MEMORY : AN ARRAY OF N REALS IS DECLARED.
METHOD AND PERFORMANCE:
FOR EACH MATRIX COLUMN A[I] A HOUSEHOLDERMATRIX Q IS FORMED,
SUCH THAT Q.A[I] HAS ONLY ZERO ELEMENTS BELOW THE DIAGONAL ELEMENT.
WHEN SUCCESSIVELY FOR I = 1,2,....,N-1 THESE TRANSFORMATIONS HAVE
BEEN PERFORMED,THE MATRIX A HAS BEEN CHANGED INTO AN UPPER
TRIANGULAR MATRIX.
THE SAME TRANSFORMATIONS ARE PERFORMED ON THE MATRIX B
EXAMPLE OF USE:
THE PROCEDURE HSHDECMUL IS USED IN QZI AND QZIVAL (THIS SECTION).
1SECTION : 3.4.1.2 (FEBRUARY 1979) PAGE 10
SUBSECTION: HESTGL3:
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE IS:
"PROCEDURE" HESTGL3(N,A,B,X);
"VALUE" N; "INTEGER" N; "ARRAY" A,B,X;
"CODE" 34603;
THE MEANING OF THE FORMAL PARAMETERS IS:
N: <ARITHMETIC EXPRESSION>;
THE ORDER OF THE GIVEN MATRICES;
A: <ARRAY IDENTIFIER>;
"ARRAY" A[1:N,1:N];
ENTRY: THE GIVEN MATRIX A;
EXIT: THE UPPER HESSENBERG MATRIX Q.A.Z (SEE BRIEF DESCRIPTION);
B: <ARRAY IDENTIFIER>;
"ARRAY" B[1:N,1:N];
ENTRY: THE GIVEN UPPER TRIANGULAR MATRIX B;
EXIT: THE UPPER TRIANGULAR MATRIX Q.B.Z (SEE BRIEF DESCRIPTION);
X: <ARRAY IDENTIFIER>;
"ARRAY" X[1:N,1:N];
ENTRY: THE GIVEN MATRIX X;
EXIT: THE TRANSFORMED MATRIX Q.X.Z (SEE BRIEF DESCRIPTION);
PROCEDURES USED:
HSH2COL = CP 34605
HSH2ROW3 = CP 34607
METHODE AND PERFORMANCE:
THE REDUCTION OF THE MATRIX A TO UPPER HESSENBERG FORM
WHILE PRESERVING THE TRIANGULARITY OF THE MATRIX B
IS THE RESULT OF A NUMBER OF STEPS, WHICH DO THE FOLLOWING
ACTIONS: INTRODUCING A ZERO ELEMENT IN A AND RESTORING
THE DISTURBED ZERO IN B, WITHOUT DISTURBING THE ZERO
INTRODUCED IN A. THIS IS DONE BY PRE-AND POSTMULTIPLICATIONS OF
HOUSEHOLDER MATRICES.
THE MATRIX X SHARES THE TRANSFORMATION.
FOR FURTHER DETAILS SEE [1]
EXAMPLE OF USE:
THE PROCEDURE HESTGL3 IS USED IN QZI (THIS SECTION).
1SECTION : 3.4.1.2 (FEBRUARY 1979) PAGE 11
SUBSECTION: HESTGL2:
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE IS:
"PROCEDURE" HESTGL2(N,A,B); "VALUE" N; "INTEGER" N; "ARRAY" A,B;
"CODE" 34604;
THE MEANING OF THE FORMAL PARAMETERS IS:
N: <ARITHMETIC EXPRESSION>;
THE ORDER OF THE GIVEN MATRICES;
A: <ARRAY IDENTIFIER>;
"ARRAY" A[1:N,1:N];
ENTRY: THE GIVEN MATRIX A;
EXIT: THE UPPER HESSENBERG MATRIX Q.A.Z (SEE BRIEF DESCRIPTION);
B: <ARRAY IDENTIFIER>;
"ARRAY" B[1:N,1:N];
ENTRY: THE GIVEN UPPER TRIANGULAR MATRIX B
EXIT: THE UPPER TRIANGULAR MATRIX Q.B.Z (SEE BRIEF DESCRIPTION);
PROCEDURES USED:
HSH2COL = CP 34605
HSH2ROW2 = CP 34608
METHODE AND PERFORMANCE:
SEE HESTGL3, BUT HERE THE MATRIX X HAS BEEN LEFT OUT.
EXAMPLE OF USE:
THE PROCEDURE HESTGL2 IS USED IN QZIVAL (THIS SECTION).
1SECTION : 3.4.1.2 (FEBRUARY 1979) PAGE 12
SUBSECTION HSH2COL:
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE IS:
"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;
"CODE" 34605;
THE MEANING OF THE FORMAL PARAMETERS IS:
LA: <ARITHMETIC EXPRESSION>;
THE LOWER BOUND OF THE RUNNING COLUMN SUBSCRIPT OF A;
LB: <ARITHMETIC EXPRESSION>;
THE LOWER BOUND OF THE RUNNING COLUMN SUBSCRIPT OF B;
U: <ARITHMETIC EXPRESSION>;
THE UPPER BOUND OF THE RUNNING COLUMN SUBSCRIPTS
OF A AND B.
I: <ARITHMETIC EXPRESSION>;
THE LOWERBOUND OF THE RUNNING ROW SUBSCRIPTS OF A AND B.
I+1 IS THE UPPERBOUND.
A1: <ARITHMETIC EXPRESSION>;
THE I-TH COMPONENT OF THE VECTOR TO BE TRANSFORMED.
A2: <ARITHMETIC EXPRESSION>;
THE (I+1)-TH COMPONENT OF THE VECTOR TO BE TRANSFORMED;
A: <ARRAY IDENTIFIER>;
"ARRAY" A[I:I+1,LA:U];
ENTRY THE GIVEN MATRIX A;
EXIT: THE TRANSFORMED MATRIX Q.A (SEE BRIEF DESCRIPTION);
B: <ARRAY IDENTIFIER>;
"ARRAY" B[I:I+1,LB:U];
ENTRY: THE GIVEN MATRIX B;
EXIT: THE TRANSFORMED MATRIX Q.B (SEE BRIEF DESCRIPTION);
PROCEDURES USED:
HSHVECMAT = CP 31070
METHOD AND PERFORMANCE:
WHEN THE CALCULATED HOUSEHOLDER MATRIX Q PREMULTIPLIES
A MATRIX M, ONLY ROWS I AND I+1 ARE CHANGED.
IF THE ELEMENTS I AND I+1 IN A COLUMN OF M ARE ZERO, THEY
REMAIN ZERO IN Q.M.
THEREFORE ONLY THE SUBMATRICES A[I:I+1,LA:U] AND
B[I:I+1,LB:U] ARE CHANGED, WHERE Q.A AND Q.B ARE
OVERWRITTEN IN A RESP B.
EXAMPLE OF USE: THE PROCEDURE HSH2COL IS USED IN QZI AND QZIVAL,
(THIS SECTION).
1SECTION : 3.4.1.2 (FEBRUARY 1979) PAGE 13
SUBSECTION HSH3COL:
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE IS:
"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;
"CODE" 34606;
THE MEANING OF THE FORMAL PARAMETERS IS:
LA: <ARITHMETIC EXPRESSION>;
THE LOWERBOUND OF THE RUNNING COLUMN SUBSCRIPT OF A;
LB: <ARITHMETIC EXPRESSION>;
THE LOWERBOUND OF THE RUNNING COLUMN SUBSCRIPT OF B;
U: <ARITHMETIC EXPRESSION>;
THE UPPERBOUND OF THE RUNNING COLUMN SUBSCRIPT OF A AND B;
I: <ARITHMETIC EXPRESSION>;
THE LOWERBOUND OF THE RUNNING ROW SUBSCRIPT OF A AND B,
I+2 IS THE UPPERBOUND;
A1: <ARITHMETIC EXPRESSION>;
THE I-TH COMPONENT OF THE VECTOR TO BE TRANSFORMED;
A2: <ARITHMETIC EXPRESSION>;
THE (I+1)-TH COMPONENT OF THE VECTOR TO BE TRANSFORMED;
A3: <ARITHMETIC EXPRESSION>;
THE (I+2)-TH COMPONENT OF THE VECTOR TO BE TRANSFORMED.
A: <ARRAY IDENTIFIER>;
"ARRAY" A[I:I+2,LA:U];
ENTRY: THE GIVEN MATRIX A;
EXIT: THE TRANSFORMED MATRIX Q.A (SEE BRIEF DESCRIPTION);
B: <ARRAY IDENTIFIER>;
"ARRAY" B[I:I+2,LB:U];
ENTRY: THE GIVEN MATRIX B;
EXIT: THE TRANSFORMED MATRIX Q.B (SEE BRIEF DESCRIPTION);
PROCEDURES USED: HSHVECMAT = CP 31070;
METHOD AND PERFORMANCE:
WHEN THE CALCULATED HOUSEHOLDER MATRIX Q PREMULTIPLIES A MATRIX
M, ONLY ROWS I, (I+1) AND (I+2) ARE CHANGED.
IF THE ELEMENTS I, I+1 AND I+2 ARE ZERO, THEN THEY REMAIN ZERO
IN Q.M.
THEREFORE ONLY THE SUBMATRICES A[I:I+2,LA:U] AND B[I:I+2,LB:U]
ARE CHANGED, WHERE Q.A AND Q.B ARE OVERWRITTEN IN A RESP B.
EXAMPLE OF USE: THE PROCEDURE HSH3COL IS USED IN QZI AND QZIVAL
(THIS SECTION).
1SECTION : 3.4.1.2 (FEBRUARY 1979) PAGE 14
SUBSECTION HSH2ROW3:
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE IS:
"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;
"CODE" 34607;
THE MEANING OF THE FORMAL PARAMETERS IS:
L: <ARITHMETIC EXPRESSION>;
THE LOWERBOUND OF THE RUNNING ROW SUBSCRIPT OF A,B AND X;
UA: <ARITHMETIC EXPRESSION>;
THE UPPERBOUND OF THE RUNNING ROW SUBSCRIPT OF A;
UB: <ARITHMETIC EXPRESSION>;
THE UPPERBOUND OF THE RUNNING ROW SUBSCRIPT OF B;
UX: <ARITHMETIC EXPRESSION>;
THE UPPERBOUND OF THE RUNNING ROW SUBSCRIPT OF X;
J: <ARITHMETIC EXPRESSION>;
THE LOWERBOUND OF THE RUNNING COLUMN SUBSCRIPT OF A,B AND X;
J+1 IS THE UPPERBOUND;
A1: <ARITHMETIC EXPRESSION>;
THE J-TH COMPONENT OF THE VECTOR TO BE TRANSFORMED;
A2: <ARITHMETIC EXPRESSION>;
THE (J+1)-TH COMPONENT OF THE VECTOR TO BE TRANSFORMED;
A: <ARRAY IDENTIFIER>;
"ARRAY" A[L:UA,J:J+1];
ENTRY: THE GIVEN MATRIX A;
EXIT: THE TRANSFORMED MATRIX A.Z (SEE BRIEF DESCRIPTION);
B: <ARRAY IDENTIFIER>;
"ARRAY" B[L:UB,J:J+1];
ENTRY: THE GIVEN MATRIX B;
EXIT: THE TRANSFORMED MATRIX B.Z (SEE BRIEF DESCRIPTION);
X: <ARRAY IDENTIFIER>;
"ARRAY" X[L:UX,J:J+1];
ENTRY: THE GIVEN MATRIX X;
EXIT: THE TRANSFORMED MATRIX X.Z (SEE BRIEF DESCRIPTION);
PROCEDURES USED: HSHVECTAM = CP 31073;
METHOD AND PERFORMANCE:
WHEN THE CALCULATED HOUSEHOLDER MATRIX Z POSTMULTIPLIES
A MATRIX M, ONLY COLUMNS J AND J+1 ARE CHANGED.
IF THE ELEMENTS J AND J+1 IN A ROW OF M ARE ZERO, THEN
THEY REMAIN ZERO IN M.Z
THEREFORE ONLY THE SUBMATRICES A[L:UA,J:J+1],B[L:UB,J:J+1]
AND X[L:UX,J:J+1] ARE CHANGED, WHERE A.Z, B.Z AND X.Z ARE
OVERWRITTEN IN RESP. A,B AND X.
EXAMPLE OF USE: THE PROCEDURE HSH2ROW3 IS USED IN QZI (THIS SECTION).
1SECTION : 3.4.1.2 (FEBRUARY 1979) PAGE 15
SUBSECTION HSH2ROW2:
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE IS:
"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;
"CODE" 34608;
THE MEANING OF THE FORMAL PARAMETERS IS:
LA: <ARITHMETIC EXPRESSION>;
THE LOWERBOUND OF THE RUNNING ROW SUBSCRIPT OF A;
LB: <ARITHMETIC EXPRESSION>;
THE LOWERBOUND OF THE RUNNING ROW SUBSCRIPT OF B;
UA: <ARITHMETIC EXPRESSION>;
THE UPPERBOUND OF THE RUNNING ROW SUBSCRIPT OF A;
UB: <ARITHMETIC EXPRESSION>;
THE UPPERBOUND OF THE RUNNING ROW SUBSCRIPT OF B;
J: <ARITHMETIC EXPRESSION>;
THE LOWERBOUND OF THE RUNNING COLUMN SUBSCRIPT OF A AND B;
J+1 IS THE UPPERBOUND;
A1: < ARITHMETIC EXPRESSION>;
THE J-TH COMPONENT OF THE VECTOR TO BE TRANSFORMED;
A2: <ARITHMETIC EXPRESSION>;
THE (J+1)-TH COMPONENT OF THE VECTOR TO BE TRANSFORMED;
A: <ARRAY IDENTIFIER>;
"REAL" "ARRAY" A[LA:UA,J:J+1];
ENTRY: THE GIVEN MATRIX A;
EXIT: THE TRANSFORMED MATRIX A.Z (SEE BRIEF DESCRIPTION);
B: <ARRAY IDENTIFIER>;
"REAL" "ARRAY" B[LB:UB,J:J+1];
ENTRY: THE GIVEN MATRIX B;
EXIT: THE TRANSFORMED MATRIX B.Z (SEE BRIEF DESCRIPTION);
PROCEDURES USED: HSHVECTAM = CP 31073;
METHOD AND PERFORMANCE:
SEE HSH2ROW3, BUT HERE THE MATRIX X HAS BEEN LEFT OUT.
EXAMPLE OF USE:
THE PROCEDURE HSH2ROW2 IS USED IN QZIVAL,
(THIS SECTION).
1SECTION : 3.4.1.2 (FEBRUARY 1979) PAGE 16
SUBSECTION: HSH3ROW3.
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE IS:
"PROCEDURE" HSH3ROW3(L,U,UX,J,A1,A2,A3,A,B,X);
"VALUE" L,U,UX,J,A1,A2,A3; "INTEGER" L,U,UX,J; "REAL" A1,A2,A3;
"ARRAY" A,B,X;
"CODE" 34609;
THE MEANING OF THE FORMAL PARAMETERS IS:
L: <ARITHMETIC EXPRESSION>;
THE LOWERBOUND OF THE RUNNING ROW SUBSCRIPT OF A AND B AND X;
U: <ARITHMETIC EXPRESSION>;
THE UPPERBOUND OF THE RUNNING ROW SUBSCRIPT OF A AND B;
UX: <ARITHMETIC EXPRESSION>;
THE UPPERBOUND OF THE RUNNING ROW SUBSCRIPT OF X;
J: <ARITHMETIC EXPRESSION>;
THE LOWERBOUND OF THE RUNNING COLUMN SUBSCRIPT OF A,B AND X;
J+2 IS THE UPPERBOUND;
A1: <ARITHMETIC EXPRESSION>;
THE J-TH COMPONENT OF THE VECTOR TO BE TRANSFORMED;
A2: <ARITHMETIC EXPRESSION>;
THE (J+1)-TH COMPONENT OF THE VECTOR TO BE TRANSFORMED;
A3: <ARITHMETIC EXPRESSION>;
THE (J+2)-TH COMPONENT OF THE VECTOR TO BE TRANSFORMED;
A: <ARRAY IDENTIFIER>;
"REAL" "ARRAY" A[L:U,J:J+2];
ENTRY: THE GIVEN MATRIX A;
EXIT: THE TRANSFORMED MATRIX A.Z (SEE BRIEF DESCRIPTION);
B: <ARRAY IDENTIFIER>;
"REAL" "ARRAY" B[L:U,J:J+2];
ENTRY: THE GIVEN MATRIX B;
EXIT: THE TRANSFORMED MATRIX B.Z (SEE BRIEF DESCRIPTION);
X: <ARRAY IDENTIFIER>;
"REAL" "ARRAY" X[L:UX,J:J+2];
ENTRY: THE GIVEN MATRIX X;
EXIT: THE TRANSFORMED MATRIX X.Z (SEE BRIEF DESCRIPTION);
PROCEDURES USED: HSHVECTAM = CP 31073;
METHOD AND PERFORMANCE:
WHEN THE CALCULATED HOUSEHOLDER MATRIX Z POSTMULTIPLIES A MATRIX M,
ONLY COLUMNS J,J+1 AND J+2 ARE CHANGED.
IF THE ELEMENTS J, J+1 AND J+2 IN A ROW OF M ARE ZERO, THEN THEY
REMAIN ZERO IN M.Z.
THEREFORE ONLY THE SUBMATRICES A[L:U,J:J+2], B[L:U,J:J+2] AND
X[L:UX,J:J+2] ARE CHANGED, WHERE A.Z , B.Z AND X.Z ARE OVERWRITTEN
ON RESP. A,B AND X;
EXAMPLE OF USE: THE PROCEDURE HSH3ROW3 IS USED IN QZI (THIS SECTION).
1SECTION : 3.4.1.2 (FEBRUARY 1979) PAGE 17
SUBSECTION: HSH3ROW2.
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE IS:
"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;
"CODE" 34610;
THE MEANING OF THE FORMAL PARAMETERS IS:
LA: <ARITHMETIC EXPRESSION>;
THE LOWERBOUND OF THE RUNNING ROW SUBSCRIPT OF A;
LB: <ARITHMETIC EXPRESSION>;
THE LOWERBOUND OF THE RUNNING ROW SUBSCRIPT OF B;
U: <ARITHMETIC EXPRESSION>;
THE UPPERBOUND OF THE RUNNING ROW SUBSCRIPT OF A AND B;
J: <ARITHMETIC EXPRESSION>;
THE LOWERBOUND OF THE RUNNING COLUMN SUBSCRIPT OF A AND B,
J+2 IS THE UPPERBOUND;
A1: <ARITHMETIC EXPRESSION>;
THE J-TH COMPONENT OF THE VECTOR TO BE TRANSFORMED;
A2: <ARITHMETIC EXPRESSION>;
THE (J+1)-TH COMPONENT OF THE VECTOR TO BE TRANSFORMED;
A3: <ARITHMETIC EXPRESSION>;
THE (J+2)-TH COMPONENT OF THE VECTOR TO BE TRANSFORMED;
A: <ARRAY IDENTIFIER>;
"REAL" "ARRAY" A[LA:U,J:J+2];
ENTRY: THE GIVEN MATRIX A;
EXIT: THE TRANSFORMED MATRIX A.Z (SEE BRIEF DESCRIPTION);
B: <ARRAY IDENTIFIER>;
"REAL" "ARRAY" B[LB:U,J:J+2];
ENTRY: THE GIVEN MATRIX B;
EXIT: THE TRANSFORMED MATRIX B.Z (SEE BRIEF DESCRIPTION);
PROCEDURES USED: HSHVECTAM = CP 31073;
METHOD AND PERFORMANCE:
SEE HSH3ROW3, BUT HERE THE MATRIX X HAS BEEN LEFT OUT.
EXAMPLE OF USE: HSH3ROW2 IS USED IN QZIVAL (THIS SECTION).
1SECTION : 3.4.1.2 (JANUARY 1979) PAGE 18
SOURCE TEXTS:
0"CODE" 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" 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"AND"ABS(A[M-1,M-2])>=CONST*OLD2;
"IF" ITER[M]>30"AND"STATIONARY "THEN"
"BEGIN" "FOR" I:=1 "STEP" 1 "UNTIL" M "DO" ITER[I]:=-1;
"GOTO" OUT
"END";
"IF" ITER[M]=10"AND"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];
"COMMENT"
1SECTION : 3.4.1.2 (JANUARY 1976) PAGE 19
;
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,M,K,A10,A20,A30,A,B) "ELSE"
"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"
"END";
OUT:
"END" QZIT;
"PROCEDURE" QZVAL(N,A,B,EPSA,EPSB,ALFR,ALFI,BETA);"VALUE" N;
"REAL" EPSA,EPSB;"INTEGER" N;"ARRAY" ALFR,ALFI,BETA,A,B;
"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;HSH2ROW2(1,1,M,M,L,A[M,M],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"
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;
"COMMENT"
1SECTION : 3.4.1.2 (JANUARY 1976) PAGE 20
;
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"
HSH2ROW2(1,1,M,M,L,A12,A11,A,B)"ELSE"
HSH2ROW2(1,1,M,M,L,A22,A21,A,B);
"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;
DWARF:=EM[0];EPS:=EM[1];
HSHDECMUL(N,A,B,DWARF);
HESTGL2(N,A,B);
QZIT(N,A,B,EPS,EPSA,EPSB,ITER);
QZVAL(N,A,B,EPSA,EPSB,ALFR,ALFI,BETA);
"END" QZIVAL
1SECTION : 3.4.1.2 (JANUARY 1976) PAGE 21
;
"EOP"
0"CODE" 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;
"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"AND"ABS(A[M-1,M-2])>=CONST*OLD2;
"IF" ITER[M]>30"AND"STATIONARY "THEN"
"BEGIN" "FOR" I:=1 "STEP" 1 "UNTIL" M "DO" ITER[I]:=-1;
"GOTO" OUT
"END";
"IF" ITER[M]=10"AND"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];
"COMMENT"
1SECTION : 3.4.1.2 (JANUARY 1976) PAGE 22
;
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]);
"COMMENT"
1SECTION : 3.4.1.2 (FEBRUARY 1979) PAGE 23
;
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
1SECTION : 3.4.1.2 (JANUARY 1976) PAGE 24
;
"PROCEDURE" QZVEC(N,A,B,X,EPSA,EPSB,ALFR,ALFI,BETA);"VALUE"N,EPSA,EPSB;
"INTEGER" N;"REAL" EPSA,EPSB;"ARRAY" A,B,ALFR,ALFI,BETA,X;
"BEGIN""INTEGER" M,MR,MI,L,L1,J,K;"REAL" BETM,ALFM,SL,SK,D,TKK,TKL,TLK,
TLL,ALMI,ALMR,TR,TI,SLR,SLI,SKR,SKI,DR,DI,TKKR,TKKI,TKLR,TKLI,TLKR,
TLKI,TLLR,TLLI,S,R;
"FOR" M:=N "STEP" -1 "UNTIL" 1 "DO"
"IF" ALFI[M]=0 "THEN"
"BEGIN" "COMMENT" M-TH REAL VECTOR;
ALFM:=ALFR[M];BETM:=BETA[M];B[M,M]:=1;L1:=M;
"FOR" L:=M-1 "STEP" -1 "UNTIL" 1 "DO"
"BEGIN" SL:=0;
"FOR" J:=L1 "STEP" 1 "UNTIL" M "DO"
SL:=SL+(BETM*A[L,J]-ALFM*B[L,J])*B[J,M];
"IF"("IF"L^=1"THEN"BETM*A[L,L-1]=0"ELSE""TRUE")"THEN"
"BEGIN""COMMENT" 1-1 BLOCK;
D:=BETM*A[L,L]-ALFM*B[L,L];
"IF" D=0 "THEN" D:=(EPSA+EPSB)/2;B[L,M]:=-SL/D
"END""ELSE"
"BEGIN" "COMMENT" 2-2 BLOCK;K:=L-1;SK:=0;
"FOR"J:=L1 "STEP" 1 "UNTIL" M "DO"
SK:=SK+(BETM*A[K,J]-ALFM*B[K,J])*B[J,M];
TKK:=BETM*A[K,K]-ALFM*B[K,K];
TKL:=BETM*A[K,L]-ALFM*B[K,L];
TLK:=BETM*A[L,K];
TLL:=BETM*A[L,L]-ALFM*B[L,L];
D:=TKK*TLL-TKL*TLK;"IF" D=0 "THEN" D:=(EPSA+EPSB)/2;
B[L,M]:=(TLK*SK-TKK*SL)/D;
B[K,M]:="IF"ABS(TKK)>=ABS(TLK)"THEN"-(SK+TKL*B[L,M])/TKK
"ELSE" -(SL+TLL*B[L,M])/TLK;L:=L-1
"END";L1:=L
"END"
"END""ELSE"
"BEGIN" "COMMENT" COMPLEX VECTOR;
ALMR:=ALFR[M-1];ALMI:=ALFI[M-1];BETM:=BETA[M-1];MR:=M-1;MI:=M;
B[M-1,MR]:=ALMI*B[M,M]/(BETM*A[M,M-1]);
B[M-1,MI]:=(BETM*A[M,M]-ALMR*B[M,M])/(BETM*A[M,M-1]);
B[M,MR]:=0;B[M,MI]:=-1;L1:=M-1;
"FOR" L:=M-2 "STEP" -1 "UNTIL" 1 "DO"
"BEGIN" SLR:=SLI:=0;
"FOR" J:=L1 "STEP" 1 "UNTIL" M "DO"
"BEGIN" TR:=BETM*A[L,J]-ALMR*B[L,J];
TI:=-ALMI*B[L,J];
SLR:=SLR+TR*B[J,MR]-TI*B[J,MI];
SLI:=SLI+TR*B[J,MI]+TI*B[J,MR]
"END";
"COMMENT"
1SECTION : 3.4.1.2 (JANUARY 1976) PAGE 25
;
"IF"("IF"L^=1"THEN"BETM*A[L,L-1]=0"ELSE""TRUE")"THEN"
"BEGIN"DR:=BETM*A[L,L]-ALMR*B[L,L];
DI:=-ALMI*B[L,L];
COMDIV(-SLR,-SLI,DR,DI,B[L,MR],B[L,MI]);
"END""ELSE"
"BEGIN" K:=L-1;SKR:=SKI:=0;
"FOR" J:=L1 "STEP" 1 "UNTIL" M "DO"
"BEGIN" TR:=BETM*A[K,J]-ALMR*B[K,J];
TI:=-ALMI*B[K,J];
SKR:=SKR+TR*B[J,MR]-TI*B[J,MI];
SKI:=SKI+TR*B[J,MI]+TI*B[J,MR]
"END";
TKKR:=BETM*A[K,K]-ALMR*B[K,K];
TKKI:=-ALMI*B[K,K];
TKLR:=BETM*A[K,L]-ALMR*B[K,L];
TKLI:=-ALMI*B[K,L];
TLKR:=BETM*A[L,K];TLKI:=0;
TLLR:=BETM*A[L,L]-ALMR*B[L,L];
TLLI:=-ALMI*B[L,L];
DR:=TKKR*TLLR-TKKI*TLLI-TKLR*TLKR;
DI:=TKKR*TLLI+TKKI*TLLR-TKLI*TLKR;
"IF"DR=0"AND"DI=0"THEN"DR:=(EPSA+EPSB)/2;
COMDIV(TLKR*SKR-TKKR*SLR+TKKI*SLI,TLKR*SKI-TKKR*SLI-
TKKI*SLR,DR,DI,B[L,MR],B[L,MI]);
"IF"ABS(TKKR)+ABS(TKKI)>=ABS(TLKR)"THEN"
COMDIV(-SKR-TKLR*B[L,MR]+TKLI*B[L,MI],-SKI-TKLR*B[L,MI]
-TKLI*B[L,MR],TKKR,TKKI,B[K,MR],B[K,MI])"ELSE"
COMDIV(-SLR-TLLR*B[L,MR]+TLLI*B[L,MI],-SLI-TLLR*B[L,MI]
-TLLI*B[L,MR],TLKR,TLKI,B[K,MR],B[K,MI]);L:=L-1
"END";L1:=L
"END";M:=M-1
"END";
"FOR" M:=N "STEP" -1 "UNTIL" 1 "DO"
"FOR" K:=1 "STEP" 1 "UNTIL" N "DO"
X[K,M]:=MATMAT(1,M,K,M,X,B);
"FOR" M:=N "STEP" -1 "UNTIL" 1 "DO"
"BEGIN" S:=0;"IF" ALFI[M]=0 "THEN"
"BEGIN" "FOR" K:=1 "STEP" 1 "UNTIL" N "DO"
"BEGIN" R:=ABS(X[K,M]);
"IF" R>=S "THEN""BEGIN" S:=R;D:=X[K,M] "END"
"END";"FOR" K:=1 "STEP" 1 "UNTIL" N "DO"
X[K,M]:=X[K,M]/D
"END""ELSE"
"BEGIN" "FOR" K:=1 "STEP" 1 "UNTIL" N "DO"
"BEGIN" R:=ABS(X[K,M-1])+ABS(X[K,M]);
R:=R*SQRT((X[K,M-1]/R)**2+(X[K,M]/R)**2);
"IF" R>=S"THEN"
"BEGIN" S:=R;DR:=X[K,M-1];DI:=X[K,M] "END"
"END";"FOR" K:=1 "STEP" 1 "UNTIL" N "DO"
COMDIV(X[K,M-1],X[K,M],DR,DI,X[K,M-1],X[K,M]);M:=M-1
"END"
"END"
"END" QZVEC;
"COMMENT"
1SECTION : 3.4.1.2 (JANUARY 1976) PAGE 26
;
DWARF:=EM[0];EPS:=EM[1];
HSHDECMUL(N,A,B,DWARF);
HESTGL3(N,A,B,X);
QZIT(N,A,B,X,EPS,EPSA,EPSB,ITER);
QZVAL(N,A,B,X,EPSA,EPSB,ALFR,ALFI,BETA);
QZVEC(N,A,B,X,EPSA,EPSB,ALFR,ALFI,BETA)
"END" QZI;
"EOP"
0"CODE" 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;
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;
"EOP"
0"CODE" 34603;
"PROCEDURE" HESTGL3(N,A,B,X);"VALUE" N;"INTEGER" N;"ARRAY" A,B,X;
"BEGIN" "INTEGER" NM1,K,L,K1,L1;
"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
1SECTION : 3.4.1.2 (JANUARY 1976) PAGE 27
;
"EOP"
0"CODE" 34604;
"PROCEDURE" HESTGL2(N,A,B);"VALUE" N;"INTEGER" N;"ARRAY" A,B;
"BEGIN" "INTEGER" NM1,K,L,K1,L1;
"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;
"EOP"
0"CODE" 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];
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;
"EOP"
0"CODE" 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 "OR" A3^=0 "THEN"
"BEGIN" "REAL" R,T,C;"ARRAY" V[I:I+2];
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
1SECTION : 3.4.1.2 (JANUARY 1976) PAGE 28
;
"EOP"
0"CODE" 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];
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;
"EOP"
0"CODE" 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];
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;
"EOP"
0"CODE" 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 "OR" A3^=0 "THEN"
"BEGIN" "REAL" R,T,C;"ARRAY" V[J:J+2];"INTEGER" K;
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;
"EOP"
0"CODE" 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 "OR" A3^=0 "THEN"
"BEGIN" "REAL" R,T,C;"ARRAY" V[J:J+2];
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;
"EOP"
1SECTION : 3.5.1.1 (DECEMBER 1975) PAGE 1
AUTHORS : G.H.GOLUB AND C.REINSCH
CONTRIBUTOR : D.T.WINTER
INSTITUTE : MATHEMATICAL CENTRE
RECEIVED : 731217
BRIEF DESCRIPTION :
THIS SECTION CONTAINS TWO PROCEDURES, QRISNGVALBID AND
QRISNGVALDECBID. BOTH PROCEDURES CALCULATE THE SINGULAR VALUES OF A
BIDIAGONAL MATRIX. MOREOVER, THE SECOND PROCEDURE CALCULATES THE
THE SINGULAR VALUES DECOMPOSITION OF A FULL MATRIX OF WHICH THE
BIDIAGONAL AND THE PRE- AND POSTMULTIPLYING MATRICES, AS CALCULATED
BY HSHREABID ARE GIVEN.
KEYWORDS :
SINGULAR VALUES
QR ITERATION
BIDIAGONAL MATRICES
1SECTION : 3.5.1.1 (DECEMBER 1975) PAGE 2
SUBSECTION : QRISNGVALBID
CALLING SEQUENCE :
THE HEADING OF THE PROCEDURE IS :
"INTEGER" "PROCEDURE" QRISNGVALBID(D, B, N, EM);
"VALUE" N; "INTEGER" N; "ARRAY" D, B, EM;
"CODE" 34270;
THE MEANING OF THE FORMAL PARAMETERS IS:
D: <ARRAY IDENTIFIER>;
"ARRAY" D[1:N];
ENTRY: THE DIAGONAL OF THE BIDIAGONAL MATRIX;
EXIT: THE SINGULAR VALUES;
B: <ARRAY IDENTIFIER>;
"ARRAY" B[1:N];
ENTRY: THE SUPER DIAGONAL OF THE BIDIAGONAL MATRIX,IN B[1:N-1];
N: <ARITHMETIC EXPRESSION>;
THE LENGTH OF B AND D;
EM: <ARRAY IDENTIFIER>;
"ARRAY" EM[1:7];
ENTRY: EM[1]: THE INFINITY NORM OF THE MATRIX;
EM[2]: THE RELATIVE PRECISION IN THE SINGULAR VALUES;
EM[4]: THE MAXIMAL NUMBER OF ITERATIONS TO BE PERFORMED;
EM[6]: THE MINIMAL NON-NEGLECTABLE SINGULAR VALUE;
EXIT: EM[3]: THE MAXIMAL NEGLECTED SUPERDIAGONAL ELEMENT;
EM[5]: THE NUMBER OF ITERATIONS PERFORMED;
EM[7]: THE NUMERICAL RANK OF THE MATRIX, I.E. THE NUMBER OF
SINGULAR VALUES GREATER THAN OR EQUAL TO EM[6].
MOREOVER :
QRISNGVALBID:= THE NUMBER OF SINGULAR VALUES NOT FOUND, I.E. A
NUMBER NOT EQUAL TO ZERO IF THE NUMBER OF ITERATIONS EXCEEDS
EM[4].
PROCEDURES USED : NONE
REQUIRED CENTRAL MEMORY : NO AUXILIARY ARRAYS ARE DECLARED
RUNNING TIME :
THE RUNNING TIME DEPENDS STRONGLY UPON THE PROPERTIES OF THE MATRIX
METHOD AND PERFORMANCE :
THE METHOD IS DESCRIBED IN DETAIL IN [1]. THIS PROCEDURE IS A
REWRITING OF PART OF THE PROCEDURE SVD PUBLISHED THERE BY
G.H.GOLUB AND C.REINSCH.
LANGUAGE : ALGOL 60.
1SECTION : 3.5.1.1 (DECEMBER 1975) PAGE 3
SUBSECTION : QRISNGVALDECBID
CALLING SEQUENCE :
THE HEADING OF THE PROCEDURE IS :
"INTEGER" "PROCEDURE" QRISNGVALDECBID(D, B, M, N, U, V, EM);
"VALUE" M, N; "INTEGER" M, N; "ARRAY" D, B, U, V, EM;
"CODE" 34271;
THE MEANING OF THE FORMAL PARAMETERS IS :
D: <ARRAY IDENTIFIER>;
"ARRAY" D[1:N];
ENTRY: THE DIAGONAL OF THE BIDIAGONAL MATRIX;
EXIT: THE SINGULAR VALUES;
B: <ARRAY IDENTIFIER>;
"ARRAY" B[1:N];
ENTRY: THE SUPER DIAGONAL OF THE BIDIAGONAL MATRIX,IN B[1:N-1];
M: <ARITHMETIC EXPRESSION>;
THE NUMBER OF ROWS OF THE MATRIX U;
N: <ARITHMETIC EXPRESSION>;
THE LENGTH OF B AND D, THE NUMBER OF COLUMNS OF U AND THE
NUMBER OF COLUMNS AND ROWS OF V;
U: <ARRAY IDENTIFIER>;
"ARRAY" U[1:M,1:N];
ENTRY: THE PREMULTIPLYING MATRIX AS PRODUCED BY PRETFMMAT
(SECTION 3.2.2.1.1);
EXIT: THE PREMULTIPLYING MATRIX U OF THE SINGULAR VALUES
DECOMPOSITION U * S * V';
V: <ARRAY IDENTIFIER>;
"ARRAY" V[1:N,1:N];
ENTRY: THE TRANSPOSE OF THE POSTMULTIPLYING MATRIX AS PRODUCED
BY PSTTFMMAT (SECTION 3.2.2.1.1);
EXIT: THE TRANSPOSE OF THE POSTMULTIPLYING MATRIX V OF THE
SINGULAR VALUES DECOMPOSITION;
EM: <ARRAY IDENTIFIER>;
"ARRAY" EM[1:7];
ENTRY: EM[1]: THE INFINITY NORM OF THE MATRIX;
EM[2]: THE RELATIVE PRECISION IN THE SINGULAR VALUES;
EM[4]: THE MAXIMAL NUMBER OF ITERATIONS TO BE PERFORMED;
EM[6]: THE MINIMAL NON-NEGLECTABLE SINGULAR VALUE;
EXIT: EM[3]: THE MAXIMAL NEGLECTED SUPERDIAGONAL ELEMENT;
EM[5]: THE NUMBER OF ITERATIONS PERFORMED;
EM[7]: THE NUMERICAL RANK OF THE MATRIX, I.E. THE NUMBER OF
SINGULAR VALUES GREATER THAN OR EQUAL TO EM[6].
MOREOVER :
QRISNGVALDECBID:= THE NUMBER OF SINGULAR VALUES NOT FOUND, I.E. A
NUMBER NOT EQUAL TO ZERO IF THE NUMBER OF ITERATIONS EXCEEDS
EM[4].
1SECTION : 3.5.1.1 (DECEMBER 1975) PAGE 4
PROCEDURES USED :
ROTCOL = CP34040
REQUIRED CENTRAL MEMORY : NO AUXILIARY ARRAYS ARE DECLARED
RUNNING TIME :
THE RUNNING TIME DEPENDS STRONGLY UPON THE PROPERTIES OF THE MATRIX
METHOD AND PERFORMANCE :
THE METHOD IS DESCRIBED IN DETAIL IN [1]. THIS PROCEDURE IS A
REWRITING OF PART OF THE PROCEDURE SVD PUBLISHED THERE BY
G.H.GOLUB AND C.REINSCH.
LANGUAGE : ALGOL 60
REFERENCES :
[1] WILKINSON, J.H. AND C.REINSCH
HANDBOOK OF AUTOMATIC COMPUTATION, VOL. 2
LINEAR ALGEBRA
HEIDELBERG (1971)
EXAMPLE OF USE :
FOR AN EXAMPLE OF USE ONE IS REFERRED TO SECTION 3.5.1.2
SOURCE TEXT(S):
0"CODE" 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"
1SECTION : 3.5.1.1 (JULY 1974) PAGE 5
;
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;
"EOP"
0"CODE" 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;
"COMMENT"
1SECTION : 3.5.1.1 (JULY 1974) PAGE 6
;
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;
"EOP"
1SECTION : 3.5.1.2 (JULY 1974) PAGE 1
AUTHOR : D.T.WINTER
INSTITUTE : MATHEMATICAL CENTRE
RECEIVED : 731217
BRIEF DESCRIPTION :
THIS SECTION CONTAINS TWO PROCEDURES, QRISNGVAL AND QRISNGVALDEC.
QRISNGVAL CALCULATES THE SINGULAR VALUES OF A GIVEN MATRIX.
QRISNGVALDEC CALCULATES THE SINGULAR VALUES DECOMPOSITION
U * S * V', WITH U AND V ORTHOGONAL AND S POSITIVE DIAGONAL.
KEYWORDS :
SINGULAR VALUES
QR ITERATION
1SECTION : 3.5.1.2 (DECEMBER 1975) PAGE 2
SUBSECTION : QRISNGVAL
CALLING SEQUENCE :
THE HEADING OF THE PROCEDURE IS :
"INTEGER" "PROCEDURE" QRISNGVAL(A, M, N, VAL, EM);
"VALUE" M, N; "INTEGER" M, N; "ARRAY" A, VAL, EM;
"CODE" 34272;
THE MEANING OF THE FORMAL PARAMETERS IS :
A: <ARRAY IDENTIFIER>;
"ARRAY" A[1:M,1:N];
ENTRY: THE INPUT MATRIX;
EXIT: DATA CONCERNING THE TRANSFORMATION TO BIDIAGONAL FORM;
M: <ARITHMETIC EXPRESSION>;
THE NUMBER OF ROWS OF A;
N: <ARITHMETIC EXPRESSION>;
THE NUMBER OF COLUMNS OF A, N SHOULD SATISFY N <= M;
VAL: <ARRAY IDENTIFIER>;
"ARRAY" VAL[1:N];
EXIT: THE SINGULAR VALUES;
EM: <ARRAY IDENTIFIER>;
"ARRAY" EM[0:7];
ENTRY: EM[0]: THE MACHINE PRECISION;
EM[2]: THE RELATIVE PRECISION IN THE SINGULAR VALUES;
EM[4]: THE MAXIMAL NUMBER OF ITERATIONS TO BE PERFORMED;
EM[6]: THE MINIMAL NON-NEGLECTABLE SINGULAR VALUE;
EXIT: EM[1]: THE INFINITY NORM OF THE MATRIX;
EM[3]: THE MAXIMAL NEGLECTED SUPERDIAGONAL ELEMENT;
EM[5]: THE NUMBER OF ITERATIONS PERFORMED;
EM[7]: THE NUMERICAL RANK OF THE MATRIX, I.E. THE NUMBER OF
SINGULAR VALUES GREATER THAN OR EQUAL TO EM[6].
MOREOVER :
QRISNGVAL:= THE NUMBER OF SINGULAR VALUES NOT FOUND, I.E. A NUMBER
NOT EQUAL TO ZERO IF THE NUMBER OF ITERATIONS EXCEEDS EM[4].
PROCEDURES USED :
HSHREABID = CP34260
QRISNGVALBID = CP34270
REQUIRED CENTRAL MEMORY : AN AUXILIARY ARRAY OF N REALS IS DECLARED
RUNNING TIME :
THE RUNNING TIME DEPENDS UPON THE PROPERTIES OF THE MATRIX, HOWEVER
THE PROCESS OF BIDIAGONALIZATION DOMINATES, AND ITS RUNNING TIME
IS PROPORTIONAL TO (M + N) * N * N
METHOD AND PERFORMANCE :
THE MATRIX IS FIRST TRANSFORMED TO BIDIAGONAL FORM BY THE PROCEDURE
HSHREABID (SECTION 3.2.2.1.1) , AND THEN THE SINGULAR VALUES ARE
CALCULATED BY QRISNGVALBID (SECTION 3.5.1.1).
LANGUAGE : ALGOL 60
1SECTION : 3.5.1.2 (DECEMBER 1975) PAGE 3
SUBSECTION : QRISNGVALDEC
CALLING SEQUENCE :
THE HEADING OF THE PROCEDURE IS :
"INTEGER" "PROCEDURE" QRISNGVALDEC(A, M, N, VAL, V, EM);
"VALUE" M, N; "INTEGER" M, N; "ARRAY" A, VAL, V, EM;
"CODE" 34273;
THE MEANING OF THE FORMAL PARAMETERS IS:
A: <ARRAY IDENTIFIER>;
"ARRAY" A[1:M,1:N];
ENTRY: THE GIVEN MATRIX;
EXIT: THE MATRIX U IN THE SINGULAR VALUES DECOMPOSITION
U * S * V';
M: <ARITHMETIC EXPRESSION>;
THE NUMBER OF ROWS OF A;
N: <ARITHMETIC EXPRESSION>;
THE NUMBER OF COLUMNS OF A, N SHOULD SATISFY N <= M;
VAL: <ARRAY IDENTIFIER>;
"ARRAY" VAL[1:N];
EXIT: THE SINGULAR VALUES;
V: <ARRAY IDENTIFIER>;
"ARRAY" V[1:N,1:N];
EXIT: THE MATRIX V OF THE SINGULAR VALUES DECOMPOSITION
(A = U . S . V' );
EM: <ARRAY IDENTIFIER>;
"ARRAY" EM[0:7];
ENTRY: EM[0]: THE MACHINE PRECISION;
EM[2]: THE RELATIVE PRECISION IN THE SINGULAR VALUES;
EM[4]: THE MAXIMAL NUMBER OF ITERATIONS TO BE PERFORMED;
EM[6]: THE MINIMAL NON-NEGLECTABLE SINGULAR VALUE;
EXIT: EM[1]: THE INFINITY NORM OF THE MATRIX;
EM[3]: THE MAXIMAL NEGLECTED SUPER DIAGONAL ELEMENT;
EM[5]: THE NUMBER OF ITERATIONS PERFORMED;
EM[7]: THE NUMERICAL RANK OF THE MATRIX, I.E. THE NUMBER OF
SINGULAR VALUES GREATER THAN OR EQUAL TO EM[6].
MOREOVER :
QRISNGVALDEC:= THE NUMBER OF SINGULAR VALUES NOT FOUND, I.E. A
NUMBER NOT EQUAL TO ZERO IF THE NUMBER OF ITERATIONS EXCEEDS
EM[4].
PROCEDURES USED :
HSHREABID = CP34260
PSTTFMMAT = CP34261
PRETFMMAT = CP34262
QRISNGVALDECBID = CP34271
REQUIRED CENTRAL MEMORY : AN AUXILIARY ARRAY OF N ELEMENTS IS DECLARED
1SECTION : 3.5.1.2 (DECEMBER 1975) PAGE 4
RUNNING TIME :
THE RUNNING TIME DEPENDS UPON THE PROPERTIES OF THE MATRIX, HOWEVER
THE PROCESS OF BIDIAGONALIZATION DOMINATES, AND ITS RUNNING TIME
IS PROPORTIONAL TO (M + N) * N * N
METHOD AND PERFORMANCE:
THE MATRIX IS FIRST TRANSFORMED TO BIDIAGONAL FORM BY THE PROCEDURE
HSHREABID (SECTION 3.2.2.1.1), THE TWO TRANSFORMING MATRICES ARE
CALCULATED BY THE PROCEDURES PSTTFMMAT AND PRETFMMAT (SECTIONS
3.2.2.1.2 AND 3.2.2.1.3 RESPECTIVELY), AND FINALLY THE SINGULAR
VALUES DECOMPOSITION IS CALCULATED BY QRISNGVALDECBID (SECTION
3.5.1.1).
LANGUAGE : ALGOL 60
REFERENCES :
WILKINSON, J.H. AND C.REINSCH
HANDBOOK OF AUTOMATIC COMPUTATION, VOL. 2
LINEAR ALGEBRA
HEIDELBERG (1971)
EXAMPLE OF USE :
AS THE PROCEDURE QRISNGVALDEC CALCULATES THE SINGULAR VALUES OF A
MATRIX IN EXACTLY THE SAME WAY AS QRISNGVAL, WE GIVE HER ONLY AN
EXAMPLE OF USE OF THE PROCEDURE QRISNGVALDEC. FIRST WE GIVE A
PROGRAM, AND THEN THE RESULTS OF THIS PROGRAM:
"BEGIN" "ARRAY" A[1:6,1:5], V[1:5,1:5], VAL[1:5], EM[0:7];
"INTEGER" I, J;
"FOR" I:= 1 "STEP" 1 "UNTIL" 6 "DO"
"FOR" J:= 1 "STEP" 1 "UNTIL" 5 "DO"
A[I,J]:= 1 / (I + J - 1);
EM[0]:= "-14; EM[2]:= "-12; EM[4]:= 25; EM[6]:= "-10;
I:= QRISNGVALDEC(A, 6, 5, VAL, V, EM);
OUTPUT(61, "("3B, "("NUMBER SINGULAR VALUES NOT FOUND : ")",
3ZD, /, 3B, "("INFINITY NORM : ")", N, /, 3B,
"("MAX NEGLECTED SUBDIAGONAL ELEMENT : ")", N, /, 3B,
"("NUMBER ITERATIONS : ")", 3ZD, /, 3B,
"("NUMERICAL RANK : ")", 3ZD, /")", I, EM[1], EM[3], EM[5],
EM[7]);
OUTPUT(61, "("/, 3B, "("SINGULAR VALUES : ")", /")");
"FOR" I:= 1 "STEP" 1 "UNTIL" 5 "DO"
OUTPUT(61, "("/, 3B, N")", VAL[I]);
OUTPUT(61, "("/, /, 3B, "("MATRIX U, FIRST 3 COLUMNS")", /")");
"FOR" I:= 1 "STEP" 1 "UNTIL" 6 "DO"
OUTPUT(61, "("/, 3B, 3(N)")", A[I,1], A[I,2], A[I,3]);
OUTPUT(61, "("/, /, 13B, "("LAST 2 COLUMNS")", /")");
"FOR" I:= 1 "STEP" 1 "UNTIL" 6 "DO"
OUTPUT(61, "("/, 13B, 2(N)")", A[I,4], A[I,5])
"END"
1SECTION : 3.5.1.2 (JULY 1974) PAGE 5
NUMBER SINGULAR VALUES NOT FOUND : 0
INFINITY NORM : +2.2833333333334"+000
MAX NEGLECTED SUBDIAGONAL ELEMENT : +5.7786437871158"-014
NUMBER ITERATIONS : 5
NUMERICAL RANK : 5
SINGULAR VALUES :
+1.5921172587262"+000
+2.2449595426097"-001
+1.3610556101029"-002
+4.3245382038374"-004
+6.4001947134260"-006
MATRIX U, FIRST 3 COLUMNS
-7.5497918208386"-001 +6.1011090790645"-001 -2.3287173869184"-001
-4.3909273679284"-001 -2.2602102994174"-001 +7.0245315582712"-001
-3.1703146681544"-001 -3.7306964696148"-001 +2.1607293656979"-001
-2.4999458583084"-001 -3.9557817833576"-001 -1.4665595223684"-001
-2.0704999076883"-001 -3.8483260608872"-001 -3.6803786187007"-001
-1.7699734614538"-001 -3.6458192866515"-001 -4.9868122801331"-001
LAST 2 COLUMNS
+5.8625326935176"-002 -1.0184205426735"-002
-4.8169088124009"-001 +1.7189132301455"-001
+5.4982292571999"-001 -5.9788920283495"-001
+4.0633053815463"-001 +4.5989617524697"-001
-6.1755991033503"-002 +4.3029765325422"-001
-5.4158416488948"-001 -4.6499203623570"-001
1SECTION : 3.5.1.2 (JULY 1974) PAGE 6
SOURCE TEXT(S):
0"CODE" 34272;
"INTEGER" "PROCEDURE" QRISNGVAL(A, M, N, VAL, EM);
"VALUE" M, N; "INTEGER" M, N; "ARRAY" A, VAL, EM;
"BEGIN" "ARRAY" B[1:N];
HSHREABID(A, M, N, VAL, B, EM);
QRISNGVAL:= QRISNGVALBID(VAL, B, N, EM)
"END" QRISNGVAL;
"EOP"
0"CODE" 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];
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;
"EOP"
1SECTION : 3.6.1 (DECEMBER 1978) PAGE 1
AUTHORS: TH.J. DEKKER AND TH.H.P. REYMER
CONTRIBUTOR: TH.H.P. REYMER
INSTITUTE: UNIVERSITY OF AMSTERDAM
RECEIVED: 770427;
BRIEF DESCRIPTION:
THIS SECTION CONTAINS TWO PROCEDURES:
A) ZERPOL CALCULATES ALL ROOTS OF A POLYNOMIAL WITH REAL
COEFFICIENTS BY MEANS OF LAGUERRE'S METHOD;
B) BOUNDS CALCULATES UPPERBOUNDS FOR THE ABSOLUTE ERROR IN GIVEN
APPROXIMATED ZEROS OF A POLYNOMIAL WITH REAL COEFFICIENTS;
KEYWORDS:
ZEROS;
REAL POLYNOMIAL;
LAGUERRE'S METHOD;
ERROR BOUNDS;
SUBSECTION: ZERPOL
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE READS:
"INTEGER" "PROCEDURE" ZERPOL(N, A, EM, RE, IM, D);
"VALUE" N; "INTEGER" N; "ARRAY" A, EM, RE, IM, D;
"CODE" 34501 ;
THE MEANING OF THE FORMAL PARAMETERS IS:
N: <ARITHMETIC EXPRESSION>;
ENTRY: THE DEGREE OF THE POLYNOMIAL;
A: <ARRAY IDENTIFIER>;
"ARRAY" A[0 : N];
ENTRY: THE COEFFICIENTS OF THE POLYNOMIAL, IN SUCH A WAY
THAT
P(Z) = (..(A[N]*Z + A[N-1])*Z +..+ A[1])*Z + A[0];
1SECTION : 3.6.1 (DECEMBER 1979) PAGE 2
EM: <ARRAY IDENTIFIER>;
"ARRAY" EM[0 : 4];
ENTRY: EM[0]: MACHINE PRECISION;
EM[1]: THE MAXIMAL NUMBER OF ITERATIONS ALLOWED FOR
EACH ZERO;
EXIT: EM[2]: FAIL INDICATION;
0 SUCCESSFUL CALL;
1 UPON ENTRY DEGREE N <= 0;
2 UPON ENTRY LEADING COEFFICIENT A[N] = 0;
3 NUMBER OF ITERATIONS EXCEEDED EM[1];
EM[3]: NUMBER OF NEW STARTS IN THE LAST ITERATION;
EM[4]: TOTAL NUMBER OF ITERATIONS PERFORMED;
FOR THE CD CYBER 70 SYSTEM SUITABLE VALUES ARE:
EM[0]:= "-14;
EM[1]:= 40; IF, UPON EXIT, EM[2] = 3 AND EM[3] < 5 THEN IT
MAY BE USEFUL TO START AGAIN WITH A HIGHER
VALUE OF EM[1];
RE, IM: <ARRAY IDENTIFIERS>;
"ARRAY" RE, IM[1 : N];
EXIT: THE REAL AND IMAGINARY PARTS OF THE ZEROS OF THE
POLYNOMIAL; THE MEMBERS OF EACH NONREAL COMPLEX
CONJUGATE PAIR ARE CONSECUTIVE;
D: <ARRAY IDENTIFIER>;
"ARRAY" D[0 : N];
EXIT: IF THE CALL IS UNSUCCESSFUL AND ONLY N-K ZEROS HAVE
BEEN FOUND, THEN D[0 : K] CONTAINS THE
COEFFICIENTS OF THE (DEFLATED) POLYNOMIAL;
MOREOVER, THEN THE ZEROS FOUND ARE DELIVERED IN
RE, IM[ K + 1 : N], WHEREAS THE REMAINING PARTS
OF RE AND IM CONTAIN NO INFORMATION;
ZERPOL:= THE NUMBER, K, OF ZEROS NOT FOUND;
PROCEDURES USED:
DWARF = CP30003;
GIANT = CP30004;
COMABS = CP34340;
COMSQRT = CP34343;
REQUIRED CENTRAL MEMORY:
TOTAL SIZE OF LOCAL ARRAYS IS N + 16 REAL LOCATIONS;
RUNNING TIME:
ROUGHLY PROPORTIONAL TO N**2;
1SECTION : 3.6.1 (DECEMBER 1978) PAGE 3
METHOD AND PERFORMANCE:
THE PROCEDURE USES LAGUERRE'S METHOD TO FIND ZEROS OF THE GIVEN
POLYNOMIAL (SEE [2]); WHEN A ZERO HAS BEEN FOUND, A COMPOSITE
DEFLATION TECHNIQUE IS USED TO OBTAIN A NEW POLYNOMIAL OF LOWER
DEGREE (SEE [1], [3], [4]); IF CONVERGENCE IS NOT APPARENT, SEVERAL
RESTARTS, THE NUMBER OF WHICH DEPENDS ON EM[1] BUT HAS A MAXIMUM
OF 5, ARE MADE IN THE NEIGHBOURHOOD OF THE ABSOLUTE LARGEST ZERO;
THE ACCURACY OF THE CALCULATED ZEROS STRONGLY DEPENDS ON THE
POLYNOMIAL; A ROUGH INDICATION FOR THE ERROR IN A CALCULATED ZERO Z
FOLLOWS FROM P(Z) / DP(Z), WHERE P DENOTES THE GIVEN POLYNOMIAL AND
DP ITS FIRST DERIVATIVE (SEE E.G. [5]); TO FIND A TRUE UPPERBOUND
FOR THESE ERRORS, ONE CAN USE PROCEDURE BOUNDS (SEE NEXT
SUBSECTION); FOR A MORE DETAILED DESCRIPTION OF THE PROCEDURE AND
TEST RESULTS SEE [4];
REFERENCES:
[1] D.A. ADAMS, A STOPPING CRITERION FOR POLYNOMIAL ROOT FINDING,
CACM 10, NO 10, PP. 655-658, OCTOBER 1967;
[2] T.J. DEKKER, NEWTON-LAGUERRE ITERATION,
MATHEMATISCH CENTRUM MR82, 1966;
[3] G. PETERS AND J.H. WILKINSON, PRACTICAL PROBLEMS ARISING IN THE
SOLUTION OF POLYNOMIAL EQUATIONS,
J. INST. MATHS APPLICS 1971, NO. 8, PP. 16-35;
[4] TH.H.P. REYMER, BEREKENING VAN NULPUNTEN VAN REELE POLYNOMEN EN
FOUTGRENZEN VOOR DEZE NULPUNTEN,
DOCTORAAL SCRIPTIE UVA, APRIL 1977;
[5] J.H. WILKINSON, ROUNDING ERRORS IN ALGEBRAIC PROCESSES,
PRENTICE HALL, 1963;
EXAMPLE OF USE:
FOR AN EXAMPLE OF USE SEE PROCEDURE BOUNDS (NEXT SUBSECTION);
1SECTION : 3.6.1 (DECEMBER 1979) PAGE 4
SUBSECTION: BOUNDS
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE READS:
"PROCEDURE" BOUNDS(N,A,RE,IM,RELE,ABSE,RECENTRE,IMCENTRE,BOUND);
"VALUE" N, RELE, ABSE; "INTEGER" N; "REAL" RELE, ABSE;
"ARRAY" A, RE, IM, RECENTRE, IMCENTRE, BOUND;
"CODE" 34502 ;
THE MEANING OF THE FORMAL PARAMETERS IS:
N: <ARITHMETIC EXPRESSION>;
ENTRY: DEGREE OF THE POLYNOMIAL;
A: <ARRAY IDENTIFIER>;
"ARRAY" A[0 : N];
ENTRY: THE COEFFICIENTS OF THE POLYNOMIAL OF WHICH
RE[J] + I * IM[J] ARE THE APPROXIMATED ZEROS,
IN SUCH A WAY THAT
P(Z) = (..(A[N]*Z + A[N-1])*Z +..+A[1])*Z + A[0]
RE, IM: <ARRAY IDENTIFIERS>;
"ARRAY" RE, IM[1 : N];
ENTRY: REAL AND IMAGINARY PARTS OF APPROXIMATED ZEROS OF
A POLYNOMIAL, SUCH THAT THE MEMBERS OF EACH
NONREAL COMPLEX CONJUGATE PAIR ARE CONSECUTIVE;
EXIT: A PERMUTATION OF THE INPUT DATA;
RELE: <ARITHMETIC EXPRESSION>;
ENTRY: RELATIVE ERROR IN THE NON-VANISHING COEFFICIENTS
A[J] OF THE GIVEN POLYNOMIAL;
ABSE: <ARITHMETIC EXPRESSION>;
ENTRY: ABSOLUTE ERROR IN THE VANISHING COEFFICIENTS A[J]
GIVEN POLYNOMIAL; IF THERE ARE NO VANISHING
COEFFICIENTS, ABSE SHOULD BE ZERO;
RECENTRE, IMCENTRE: <ARRAY IDENTIFIERS>;
"ARRAY" RECENTRE, IMCENTRE[1 : N];
EXIT: REAL AND IMAGINARY PARTS OF THE CENTERS OF DISKS
IN WHICH SOME NUMBER OF ZEROS OF THE POLYNOMIAL
GIVEN BY A ARE SITUATED;
THE NUMBER OF IDENTICAL CENTERS DENOTES
THE NUMBER OF ZEROS IN THAT DISK;
BOUND: <ARRAY IDENTIFIER>;
"ARRAY" BOUND[1 : N];
EXIT: RADIUS OF THE DISKS WHOSE CENTERS ARE GIVEN
CORRESPONDINGLY IN RECENTRE AND IMCENTRE;
PROCEDURES USED:
ARREB = CP30002;
GIANT = CP30004;
1SECTION : 3.6.1 (DECEMBER 1979) PAGE 5
REQUIRED CENTRAL MEMORY:
TOTAL SIZE OF LOCAL ARRAYS IS AT MOST 7 * N REAL LOCATIONS;
RUNNING TIME:
APPROXIMATELY OF ORDER N**2;
METHOD AND PERFORMANCE:
FROM THE APPROXIMATED ZEROS A POLYNOMIAL IS RECONSTRUCTED AND
COMPARED WITH THE GIVEN POLYNOMIAL; SUBSEQUENTLY, THE PROCEDURE
CALCULATES DISKS SUCH THAT THE NUMBER OF GIVEN APPROXIMATED ZEROS
WITHIN EACH DISK EQUALS THE NUMBER OF ZEROS OF THE GIVEN POLYNOMIAL
WITHIN THAT DISK; UPON EXIT EVERY TWO NON-IDENTICAL DISKS ARE
DISJOINT;
FOR A MORE DETAILED DESCRIPTION SEE [1], [2];
REFERENCES:
[1] G. PETERS AND J.H. WILKINSON, PRACTICAL PROBLEMS ARISING IN THE
SOLUTION OF POLYNOMIAL EQUATIONS, J.INST.MATHS APPLICS 1971,
NO 8, PP. 16-35;
[2] TH.H.P. REYMER, BEREKENING VAN NULPUNTEN VAN REELE POLYNOMEN EN
FOUTGRENZEN VOOR DEZE NULPUNTEN,
DOCTORAAL SCRIPTIE UVA, APRIL 1977;
EXAMPLE OF USE:
"BEGIN" "INTEGER" I, J;
"ARRAY" A, D[0:7], RE, IM[1:7], EM[0:4];
A[7]:= 1; A[6]:= -3; A[5]:= -3; A[4]:= 25; A[3]:= -46;
A[2]:= 38; A[1]:= -12; A[0]:= 0;
EM[0]:= "-14; EM[1]:= 40;
I:= ZERPOL(7, A, EM, RE, IM, D);
OUTPUT(61,"(""("COEFFICIENTS OF POLYNOMIAL:")",//")");
"FOR" J:=7 "STEP" -1 "UNTIL" 0 "DO"
OUTPUT(61,"("-2ZD3B")",A[J]);
OUTPUT(61,"("//,"("NUMBER NOT FOUND ZEROS ")",3ZD,/,
"("FAIL INDICATION ")",3ZD,/,"("NUMBER NEW STARTS ")",3ZD,/,
"("NUMBER OF ITERATIONS ")",3ZD,/")",I,EM[2],EM[3],EM[4]);
OUTPUT(61,"("/,"("ZEROS: ")",/")");
"FOR" J:= I+1 "STEP" 1 "UNTIL" 7 "DO" "IF" IM[J] = 0
"THEN" OUTPUT(61,"("/,N")",RE[J])
"ELSE" OUTPUT(61,"("/,2(N)")",RE[J],IM[J]);
1SECTION : 3.6.1 (DECEMBER 1979) PAGE 6
"IF" I = 0 "THEN"
"BEGIN" "ARRAY" RECENTRE, IMCENTRE, BOUND[1:7];
BOUNDS(7, A, RE, IM, 0, 0, RECENTRE, IMCENTRE, BOUND);
OUTPUT(61,"("2/,"("REAL AND IMAG. PART OF CENTRE + RADIUS")",/")");
"FOR" J:= 1 "STEP" 1 "UNTIL" 7 "DO"
OUTPUT(61,"("/,3(N)")",RECENTRE[J],IMCENTRE[J],BOUND[J])
"END"
"END"
RESULTS :
COEFFICIENTS OF POLYNOMIAL:
1 -3 -3 25 -46 38 -12 0
NUMBER NOT FOUND ZEROS 0
FAIL INDICATION 0
NUMBER NEW STARTS 0
NUMBER OF ITERATIONS 11
ZEROS:
+2.0000000000000"+000
-3.0000000000000"+000
+1.0000000000000"+000 -1.0000000000000"+000
+1.0000000000000"+000 +1.0000000000000"+000
+1.0000000083024"+000
+9.9999999169752"-001
+0.0000000000000"+000
REAL AND IMAG. PART OF CENTRE + RADIUS
+2.0000000000000"+000 +0.0000000000000"+000 +1.3238111117716"-011
-3.0000000000000"+000 +0.0000000000000"+000 +3.8857510604494"-013
+1.0000000000000"+000 -1.0000000000000"+000 +4.0912729775463"-012
+1.0000000000000"+000 +1.0000000000000"+000 +4.0912729775463"-012
+9.9999999999998"-001 +0.0000000000000"+000 +2.2533888428865"-006
+9.9999999999998"-001 +0.0000000000000"+000 +2.2533888428865"-006
+0.0000000000000"+000 +0.0000000000000"+000 +0.0000000000000"+000
1SECTION : 3.6.1 (DECEMBER 1979) PAGE 7
SOURCE TEXT(S) :
"CODE" 34501;
"INTEGER""PROCEDURE" ZERPOL(N, A, EM, RE, IM, D);
"VALUE" N; "INTEGER" N; "ARRAY" A, EM, RE, IM, D;
"BEGIN" "INTEGER" I, TOTIT, IT, FAIL, START, UP, MAX, GIEX, ITMAX;
"REAL" X, Y, NEWF, OLDF, MAXRAD, AE, TOL, H1, H2, LN2;
"ARRAY" F[0 : 5], TRIES[1 : 10];
"BOOLEAN""PROCEDURE" FUNCTION;
"BEGIN" "INTEGER" K, M1, M2;
"REAL" P, Q, QSQRT, F01, F02, F03, F11, F12, F13,
F21, F22, F23, STOP;
IT:= IT + 1;
P:= 2 * X; Q:= -(X * X + Y * Y); QSQRT:= SQRT(-Q);
F01:= F11:= F21:= D[0]; F02:= F12:= F22:= 0;
M1:= N - 4; M2:= N - 2;
STOP:= ABS(F01) * 0.8;
"FOR" K:= 1 "STEP" 1 "UNTIL" M1 "DO"
"BEGIN" F03:= F02; F02:= F01; F01:= D[K] + P * F02 + Q * F03;
F13:= F12; F12:= F11; F11:= F01 + P * F12 + Q * F13;
F23:= F22; F22:= F21; F21:= F11 + P * F22 + Q * F23;
STOP:= QSQRT * STOP + ABS(F01)
"END";
"IF" M1 < 0 "THEN" M1:= 0;
"FOR" K:= M1 + 1 "STEP" 1 "UNTIL" M2 "DO"
"BEGIN" F03:= F02; F02:= F01; F01:= D[K] + P * F02 + Q * F03;
F13:= F12; F12:= F11; F11:= F01 + P * F12 + Q * F13;
STOP:= QSQRT * STOP + ABS(F01)
"END";
"IF" N = 3 "THEN" F21:= 0;
F03:= F02; F02:= F01; F01:= D[N - 1] + P * F02 + Q * F03;
F[0]:= D[N] + X * F01 + Q * F02;
F[1]:= Y * F01;
F[2]:= F01 - 2 * F12 * Y * Y;
F[3]:= 2 * Y * (- X * F12 + F11);
F[4]:= 2 * (- X * F12 + F11) - 8 * Y * Y * (- X * F22 + F21);
F[5]:= Y * (6 * F12 - 8 * Y * Y * F22);
STOP:= QSQRT * (QSQRT * STOP + ABS(F01)) + ABS(F[0]);
NEWF:= F02:= COMABS(F[0], F[1]);
FUNCTION:= F02 < (2 * ABS(X * F01) - 8 * (ABS(F[0]) + ABS(F01)
* QSQRT) + 10 * STOP) * TOL * (1 + TOL) ** (4 * N + 3)
"END" OF FUNCTION; "COMMENT"
1SECTION : 3.6.1 (DECEMBER 1978) PAGE 8
;
"BOOLEAN""PROCEDURE" CONTROL;
"IF" IT > ITMAX "THEN"
"BEGIN" TOTIT:= TOTIT + IT; FAIL:= 3; "GOTO" EXIT "END"
"ELSE" "IF" IT = 0 "THEN"
"BEGIN" "INTEGER" I, H; "REAL" H1, SIDE;
MAXRAD:= 0; MAX:= (GIEX - LN(ABS(D[0])) / LN2) / N;
"FOR" I:= 1 "STEP" 1 "UNTIL" N "DO"
"BEGIN" H1:= "IF" D[I] = 0 "THEN" 0
"ELSE" EXP(LN(ABS(D[I] / D[0])) / I);
"IF" H1 > MAXRAD "THEN" MAXRAD:= H1
"END";
"FOR" I:= 1 "STEP" 1 "UNTIL" N - 1 "DO"
"IF" D[I] ^= 0 "THEN"
"BEGIN" H:= (GIEX - LN(ABS(D[I])) / LN2) / (N - I);
"IF" H < MAX "THEN" MAX:= H
"END";
MAX:= MAX * LN2 / LN(N);
SIDE:= - D[1] / D[0];
SIDE:= "IF" ABS(SIDE) < TOL "THEN" 0 "ELSE" SIGN(SIDE);
"IF" SIDE = 0 "THEN"
"BEGIN" TRIES[7]:= TRIES[2]:= MAXRAD; TRIES[9]:= -MAXRAD;
TRIES[6]:= TRIES[4]:= TRIES[3]:= MAXRAD / SQRT(2);
TRIES[5]:= -TRIES[3]; TRIES[10]:= TRIES[8]:= TRIES[1]:= 0
"END" "ELSE"
"BEGIN" TRIES[8]:= TRIES[4]:= MAXRAD/ SQRT(2);
TRIES[1]:= SIDE * MAXRAD; TRIES[3]:= TRIES[4] * SIDE;
TRIES[6]:= MAXRAD; TRIES[7]:= -TRIES[3];
TRIES[9]:= -TRIES[1]; TRIES[2]:= TRIES[5]:= TRIES[10]:= 0
"END";
"IF" COMABS(X, Y) > 2 * MAXRAD "THEN" X:= Y:= 0;
CONTROL:= "FALSE"
"END" "ELSE"
"BEGIN" "IF" IT > 1 & NEWF >= OLDF "THEN"
"BEGIN" UP:= UP+ 1;
"IF" UP = 5 & START < 5 "THEN"
"BEGIN" START:= START + 1; UP:= 0; X:= TRIES[2 * START - 1];
Y:= TRIES[2 * START]; CONTROL:= "FALSE"
"END" "ELSE" CONTROL:= "TRUE"
"END" "ELSE" CONTROL:= "TRUE"
"END" OF CONTROL; "COMMENT"
1SECTION : 3.6.1 (DECEMBER 1978) PAGE 9
;
"PROCEDURE" DEFLATION;
"IF" X = 0 & Y = 0 "THEN" N:= N - 1 "ELSE"
"BEGIN" "INTEGER" I, SPLIT; "REAL" H1, H2;
"ARRAY" B[0 : N - 1];
"IF" Y = 0 "THEN"
"BEGIN" N:= N - 1; B[N]:= -D[N + 1] / X;
"FOR" I:= 1 "STEP" 1 "UNTIL" N "DO"
B[N - I]:= (B[N - I + 1] - D[N - I + 1]) / X;
"FOR" I:= 1 "STEP" 1 "UNTIL" N "DO"
D[I]:= D[I] + D[I - 1] * X
"END" "ELSE"
"BEGIN" H1:= - 2 * X; H2:= X * X + Y * Y;
N:= N - 2;
B[N]:= D[N + 2] / H2; B[N - 1]:= (D[N + 1] - H1 * B[N]) / H2;
"FOR" I:= 2 "STEP" 1 "UNTIL" N "DO"
B[N - I]:= (D[N - I + 2] - H1 * B[N - I + 1] - B[N - I + 2])/H2;
D[1]:= D[1] - H1 * D[0];
"FOR" I:= 2 "STEP" 1 "UNTIL" N "DO"
D[I]:= D[I] - H1 * D[I-1] - H2 * D[I-2]
"END";
SPLIT:= N;
H2:= ABS(D[N] - B[N]) / (ABS(D[N]) + ABS(B[N]));
"FOR" I:= N - 1 "STEP" -1 "UNTIL" 0 "DO"
"BEGIN" H1:= ABS(D[I]) + ABS(B[I]);
"IF" H1 > TOL "THEN"
"BEGIN" H1:= ABS(D[I] - B[I]) / H1;
"IF" H1 < H2 "THEN" "BEGIN" H2:= H1; SPLIT:= I "END"
"END"
"END";
"FOR" I := SPLIT + 1 "STEP" 1 "UNTIL" N "DO" D[I]:= B[I];
D[SPLIT]:= (D[SPLIT] + B[SPLIT]) / 2
"END" OF DEFLATION;
"PROCEDURE" LAGUERRE;
"BEGIN" "INTEGER" M;
"REAL" S1RE, S1IM, S2RE, S2IM, DX, DY, H1, H2, H3, H4, H5, H6;
"IF" ABS(F[0]) > ABS(F[1]) "THEN"
"BEGIN" H1:= F[0]; H6:= F[1] / H1; H2:= F[2] + H6 * F[3];
H3:= F[3] - H6 * F[2]; H4:= F[4] + H6 * F[5];
H5:= F[5] - H6 * F[4]; H6:= H6 * F[1] + H1
"END" "ELSE"
"BEGIN" H1:= F[1]; H6:= F[0] / H1; H2:= H6 * F[2] + F[3];
H3:= H6 * F[3] - F[2]; H4:= H6 * F[4] + F[5];
H5:= H6 * F[5] - F[4]; H6:= H6 * F[0] + F[1]
"END"; "COMMENT"
1SECTION : 3.6.1 (DECEMBER 1979) PAGE 10
;
S1RE:= H2 / H6; S1IM:= H3 / H6;
H2:= S1RE * S1RE - S1IM * S1IM; H3:= 2 * S1RE * S1IM;
S2RE:= H2 - H4 / H6; S2IM:= H3 - H5 / H6;
H1:= S2RE * S2RE + S2IM * S2IM;
H1:= "IF" H1 ^= 0 "THEN" (S2RE * H2 + S2IM * H3) / H1 "ELSE" 1;
M:= "IF" H1 >= N - 1 "THEN" ("IF" N > 1 "THEN" N - 1 "ELSE" 1)
"ELSE" "IF" H1 > 1 "THEN" H1 "ELSE" 1;
H1:= (N - M) / M;
COMSQRT(H1 * (N * S2RE - H2), H1 * (N * S2IM - H3), H2, H3);
"IF" S1RE * H2 + S1IM * H3 < 0 "THEN"
"BEGIN" H2:= - H2; H3:= - H3 "END";
H2:= S1RE + H2; H3:= S1IM + H3;
H1:= H2 * H2 + H3 * H3;
"IF" H1 = 0 "THEN" "BEGIN" DX:= -N; DY:= N "END" "ELSE"
"BEGIN" DX:= - N * H2 / H1; DY:= N * H3 / H1 "END";
H1:= ABS(X) * TOL + AE; H2:= ABS(Y) * TOL+ AE;
"IF" ABS(DX) < H1 & ABS(DY) < H2 "THEN"
"BEGIN" DX:= "IF" DX = 0 "THEN" H1 "ELSE" SIGN(DX) * H1;
DY:= "IF" DY = 0 "THEN" H2 "ELSE" SIGN(DY) * H2
"END";
X:= X + DX; Y:= Y + DY;
"IF" COMABS(X, Y) > 2 * MAXRAD "THEN"
"BEGIN" H1:= "IF" ABS(X) > ABS(Y) "THEN" ABS(X) "ELSE" ABS(Y);
H2:= LN(H1) / LN2 + 1 - MAX;
"IF" H2 > 0 "THEN"
"BEGIN" H2:= 2 ** H2; X:= X / H2; Y:= Y / H2 "END"
"END"
"END" OF LAGUERRE;
TOTIT:= IT:= FAIL:= UP:= START:= 0; LN2:= LN(2);
NEWF:= GIANT; AE:= DWARF; GIEX:= LN(NEWF) / LN2 - 40;
TOL:= EM[0]; ITMAX:= EM[1];
"FOR" I:= 0 "STEP" 1 "UNTIL" N "DO" D[I]:= A[N-I];
"IF" N <= 0 "THEN"
"BEGIN" FAIL:= 1; "GOTO" EXIT "END"
"ELSE" "IF" D[0] = 0 "THEN"
"BEGIN" FAIL:= 2; "GOTO" EXIT "END";
"FOR" I:= 1 "WHILE" D[N] = 0 & N > 0 "DO"
"BEGIN" RE[N]:= IM[N]:= 0; N:= N - 1 "END";
X:= Y:= 0; "COMMENT"
1SECTION : 3.6.1 (DECEMBER 1979) PAGE 11
;
"FOR" I:= 1 "WHILE" N > 2 "DO"
"BEGIN" "IF" CONTROL "THEN" LAGUERRE;
OLDF:= NEWF;
"IF" FUNCTION "THEN"
"BEGIN" "IF" Y ^= 0 & ABS(Y) < .1 "THEN"
"BEGIN" "REAL" H; H:= Y; Y:= 0;
"IF" ^ FUNCTION "THEN" Y:= H
"END";
RE[N]:= X; IM[N]:= Y;
"IF" Y ^= 0 "THEN" "BEGIN" RE[N - 1]:= X; IM[N - 1]:= -Y "END";
DEFLATION; TOTIT:= TOTIT + IT; UP:= START:= IT:= 0
"END"
"END";
"IF" N = 1 "THEN" "BEGIN" RE[1]:= - D[1] / D[0]; IM[1]:= 0 "END"
"ELSE"
"BEGIN" "REAL" H1, H2;
H1:= - 0.5 * D[1] / D[0]; H2:= H1 * H1 - D[2] / D[0];
"IF" H2 >= 0 "THEN"
"BEGIN" RE[2]:= "IF" H1 < 0 "THEN" H1 - SQRT(H2)
"ELSE" H1 + SQRT(H2);
RE[1]:= D[2] / (D[0] * RE[2]);
IM[2]:= IM[1]:= 0
"END" "ELSE"
"BEGIN" RE[2]:= RE[1]:= H1;
IM[2]:= SQRT(-H2); IM[1]:= -IM[2]
"END"
"END"; N:= 0;
EXIT: EM[2]:= FAIL; EM[3]:= START; EM[4]:= TOTIT;
"FOR" I:= (N-1) "DIV" 2 "STEP" -1 "UNTIL" 0 "DO"
"BEGIN" TOL := D[I]; D[I]:= D[N-I]; D[N-I]:= TOL
"END";
ZERPOL:= N
"END" OF ZERPOL;
"EOP"
"CODE" 34502;
"PROCEDURE" BOUNDS(N,A,RE,IM,RELE,ABSE,RECENTRE,IMCENTRE,BOUND);
"VALUE" N, RELE, ABSE; "INTEGER" N; "REAL" RELE, ABSE;
"ARRAY" RE, IM, A, RECENTRE, IMCENTRE, BOUND;
"BEGIN" "INTEGER" I, J, K, L, INDEX1, INDEX2; "BOOLEAN" GOON;
"REAL" H, MIN, RECENT, IMCENT, GIA, XK, YK, ZK, CORR;
"ARRAY" RC, C, RCE[0:N], CLUST[1:N];
"COMMENT"
1SECTION : 3.6.1 (DECEMBER 1978) PAGE 12
;
"REAL""PROCEDURE" G(RAD, RECENT, IMCENT, K, M);
"VALUE" RAD, RECENT, IMCENT, K, M; "REAL" RAD, RECENT, IMCENT;
"INTEGER" K, M;
"BEGIN" "REAL" S, H1, H2; "INTEGER" I;
S:= SQRT(RECENT * RECENT + IMCENT * IMCENT) + RAD;
H1:= RC[1]; H2:= RC[0];
"FOR" I:= 2 "STEP" 1 "UNTIL" N "DO" H1:= H1*S + RC[I];
"FOR" I:= 1 "STEP" 1 "UNTIL" M-1, M+K "STEP" 1 "UNTIL" N "DO"
H2:= H2 * ABS(SQRT((RE[I]-RECENT)**2 + (IM[I]-IMCENT)**2) - RAD);
G:= "IF" H1=0 "THEN" 0 "ELSE" "IF" H2=0 "THEN" -10 "ELSE" H1 / H2
"END";
"PROCEDURE" KCLUSTER(K, M);
"VALUE" K, M; "INTEGER" K, M;
"BEGIN" "INTEGER" I, J, STOP, L; "BOOLEAN" NONZERO;
"REAL" RECENT, IMCENT, D, PROD, RAD, GR, R;
"ARRAY" DIST[M: M+K-1];
RECENT:= RE[M]; IMCENT:= IM[M]; STOP:= M+K-1;
L:= SIGN(IMCENT); NONZERO:= L ^= 0;
"FOR" I:= M+1 "STEP" 1 "UNTIL" STOP "DO"
"BEGIN" RECENT:= RECENT+RE[I];
"IF" NONZERO "THEN"
"BEGIN" NONZERO:= L = SIGN(IM[I]); IMCENT:= IMCENT+IM[I] "END"
"END";
RECENT:= RECENT/K; IMCENT:= "IF" NONZERO "THEN" IMCENT/K "ELSE" 0;
D:= 0; RAD:= 0;
"FOR" I:= M "STEP" 1 "UNTIL" STOP "DO"
"BEGIN" RECENTRE[I]:= RECENT; IMCENTRE[I]:= IMCENT;
DIST[I]:= SQRT((RE[I] -RECENT)**2 + (IM[I]-IMCENT)**2);
"IF" D < DIST[I] "THEN" D:= DIST[I]
"END";
GR:= ABS(G(0, RECENT, IMCENT, K, M));
"IF" GR > 0 "THEN"
"BEGIN" "FOR" J:= 1, 1 "WHILE" PROD <= GR "DO"
"BEGIN" R:= RAD; RAD:= D + EXP(LN(1.1*GR)/K);
"IF" RAD = R "THEN" RAD:= EXP(LN(1.1)/K) * RAD;
GR:= G(RAD, RECENT, IMCENT, K, M);
PROD:= 1;
"FOR" I:= M "STEP" 1 "UNTIL" STOP "DO"
PROD:= PROD*(RAD-DIST[I])
"END"
"END";
"FOR" I:= M "STEP" 1 "UNTIL" STOP "DO"
"BEGIN" BOUND[I]:= RAD; CLUST[I]:= K "END";
"END"; "COMMENT"
1SECTION : 3.6.1 (DECEMBER 1979) PAGE 13
;
"PROCEDURE" SHIFT(INDEX, NEW);
"VALUE" INDEX, NEW; "INTEGER" INDEX, NEW;
"BEGIN" "INTEGER" J, PLACE, CLUSTIN;
"REAL" BOUNDIN, IMCENT, RECENT;
"REAL""ARRAY" WA1, WA2[1:CLUST[INDEX]];
CLUSTIN:= CLUST[INDEX]; BOUNDIN:= BOUND[INDEX];
IMCENT:= IMCENTRE[INDEX]; RECENT:= RECENTRE[INDEX];
"FOR" J:= 1 "STEP" 1 "UNTIL" CLUSTIN "DO"
"BEGIN" PLACE:=INDEX+J-1; WA1[J]:= RE[PLACE]; WA2[J]:= IM[PLACE];
"END";
"FOR" J:= INDEX-1 "STEP" -1 "UNTIL" NEW "DO"
"BEGIN" PLACE:= J+CLUSTIN;
RE[PLACE]:= RE[J]; IM[PLACE]:= IM[J]; CLUST[PLACE]:= CLUST[J];
BOUND[PLACE]:= BOUND[J]; RECENTRE[PLACE]:= RECENTRE[J];
IMCENTRE[PLACE]:= IMCENTRE[J]
"END";
"FOR" J:= NEW+CLUSTIN-1 "STEP" -1 "UNTIL" NEW "DO"
"BEGIN" PLACE:= J+1-NEW;
RE[J]:= WA1[PLACE]; IM[J]:= WA2[PLACE];
BOUND[J]:= BOUNDIN; CLUST[J]:= CLUSTIN;
RECENTRE[J]:= RECENT; IMCENTRE[J]:= IMCENT
"END"
"END";
GIA:= GIANT;
RC[0]:= C[0]:= A[N]; RCE[0]:= ABS(C[0]); K:= 0;
"FOR" I:= 1 "STEP" 1 "UNTIL" N "DO"
"BEGIN" RC[I]:= RCE[I]:= 0 ; C[I]:= A[N-I] "END";
"FOR" I:= 0 "WHILE" K < N "DO"
"BEGIN" K:= K+1; XK:= RE[K]; YK:= IM[K]; ZK:= XK*XK+YK*YK;
"FOR" J:= K "STEP" -1 "UNTIL" 1 "DO"
RCE[J]:= RCE[J]+RCE[J-1]*SQRT(ZK);
"IF" YK = 0 "THEN"
"BEGIN" "FOR" J:= K "STEP" -1 "UNTIL" 1 "DO"
RC[J]:= RC[J]-XK*RC[J-1]
"END" "ELSE"
"BEGIN" K:= K+1;
"IF" K <= N & XK = RE[K] & YK = -IM[K] "THEN"
"BEGIN" XK:= -2*XK;
"FOR" J:= K "STEP" -1 "UNTIL" 1 "DO"
RCE[J]:= RCE[J]+RCE[J-1]*SQRT(ZK);
"FOR" J:= K "STEP" -1 "UNTIL" 2 "DO"
RC[J]:= RC[J]+XK*RC[J-1]+ZK*RC[J-2];
RC[1]:= RC[1]+XK*RC[0]
"END"
"END"
"END";
RC[0]:= RCE[0]; CORR:= 1.06*ARREB;
"FOR" I:= 1 "STEP" 1 "UNTIL" N-1 "DO"
RC[I]:= ABS(RC[I]-C[I])+RCE[I]*CORR*(N+I-2)+RELE*ABS(C[I])+ABSE;
RC[N]:= ABS(RC[N]-C[N])+RCE[N]*CORR*(N-1)+RELE*ABS(C[N])+ABSE;
"FOR" I:= 1 "STEP" 1 "UNTIL" N "DO" KCLUSTER(1, I); "COMMENT"
1SECTION : 3.6.1 (DECEMBER 1978) PAGE 14
;
GOON:= "TRUE";
"FOR" L:= 1 "WHILE" GOON "DO"
"BEGIN" INDEX1:= INDEX2:= 0; MIN:= GIANT; I:= N-CLUST[N]+1;
"FOR" I:= I "WHILE" I >= 2 "DO"
"BEGIN" J:= I; RECENT:= RECENTRE[I]; IMCENT:= IMCENTRE[I];
"FOR" J:= J "WHILE" J >= 2 "DO"
"BEGIN" J:= J-CLUST[J-1];
H:= SQRT((RECENT-RECENTRE[J])**2 + (IMCENT-IMCENTRE[J])**2);
"IF" H < BOUND[I] + BOUND[J] & H <= MIN "THEN"
"BEGIN" INDEX1:= J; INDEX2:= I; MIN:= H "END"
"END"; I:= I-CLUST[I-1]
"END";
"IF" INDEX1 = 0 "THEN" GOON:= "FALSE" "ELSE"
"BEGIN" "IF" IMCENTRE[INDEX1] = 0 "THEN"
"BEGIN" "IF" IMCENTRE[INDEX2] ^= 0 "THEN"
CLUST[INDEX2]:= 2*CLUST[INDEX2]
"END" "ELSE" "IF" IMCENTRE[INDEX2] = 0 "THEN"
CLUST[INDEX1]:= 2*CLUST[INDEX1];
K:= INDEX1+CLUST[INDEX1];
"IF" K ^= INDEX2 "THEN" SHIFT(INDEX2, K);
K:= CLUST[INDEX1]+CLUST[K];
KCLUSTER(K, INDEX1)
"END"
"END"
"END";
"EOP"
1SECTION : 3.6.2 (DECEMBER 1978) PAGE 1
AUTHORS: M. BAKKER, P.J. HARINGHUIZEN AND C.G. VAN DER LAAN.
CONTRIBUTORS: M. BAKKER, P.J. HARINGHUIZEN,
C.G. VAN DER LAAN AND M. VOORINTHOLT.
INSTITUTE: MATHEMATICAL CENTRE AND RIJKSUNIVERSITEIT GRONINGEN.
RECEIVED: 780601.
BRIEF DESCRIPTION:
THIS SECTION CONTAINS FIVE PROCEDURES FOR CALCULATING ZEROS OF
ORTHOGONAL POLYNOMIALS WHICH ARE GIVEN BY THE COEFFICIENTS OF
THEIR RECURRENCE RELATION:
ALLZERORTPOL: CALCULATES ALL ZEROS,
LUPZERORTPOL: CALCULATES A NUMBER OF ADJACENT UPPER OR LOWER ZEROS,
SELZERORTPOL: CALCULATES A NUMBER OF ADJACENT ZEROS. IT IS
EFFICIENT TO USE ALLZERORTPOL IF MORE THAN 50
PERCENT OF EXTREME ZEROS OR MORE THAN 25 PERCENT OF
SELECTED ZEROS ARE WANTED.
ALLJACZER : CALCULATES THE ZEROS OF THE N-TH JACOBIAN POLYNOMIAL.
ALLLAGZER : CALCULATES THE ZEROS OF THE N-TH LAGUERRE POLYNOMIAL.
KEYWORDS:
ZEROS,
ORTHOGONAL POLYNOMIALS,
CHRISTOFFEL ABSCISSAS.
REFERENCES:
ABRAMOWITZ, M. AND I.A. STEGUN (1964):
HANDBOOK OF MATHEMATICAL FUNCTIONS.
DOVER PUBLICATIONS INC.
GOLUB, G.H. AND J.H. WELSCH (1969):
CALCULATION OF GAUSS QUADRATURE RULES.
MATH. COMP. VOL. 23, P.221-230.
LANCZOS, C. (1957):
APPLIED ANALYSIS.
PRENTICE HALL.
1SECTION : 3.6.2 (DECEMBER 1978) PAGE 2
STOER, J. (1972):
EINFUEHRUNG IN DIE NUMERISCHE MATHEMATIK 1.
HEIDELBERG TASCHENBUECHER 105, SPRINGER.
WILKINSON,J AND REINSCH,C. :
HANDBOOK OF AUTOMATIC COMPUTATION. VOL. 2.
LINEAR ALGEBRA
HEIDELBERG (1971).
SUBSECTION: ALLZERORTPOL.
CALLING SEQUENCE:
THE DECLARATION OF THE PROCEDURE IN THE CALLING PROGRAM READS:
"PROCEDURE" ALLZERORTPOL (N, B, C, ZER, EM);
"VALUE" N; "INTEGER" N; "ARRAY" B, C, ZER, EM;
"CODE" 31362;
THE MEANING OF THE FORMAL PARAMETERS IS:
N: <ARITHMETIC EXPRESSION>;
ENTRY: THE DEGREE OF THE ORTHOGONAL POLYNOMIAL OF WHICH
THE ZEROS ARE TO BE CALCULATED;
B, C: <ARRAY IDENTIFIER>;
"ARRAY" B, C [0:N-1];
ENTRY: THE ELEMENTS B[I] AND C[I], I = 0, 1, ... , N-1,
CONTAIN THE COEFFICIENTS OF THE RECURRENCE RELATION
P[I+1](X) = (X - B[I]) * P[I](X) - C[I] * P[I-1](X)
I = 0, 1, ... , N-1; ASSUMED IS C[0]=0, WHILE THE
CONTENTS OF THE ARRAYS ARE PRESERVED;
ZER: <ARRAY IDENTIFIER>;
"ARRAY" ZER[1:N];
EXIT: THE ZEROS OF THE N-TH DEGREE ORTHOGONAL POLYNOMIAL;
(B MAY BE USED FOR ZER, BUT THEN THIS RECURRENCE
COEFFICIENTS ARE OVERWRITTEN BY THE ZEROS AND
THE ORIGINAL CONTENTS OF B ARE NOT PRESERVED.)
EM: <ARRAY IDENTIFIER>;
"ARRAY" EM[0:5];
ENTRY: EM[0]: THE MACHINE PRECISION;
EM[2]: THE RELATIVE TOLERANCE OF THE ZEROS;
EM[4]: THE MAXIMUM ALLOWED NUMBER OF ITERATIONS,
E.G. 5 * N;
EXIT: EM[1]: THE MAXIMUM OF ABS(B[0])+1,C[I]+ABS(B[I])+1,
(I=1,...N-2),C[N-1]+ABS(B[N-1]);
EM[3]: INFORMATION CONCERNING THE PROCESS USED;
I.E. THE MAXIMUM ABSOLUTE VALUE OF THE
CODIAGONAL ELEMENTS NEGLECTED,
(SEE ALSO SECTION 3.3.1.1.1.);
EM[5]: THE NUMBER OF ITERATIONS PERFORMED.
1SECTION : 3.6.2 (DECEMBER 1978) PAGE 3
PROCEDURES USED:
QRIVALSYMTRI = CP34160,
DUPVEC = CP31030.
METHOD AND PERFORMANCE : SEE SELZERORTPOL (THIS SECTION).
EXAMPLE OF USE:
AS A FORMAL TEST OF THE PROCEDURE WE CALCULATE THE ZEROS OF
THE CHEBYSHEV POLYNOMIAL (OF THE FIRST KIND) OF THE THIRD DEGREE.
THE RECURRENCE COEFFICIENTS ARE:
B[I] = 0, I = 0, 1, ....;
C[0] = 0, C[1] = .5, C[I] = .25 , I = 2, 3, .....
(IT IS RECOMMENDED TO STORE THE ELEMENTS OF THE ARRAYS B AND C IN
REVERSED ORDER IF THESE ELEMENTS ARE STRONGLY INCREASING).
"BEGIN" "ARRAY" B, C[0:3], ZER[1:3], EM[0:5];
EM[0]:= EM[2]:= "-14; EM[4]:=15;
B[2]:=B[1]:=B[0]:=0;
C[0]:= 0; C[1]:= .5; C[2]:= .25;
ALLZERORTPOL (3, B, C, ZER, EM);
OUTPUT(61,"(""("THE THREE ZEROS:")",/,3(/ZD5B,N),2/,
"("EM[1]:")",5BD.2D"+2D, /,
"("EM[3]:")",5BD.2D"+2D, /,"("EM[5]:")",5ZD")",
1,ZER[1],2,ZER[2],3,ZER[3],EM[1],EM[3],EM[5])
"END"
THE THREE ZEROS:
1 -8.6602540378444"-001
2 +8.6602540378444"-001
3 -1.0000000000000"-014
EM[1]: 1.50"+00
EM[3]: 7.07"-15
EM[5]: 1
1SECTION : 3.6.2 (DECEMBER 1978) PAGE 4
SUBSECTION: LUPZERORTPOL.
CALLING SEQUENCE:
THE DECLARATION OF THE PROCEDURE IN THE CALLING PROGRAM READS:
"PROCEDURE" LUPZERORTPOL (N, M, B, C, ZER, EM);
"VALUE" N, M; "INTEGER" N, M; "ARRAY" B, C, ZER, EM;
"CODE" 31363;
THE MEANING OF THE FORMAL PARAMETERS IS:
N: <ARITHMETIC EXPRESSION>;
ENTRY: THE DEGREE OF THE ORTHOGONAL POLYNOMIAL OF WHICH
THE ZEROS ARE TO BE CALCULATED;
M: <ARITHMETIC EXPRESSION>;
ENTRY: THE NUMBER OF ZEROS TO BE CALCULATED;
B, C: <ARRAY IDENTIFIER>;
"ARRAY" B, C [0:N-1];
ENTRY: THE ELEMENTS B[I] AND C[I], I = 0, 1, ... , N-1,
CONTAIN THE COEFFICIENTS OF THE RECURRENCE RELATION
P[I+1](X) = (X - B[I]) * P[I](X) - C[I] * P[I-1](X)
I = 0, 1, ... , N-1;
ASSUMED IS C[0]=0, WHILE THE CONTENTS
OF THE ARRAYS ARE NOT PRESERVED;
ZER: <ARRAY IDENTIFIER>;
"ARRAY" ZER[1:M];
EXIT: THE M LOWEST ZEROS ARE DELIVERED;
IF HOWEVER THE ARRAY B[0:N-1] CONTAINED THE OPPOSIT
VALUES OF THE CORRESPONDING RECURRENCE COEFFICIENTS
THEN THE OPPOSITE VALUES OF THE M UPPER ZEROS
ARE DELIVERED.
IN EITHER CASE, ZER[I]<ZER[I+1], I = 1,...,M-1;
EM: <ARRAY IDENTIFIER>;
"ARRAY" EM[0:6];
ENTRY: EM[0]: THE MACHINE PRECISION.
EM[2]: THE RELATIVE TOLERANCE OF THE ZEROS;
EM[4]: THE MAXIMUM ALLOWED NUMBER OF ITERATIONS,
E.G. 15 * M;
EM[6]: IF ALL ZEROS ARE KNOWN TO BE POSITIVE
THEN 1 ELSE 0;
EXIT: EM[1]: THE MAXIMUM OF ABS(B[0]) + 1 ,
C[I]+ABS(B[I])+1,(I=1,...N-2),
C[N-1]+ABS(B[N-1]);
EM[3]: INFORMATION CONCERNING THE PROCESS USED,
I.E. THE MAXIMUM ABSOLUTE VALUE OF THE
THEORETICAL ERRORS OF THE ZEROS
(SEE WILKINSON AND REINSCH, 1971, P.263);
EM[5]: THE NUMBER OF ITERATIONS PERFORMED.
1SECTION : 3.6.2 (DECEMBER 1978) PAGE 5
PROCEDURES USED:
DUPVEC = CP31030,
INFNRMVEC = CP31061.
METHOD AND PERFORMANCE : SEE SELZERORTPOL (THIS SECTION).
EXAMPLE OF USE:
WE CALCULATE THE TWO LOWER AND THE TWO UPPER ZEROS OF THE
LAGUERRE POLYNOMIAL OF THE THIRD DEGREE.
THE RECURRENCE COEFFICIENTS ARE OBTAINED FROM [1], P.782:
B[I] = - A2I / A3I = 2I + 1;
C[I] = A4I / (A3I * A3(I-1)) * A1(I-1) = I * I, I = 0, 1, 2.
(IT IS RECOMMENDED TO STORE THE ELEMENTS OF THE ARRAYS B AND C IN
REVERSED ORDER IF THESE ELEMENTS ARE STRONGLY DECREASING).
"BEGIN" "ARRAY" B, C[0:3], ZER[1:2], EM[0:6];
"INTEGER" I;
EM[0]:= EM[2]:= "-14; EM[4]:= 45; EM[6]:= 1;
"FOR" I:= 0, 1, 2 "DO"
"BEGIN" B[I]:= 2 * I + 1; C[I]:= I * I "END";
LUPZERORTPOL (3, 2, B, C, ZER, EM);
OUTPUT(61,"(""("THE TWO LOWER ZEROS:")",/,2(/ZD5B,N),2/,
"("EM[1]:")",5BD.2D"+2D, /,
"("EM[3]:")",5BD.2D"+2D, /,"("EM[5]:")",5ZD")",
1,ZER[1],2,ZER[2],EM[1],EM[3],EM[5]);
EM[6]:= 0;
"FOR" I:= 0, 1, 2 "DO"
"BEGIN" B[I]:= - 2 * I - 1; C[I]:= I * I "END";
LUPZERORTPOL (3, 2, B, C, ZER, EM);
OUTPUT(61,"("3/,"("THE TWO UPPER ZEROS:")",/,2(/ZD5B,N),2/,
"("EM[1]:")",5BD.2D"+2D, /,
"("EM[3]:")",5BD.2D"+2D, /,"("EM[5]:")",5ZD")",
1,-ZER[1],2,-ZER[2],EM[1],EM[3],EM[5]);
"END"
THE TWO LOWER ZEROS:
1 +4.1577455678348"-001
2 +2.2942803602791"+000
EM[1]: 9.00"+00
EM[3]: 5.72"-16
EM[5]: 12
1SECTION : 3.6.2 (DECEMBER 1978) PAGE 6
THE TWO UPPER ZEROS:
1 +6.2899450829375"+000
2 +2.2942803602791"+000
EM[1]: 9.00"+00
EM[3]: 4.70"-20
EM[5]: 14
SUBSECTION: SELZERORTPOL.
CALLING SEQUENCE:
THE DECLARATION OF THE PROCEDURE IN THE CALLING PROGRAM READS:
"PROCEDURE" SELZERORTPOL (N, N1, N2, B, C, ZER, EM);
"VALUE" N, N1, N2; "INTEGER" N, N1, N2; "ARRAY" B, C, ZER, EM;
"CODE" 31364;
THE MEANING OF THE FORMAL PARAMETERS IS :
N,N1,N2:<ARITHMETIC EXPRESSION>;
ENTRY: N IS THE DEGREE OF THE ORTHOGONAL POLYNOMIAL OF
WHICH THE N1-ST UP TO AND INCLUDING N2-ND ZEROS ARE
TO BE CALCULATED(ZER[N1]>=ZER[N2]);
B, C: <ARRAY IDENTIFIER>;
"ARRAY" B,C [0 : N-1];
ENTRY: THE ELEMENTS B[I] AND C[I], I = 0, 1, ... , N-1,
CONTAIN THE COEFFICIENTS OF THE RECURRENCE RELATION
P[I+1](X) = (X - B[I]) * P[I](X) - C[I] * P[I-1](X)
I = 0, 1, ... , N-1,
ASSUMED IS C[0]=0, WHILE THE CONTENTS
OF THE ARRAYS IS PRESERVED;
ZER: <ARRAY IDENTIFIER>;
"ARRAY" ZER [N1:N2];
EXIT: THE N2-N1+1 CALCULATED ZEROS IN DECREASING ORDER.
EM: <ARRAY IDENTIFIER>;
"ARRAY" EM[0:5];
ENTRY: EM[0]: THE MACHINE PRECISION.
EM[2]: THE RELATIVE TOLERANCE OF THE ZEROS;
EXIT: EM[1]: THE MAXIMUM OF ABS(B[0]) + 1,
C[I]+ABS(B[I])+1 (I=1,...N-2) AND
C[N-1]+ABS(B[N-1]);
EM[5]: THE NUMBER OF ITERATIONS PERFORMED.
PROCEDURES USED:
VALSYMTRI = CP34151.
1SECTION : 3.6.2 (DECEMBER 1978) PAGE 7
METHOD AND PERFORMANCE:
THE ZEROS OF AN ORTHOGONAL POLYNOMIAL ARE THE EIGENVALUES OF A
SYMMETRIC TRIDIAGONAL MATRIX (SEE GOLUB AND WELSCH (1969),
LANCZOS (1957),P.375,376, STOER (1972),P.120).
THE ORTHOGONAL POLYNOMIAL IS DEFINED BY A LINEAR THREE-TERM
HOMOGENEOUS RECURRENCE RELATION.
EXAMPLE OF USE :
WE CALCULATE THE THIRD ZERO OF THE LEGENDRE POLYNOMIAL OF THE
FOURTH DEGREE. THE RECURRENCE COEFFICIENTS ARE OBTAINED FROM
ABRAMOWITZ AND STEGUN (1964),P.782:
B[I] = 0, I = 0, 1, ....;
C[I] = A4I / (A3I * A3(I-1)) * A1(I-1) = I * I / ( 4 * I * I - 1),
I = 0, 1, .....
(IT IS RECOMMENDED TO STORE THE ELEMENTS OF THE ARRAYS B AND C IN
REVERSED ORDER IF THESE ELEMENTS ARE STRONGLY DECREASING).
"BEGIN" "ARRAY" B, C[0:4], ZER[3:3], EM[0:5];
"INTEGER" I;
EM[0]:= EM[2]:= "-14;
"FOR" I:= 0, 1, 2, 3 "DO"
"BEGIN" B[I]:= 0; C[I]:= I * I / (4 * I * I - 1) "END";
SELZERORTPOL (4, 3, 3, B, C, ZER, EM);
OUTPUT(61,"(""("THE THIRD ZERO:")",2/,ZD5B,N,2/,
"("EM[1]:")",5BD.2D"+2D, /,
"("EM[5]:")",5ZD")",3,ZER[3],EM[1],EM[5])
"END"
THE THIRD ZERO:
3 -3.3998104358486"-001
EM[1]: 1.33"+00
EM[5]: 12
1SECTION : 3.6.2 (DECEMBER 1978) PAGE 8
SUBSECTION: ALL JAC ZER.
CALLING SEQUENCE:
THE DECLARATION OF THE PROCEDURE IN THE CALLING PROGRAM READS:
"PROCEDURE" ALL JAC ZER(N, ALFA, BETA, ZER);
"VALUE" N, ALFA, BETA;
"INTEGER" N; "REAL" ALFA, BETA; "ARRAY" ZER;
"CODE" 31370;
THE MEANING OF THE FORMAL PARAMETERS IS:
N: <ARITHMETIC EXPRESSION>;
THE UPPER BOUND OF THE ARRAY ZER; N >= 1;
ALFA,BETA:
<ARITHMETIC EXPRESSION>;
THE PARAMETERS OF THE JACOBI POLYNOMIAL,
SEE ABRAMOWITZ AND STEGUN (1964);
ALFA, BETA > - 1;
ZER: <ARRAY IDENTIFIER>;
"ARRAY" ZER[1 : N];
EXIT: ZER[1], ..., ZER[N] ARE THE ZEROS OF THE N-TH
JACOBI POLYNOMIAL WITH PARAMETERS ALFA AND BETA.
PROCEDURES USED:
ALL ZER ORT POL = CP 31362.
REQUIRED CENTRAL MEMORY:
IF ALFA = BETA THEN TWO AUXILIARY ARRAYS OF N//2 REALS ARE
USED, OTHERWISE TWO AUXILIARY ARRAYS OF N REALS ARE DECLARED.
METHOD AND PERFORMANCE:
THE JACOBI POLYNOMIALS ARE A SPECIAL CASE OF ORTHOGONAL
POLYNOMIALS (SEE ABRAMOWITZ AND STEGUN (1964)); ALL JAC ZER
COMPUTES THE COEFFICIENTS OF THE THREE-TERM RECURRENCE RELATION
AND CALLS THE PROCEDURE ALL ZER ORT POL TO COMPUTE THE ZEROS;
IF ALFA=BETA, THE POLYNOMIALS ARE ODD OR EVEN, HENCE ONLY THE
POSITIVE ZEROS ARE CALCULATED; THIS IS DONE BY MEANS OF THE
FORMULAS
P(2*M, ALFA, ALFA, X) = C(M)*P(M, ALFA, -0.5, 2*X*X - 1),
P(2*M - 1, ALFA, ALFA, X) = D(M)*P(M, ALFA, +0.5, 2*X*X - 1)*X
(SEE ABRAMOWITZ AND STEGUN (1964), FORMULAS 22.5.20 - 22.5.27).
1SECTION : 3.6.2 (DECEMBER 1978) PAGE 9
EXAMPLE OF USE:
THE PROGRAM
"BEGIN" "ARRAY" X[1:3];
ALL JAC ZER(3,-.5,-.5,X);
OUTPUT(61,"("3(4B-D.13D"-ZD)")",X[1],X[2],X[3])
"END"
DELIVERS THE FOLOWING RESULTS:
-8.6602540378444"-1 0.0000000000000" 0 8.6602540378444"-1
SUBSECTION: ALL LAG ZER.
CALLING SEQUENCE:
THE DECLARATION OF THE PROCEDURE IN THE CALLING PROGRAM READS:
"PROCEDURE" ALL LAG ZER(N, ALFA, ZER);
"VALUE" N, ALFA;
"INTEGER" N; "REAL" ALFA; "ARRAY" ZER;
"CODE" 31371;
THE MEANING OF THE FORMAL PARAMETERS IS:
N: <ARITHMETIC EXPRESSION>;
THE UPPER BOUND OF THE ARRAY ZER; N >= 1;
ALFA: <ARITHMETIC EXPRESSION>;
THE PARAMETER OF THE LAGUERRE POLYNOMIAL,
SEE ABRAMOWITZ AND STEGUN (1964); ALFA > -1;
ZER: <ARRAY IDENTIFIER>;
"ARRAY" ZER[1 : N];
EXIT: ZER[1], ..., ZER[N] ARE THE ZEROS OF THE N-TH
LAGUERRE POLYNOMIAL WITH PARAMETER ALFA.
PROCEDURES USED:
ALL ZER ORT POL = CP 31362.
REQUIRED CENTRAL MEMORY:
TWO AUXILIARY ARRAYS OF N REALS ARE USED.
1SECTION : 3.6.2 (DECEMBER 1978) PAGE 10
METHOD AND PERFORMANCE:
THE LAGUERRE POLYNOMIALS ARE A SPECIAL CASE OF ORTHOGONAL
POLYNOMIALS (SEE ABRAMOWITZ AND STEGUN (1964)); ALL LAG ZER
COMPUTES THE COEFFICIENTS OF THE THREE-TERM RECURRENCE RELATION
AND CALLS THE PROCEDURE ALL ZER ORT POL TO COMPUTE THE ZEROS.
EXAMPLE OF USE:
"BEGIN" "ARRAY" X[1:3];
ALL LAG ZER(3,-.5,X);
OUTPUT(61,"("3(4B-D.13D"-ZD)")",X[1],X[2],X[3])
"END"
DELIVERS THE FOLOWING RESULTS:
5.5253437422633" 0. 1.7844927485432" 0 1.9016350919350" -1
SOURCE TEXT(S) :
0"CODE"31362;
"PROCEDURE" ALLZERORTPOL (N, B, C, ZER, EM);
"VALUE" N; "INTEGER" N; "ARRAY" B, C, ZER, EM;
"BEGIN" "INTEGER"I;"REAL"NRM;"ARRAY"BB[1:N];
"PROCEDURE" DUPCEV (L, U, SHIFT, A, B);
"VALUE"L,U,SHIFT;"INTEGER"L,U,SHIFT;"ARRAY"A,B;
"FOR" U:=U "STEP" -1 "UNTIL" L "DO" A[U]:=B[U+SHIFT];
NRM:=ABS(B[0]);
"FOR"I:=1"STEP"1"UNTIL"N-2"DO""IF"C[I]+ABS(B[I])>NRM"THEN"
NRM:=C[I]+ABS(B[I]);
"IF"N>1"THEN"NRM:="IF"NRM+1>=C[N-1]+ABS(B[N-1])"THEN"NRM+1"ELSE"
C[N-1]+ABS(B[N-1]);
EM[1]:=NRM; DUPCEV(1,N,-1,ZER,B);
DUPVEC(1,N-1,0,BB,C);BB[N]:=0;
QRIVALSYMTRI(ZER,BB,N,EM)
"END" ALLZERORTPOL
1SECTION : 3.6.2 (DECEMBER 1978) PAGE 11
;
"EOP"
"CODE"31363;
"PROCEDURE" LUPZERORTPOL (N, M, B, C, ZER, EM);
"VALUE" N, M; "INTEGER" N, M; "ARRAY" B, C, ZER, EM;
"BEGIN"
"PROCEDURE" RATQR(N,M,POSDEF,DLAM,EPS)TRANS:(D,B2);
"VALUE" N,M,POSDEF,DLAM,EPS;
"INTEGER" N,M;
"BOOLEAN" POSDEF;
"REAL" DLAM,EPS;
"ARRAY" D,B2;
"COMMENT" QR ALGORITHM FOR THE COMPUTATION OF THE LOWEST EIGENVALUES
OF A SYMMETRIC TRIDIAGONAL MATRIX. A RATIONAL VARIANT OF THE
QR TRANSFORMATION IS USED, CONSISTING OF TWO SUCCESSIVE QD STEPS
PER ITERATION.
A SHIFT OF THE SPECTRUM AFTER EACH ITERATION GIVES AN ACCELERATED
RATE OF CONVERGENCE. A NEWTON CORRECTION,DERIVED FROM THE
CHARACTERISTIC POLYNOMIAL,IS USED AS SHIFT.
RATQR IS IMPLEMENTED BY REINSCH AND BAUER, SEE WILKINSON AND REINSCH
,1971, CONTR. II-6.
FORMATS: D,B2[1:N];
"BEGIN"
"INTEGER" I,J,K,T; "REAL" DELTA,E,EP,ERR,P,Q,QP,R,S,TOT;
"COMMENT" LOWER BOUND FOR EIGENVALUES FROM GERSHGORIN, INITIAL SHIFT;
B2[1]:= ERR:= Q:= S:= 0; TOT:= D[1];
"FOR" I:= N "STEP" -1 "UNTIL" 1 "DO"
"BEGIN"
P:= Q; Q:= SQRT(B2[I]); E:= D[I]-P-Q;
"IF" E < TOT "THEN" TOT:= E
"END" I;
"IF" POSDEF & TOT < 0 "THEN" TOT:= 0 "ELSE"
"FOR" I:= 1 "STEP" 1 "UNTIL" N "DO" D[I]:= D[I]-TOT;
T:= 0;
"FOR" K:= 1 "STEP" 1 "UNTIL" M "DO"
"BEGIN"
NEXT QR TRANSFORMATION: T:= T + 1;
TOT:= TOT + S; DELTA:= D[N]-S; I:= N;
E:= ABS(EPS*TOT); "IF" DLAM < E "THEN" DLAM:= E;
"IF" DELTA < = DLAM "THEN" "GOTO" CONVERGENCE;
E:= B2[N]/DELTA; QP:= DELTA+E; P:= 1;
"FOR" I:= N-1 "STEP" -1 "UNTIL" K "DO"
"BEGIN"
Q:= D[I]-S-E; R:= Q/QP; P:= P*R+1;
EP:= E*R; D[I+1]:= QP+EP; DELTA:= Q-EP;
"IF" DELTA < = DLAM "THEN" "GOTO" CONVERGENCE;
E:= B2[I]/Q;QP:= DELTA+E; B2[I+1]:= QP*EP
"END" I;
D[K]:= QP; S:= QP/P;
"COMMENT"
1SECTION : 3.6.2 (DECEMBER 1978) PAGE 12
;
"IF" TOT+S > TOT "THEN" "GOTO" NEXT QR TRANSFORMATION;
"COMMENT" IRREGULAR END OF ITERATION,
DEFLATE MINIMUM DIAGONAL ELEMENT;
S:= 0; I:= K; DELTA:= QP;
"FOR" J:= K+1 "STEP" 1 "UNTIL" N "DO"
"IF" D[J] < DELTA "THEN"
"BEGIN" I:= J; DELTA:= D[J] "END";
CONVERGENCE:
"IF" I < N "THEN" B2[I+1]:= B2[I]*E/QP;
"FOR" J:= I-1 "STEP" -1 "UNTIL" K "DO"
"BEGIN" D[J+1]:= D[J]-S; B2[J+1]:= B2[J] "END" J;
D[K]:= TOT; B2[K]:= ERR:= ERR+ABS(DELTA)
"END" K;
EM[5]:=T;EM[3]:=INFNRMVEC(1,M,T,B2);
"END" RATQR;
"PROCEDURE" DUPCEV (L, U, SHIFT, A, B);
"VALUE"L,U,SHIFT;"INTEGER"L,U,SHIFT;"ARRAY"A,B;
"FOR" U:=U "STEP" -1 "UNTIL" L "DO" A[U]:=B[U+SHIFT];
"INTEGER" I;"REAL"NRM;
NRM:=ABS(B[0]);
"FOR"I:=1"STEP"1"UNTIL"N-2"DO""IF"C[I]+ABS(B[I])>NRM"THEN"
NRM:=C[I]+ABS(B[I]);
"IF"N>1"THEN"NRM:="IF"NRM+1>=C[N-1]+ABS(B[N-1])"THEN"NRM+1"ELSE"
C[N-1]+ABS(B[N-1]);
EM[1]:=NRM;
DUPCEV(1,N,-1,B,B);
DUPCEV(2,N,-1,C,C);
RATQR (N, M, EM[6] = 1, EM[2], EM[0], B, C);
DUPVEC (1, M, 0, ZER, B)
"END" LUPZERORTPOL;
"EOP"
"CODE"31364;
"PROCEDURE" SELZERORTPOL (N, N1, N2, B, C, ZER, EM);
"VALUE" N, N1, N2; "INTEGER" N, N1, N2; "ARRAY" B, C, ZER, EM;
"BEGIN" "INTEGER"I;"REAL"NRM;"ARRAY"D[1:N];
"PROCEDURE" DUPCEV (L, U, SHIFT, A, B);
"VALUE"L,U,SHIFT;"INTEGER"L,U,SHIFT;"ARRAY"A,B;
"FOR" U:=U "STEP" -1 "UNTIL" L "DO" A[U]:=B[U+SHIFT];
NRM:=ABS(B[0]);
"FOR"I:=N-2"STEP"-1"UNTIL"1"DO""IF"C[I]+ABS(B[I])>NRM"THEN"
NRM:=C[I]+ABS(B[I]);
"COMMENT"
1SECTION : 3.6.2 (DECEMBER 1978) PAGE 13
;
"IF"N>1"THEN"NRM:="IF"NRM+1>=C[N-1]+ABS(B[N-1])"THEN"NRM+1"ELSE"
C[N-1]+ABS(B[N-1]);
EM[1]:=NRM;
DUPCEV(1,N,-1,D,B);
VALSYMTRI (D, C, N, N1, N2, ZER, EM);
EM[5]:=EM[3]
"END" SELZERORTPOL;
"EOP"
"CODE" 31370;
"PROCEDURE" ALL JAC ZER(N, ALFA, BETA, ZER);
"VALUE" N, ALFA, BETA ; "INTEGER" N;
"REAL" ALFA, BETA ; "ARRAY" ZER;
"IF" ALFA = BETA "THEN"
"BEGIN" "INTEGER" I, M;
"ARRAY" A, B[0:N//2], EM[0:5];
"REAL" MIN, GAMMA, SUM, ZERI;
M:= N//2; "IF" N ^= 2*M "THEN"
"BEGIN" GAMMA:= + 0.5; ZER[M + 1]:= 0 "END"
"ELSE" GAMMA:= - 0.5;
MIN:= 0.25 - ALFA*ALFA; SUM:= ALFA + GAMMA + 2;
A[0]:= (GAMMA - ALFA)/SUM; A[1]:= MIN/SUM/(SUM + 2);
B[1]:= 4*(1 + ALFA)*(1 + GAMMA)/SUM/SUM/(SUM + 1);
"FOR" I:= 2 "STEP" 1 "UNTIL" M - 1 "DO"
"BEGIN" SUM:= I + I + ALFA + GAMMA;
A[I]:= MIN/SUM/(SUM + 2); SUM := SUM*SUM;
B[I]:= 4*I*(I + ALFA + GAMMA)*(I + ALFA)*(I + GAMMA)/
SUM/(SUM - 1)
"END";
EM[0]:=ARREB; EM[2]:="-10; EM[4]:= 6*M;
ALL ZER ORT POL (M, A, B, ZER, EM);
"FOR" I:= 1 "STEP" 1 "UNTIL" M "DO"
"BEGIN" ZER[I]:= ZERI:= - SQRT((1 + ZER[I])/2);
ZER[N + 1 - I]:= - ZERI
"END"
"END" "ELSE"
"BEGIN" "INTEGER" I; "REAL" SUM, MIN;
"ARRAY" A, B[0:N], EM[0:5];
"COMMENT"
1SECTION : 3.6.2 (DECEMBER 1978) PAGE 14
;
MIN:= (BETA - ALFA)*(BETA + ALFA);
SUM:= ALFA + BETA + 2; B[0]:= 0;
A[0]:= (BETA - ALFA)/SUM;
A[1]:= MIN/SUM/(SUM + 2);
B[1]:= 4*(1 + ALFA)*(1 + BETA)/SUM/SUM/(SUM + 1);
"FOR" I:= 2 "STEP" 1 "UNTIL" N - 1 "DO"
"BEGIN" SUM:= I + I + ALFA + BETA;
A[I]:= MIN/SUM/(SUM + 2); SUM:= SUM*SUM;
B[I]:= 4*I*(I + ALFA + BETA)*(I + ALFA)*(I + BETA)/
(SUM - 1)/SUM
"END";
EM[0]:=ARREB; EM[2]:= 1.0"-8; EM[4]:= 6*N;
ALL ZER ORT POL(N, A, B, ZER, EM)
"END" ALL JAC ZER;
"EOP"
"CODE" 31371;
"PROCEDURE" ALL LAG ZER(N, ALFA, ZER);
"VALUE" N, ALFA ; "INTEGER"N; "REAL" ALFA ; "ARRAY" ZER;
"BEGIN" "INTEGER" I; "ARRAY" A, B[0:N], EM[0:5];
B[0]:= 0; A[N - 1]:= N + N + ALFA - 1;
"FOR" I:= 1 "STEP" 1 "UNTIL" N - 1 "DO"
"BEGIN" A[I - 1]:= I + I + ALFA - 1;
B[I]:= I*(I + ALFA)
"END";
EM[0]:=ARREB; EM[2]:= "-10;EM[4]:= 6*N;
ALL ZER ORT POL(N, A, B, ZER, EM)
"END" ALL LAG ZER;
"EOP"
1SECTION : 3.6.3 (JULY 1974) PAGE 1
AUTHOR: C.G. VAN DER LAAN.
INSTITUTE: MATHEMATICAL CENTRE.
RECEIVED: 730815.
BRIEF DESCRIPTION:
COMKWD CALCULATES THE ROOTS OF A QUADRATIC EQUATION WITH COMPLEX
COEFFICIENTS.
KEYWORDS:
ZEROS,QUADRATIC EQUATION,POLYNOMIAL EQUATION,COMPLEX COEFFICIENTS.
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE READS:
"PROCEDURE"COMKWD(PR,PI,QR,QI,GR,GI,KR,KI);
"VALUE"PR,PI,QR,QI;"REAL"PR,PI,QR,QI,GR,GI,KR,KI;
"CODE" 34345;
THE MEANING OF THE FORMAL PARAMETERS IS:
PR,PI,QR,QI:<ARITHMETIC EXPRESSION>;
ENTRY:PR,QR ARE THE REAL PARTS AND PI,QI ARE THE
IMAGINARY PARTS OF THE COEFFICIENTS OF THE
QUADRATIC EQUATION:
X**2-2*(PR+I*PI)*X-(QR+I*QI)=0;
GR,GI,KR,KI:<VARIABLE>;
EXIT:THE REAL PARTS AND THE IMAGINARY PARTS OF THE
DINOMIAL ARE DELIVERED IN GR,KR AND GI,KI,
RESPECTIVELY;MOREOVER,THE MODULUS OF GR+I*GI IS
GREATER OR EQUAL THE MODULUS OF KR+I*KI.
PROCEDURES USED:
COMMUL=CP34341;
COMDIV=CP34342;
COMSQRT=CP34343.
LANGUAGE: ALGOL 60.
1SECTION : 3.6.3 (JULY 1974) PAGE 2
EXAMPLE OF USE:
"BEGIN""REAL"GR,GI,KR,KI;
COMKWD(-.1,.3,.11,.02,GR,GI,KR,KI);
OUTPUT(61,"(""("X**2-2(-.1+.3*I)*X-( .11+.02*I) HAS ROOTS")",/,
-D.DD,+D.DD,"("*I")",/,
-D.DD,+D.DD,"("*I")"")",GR,GI,KR,KI)
"END"
X**2-2(-.1+.3*I)*X-( .11+.02*I) HAS ROOTS
-0.30+0.40*I
0.10+0.20*I
SOURCE TEXT(S):
0"CODE"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"
"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 "OR" 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;
"EOP"
1SECTION : 4.1 (JULY 1974) PAGE 1
AUTHOR : J.W. DANIEL.
REVISOR : J. KOK.
INSTITUTE : MATHEMATICAL CENTRE.
RECEIVED : 730528 (EULER).
730917 (SUMPOSSERIES).
BRIEF DESCRIPTION :
THIS SECTION CONTAINS TWO PROCEDURES FOR THE SUMMATION OF
CONVERGENT INFINITE SERIES:
EULER PERFORMS THE SUMMATION OF AN ALTERNATING SERIES.
SUMPOSSERIES PERFORMS THE SUMMATION OF A CONVERGENT SERIES WITH
POSITIVE MONOTONOUSLY DECREASING TERMS USING THE VAN WIJNGAARDEN
TRANSFORMATION OF THE SERIES TO AN ALTERNATING SERIES.
KEYWORDS :
SUMMATION,
SERIES,
VAN WIJNGAARDEN TRANSFORMATION.
SUBSECTION : EULER.
CALLING SEQUENCE :
THE HEADING OF THE PROCEDURE IS :
"REAL""PROCEDURE" EULER(AI, I, EPS, TIM);
"VALUE" EPS, TIM; "INTEGER" I, TIM; "REAL" AI, EPS;
"CODE" 32010;
EULER : DELIVERS THE COMPUTED SUM OF THE INFINITE SERIES
SUM( A[I], I:= 0,1,... ) .
THE MEANING OF THE FORMAL PARAMETERS IS:
AI : <ARITHMETIC EXPRESSION>;
THE SUMMAND,
THIS EXPRESSION WILL BE DEPENDENT ON THE JENSEN
PARAMETER I;
AI IS THE I-TH TERM OF THE SERIES (I >= 0).
I : <VARIABLE>;
JENSEN PARAMETER.
EPS,TIM: <ARITHMETIC EXPRESSION>;
THE SUMMATION IS CONTINUED UNTIL TIM SUCCESSIVE TERMS
OF THE TRANSFORMED SERIES ARE IN ABSOLUTE VALUE LESS
THAN EPS.
1SECTION : 4.1 (DECEMBER 1975) PAGE 2
PROCEDURES USED : NONE.
REQUIRED CENTRAL MEMORY :
EXECUTION FIELD LENGTH : 25.
LANGUAGE : ALGOL 60.
METHOD AND PERFORMANCE :
EULER PERFORMS THE SUMMATION OF AN ALTERNATING SEQUENCE BY APPLYING
EULER'S TRANSFORMATION. BY THIS TRANSFORMATION THE SEQUENCE OF
TERMS IS REPLACED BY THE SEQUENCE OF MEANS OF TWO SUCCESSIVE TERMS.
IF NECESSARY THE NEW SEQUENCE IS AGAIN TRANSFORMED BY EULER'S
TRANSFORMATION. THE SUMMATION STOPS WHEN TIM SUCCESSIVE TERMS OF
THE (ONCE OR SEVERAL TIMES TRANSFORMED) SEQUENCE ARE IN ABSOLUTE
VALUE LESS THAN EPS.
REFERENCES :
P.NAUR, ED. : REVISED REPORT ON THE ALGORITHMIC LANGUAGE
ALGOL 60. COPENHAGEN (1964).
EXAMPLE OF USE :
THE PROGRAM :
"BEGIN""INTEGER" K;
OUTPUT(61, "("+.8D"+2D")",
EULER((- 1) ** K / (K + 1) ** 2, K, "- 6, 100))
"END"
DELIVERS :
+.82246703"+00.
1SECTION : 4.1 (JULY 1974) PAGE 3
SUBSECTION : SUMPOSSERIES.
CALLING SEQUENCE :
THE HEADING OF THE PROCEDURE IS :
"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;
"CODE" 32020;
SUMPOSSERIES : DELIVERS THE COMPUTED SUM OF THE INFINITE SERIES
A[I] , I:= 1,2,.... .
THE MEANING OF THE FORMAL PARAMETERS IS:
AI : <ARITHMETIC EXPRESSION>;
THE SUMMAND,
THIS EXPRESSION SHOULD BE DEPENDENT ON THE JENSEN
PARAMETER I;
AI IS THE I-TH TERM OF THE SERIES (I >= 1).
I : <VARIABLE>;
JENSEN PARAMETER.
MAXADDUP : <ARITHMETIC EXPRESSION>;
UPPER LIMIT FOR THE NUMBER OF STRAIGHTFORWARD ADDITIONS
.
MAXZERO, TIM :
<ARITHMETIC EXPRESSION>;
TOLERANCES EPS AND TIM NEEDED FOR A CALL OF THE
PROCEDURE EULER (THIS SECTION). MAXZERO IS ALSO USED
AS A TOLERANCE FOR MAXADDUP STRAIGHTFORWARD ADDITIONS.
MAXRECURS : <ARITHMETIC EXPRESSION>;
UPPER LIMIT FOR THE RECURSION DEPTH OF THE
VAN WIJNGAARDEN TRANSFORMATIONS.
MACHEXP : <ARITHMETIC EXPRESSION>;
IN ORDER TO AVOID OVERFLOW AND EVALUATION OF THOSE
TERMS WHICH CAN BE NEGLECTED, MACHEXP HAS TO BE THE
LARGEST ADMISSIBLE VALUE X FOR WHICH TERMS WITH INDEX
J = K * (2 ** X) CAN BE COMPUTED (K IS SMALL).
OTHERWISE OVERFLOW MIGHT OCCUR IN COMPUTING A VALUE FOR
THE JENSEN PARAMETER I, WHICH CAN BE AN UNUSUALLY
HIGH POWER OF 2.
PROCEDURES USED : EULER = CP32010.
REQUIRED CENTRAL MEMORY :
EXECUTION FIELD LENGTH : ABOUT 1000 * RECURSION DEPTH.
LANGUAGE : ALGOL 60.
1SECTION : 4.1 (JULY 1974) PAGE 4
METHOD AND PERFORMANCE :
WHEN THE TERMS AI WITH INDICES
MAXADDUP + 1, ... , MAXADDUP + TIM ARE ALL LESS THAN MAXZERO,
CONVERGENCE IS ASSUMED AND SUMPOSSERIES DELIVERS THE SUM OF THE
SERIES BY STRAIGHTFORWARD ADDITION UNTIL TIM SERIAL TERMS ARE LESS
THAN MAXZERO. OTHERWISE THE VAN WIJNGAARDEN TRANSFORMATION IS
APPLIED, YIELDING AN ALTERNATING SERIES WHICH IS SUMMED UP WITH
EULER'S METHOD. SINCE THE TERMS OF THIS ALTERNATING SERIES ARE
THEMSELVES INFINITE SERIES WITH POSITIVE TERMS, THE HERE DESCRIBED
PROCESS IS RECURSIVELY CALLED FOR THE SUMMATION OF EACH
TERM THAT IS WANTED BY EULER'S METHOD.
HOWEVER, ONLY STRAIGHTFORWARD ADDITION IS APPLIED IF THE ALLOWED
RECURSION LEVEL (SPECIFIED BY MAXRECURS) HAS BEEN REACHED.
IN THE RECURSION THE PROCESS ASKS FOR TERMS AI WITH INDICES OF
THE TYPE J * (2 ** K), IN WHICH K CAN BE VERY LARGE. IN ORDER
TO AVOID OVERFLOW AN UPPER BOUND FOR K MUST BE GIVEN IN MACHEXP.
IF K EXCEEDS THIS BOUND THE CORRESPONDING TERM IS TAKEN TO BE ZERO.
REFERENCES :
[1] DANIEL, J.W. :
SUMMATION OF A SERIES OF POSITIVE TERMS BY CONDENSATION
TRANSFORMATIONS. MATH. OF COMP. V.23, P.91-96 (1969).
[2] WIJNGAARDEN, A. VAN :
COURSE SCIENTIFIC COMPUTING B, PROCESS ANALYSIS (DUTCH)
MATHEMATISCH CENTRUM CR-18 (1965).
EXAMPLE OF USE :
THE PROGRAM :
"BEGIN""COMMENT" 730808, EXAMPLE OF THE USE OF SUMPOSSERIES;
"REAL" I;
OUTPUT(61, "("/, +.12D"+DD")",
SUMPOSSERIES(1 / I ** 2, I, 100, "- 7, 8, 1068, 10))
"END"
DELIVERS :
+.164493406604"+01
NUMBER OF TERMS USED : 462,
RECURSION DEPTH : 1.
1SECTION : 4.1 (JULY 1974) PAGE 5
SOURCE TEXT(S) :
0"CODE" 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;
"EOP"
0"CODE" 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" 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
1SECTION : 4.1 (JULY 1974) PAGE 6
;
"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;
"EOP"
1SECTION : 4.2.1 (JULY 1974) PAGE 1
SECTION 4.2.1 CONTAINS TWO ALTERNATIVE PROCEDURES FOR THE COMPUTATION
OF A DEFINITE INTEGRAL.
A. THE PROCEDURE QADRAT USES HIGH ORDER INTEGRATION RULES (UP TO 16-TH
ORDER) AND IS APPROPRIATE FOR THE EVALUATION OVER A FINITE
INTERVAL.
B. THE PROCEDURE INTEGRAL USES A 5-TH ORDER METHOD AND CAN ALSO BE
USED TO CALCULATE THE INTEGRAL OVER A NUMBER OF CONSECUTIVE
INTERVALS. MOREOVER THE PROCEDURE CAN BE USED FOR THE COMPUTATION
OF THE DEFINITE INTEGRAL OVER AN INFINITE INTERVAL.
FOR A COMPARISON OF A NUMBER OF PROCEDURES THAT EVALUATE DEFINITE
INTEGRALS : SEE REF[2].
REFERENCES :
[1] T.J.DEKKER AND C.J.ROOTHART.
INTRODUCTION TO NUMERICAL ANALYSIS. (DUTCH).
MATH. CENTRE REPORT CR 244/74, AMSTERDAM.
[2] C.J.ROOTHART AND H. FIOLET.
QUADRATURE PROCEDURES.
MATH. CENTRE REPORT MR 137/72, AMSTERDAM.
1SECTION : 4.2.1.A (JULY 1974) PAGE 1
AUTHORS: C.J.ROOTHART.
CONTRIBUTORS: P.W.HEMKER.
INSTITUTE: MATHEMATICAL CENTRE.
RECEIVED: 730530.
BRIEF DESCRIPTION:
QADRAT COMPUTES THE DEFINITE INTEGRAL OF A FUNCTION OF ONE
VARIABLE OVER A FINITE INTERVAL.
KEYWORDS:
INTEGRATION,
QUADRATURE,
DEFINITE INTEGRAL.
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE READS:
"REAL" "PROCEDURE" QADRAT (X, A, B, FX, E);
"VALUE" A, B; "REAL" X, A, B, FX; "ARRAY" E;
"CODE" 32070;
QADRAT: DELIVERS THE COMPUTED VALUE OF THE DEFINITE INTEGRAL FROM
A TO B OF THE FUNCTION F(X);
THE MEANING OF THE FORMAL PARAMETERS IS:
X: <VARIABLE>;
INTEGRATION VARIABLE; X CAN BE USED AS A JENSEN-PARAMETER
DURING THE EVALUATIONS OF FX;
A,B: <ARITHMETIC EXPRESSION>;
(A,B) DENOTES THE INTERVAL OF INTEGRATION;
B < A IS ALLOWED;
FX: <ARITHMETIC EXPRESSION>;
FX DENOTES THE INTEGRAND F(X). THIS EXPRESSION WILL BE
DEPENDENT ON THE JENSEN-PARAMETER X.
E: <ARRAY IDENTIFIER>;
"ARRAY" E[1:3];
ENTRY: E[1]: THE RELATIVE ACCURACY REQUIRED;
E[2]: THE ABSOLUTE ACCURACY REQUIRED;
EXIT: E[3]: THE NUMBER OF ELEMENTARY INTEGRATIONS WITH
H < ABS(B-A) * E[1].
1SECTION : 4.2.1.A (JULY 1974) PAGE 2
PROCEDURES USED: NONE.
REQUIRED CENTRAL MEMORY:
EXECUTION FIELD LENGTH: CIRCA 16 + 9 * RECURSION DEPTH.
RUNNING TIME: DEPENDS STRONGLY ON THE DEFINITE INTEGRAL TO COMPUTE.
LANGUAGE: ALGOL 60.
METHOD AND PERFORMANCE: SEE REF[1].
REFERENCES:
[1].C.J.ROOTHART AND H.FIOLET.
QUADRATURE PROCEDURES.
MATH.CENTRE, AMSTERDAM. REPORT MR 137/72.
EXAMPLE OF USE:
"BEGIN"
"ARRAY" E[1:3]; "REAL" T,Q;
EXECUTION FIELD LENGTH: CIRCA 16 + 26 * RECURSION DEPTH.
E[1]:= E[2]:= "-9;
Q:= QADRAT(T,0,3.141592653589 ,SIN(T),E);
OUTPUT(61,"("/,+.15D"+3D,3B,3ZD,/")",Q,E[3]);
"END"
DELIVERS:
+.200000000000033"+001 0
1SECTION : 4.2.1.A (NOVEMBER 1976) PAGE 3
SOURCE TEXT(S):
0"CODE" 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.393971460638127"- 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.275789764664284"- 1 * (F2 + F12) + 0.105575010053846* (F1
+ F13) + 0.157119426059518"- 1 * (F0 + F14);
"IF" ABS(H) < HMIN "THEN" E[3]:= E[3] + 1;
"IF" ABS(V - W) < ABS(W) * RE + AE "OR" 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.500557131525460"- 1*(F4 +
F10) + 0.177946487736780*(F3 + F11)+0.584014599347449"- 1
* (F2 + F12) + 0.874830942871331"- 1 * (F1 + F13) +
0.189642078648079"- 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;
"EOP"
1SECTION : 4.2.1.B (JULY 1974) PAGE 1
AUTHOR: H.N.GLORIE.
CONTRIBUTOR: H.FIOLET.
INSTITUTE: MATHEMATICAL CENTRE.
RECEIVED: 730606.
BRIEF DESCRIPTION:
INTEGRAL CALCULATES THE DEFINITE INTEGRAL OF A FUNCTION OF ONE
VARIABLE, OVER A FINITE OR INFINITE INTERVAL OR OVER A NUMBER OF
CONSECUTIVE INTERVALS.
KEYWORDS:
DEFINITE INTEGRAL,
INFINITE INTERVAL,
SIMPSON RULE,
RICHARDSON CORRECTION.
1SECTION : 4.2.1.B (JULY 1974) PAGE 2
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE READS:
"REAL" "PROCEDURE" INTEGRAL(X,A,B,FX,E,UA,UB);
"VALUE" A,B;"REAL" X,A,B,FX;"ARRAY" E;"BOOLEAN" UA,UB;
"CODE" 32051;
INTEGRAL:
DELIVERS THE COMPUTED VALUE OF THE DEFINITE INTEGRAL OF THE
FUNCTION FROM A TO B; AFTER SUCCESSIVE CALLS OF THE PROCEDURE,
THE INTEGRAL OVER THE TOTAL INTERVAL IS DELIVERED, I.E. THE
VALUE OF A IN THE LAST CALL WITH UA="TRUE" IS THE
STARTING POINT OF THE INTERVAL.
THE MEANING OF THE FORMAL PARAMETERS IS:
X: <VARIABLE>;
INTEGRATION VARIABLE; X IS USED AS JENSEN-PARAMETER
FOR FX.
A,B: <ARITHMETIC EXPRESSION>;
THE INTERVAL OF INTEGRATION IS EITHER (A,B) OR
(A,INFINITY) (SEE PARAMETER UB); B<A IS ALLOWED;
FX: <ARITHMETIC EXPRESSION>;
THE INTEGRAND F(X);
E: <ARRAY IDENTIFIER>;
"ARRAY" E[1:6];
ENTRY : E[1]:THE RELATIVE ACCURACY REQUIRED;
E[2]:THE ABSOLUTE ACCURACY REQUIRED;
E[5]:ALTERNATIVE STARTING POINT (SEE PAR. UA);
EXIT: E[3]:THE NUMBER OF SKIPPED INTEGRATION STEPS;
E[4]:THE VALUE OF THE INTEGRAL FROM A TO B;
E[5]:"IF" UB "THEN" B "ELSE" 0;
E[6]:"IF" UB "THEN" F(B) "ELSE" 0;
UA: <BOOLEAN EXPRESSION>;
DETERMINES THE STARTING POINT OF THE INTEGRATION;
STARTING POINT:="IF" UA "THEN" A "ELSE" E[5];
UB: <BOOLEAN EXPRESSION>;
DETERMINES THE FINAL POINT OF THE INTEGRATION;
FINAL POINT:="IF" UB "THEN" B "ELSE"
"IF" B>A "THEN" +INFINITY "ELSE" -INFINITY;
IN THE CASE UB="FALSE" , THE VALUE OF B IS STILL RELEVANT
(SEE METHOD AND PERFORMANCE).
PROCEDURES USED: NONE.
REQUIRED CENTRAL MEMORY:
EXECUTION FIELD LENGTH: CIRCA 16 + 5 * RECURSION LEVEL.
RUNNING TIME: DEPENDS STRONGLY UPON THE INTEGRAL TO BE COMPUTED.
1SECTION : 4.2.1.B (MARCH 1977) PAGE 3
LANGUAGE: ALGOL 60.
METHOD AND PERFORMANCE:
INTEGRAL USES THE SUBPROCEDURE QAD FOR THE CALCULATION OF THE
DEFINITE INTEGRAL OVER A FINITE INTERVAL. THIS IS DONE BY MEANS OF
SIMPSON 'S RULE WITH RICHARDSON CORRECTION.IF THE FOURTH DERIVATIVE
IS TOO LARGE (AND THUS THE CORRECTION TERM) , THE TOTAL INTERVAL IS
SPLIT INTO TWO EQUAL PARTS AND THE INTEGRATION PROCESS IS INVOKED
RECURSIVELY. THIS IS DONE IN SUCH A WAY THAT THE TOTAL AMOUNT OF
RICHARDSON CORRECTIONS IS SLIGHTLY SMALLER THAN OR EQUAL TO
E[1] * ABS ( THE INTEGRAL FROM A TO B OF (FX) ) + E[2].
THE INTEGRATION OVER AN INFINITE INTERVAL REQUIRES TWO CALLS OF THE
PROCEDURE QAD. IN THE FIRST CALL QAD COMPUTES THE DEFINITE INTEGRAL
FROM A TO B . IN THE INTERVAL FROM B TO + OR - INFINITY
THE INTEGRAND IS TRANSFORMED BY MEANS OF THE SUBSTITUTION
Z=1/(X+1-B) TO THE DEFINITE INTEGRAL OF F(B-1+1/Z)/Z**2 FROM 0 TO
1. FOR THE INTEGRATION OF A DEFINITE INTEGRAL OVER A FINITE
INTERVAL THE USE OF QADRAT IS RECOMMENDED ,ESPECIALLY WHEN HIGH
ACCURACY IS REQUIRED.
REFERENCES:
[1] T.J.DEKKER AND C.J.ROOTHART.
INTRODUCTION TO NUMERICAL ANALYSIS.(DUTCH)
MATH.CENTR. REPORT CR 24/71, AMSTERDAM.
[2] C.J.ROOTHART AND H.FIOLET.
QUADRATURE PROCEDURES.
MATH.CENTR. REPORT MR 137/72, AMSTERDAM.
EXAMPLE OF USE:
"BEGIN"
"ARRAY" E[1:6];"REAL" A,B,X;"BOOLEAN" UA,UB;
UA:="TRUE";E[1]:=E[2]:="-14;
"FOR" B:=2,4,20,100 "DO"
"BEGIN" UB:=B<50;
A:=INTEGRAL(X,-1,-B,10/X**2,E,UA,UB);
OUTPUT(61,"("N,B+DDB,N,2(B+DDDB),/")",
A,E[3],E[4],E[5],E[6]);
UA:="FALSE"
"END"
"END"
DELIVERS:
-4.9999999999999"+000 +00 -4.9999999999999 -002 +003
-7.4999999999998"+000 +00 -7.4999999999998 -004 +001
-9.5000000000000"+000 +00 -9.5000000000000 -020 +000
-9.9999999999998"+000 +01 -9.9999999999998 +000 +000 .
1SECTION : 4.2.1.B (MARCH 1977) PAGE 4
SOURCE TEXT(S):
0"CODE" 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;
"EOP"
1SECTION : 4.2.2 (DECEMBER 1979) PAGE 1
AUTHOR : P.W. HEMKER.
CONTRIBUTOR : F.GROEN.
INSTITUTE : MATHEMATICAL CENTRE.
RECEIVED : 740620.
BRIEF DESCRIPTION :
TRICUB COMPUTES THE DEFINITE INTEGRAL OF A FUNCTION OF TWO
VARIABLES OVER A TRIANGULAR DOMAIN.
KEYWORDS :
INTEGRATION,
QUADRATURE,
MOREDIMENSIONAL QUADRATURE,
CUBATURE,
DEFINITE INTEGRAL.
CALLING SEQUENCE :
THE HEADING OF THE PROCEDURE READS :
"REAL" "PROCEDURE" TRICUB ( XI, YI, XJ, YJ, XK, YK, F, RE, AE );
"VALUE" XI, YI, XJ, YJ, XK, YK, RE, AE;
"REAL" XI, YI, XJ, YJ, XK, YK, RE, AE;
"REAL" "PROCEDURE" F;
"CODE" 32075;
TRICUB := THE COMPUTED VALUE OF THE DEFINITE INTEGRAL OF THE
FUNCTION F ( X, Y ) OVER THE TRIANGULAR DOMAIN T WITH
VERTICES ( XI, YI ), ( XJ, YJ ) AND ( XK, YK ).
1SECTION : 4.2.2 (DECEMBER 1979) PAGE 2
THE MEANING OF THE FORMAL PARAMETERS IS :
XI, YI: <ARITHMETIC EXPRESSION>;
ENTRY : THE COORDINATES OF THE FIRST VERTEX OF THE
TRIANGULAR DOMAIN OF INTEGRATION;
XJ, YJ: <ARITHMETIC EXPRESSION>;
ENTRY : THE COORDINATES OF THE SECOND VERTEX OF THE
TRIANGULAR DOMAIN OF INTEGRATION;
XK, YK: <ARITHMETIC EXPRESSION>;
ENTRY : THE COORDINATES OF THE THIRD VERTEX OF THE
TRIANGULAR DOMAIN OF INTEGRATION;
REMARK: THE ALGORITHM IS SYMMETRICAL IN THE VERTICES; THIS
IMPLIES THAT THE RESULT OF THE PROCEDURE (ON ALL COUNTS) IS
INVARIANT FOR ANY PERMUTATION OF THE VERTICES.
F : <PROCEDURE IDENTIFIER>;
THE HEADING OF THIS PROCEDURE READS:
"REAL" "PROCEDURE" F ( X, Y ); "REAL" X, Y;
THIS PROCEDURE DEFINES THE INTEGRAND;
AE, RE: <ARITHMETIC EXPRESSION>;
ENTRY: THE REQUIRED ABSOLUTE AND RELATIVE ERROR
RESPECTIVELY. ONE SHOULD TAKE FOR "AE" AND "RE"
VALUES WHICH ARE GREATER THAN THE ABSOLUTE AND
RELATIVE ERROR IN THE COMPUTATION OF THE INTEGRAND F.
PROCEDURES USED : NONE.
REQUIRED CENTRAL MEMORY :
THE PROCESS IS PROGRAMMED RECURSIVELY. AT EACH RECURSION LEVEL 43
REAL NUMBERS ARE USED. HOWEVER, FOR ANY PROPERLY CHOSEN VALUES OF
RE AND AE THE RECURSION DEPTH WILL NOT EXCEED THE NUMBER OF BITS IN
A REAL'S MANTISSA.
RUNNING TIME : DEPENDS STRONGLY ON THE INTEGRAL TO COMPUTE.
METHOD AND PERFORMANCE :
A NESTED SEQUENCE OF CUBATURE RULES OF ORDER 2, 3, 4 AND 5
IS APPLIED. IF THE DIFFERENCE BETWEEN THE RESULT WITH THE
4-TH DEGREE RULE AND THE RESULT WITH THE 5-TH DEGREE RULE
IS TOO LARGE, THEN THE TRIANGLE IS DIVIDED INTO FOUR CONGRUENT
TRIANGLES. THIS PROCESS IS APPLIED RECURSIVELY IN ORDER TO
OBTAIN AN ADAPTIVE CUBATURE ALGORITHM.
1SECTION : 4.2.2 (OCTOBER 1975) PAGE 3
REFERENCES :
[1].P.W.HEMKER,
A SEQUENCE OF NESTED CUBATURE RULES,
MATH.CENTRE, AMSTERDAM, REPORT NW 3/73.
EXAMPLE OF USE:
THE FOLLOWING PROGRAM EVALUATES THE INTEGRAL OF
F ( X, Y ) = COS ( X ) * COS ( Y ) OVER THE TRIANGLE T WITH
VERTICES ( 0, 0 ), ( O, PI/2 ) AND ( PI/2, PI/2 ).
ON EACH LINE ARE LISTED :
A: THE REQUIRED RELATIVE AND ABSOLUTE PRECISION;
B: THE COMPUTED VALUE OF THE INTEGRAL;
C: THE NUMBER OF CALLS OF THE FUNCTION F,
"BEGIN"
"INTEGER" N,C,I,K; "REAL" PI,ACC,R,S;
"REAL" "PROCEDURE" E(X,Y); "REAL" X,Y;
"BEGIN" C:= C+1;
"IF" C> 20000 "THEN" "GOTO" CC;
E:= COS(X) * COS(Y);
"END" E;
PI:= 3.14159265359;
"FOR" ACC:= "-1,"-2,"-3,"-4,"-5,"-6,"-7,"-8,"-9,"-10,"-11 "DO"
"BEGIN" C:=0; OUTPUT(61,"("+.D"+ZD,2B,+.14D"+2ZD,2B,10ZD,/")",
ACC, TRICUB(0,0,0,PI/2,PI/2,PI/2,E,ACC,ACC) ,C);
"END";
CC: OUTPUT(61,"("*")");
"END"
RESULTS:
+.1" +0 +.50063973801970" +0 7
+.1" -1 +.50063973801970" +0 7
+.1" -2 +.50063973801970" +0 7
+.1" -3 +.49999110261504" +0 10
+.1" -4 +.49999848959226" +0 13
+.1" -5 +.49999848959226" +0 13
+.1" -6 +.49999997378240" +0 43
+.1" -7 +.49999999209792" +0 133
+.1" -8 +.49999999893172" +0 313
+.1" -9 +.49999999985571" +0 733
+.1"-10 +.49999999998692" +0 1723
1SECTION : 4.2.2 (DECEMBER 1979) PAGE 4
SOURCE TEXT(S):
0"CODE" 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 "OR" 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;
"COMMENT"
1SECTION : 4.2.2 (OCTOBER 1975) PAGE 5
;
"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;
"EOP"
1SECTION : 4.2.3.1 (NOVEMBER 1978) PAGE 1
AUTHOR: C.G. VAN DER LAAN.
CONTRIBUTORS: C.G. VAN DER LAAN AND M. VOORINTHOLT.
INSTITUTE: REKENCENTRUM RIJKSUNIVERSITEIT GRONINGEN.
RECEIVED: 780601.
BRIEF DESCRIPTION:
THIS SECTION CONTAINS THE PROCEDURES GSSWTS, GSSWTSSYM AND RECCOF.
RECCOF CALCULATES FROM A GIVEN WEIGHT FUNCTION ON [-1,1] THE
RECURRENCE COEFFICIENTS OF THE CORRESPONDING ORTHOGONAL
POLYNOMIALS; GSSWTS AND GSSWTSSYM CALCULATE FROM THE RECURRENCE
COEFFICIENTS THE GAUSSIAN WEIGHTS OF THE CORRESPONDING WEIGHT
FUNCTION.
KEYWORDS:
RECURRENCE COEFFICIENTS ORTHOGONAL POLYNOMIALS,
GAUSSIAN WEIGHTS,
GAUSSIAN QUADRATURE.
SUBSECTION: RECCOF.
CALLING SEQUENCE:
THE DECLARATION OF THE PROCEDURE IN THE CALLING PROGRAM READS:
"PROCEDURE" RECCOF(N,M,X,WX,B,C,L,SYM);
"VALUE" N,M,SYM; "INTEGER" N,M; "BOOLEAN" SYM;
"REAL" X,WX; "ARRAY" B,C,L;
"CODE" 31254;
THE MEANING OF THE FORMAL PARAMETERS IS:
N: <ARITHMETIC EXPRESSION>;
ENTRY: UPPER BOUND FOR THE INDICES OF THE ARRAYS B, C, L
(N>=0);
M: <ARITHMETIC EXPRESSION>;
ENTRY: THE NUMBER OF POINTS USED IN THE GAUSS-CHEBYSHEV
QUADRATURE RULE FOR CALCULATING THE APPROXIMATION
OF THE INTEGRAL REPRESENTATIONS OF B[K],C[K]
1SECTION : 4.2.3.1 (NOVEMBER 1978) PAGE 2
SYM: <BOOLEAN EXPRESSION>;
ENTRY: "IF" SYM
"THEN" WEIGHT FUNCTION ON [-1,1] IS EVEN
"ELSE" WEIGHT FUNCTION ON [-1,1] IS NOT EVEN;
X,WX: <ARITHMETIC EXPRESSION>;
ENTRY: JENSEN VARIABLES WITH WX AN EXPRESSION OF X
DENOTING THE WEIGHT FUNCTION ON [-1,1];
B,C,L: <ARRAY IDENTIFIER>;
"ARRAY" B,C,L[0:N];
EXIT: THE APPROXIMATE RECURRENCE COEFFICIENTS FOR
P[K+1](X) = (X-B[K])*P[K](X) - C[K]*P[K-1](X),
K=0,1,2,...N,
AND THE APPROXIMATE SQUARE LENGTHS
X = +1
L[K] = INTEGRAL ( W(X) * P[K](X) ** 2 ) DX
X = -1
PROCEDURES USED: ORTPOL = CP31044.
RUNNING TIME: PROPORTIONAL TO M*N**2.
METHOD AND PERFORMANCE:
THE RECURRENCE COEFFICIENTS ARE REPRESENTED BY
X = +1
B[K] = ( INTEGRAL ( W(X) * X * P[K](X) ** 2 ) DX ) / L[K],
X = -1
C[K] = L[K] / L[K-1]],
WHERE P[K](X) IS THE K-TH ORTHOGONAL POLYNOMIAL.
THE INTEGRALS ARE APPROXIMATED BY THE M-POINTS GAUSS-CHEBYSHEV
RULE AS
X = +1 M
INTEGRAL(F(X))DX := PI / M * SUM SIN(THETA[J])*F(COS(THETA[J]))
X = -1 J=1
WITH THETA[J] = (2*J-1) * PI / (2*M) (SEE GAUTSCHI, 1968A).
THE VALUE OF M IS TO BE SUPPLIED BY THE USER.
REFERENCES:
GAUTSCHI, W. (1968A):
CONTRUCTION OF GAUSS-CHRISTOFFEL FORMULAS.
MATH. COMP., 22,P.251-270.
GAUTSCHI, W. (1968B):
GAUSSIAN QUADRATURE FORMULAS.
COMM. ACM. CALGO 331.
1SECTION : 4.2.3.1 (NOVEMBER 1978) PAGE 3
EXAMPLE OF USE:
THE FOLLOWING PROGRAM DELIVERS AN APPROXIMATION
FOR THE RECURSION COEFFICIENTS C[1] AND C[2], OF THE CHEBYSHEV
POLYNOMIALS OF THE SECOND KIND;
"BEGIN"
"REAL" X; "ARRAY" B,C,L[0:2];
RECCOF(2,200,X,SQRT(1 - X**2),B,C,L,"TRUE");
OUTPUT(61,"("2/,2(3B,-ZD.3D)")",C[1],C[2]);
"END";
RESULTS:
0.250 0.250
SUBSECTION: GSSWTS.
CALLING SEQUENCE:
THE DECLARATION OF THE PROCEDURE IN THE CALLING PROGRAM READS:
"PROCEDURE" GSSWTS(N,ZER,B,C,W);
"VALUE" N; "INTEGER" N; "ARRAY" ZER,B,C,W;
"CODE" 31253;
THE MEANING OF THE FORMAL PARAMETERS IS:
N: <ARITHMETIC EXPRESSION>;
ENTRY: THE NUMBER OF WEIGHTS TO BE COMPUTED; UPPER
BOUND FOR THE ARRAYS Z AND W (N>=1);
ZER: <ARRAY IDENTIFIER>;
"ARRAY" ZER[1:N];
ENTRY: THE ZEROS OF THE N-TH DEGREE ORTHOGONAL POLYNOMIAL;
B,C: <ARRAY IDENTIFIER>;
"ARRAY" B[0:N-1], C[1:N-1];
ENTRY: THE RECURRENCE COEFFICIENTS;
W: <ARRAY IDENTIFIER>;
"ARRAY" W[1:N];
EXIT : THE GAUSSIAN WEIGHTS DIVIDED BY THE
INTEGRAL OVER THE WEIGHT FUNCTION.
PROCEDURES USED: ALLORTPOL = CP 31045.
1SECTION : 4.2.3.1 (NOVEMBER 1978) PAGE 4
METHOD AND PERFORMANCE:
THE GAUSSIAN WEIGHTS OF AN N-POINTS RULE DIVIDED BY THE INTEGRAL
OF THE WEIGHT FUNCTION MAY BE REPRESENTED AS
W[K] = 1/(...((P[N-1](Z)**2/C[N-1]+P[N-2](Z)**2)/C[N-2]+...
...+P[1](Z)**2)/C[1]+1) , K=1,2,...N
WITH Z= K-TH ZERO OF P[N](X). (GAUTSCHI, 1970).
ALLZERORTPOL AND GSSWTS MAY BE USED TO GENERATE GAUSSIAN
QUADRATURE RULES PROVIDED THE RECURRENCE COEFFICIENTS AND THE
INTEGRAL OF THE WEIGHT FUNCTION ARE KNOWN.
FOR EXAMPLE THE GAUSS-LAGUERRE QUADRATURE RULE APPLIED TO F
MAY BE OBTAINED BY THE CALLS
"FOR" K:=1 "STEP" 1 "UNTIL" N-1 "DO"
"BEGIN"
B[K]:=2*K+ALPHA+1;
C[K]:=K*(K+ALPHA)
"END";
B[0]:=ALPHA+1;
ALLZERORTPOL(N,ZER,B,C);
GSSWTS(N,ZER,B,C,W);
GAUSSRULE:=0;
"FOR" K:=1 "STEP" 1 "UNTIL" N "DO"
GAUSSRULE:=GAUSSRULE+W[K]*F(ZER[K]);
GAUSSRULE:=GAUSSRULE*GAMMA(ALPHA+1)
GAUSSRULE CONTAINS THE VALUE OF THE APPOXIMATING GAUSS
QUADRATURE RULE AND ZER[1:N],W[1:N] CONTAIN THE GAUSSIAN
ABSCISSA AND WEIGHTS.
1SECTION : 4.2.3.1 (NOVEMBER 1978) PAGE 5
IN THE FOLLOWING TABEL WE SUMMARIZE CLASSICAL QUADRATURE RULES
: WEIGHT : RECURRENCE COEFFICIENTS : INTEGRAL
GAUSSIAN : FUNCTION :---------------:---------------: OF
QUADRATURE : W(X) : B[K] : C[K] :WEIGHT FUNCTION
-----------:-----------:---------------:---------------:---------------
: : : :
LEGENDRE : 1 : 0 :K**2*(4*K**2-1): 2
: : : :
CHEBYSHEV : 1/SQRT(1- : 0 : 1/2 , K=1 : PI
(1-ST KIND): X**2) : : 1/4 , K>1 :
: : : :
CHEBYSHEV : SQRT(1- : 0 : 1/4 : PI/2
(2-ND KIND): X**2) : : :
: : : :
JACOBI : (1-X)** : -(ALPHA**2- : 4*(1+ALPHA)* : 2**(ALPHA+
: ALPHA*(1+ : BETA**2)/((2* : (1+BETA)/ : BETA+1)*
: X)**BETA : K+ALPHA+BETA)*: ((ALPHA+BETA+ : GAMMA(ALPHA+
: : (2*K+ALPHA+ : 2)**2*(ALPHA+ : 1)*GAMMA(BETA+
: : BETA+2)) : BETA+3)) ,K=1 : 1)/GAMMA(ALPHA
: : : : +BETA+2)
: : : 4*K*(K+ALPHA)*:
: : : (K+BETA)*(K+ :
: : : ALPHA+BETA)/ :
: : : ((2*K+ALPHA+ :
: : : BETA)**2* :
: : : ((2*K+ALPHA+ :
: : : BETA)**2-1)) :
: : : ,K>1 :
: : : :
: : :(ALPHA,BETA>-1):
: : : :
LAGUERRE : EXP(-X)* : 2*K+ALPHA+1 : K*(K+ALPHA) : GAMMA(ALPHA+1)
: X**ALPHA : : :
: : : :
HERMITE : EXP(-X**2): 0 : K/2 : SQRT(PI)
(THE INTEGRATION INTERVALS ARE: [-INFINITY,INFINITY] FOR HERMITE;
[0,INFINITY] FOR LAGUERRE;
[-1,1] FOR THE OTHERS.)
FOR NON-CLASSICAL WEIGHT FUNCTIONS ON A FINITE INTERVAL THE RECURSION
COEFFICIENTS (AND THE SQUARE LENGTHS OF THE CORRESPONDING ORTHOGONAL-
POLYNOMIALS) CAN BE OBTAINED BY THE PROCEDURE RECCOF (THIS SECTION).
1SECTION : 4.2.3.1 (NOVEMBER 1978) PAGE 6
REFERENCES:
GAUTSCHI, W. (1970):
GENERATION OF GAUSSIAN QUADRATURE RULES AND
ORTHOGONAL POLYNOMIALS.
IN: COLLOQUIUM APPROXIMATIETHEORIE,
MC SYLLABUS 14.
EXAMPLE OF USE: SEE SUBSECTION GSSWTSSYM.
SUBSECTION: GSSWTSSYM.
CALLING SEQUENCE:
THE DECLARATION OF THE PROCEDURE IN THE CALLING PROGRAM READS:
"PROCEDURE" GSSWTSSYM(N,ZER,C,W);
"VALUE" N; "INTEGER" N; "ARRAY" ZER,C,W;
"CODE" 31252;
THE MEANING OF THE FORMAL PARAMETERS IS:
N: <ARITHMETIC EXPRESSION>;
ENTRY: THE WEIGHTS OF AN N-POINTS GAUSS RULE ARE
TO BE CALCULATED (BECAUSE OF SYMMETRY ONLY
(N+1)//2 OF THE VALUES ARE DELIVERED);
ZER: <ARRAY IDENTIFIER>;
"ARRAY" ZER[1:N//2]
ENTRY: THE NEGATIVE ZEROS OF THE N-TH DEGREE ORTHOGONAL
POLYNOMIAL (ZER[I] < ZER[I+1], I=1,2,...,N//2-1);
(IF N IS ODD THEN 0 IS ALSO A ZERO.)
C: <ARRAY IDENTIFIER>;
"ARRAY" C[1:N-1];
ENTRY: THE RECURRENCE COEFFICIENTS;
W: <ARRAY IDENTIFIER>;
"ARRAY" W[1:(N+1)//2];
EXIT : PART OF THE GAUSSIAN WEIGHTS DIVIDED BY THE
INTEGRAL OF THE WEIGHT FUNCTION.
(NOTE THAT W[N+1-K]=W[K] , K=1,2,...,(N+1)//2.)
PROCEDURES USED: ALLORTPOLSYM = CP 31049.
METHOD AND PERFORMANCE: SEE SUBSECTION GSSWTS; THIS PROCEDURE IS
SUPPLIED FOR STORAGE ECONOMICAL REASONS.
REFERENCES: SEE SUBSECTION GSSWTS.
1SECTION : 4.2.3.1 (NOVEMBER 1978) PAGE 7
EXAMPLE OF USE:
THE FOLLOWING PROGRAM DELIVERS THE GAUSSIAN WEIGHTS
FOR THE 5-POINTS GAUSS-CHEBYSHEV QUADRATURE RULE BY MEANS OF
THE PROCEDURE GSSWTSSYM (C[1]=0.5; C[K]=0.25, K=2,3,...;
ZER[I] = COS((2*(N-I) - 1) / (2*N) * PI), I=1,2,...,N//2.
"BEGIN"
"REAL" PI; "INTEGER" I;
"ARRAY" ZER[1:2], W[1:3], C[1:4];
PI:=4*ARCTAN(1);
C[1]:=.5;
"FOR" I:=2 "STEP" 1 "UNTIL" 4 "DO"
C[I]:=.25;
ZER[1]:=COS(.9*PI);
ZER[2]:=COS(.7*PI);
GSSWTSSYM(5,ZER,C,W);
OUTPUT(61,"("2/,5(3B,-ZD.3D)")",W[1]*PI,W[2]*PI,W[3]*PI,
W[2]*PI,W[1]*PI);
"END";
RESULTS:
0.628 0.628 0.628 0.628 0.628
1SECTION : 4.2.3.1 (NOVEMBER 1978) PAGE 8
SOURCE TEXT(S):
0"CODE" 31254;
"PROCEDURE" RECCOF(N,M,X,WX,B,C,L,SYM);
"VALUE" N,M,SYM;"INTEGER" N,M; "BOOLEAN" SYM;
"REAL" X,WX;"ARRAY" B,C,L;
"BEGIN" "INTEGER" I,J,UP;"REAL" R,S,PIM,H,HH,ARG,SA;
PIM:=4*ARCTAN(1)/M;
"IF" SYM "THEN" "BEGIN"
"FOR" J:=0 "STEP" 1 "UNTIL" N"DO"
"BEGIN" R:=B[J]:=0;UP:=M "DIV" 2;
"FOR" I:=1 "STEP" 1 "UNTIL" UP"DO"
"BEGIN" ARG:=(I-.5)*PIM;X:=COS(ARG);
R:=R+SIN(ARG)*WX*ORTPOL(J,X,B,C)**2;
"END";"IF" UP*2=M "THEN" L[J]:=2*R*PIM "ELSE"
"BEGIN" X:=0;L[J]:=(2*R+WX*ORTPOL(J,0,B,C)**2)*PIM "END";
C[J]:="IF" J=0 "THEN" 0 "ELSE" L[J]/L[J-1];
"END" "END" "ELSE"
"FOR" J:=0 "STEP" 1 "UNTIL" N "DO"
"BEGIN" R:=S:=0;UP:=M"DIV" 2;
"FOR" I:=1 "STEP" 1 "UNTIL" UP "DO"
"BEGIN" ARG:=(I-.5)*PIM;SA:=SIN(ARG);X:=COS(ARG);
H:=WX*ORTPOL(J,X,B,C)**2;X:=-X;HH:=WX*ORTPOL(J,X,B,C)**2;
R:=R+(H+HH)*SA;S:=S+(HH-H)*X*SA;
"END";B[J]:=S*PIM;
"IF" UP*2=M "THEN" L[J]:=R*PIM"ELSE"
"BEGIN" X:=0;L[J]:=(R+WX*ORTPOL(J,0,B,C)**2)*PIM "END";
C[J]:="IF" J=0 "THEN" 0 "ELSE" L[J]/L[J-1];
"END";
"END" RECCOF
1SECTION : 4.2.3.1 (NOVEMBER 1978) PAGE 9
;
"EOP"
"CODE" 31253;
"PROCEDURE" GSSWTS(N,ZER,B,C)RESULTS:(W);
"VALUE" N; "INTEGER" N;
"ARRAY" ZER,B,C,W;
"BEGIN"
"INTEGER" J,K; "REAL" S; "ARRAY" P[0:N-1];
"FOR" J:=1 "STEP" 1 "UNTIL" N "DO"
"BEGIN"
ALLORTPOL(N-1,ZER[J],B,C,P);
S:=0.0;
"FOR" K:=N-1 "STEP" -1 "UNTIL" 1 "DO"
S:=(S+P[K]**2)/C[K];
W[J]:=1/(1+S);
"END"
"END" GSSWTS;
"EOP"
"CODE" 31252;
"PROCEDURE" GSSWTSSYM(N,ZER,C)RESULTS:(W);
"VALUE" N; "INTEGER" N;
"ARRAY" ZER,C,W;
"BEGIN"
"INTEGER" LOW,UP,DUMMY;
"ARRAY" P[0:N-1];
LOW:=1; UP:=N;
"FOR" DUMMY:=1
"WHILE" LOW < UP "DO"
"BEGIN" "INTEGER" I; "REAL" S;
ALLORTPOLSYM( N-1,ZER[LOW],C,P );
S:=P[N-1]**2;
"FOR" I:=N-1 "STEP" -1 "UNTIL" 1 "DO"
S:=S/C[I] + (P[I-1])**2;
W[LOW]:=1/S; LOW:=LOW+1; UP:=UP-1;
"END";
"IF" LOW = UP
"THEN" "BEGIN" "INTEGER" TWOI; "REAL" S; S:=1.0;
"FOR" TWOI:=N-1 "STEP" -2 "UNTIL" 2 "DO"
S:=S*C[TWOI-1]/C[TWOI]+1;
W[LOW]:=1/S;
"END";
"END" GSSWTSSYM;
"EOP"
1SECTION : 4.2.3.2 (NOVEMBER 1976) PAGE 1
AUTHOR: M.BAKKER.
INSTITUTE: MATHEMATICAL CENTRE, AMSTERDAM.
RECEIVED: 760131.
BRIEF DESCRIPTION:
THIS SECTION CONTAINS THE FOLLOWING PROCEDURES:
(1) GSS JAC WGHTS:
GIVEN THE TWO PARAMETERS ALFA AND BETA,THIS PROCEDURE
CALCULATES THE N ZEROS OF THE N-TH JACOBI POLYNOMIAL
AND THE CORRESPONDING GAUSS-CHRISTOFFEL NUMBERS NEEDED FOR
THE N-POINT GAUSS-JACOBI QUADRATURE OVER [-1,+1]
WITH WEIGHT FUNCTION
W(X) = (1-X)**ALFA*(1+X)**BETA;
(2) GSS LAG WGHTS:
GIVEN THE PARAMETER ALFA,THIS PROCEDURE
CALCULATES THE N ZEROS OF THE N-TH LAGUERRE POLYNOMIAL
AND THE GAUSS-CHRISTOFFEL NUMBERS NEEDED FOR THE
N-POINT GAUSS-LAGUERRE QUADRATURE OF F(X) OVER
(0, INFINITY) WITH RESPECT TO THE WEIGHT FUNCTION
W(X) = X**ALFA*EXP(-X).
THESE PROCEDURES CAN BE USED FOR GAUSSIAN QUADRATURE-
RULES OF THE JACOBI AND LAGUERRE TYPE.LET THE WEIGHT
FUNCTION W(X) AND THE INTERVAL(A,B) DETERMINE THE
SYSTEM OF POLYNOMIALS ORTHOGONAL ON (A,B) WITH RESPECT
TO W(X).THEN THE N-POINT GAUSSIAN QUADRATURE RULE
APPROXIMATES THE INTEGRAL
TO X=B
INTEGRAL F(X) W(X) DX
FROM X=A
BY THE EXPRESSION
J=N
SUM W[J] F(X[J])
J=1
WHERE THE ABSCISSAS X[J] ARE THE ZEROS OF THE N-TH
POLYNOMIAL AND W[J] ARE THE CORRESPONDING GAUSS-CHRISTOFFEL
NUMBERS.
1SECTION : 4.2.3.2 (NOVEMBER 1976) PAGE 2
KEYWORDS:
GAUSSIAN QUADRATURE,
ZEROS OF ORTHOGONAL POLYNOMIALS,
GAUSS-CHRISTOFFEL NUMBERS,
GAUSSIAN WEIGHTS.
LANGUAGE: ALGOL 60.
REFERENCES:
[1] M.ABRAMOWITZ AND I.A. STEGUN.
HANDBOOK OF MATHEMATICAL FUNCTIONS, CH.22,
[2] J.STOER,
EINFUEHRUNG IN DIE NUMERISCHE MATHEMATIK 1,
SPRINGER VERLAG, BERLIN, HEIDELBERG, GOETTINGEN.
SUBSECTION: GSS JAC WGHTS.
CALLING SEQUENCE:
THE DECLARATION OF THE PROCEDURE IN THE CALLING PROGRAM READS:
"PROCEDURE" GSS JAC WGHTS(N, ALFA, BETA, X, W);
"VALUE" N, ALFA, BETA;
"INTEGER" N; "REAL" ALFA, BETA; "ARRAY" X, W;
"CODE" 31425;
THE MEANING OF THE FORMAL PARAMETERS IS:
N: <ARITHMETIC EXPRESSION>;
THE UPPER BOUND OF THE ARRAYS X AND W; N>=1;
ALFA, BETA: <ARITHMETIC EXPRESSION>;
THE PARAMETERS OF THE WEIGHT FUNCTION FOR
THE JACOBI POLYNOMIALS; ALFA, BETA > -1;
X; <ARRAY IDENTIFIER>;
"ARRAY" X[1:N];
EXIT: X[I] IS THE I-TH ZERO OF THE N-TH JACOBI POLYNOMIAL;
W: <ARRAY IDENTIFIER>;
"ARRAY" W[1:N];
EXIT: W[I] IS THE GAUSS-CHRISTOFFEL NUMBER
ASSOCIATED WITH THE I-TH ZERO OF THE N-TH JACOBI POLYNOMIAL.
1SECTION : 4.2.3.2 (NOVEMBER 1976) PAGE 3
PROCEDURES USED:
GAMMA = CP 35061;
ALL JAC ZER = CP 31370.
REQUIRED CENTRAL MEMORY:
TWO AUXILIARY ARRAYS OF N REALS ARE USED.
RUNNING TIME: ROUGHLY PROPORTIONAL TO N CUBED.
METHOD AND PERFORMANCE:
AS IS WELL-KNOWN,THE GAUSSIAN QUADRATURE RULES ARE
BASED ON THE ZEROS OF ORTHOGONAL POLYNOMIALS.
PROCEDURES FOR THE COMPUTATION OF THESE ZEROS CAN
BE FOUND IN SECTION 3.6.2.
AFTER THE COMPUTATION OF THE ZEROS OF THE JACOBI POLYNOMIAL
THE GAUSSIAN WEIGHTS ARE COMPUTED OF THE FORMULA
J=N-1
W[I]=1/( SUM P(J, ALFA, BETA, X[I])**2)
J=0
WHERE P(J, ALFA, BETA, X[I]) IS THE J-TH ORTHONORMAL
JACOBI POLYNOMIAL;SEE FURTHER [2],CH.III.
EXAMPLE OF USE:
THE PROGRAM
"BEGIN""COMMENT" EVALUATION OF THE INTEGRAL
TO X=1
INTEGRAL (1+X)**2 * (1-X) * EXP(X) DX
FROM X=-1
BY MEANS OF FIVE POINT GAUSS-JACOBI QUADRATURE.
THE EXACT VALUE IS 2*EXP(1)-10/EXP(1);
"REAL" ALFA, BETA, INT; "INTEGER" N; "ARRAY" X, W[1:5];
"REAL" "PROCEDURE" F(X); "VALUE" X; "REAL" X; F:=EXP(X);
ALFA:= 1; BETA:= 2; N:= 5; INT:= 0;
GSS JAC WGHTS( N, ALFA, BETA, X, W);
"FOR" N:= 1 "STEP" 1 "UNTIL" 5 "DO" INT:= INT + W[N] * F(X[N]);
OUTPUT(61, "(" /, 4B+D. 4D"+ZD")", INT - 2 * EXP(1) + 10 / EXP(1))
"END"
PRINTS THE FOLOWING RESULT:
-1.5932"-10
1SECTION : 4.2.3.2 (NOVEMBER 1976) PAGE 4
SUBSECTION: GSS LAG WGHTS.
CALLING SEQUENCE:
THE DECLARATION OF THE PROCEDURE IN THE CALLING PROGRAM READS:
"PROCEDURE" GSS LAG WGHTS (N, ALFA, X, W);
"VALUE" N, ALFA;
"INTEGER" N; "REAL" ALFA; "ARRAY" X, W;
"CODE" 31427;
THE MEANING OF THE FORMAL PARAMETERS IS:
N: <ARITHMETIC EXPRESSION>;
THE UPPER BOUND OF THE ARRAYS X AND W; N>=1;
ALFA: <ARITHMETIC EXPRESSION>;
THE PARAMETER OF THE WEIGHT FUNCTION FOR THE
LAGUERRE POLYNOMIALS;
ALFA>-1;
X: <ARRAY IDENTIFIER>;
"ARRAY" X[1: N];
EXIT: X[I] IS THE I-TH ZERO OF THE N-TH
LAGUERRE POLYNOMIAL;
W: <ARRAY IDENTIFIER>;
"ARRAY" W[1: N];
EXIT: W[I] IS THE GAUSSIAN WEIGHT CORRESPONDING
WITH THE I-TH ZERO OF THE N-TH LAGUERRE POLYNOMIAL.
PROCEDURES USED:
GAMMA = CP 35061,
ALL LAG ZER = CP 31371.
REQUIRED CENTRAL MEMORY:
TWO AUXILIARY ARRAYS OF N REALS ARE USED.
RUNNING TIME:
ROUGHLY PROPORTIONAL TO N CUBED.
METHOD AND PERFORMANCE:
THE ZEROS AND WEIGHTS ARE COMPUTED IN THE SAME
WAY AS IN THE PROCEDURE GSS JAC WGHTS.
1SECTION : 4.2.3.2 (NOVEMBER 1976) PAGE 5
EXAMPLE OF USE:
THE PROGRAM
"BEGIN" "COMMENT" COMPUTATION OF THE INTEGRAL FROM 0 TO INFINITY OF
SIN(X)*EXP(-X) BY MEANS OF A TEN POINT GAUSS-LAGUERRE
QUADRATURE.THE EXACT VALUE IS 0.5;
"REAL" INT;"INTEGER" N;"ARRAY" X, W[1:10];
"REAL""PROCEDURE" F(X); "VALUE"X; "REAL"X; F:=SIN(X);
GSS LAG WGHTS(10, 0, X, W); INT:=0;
"FOR" N:=10 "STEP" -1 "UNTIL" 1 "DO" INT:= INT + W[N] * F(X[N]);
OUTPUT(61, "("-D.4D"-ZD")", INT-0.5)
"END"
PRINTS THE RESULT:
2.0497" -7
1SECTION : 4.2.3.2 (NOVEMBER 1976) PAGE 6
SOURCE TEXTS:
0"CODE" 31425;
"PROCEDURE" GSS JAC WGHTS(N, ALFA, BETA, X, W);
"VALUE" N, ALFA, BETA; "INTEGER" N; "REAL" ALFA, BETA;
"ARRAY" X, W;
"IF" ALFA = BETA "THEN"
"BEGIN" "INTEGER" I, J, M;
"ARRAY" B[1:N - 1]; "REAL" R0, R1, R2, S, H0, ALFA2, XI;
ALL JAC ZER(N, ALFA, ALFA, X); ALFA2:= 2*ALFA;
H0:= 2**(ALFA2 + 1)*GAMMA(1 + ALFA)**2/GAMMA(ALFA2 + 2);
B[1]:= 1/SQRT(3 + ALFA2); M:= N - (N//2);
"FOR" I:= 2 "STEP" 1 "UNTIL" N - 1 "DO"
B[I]:= SQRT(I*(I + ALFA2)/(4*(I + ALFA)**2 - 1));
"FOR" I:= 1 "STEP" 1 "UNTIL" M "DO"
"BEGIN" XI:= ABS(X[I]); R0:= 1; R1:= XI/B[1];
S:= 1 + R1*R1;
"FOR" J:= 2 "STEP" 1 "UNTIL" N - 1 "DO"
"BEGIN" R2:= (XI*R1 - B[J - 1]*R0)/B[J];
R0:= R1; R1:= R2; S:= S + R2*R2
"END";
W[I]:= W[N + 1 - I]:= H0/S
"END"
"END" "ELSE"
"BEGIN" "INTEGER" I, J; "ARRAY" A, B[0:N];
"REAL" MIN, SUM, H0, R0, R1, R2, XI, ALFABETA;
ALFABETA:= ALFA + BETA; MIN:= (BETA - ALFA)*ALFABETA;
B[0]:= 0; SUM:= ALFABETA + 2; A[0]:= (BETA - ALFA)/SUM;
A[1]:= MIN /SUM/(SUM + 2);
B[1]:= 2*SQRT((1 + ALFA)*(1 + BETA)/(SUM + 1))/SUM;
"FOR" I:= 2 "STEP" 1 "UNTIL" N - 1 "DO"
"BEGIN" SUM:= I + I + ALFABETA;
A[I]:= MIN/SUM/(SUM + 2);
B[I]:= (2/SUM)*
SQRT(I*(SUM - I)*(I + ALFA)*(I + BETA)/(SUM*SUM - 1))
"END";
H0:= 2**(ALFABETA + 1)*GAMMA(1 + ALFA)*GAMMA(1 + BETA)/
GAMMA(2 + ALFABETA);
ALL JAC ZER(N, ALFA, BETA, X);
"FOR" I:= 1 "STEP" 1 "UNTIL" N "DO"
"BEGIN" XI:= X[I]; R0:= 1; R1:= (XI - A[0])/B[1];
SUM:= 1 + R1*R1;
"FOR" J:= 2 "STEP" 1 "UNTIL" N - 1 "DO"
"BEGIN" R2:= ((XI - A[J - 1])*R1 - B[J - 1]*R0)/B[J];
SUM:= SUM + R2*R2; R0:= R1; R1:= R2
"END";
W[I]:= H0/SUM
"END"
"END" GSS JAC WGHTS
1SECTION : 4.2.3.2 (NOVEMBER 1976) PAGE 7
;
"EOP"
"CODE" 31427;
"PROCEDURE" GSS LAG WGHTS(N, ALFA, X, W);
"VALUE" N, ALFA; "INTEGER" N; "REAL" ALFA; "ARRAY" X, W;
"BEGIN" "INTEGER" I, J; "REAL" H0, S, R0, R1, R2, XI;
"ARRAY" A, B[0:N];
A[0]:= 1 + ALFA; A[1]:= 3 + ALFA; B[1]:= SQRT(A[0]);
"FOR" I:= 2 "STEP" 1 "UNTIL" N - 1 "DO"
"BEGIN" A[I]:= I + I + ALFA + 1;
B[I]:= SQRT(I*(I + ALFA))
"END";
ALL LAG ZER(N, ALFA, X); H0:= GAMMA(1 + ALFA);
"FOR" I:= 1 "STEP" 1 "UNTIL" N "DO"
"BEGIN" XI:= X[I]; R0:= 1;
R1:= (XI - A[0])/B[1]; S:= 1 + R1*R1;
"FOR" J:= 2 "STEP" 1 "UNTIL" N - 1 "DO"
"BEGIN" R2:= ((XI - A[J - 1])*R1 - B[J - 1]*R0)/B[J];
R0:= R1; R1:= R2; S:= S + R2*R2
"END";
W[I]:= H0/S
"END"
"END" GSS LAG WGHTS;
"EOP"
1SECTION : 4.3.2.1 (OCTOBER 1974) PAGE 1
AUTHOR: J.C.P.BUS.
INSTITUTE: MATHEMATICAL CENTRE.
RECEIVED: 740218.
BRIEF DESCRIPTION:
THIS SECTION CONTAINS PROCEDURES FOR CALCULATING THE DERIVATIVES OF
FUNCTIONS OF MORE VARIABLES, USING DIFFERENCE FORMULAS;
JACOBNNF CALCULATES THE JACOBIAN MATRIX OF AN N-DIMENSIONAL
FUNCTION OF N VARIABLES USING FORWARD DIFFERENCES;
JACOBNMF CALCULATES THE JACOBIAN MATRIX OF AN N-DIMENSIONAL
FUNCTION OF M VARIABLES USING FORWARD DIFFERENCES;
JACOBNBNDF CALCULATES THE JACOBIAN MATRIX OF AN N-DIMENSIONAL
FUNCTION OF N VARIABLES, IF THIS JACOBIAN IS KNOWN TO BE A
BAND MATRIX AND HAVE TO BE STORED ROW-WISE IN A ONE-DIMENSIONAL
ARRAY.
KEYWORDS:
NUMERICAL DIFFERENTIATION,
FUNCTIONS OF MORE VARIABLES,
DIFFERENCE FORMULAS.
1SECTION : 4.3.2.1 (OCTOBER 1974) PAGE 2
SUBSECTION: JACOBNNF.
CALLING SEQUENCE:
THE HEADING OF THIS PROCEDURE READS:
"PROCEDURE" JACOBNNF(N, X, F, JAC, I, DI, FUNCT);
"VALUE" N; "INTEGER" I, N; "REAL" DI; "ARRAY" X, F, JAC;
"PROCEDURE" FUNCT;
"CODE" 34437;
THE MEANING OF THE FORMAL PARAMETERS IS:
N: <ARITHMETIC EXPRESSION>;
THE NUMBER OF INDEPENDENT VARIABLES AND THE DIMENSION OF
THE FUNCTION;
X: <ARRAY IDENTIFIER>;
"ARRAY" X[1:N];
ENTRY: THE POINT AT WHICH THE JACOBIAN HAS TO BE CALCULATED
F: <ARRAY IDENTIFIER>;
"ARRAY" F[1:N];
ENTRY : THE VALUES OF THE FUNCTION-COMPONENTS AT THE POINT
GIVEN IN ARRAY X;
JAC: <ARRAY IDENTIFIER>;
"ARRAY" JAC[1:N, 1:N];
EXIT : THE JACOBIAN MATRIX IN SUCH A WAY THAT THE PARTIAL
DERIVATIVE OF F[I] TO X[J] IS GIVEN IN
JAC[I, J], I, J = 1, ..., N;
I: <INTEGER VARIABLE>;
A JENSEN PARAMETER; DI MAY BE DEPENDENT OF I;
DI: <ARITHMETIC EXPRESSION>;
THE PARTIAL DERIVATIVES TO X[I] ARE APPROXIMATED WITH
FORWARD DIFFERENCES, USING AN INCREMENT TO THE I-TH
VARIABLE THAT EQUALS THE VALUE OF DI, I = 1, ..., N;
FUNCT: <PROCEDURE IDENTIFIER>;
THE HEADING OF THIS PROCEDURE SHOULD READ:
"PROCEDURE" FUNCT(N, X, F);
"VALUE" N; "INTEGER" N; "ARRAY" X, F;
THE MEANING OF THE FORMAL PARAMETERS IS:
N: <ARITHMETIC EXPRESSION>;
THE NUMBER OF INDEPENDENT VARIABLES OF THE FUNCTION F;
X: <ARRAY IDENTIFIER>;
THE INDEPENDENT VARIABLES ARE GIVEN IN X[1:N];
F: <ARRAY IDENTIFIER>;
AFTER A CALL OF FUNCT THE FUNCTION COMPONENTS SHOULD BE
GIVEN IN F[1:N].
1SECTION : 4.3.2.1 (OCTOBER 1974) PAGE 3
PROCEDURES USED: NONE.
REQUIRED CENTRAL MEMORY :
EXECUTION FIELD LENGTH: JACOBNNF DECLARES ONE AUXILIARY ARRAY OF
ORDER N.
RUNNING TIME: PROPORTIONAL TO N ** 2.
LANGUAGE: ALGOL 60.
METHOD AND PERFORMANCE:
JACOBNNF CALCULATES THE JACOBIAN MATRIX OF AN N-DIMENSIONAL
FUNCTION OF N VARIABLES; THE ELEMENTS OF THIS MATRIX, WHICH ARE THE
PARTIAL DERIVATIVES OF THE FUNCTION, ARE CALCULATED USING FORWARD
DIFFERENCES WITH AN INCREMENT TO THE I-TH VARIABLE OF DI, (I = 1,
..., N).
EXAMPLE OF USE:
LET F BE DEFINED BY:
F[1]= X[1] ** 3 + X[2],
F[2]= 10 * X[2];
THE JACOBIAN MATRIX AT THE POINT (2, 1) MAY BE CALCULATED AND
PRINTED BY THE FOLLOWING PROGRAM:
"BEGIN"
"INTEGER" I; "ARRAY" JAC[1:2, 1:2], X, F[1:2];
"PROCEDURE" F1(N, X, F); "VALUE" N; "INTEGER" N; "ARRAY" X, F;
"BEGIN" F[1]:= X[1] ** 3 + X[2]; F[2]:= X[2] * 10 "END" F1;
X[1]:= 2; X[2]:= 1; F1(2, X, F);
JACOBNNF(2, X, F, JAC, I, "IF" I = 1 "THEN" "-6 "ELSE" 1, F1);
OUTPUT(71, "("/,4B,"("THE CALCULATED JACOBIAN IS:")",//,
2(4B,2(N),/)")", JAC[1, 1], JAC[1, 2], JAC[2, 1], JAC[2, 2])
"END"
RESULTS:
THE CALCULATED JACOBIAN IS:
+1.2000005938262"+001 +1.0000000000000"+000
+0.0000000000000"+000 +1.0000000000000"+001
1SECTION : 4.3.2.1 (OCTOBER 1974) PAGE 4
SUBSECTION: JACOBNMF.
CALLING SEQUENCE:
THE HEADING OF THIS PROCEDURE READS:
"PROCEDURE" JACOBNMF(N, M, X, F, JAC, I, DI, FUNCT);
"VALUE" N, M; "INTEGER" I, N, M; "REAL" DI; "ARRAY" X, F, JAC;
"PROCEDURE" FUNCT;
"CODE" 34438;
THE MEANING OF THE FORMAL PARAMETERS IS:
N: <ARITHMETIC EXPRESSION>;
THE NUMBER OF FUNCTION COMPONENTS;
M: <ARITHMETIC EXPRESSION>;
THE NUMBER OF INDEPENDENT VARIABLES;
X: <ARRAY IDENTIFIER>;
"ARRAY" X[1:M];
ENTRY: THE POINT AT WHICH THE JACOBIAN HAS TO BE CALCULATED
F: <ARRAY IDENTIFIER>;
"ARRAY" F[1:N];
ENTRY: THE VALUES OF THE FUNCTION-COMPONENTS AT THE POINT
GIVEN IN ARRAY X;
JAC: <ARRAY IDENTIFIER>;
"ARRAY" JAC[1:N, 1:M];
EXIT : THE JACOBIAN MATRIX IN SUCH A WAY THAT THE PARTIAL
DERIVATIVE OF F[I] TO X[J] IS GIVEN IN
JAC[I, J], I = 1, ..., N, J = 1, ... M;
I: <INTEGER VARIABLE>;
A JENSEN PARAMETER; DI MAY BE DEPENDENT OF I;
DI: <ARITHMETIC EXPRESSION>;
THE PARTIAL DERIVATIVES TO X[I] ARE APPROXIMATED WITH
FORWARD DIFFERENCES, USING AN INCREMENT TO THE I-TH
VARIABLE THAT EQUALS THE VALUE OF DI, I = 1, ..., M;
FUNCT: <PROCEDURE IDENTIFIER>;
THE HEADING OF THIS PROCEDURE READS :
"PROCEDURE" FUNCT(N, M, X, F);
"VALUE" N, M; "INTEGER" N, M; "ARRAY" X, F;
THE MEANING OF THE FORMAL PARAMETERS IS :
N: <ARITHMETIC EXPRESSION>;
THE NUMBER OF FUNCTION COMPONENTS;
M: <ARITHMETIC EXPRESSION>;
THE NUMBER OF INDEPENDENT VARIABLES OF THE FUNCTION F;
X: <ARRAY IDENTIFIER>;
THE INDEPENDENT VARIABLES ARE GIVEN IN X[1:M];
F: <ARRAY IDENTIFIER>;
AFTER A CALL OF FUNCT THE FUNCTION COMPONENTS SHOULD BE
GIVEN IN F[1:N].
1SECTION : 4.3.2.1 (OCTOBER 1974) PAGE 5
PROCEDURES USED: NONE.
EXECUTION FIELD LENGTH: JACOBNMF DECLARES ONE AUXILIARY ARRAY OF
ORDER N.
RUNNING TIME: PROPORTIONAL TO N * M.
LANGUAGE: ALGOL 60.
METHOD AND PERFORMANCE:
JACOBNMF CALCULATES THE JACOBIAN MATRIX OF AN N-DIMENSIONAL
FUNCTION OF M VARIABLES; THE ELEMENTS OF THIS MATRIX, WHICH ARE THE
PARTIAL DERIVATIVES OF THE FUNCTION, ARE CALCULATED USING FORWARD
DIFFERENCES WITH AN INCREMENT TO THE I-TH VARIABLE OF DI,(I = 1,
..., M).
EXAMPLE OF USE:
LET F BE DEFINED BY:
F[1]= X[1] ** 3 + X[2],
F[2]= 10 * X[2] + X[2] * X[1],
F[3]= X[1] * X[2];
THE JACOBIAN MATRIX AT THE POINT (2, 1) MAY BE CALCULATED AND
PRINTED BY THE FOLLOWING PROGRAM:
"BEGIN"
"INTEGER" I; "ARRAY" JAC[1:3, 1:2], X[1:2], F[1:3];
"PROCEDURE" F1(N, M, X, F); "VALUE" N, M; "INTEGER" N, M;
"ARRAY" X, F;
"BEGIN" F[1]:= X[1] ** 3 + X[2];
F[2]:= X[2] * 10 + X[2] * X[1] ** 2; F[3]:= X[1] * X[2]
"END" F1;
X[1]:= 2; X[2]:= 1; F1(3, 2, X, F);
JACOBNMF(3, 2, X, F, JAC, I, "IF" I=2 "THEN" 1 "ELSE" "-5, F1);
OUTPUT(71, "("/,4B,"("THE CALCULATED JACOBIAN IS:")",//,
3(4B,2(N),/)")", JAC[1, 1], JAC[1, 2], JAC[2, 1], JAC[2, 2],
JAC[3, 1], JAC[3, 2])
"END"
RESULTS:
THE CALCULATED JACOBIAN IS:
+1.2000060002038"+001 +1.0000000000000"+000
+4.0000100000270"+000 +1.4000000000000"+001
+1.0000000003174"+000 +2.0000000000000"+000
1SECTION : 4.3.2.1 (OCTOBER 1974) PAGE 6
SUBSECTION: JACOBNBNDF.
CALLING SEQUENCE:
THE HEADING OF THIS PROCEDURE READS :
"PROCEDURE" JACOBNBNDF(N, LW, RW, X, F, JAC, I, DI, FUNCT);
"VALUE" N, LW, RW; "INTEGER" N, I, LW, RW; "REAL" DI;
"ARRAY" X, F, JAC; "PROCEDURE" FUNCT;
"CODE" 34439;
THE MEANING OF THE FORMAL PARAMETERS IS:
N: <ARITHMETIC EXPRESSION>;
THE NUMBER OF INDEPENDENT VARIABLES AND THE DIMENSION OF
THE FUNCTION;
LW: <ARITHMETIC EXPRESSION>;
THE NUMBER OF CODIAGONALS TO THE LEFT OF THE MAIN DIAGONAL
OF THE JACOBIAN MATRIX, WHICH IS KNOWN TO BE A BAND MATRIX;
RW: <ARITHMETIC EXPRESSION>;
THE NUMBER OF CODIAGONALS TO THE RIGHT OF THE MAIN DIAGONAL
OF THE JACOBIAN MATRIX;
X: <ARRAY IDENTIFIER>;
"ARRAY" X[1:N];
ENTRY: THE POINT AT WHICH THE JACOBIAN HAS TO BE CALCULATED
F: <ARRAY IDENTIFIER>;
"ARRAY" F[1:N];
ENTRY: THE VALUES OF THE FUNCTION-COMPONENTS AT THE POINT
GIVEN IN ARRAY X;
JAC: <ARRAY IDENTIFIER>;
"ARRAY" JAC [1 : (LW + RW ) * (N - 1) + N];
EXIT: THE JACOBIAN MATRIX IN SUCH A WAY THAT THE (I, J)-TH
ELEMENT OF THE JACOBIAN, I.E. THE PARTIAL DERIVATIVE OF
F[I] TO X[J], IS GIVEN IN
JAC[(LW + RW) * (I - 1) + J], FOR I = 1, ..., N
J= MAX(1, I - LW), ..., MIN(N, I + RW);
I: <INTEGER VARIABLE>;
A JENSEN PARAMETER; DI MAY BE DEPENDENT OF I;
DI: <ARITHMETIC EXPRESSION>;
THE PARTIAL DERIVATIVES TO X[I] ARE APPROXIMATED WITH
FORWARD DIFFERENCES, USING AN INCREMENT TO THE I-TH
VARIABLE THAT EQUALS THE VALUE OF DI, I = 1, ..., N;
1SECTION : 4.3.2.1 (OCTOBER 1974) PAGE 7
FUNCT: <PROCEDURE IDENTIFIER>;
THE HEADING OF THIS PROCEDURE READS :
"PROCEDURE" FUNCT(N, L, U, X, F);
"VALUE" N, L, U; "INTEGER" N, L, U; "ARRAY" X, F;
THE MEANING OF THE FORMAL PARAMETERS IS :
N: <ARITHMETIC EXPRESSION>;
THE NUMBER OF FUNCTION COMPONENTS;
L,U:<ARITHMETIC EXPRESSION>;
LOWER AND UPPER BOUND OF THE FUNCTION COMPONENT
SUBSCRIPT;
X: <ARRAY IDENTIFIER>;
THE INDEPENDENT VARIABLES ARE GIVEN IN X[1:N];
F: <ARRAY IDENTIFIER>;
AFTER A CALL OF FUNCT THE FUNCTION COMPONENTS F[I],
I = L, ..., U, SHOULD BE GIVEN IN F[L:U].
PROCEDURES USED: NONE.
EXECUTION FIELD LENGTH: JACOBNMF DECLARES ONE AUXILIARY ARRAY OF
MAXIMUM ORDER LW + RW + 1;
RUNNING TIME: PROPORTIONAL TO N * (LW + RW + 1).
LANGUAGE: ALGOL 60.
METHOD AND PERFORMANCE:
JACOBNBNDF CALCULATES THE JACOBIAN MATRIX OF AN N-DIMENSIONAL
FUNCTION OF N VARIABLES, IF THIS JACOBIAN IS KNOWN TO BE A BAND
MATRIX AND HAVE TO BE STORED ROW-WISE IN A ONE-DIMENSIONAL ARRAY;
THE ELEMENTS OF THIS JACOBIAN MATRIX ARE CALCULATED USING FORWARD
DIFFERENCES, WITH AN INCREMENT TO THE I-TH VARIABLE OF DI, (I = 1,
..., N).
1SECTION : 4.3.2.1 (OCTOBER 1974) PAGE 8
EXAMPLE OF USE:
LET F BE DEFINED BY:
F[1] = (3 - 2 * X[1]) * X[1] + 1 - 2 * X[2],
F[I] = (3 - 2 * X[I]) * X[I] + 1 - X[I-1] - 2 * X[I+1], I= 2, 3, 4,
F[5] = 4 - 2 * X[5] - X[4];
THE TRIDIAGONAL JACOBIAN MATRIX AT THE POINT X, GIVEN BY X[I] = -1,
I = 1, ..., 5, MAY BE CALCULATED AND PRINTED BY THE FOLLOWING
PROGRAM:
"BEGIN"
"INTEGER" I; "ARRAY" JAC[1:13], X, F[1:5];
"PROCEDURE" F1(N, L, U, X, F); "VALUE" N, L, U;
"INTEGER" N, L, U; "ARRAY" X, F;
"BEGIN" "INTEGER" I;
"FOR" I:= L "STEP" 1 "UNTIL" ("IF" U = 5 "THEN" 4 "ELSE" U)
"DO"
"BEGIN" F[I]:= (3 - 2 * X[I]) * X[I] + 1 - 2 * X[I + 1];
"IF" I ^= 1 "THEN" F[I]:= F[I] - X[I - 1]
"END";
"IF" U = 5 "THEN" F[5]:= 4 - X[4] - X[5] * 2
"END" F1;
"PROCEDURE" LIST(ITEM); "PROCEDURE" ITEM;
"BEGIN" "INTEGER" I;
ITEM("("THE CALCULATED TRIDIAGONAL JACOBIAN IS:")");
"FOR" I:= 1 "STEP" 1 "UNTIL" 13 "DO" ITEM(JAC[I])
"END" LIST;
"PROCEDURE" LAYOUT;
FORMAT("("//,4B,40S,//,4B,2(+.5D"+D2B),/,4B,3(+.5D"+D2B),/,
16B,3(+.5D"+D2B),/,28B,3(+.5D"+D2B),/,40B,2(+.5D"+D2B),/")");
"FOR" I := 1 "STEP" 1 "UNTIL" 5 "DO" X[I]:= -1;
F1(5, 1, 5, X, F);
JACOBNBNDF(5, 1, 1, X, F, JAC, I, "IF" I = 5 "THEN" 1 "ELSE"
"-6, F1);
OUTLIST(71, LAYOUT, LIST)
"END"
RESULTS:
THE CALCULATED TRIDIAGONAL JACOBIAN IS:
+.70000"+1 -.20000"+1
-.10000"+1 +.70000"+1 -.20000"+1
-.10000"+1 +.70000"+1 -.20000"+1
-.10000"+1 +.70000"+1 -.20000"+1
-.10000"+1 -.20000"+1
1SECTION : 4.3.2.1 (OCTOBER 1974) PAGE 9
SOURCE TEXT(S):
"CODE" 34437;
"PROCEDURE" JACOBNNF(N, X, F, JAC, I, DI, FUNCT); "VALUE" N;
"INTEGER" N, I; "REAL" DI; "ARRAY" X, F, JAC; "PROCEDURE" FUNCT;
"BEGIN" "INTEGER" J; "REAL" STEP, AID; "ARRAY" F1[1:N];
"FOR" I:= 1 "STEP" 1 "UNTIL" N "DO"
"BEGIN" STEP:= DI; AID:= X[I]; X[I]:= AID + STEP;
STEP:= 1 / STEP; FUNCT(N, X, F1);
"FOR" J:= 1 "STEP" 1 "UNTIL" N "DO"
JAC[J,I]:= (F1[J] - F[J]) * STEP; X[I]:= AID
"END"
"END" JACOBNNF;
"EOP"
"CODE" 34438;
"PROCEDURE" JACOBNMF(N, M, X, F, JAC, I, DI, FUNCT); "VALUE" N, M;
"INTEGER" N, M, I; "REAL" DI; "ARRAY" X, F, JAC; "PROCEDURE" FUNCT;
"BEGIN" "INTEGER" J; "REAL" STEP, AID; "ARRAY" F1[1:N];
"FOR" I:= 1 "STEP" 1 "UNTIL" M "DO"
"BEGIN" STEP:= DI; AID:= X[I]; X[I]:= AID + STEP;
STEP:= 1 / STEP; FUNCT(N, M, X, F1);
"FOR" J:= 1 "STEP" 1 "UNTIL" N "DO"
JAC[J,I]:= (F1[J] - F[J]) * STEP; X[I]:= AID
"END"
"END" JACOBNMF;
"EOP"
"CODE" 34439;
"PROCEDURE" JACOBNBNDF(N, LW, RW, X, F, JAC, I, DI, FUNCT);
"VALUE" N, LW, RW; "INTEGER" I, N, LW, RW; "REAL" DI;
"ARRAY" X, F, JAC; "PROCEDURE" FUNCT;
"BEGIN" "INTEGER" J, K, L, U, T, B; "REAL" AID, STEPI;
L:= 1; U:= LW + 1; T:= RW + 1; B:= LW + RW;
"FOR" I:= 1 "STEP" 1 "UNTIL" N "DO"
"BEGIN" "ARRAY" F1[L:U];
STEPI:= DI; AID:= X[I]; X[I]:= AID + STEPI;
FUNCT(N, L, U, X, F1); X[I]:= AID;
K:= I + ("IF" I <= T "THEN" 0 "ELSE" I - T) * B;
"FOR" J:= L "STEP" 1 "UNTIL" U "DO"
"BEGIN" JAC[K]:= (F1[J] - F[J]) / STEPI; K:=K + B "END";
"IF" I >= T "THEN" L:= L + 1;
"IF" U < N "THEN" U:= U + 1
"END"
"END" JACOBNBNDF;
"EOP"
1SECTION : 5.1.1.1.1 (OCTOBER 1975) PAGE 1
AUTHORS: J. C. P. BUS AND T. J. DEKKER.
CONTRIBUTOR: J. C. P. BUS.
INSTITUTE: MATHEMATICAL CENTRE.
RECEIVED: 750615.
BRIEF DESCRIPTION:
THIS SECTION CONTAINS TWO PROCEDURES FOR FINDING A ZERO OF A GIVEN
FUNCTION IN A GIVEN INTERVAL;
ZEROIN APPROXIMATES A ZERO MAINLY BY LINEAR INTERPOLATION AND
EXTRAPOLATION;
ZEROINRAT APPROXIMATES A ZERO BY INTERPOLATION WITH RATIONAL
FUNCTIONS.
ZEROIN IS PREFERABLE FOR SIMPLE (I.E. CHEAPLY TO CALCULATE)
FUNCTIONS AND/OR WHEN NO HIGH PRECISION IS REQUIRED. ZEROINRAT IS
PREFERABLE FOR COMPLICATED (I.E. EXPENSIVE) FUNCTIONS WHEN A ZERO
IS REQUIRED IN RATHER HIGH PRECISION AND ALSO FOR FUNCTIONS HAVING
A POLE NEAR THE ZERO. WHEN THE ANALYTIC DERIVATIVE OF THE FUNCTION
IS EASILY OBTAINED, THEN ZEROINDER (SECTION 5.1.1.1.2) SHOULD BE
TAKEN INTO CONSIDERATION.
KEYWORDS:
ZERO SEARCHING,
ANALYTIC EQUATIONS,
SINGLE NON-LINEAR EQUATION.
1SECTION : 5.1.1.1.1 (OCTOBER 1975) PAGE 2
SUBSECTION: ZEROIN.
CALLING SEQUENCE:
THE HEADING OF THIS PROCEDURE READS :
"BOOLEAN" "PROCEDURE" ZEROIN(X, Y, FX, TOLX);
"REAL" X, Y, FX, TOLX;
"CODE" 34150;
ZEROIN SEARCHES FOR A ZERO OF A REAL FUNCTION F DEFINED ON A
CERTAIN INTERVAL J;
ZEROIN := "TRUE" WHEN A (SUFFICIENTLY SMALL) SUBINTERVAL OF
J CONTAINING A ZERO OF F HAS BEEN FOUND; OTHERWISE,
ZEROIN := "FALSE";
LET A REAL FUNCTION T DEFINED ON J, DENOTE A TOLERANCE
FUNCTION DEFINING THE REQUIRED PRECISION OF THE ZERO;
(FOR INSTANCE
T(X) = ABS(X) * RE + AE,
WHERE RE AND AE ARE THE REQUIRED RELATIVE AND ABSOLUTE
PRECISION RESPECTIVELY);
THE MEANING OF THE FORMAL PARAMETERS IS:
X: <REAL VARIABLE>;
A JENSEN VARIABLE; THE ACTUAL PARAMETERS FOR FX AND TOLX
(MAY) DEPEND ON THE ACTUAL PARAMETER FOR X;
ENTRY: ONE ENDPOINT OF INTERVAL J IN WHICH A ZERO IS
SEARCHED FOR;
EXIT: A VALUE APPROXIMATING THE ZERO WITHIN THE TOLERANCE
2 * T(X) WHEN ZEROIN HAS THE VALUE "TRUE", AND A
PRESUMABLY WORTHLESS ARGUMENT VALUE OTHERWISE;
Y: <REAL VARIABLE>;
ENTRY: THE OTHER ENDPOINT OF INTERVAL J IN WHICH A ZERO IS
SEARCHED FOR; UPON ENTRY X < Y AS WELL AS Y < X IS
ALLOWED;
EXIT: THE OTHER STRADDLING APPROXIMATION OF THE ZERO,
I.E. UPON EXIT THE VALUES OF Y AND X SATISFY
1. F(X) * F(Y) <= 0, 2. ABS(X - Y) <= 2 * T(X) AND
3. ABS(F(X)) <= ABS(F(Y)) WHEN ZEROIN HAS THE
VALUE "TRUE", AND A PRESUMABLY WORTHLESS ARGUMENT
VALUE SATISFYING CONDITIONS 2 AND 3 BUT NOT 1
OTHERWISE;
FX: <ARITHMETIC EXPRESSION>;
DEFINES FUNCTION F AS A FUNCTION DEPENDING ON THE ACTUAL
PARAMETER FOR X;
TOLX: <ARITHMETIC EXPRESSION>;
DEFINES THE TOLERANCE FUNCTION T WHICH MAY DEPEND ON THE
ACTUAL PARAMETER FOR X;
ONE SHOULD CHOOSE TOLX POSITIVE AND NEVER SMALLER THAN THE
PRECISION OF THE MACHINE'S ARITHMETIC AT X, I.E. IN THIS
ARITHMETIC X + TOLX AND X - TOLX SHOULD ALWAYS YIELD
VALUES DISTINCT FROM X; OTHERWISE THE PROCEDURE MAY GET
INTO A LOOP.
1SECTION : 5.1.1.1.1 (OCTOBER 1975) PAGE 3
PROCEDURES USED: DWARF = CP30003;
EXECUTION FIELD LENGTH: NO AUXILIARY ARRAYS ARE DECLARED IN ZEROIN.
LANGUAGE: ALGOL 60.
METHOD AND PERFORMANCE:
THE METHOD USED IS DESCRIBED IN DETAIL IN [1].
THE NUMBER OF EVALUATIONS OF FX AND TOLX IS AT MOST
4 * LOG(ABS(X - Y)) / TAU,
WHERE X AND Y ARE THE ARGUMENT VALUES GIVEN UPON ENTRY, LOG DENOTES
THE BASE 2 LOGARITHM AND TAU IS THE MINIMUM OF THE TOLERANCE
FUNCTION TOLX ON THE INITIAL INTERVAL. IF UPON ENTRY X AND Y
SATISFY F(X) * F(Y) <= 0, THEN CONVERGENCE IS GUARANTEED AND THE
ASYMPTOTIC ORDER OF CONVERGENCE IS 1.618 FOR SIMPLE ZEROES.
EXAMPLE OF USE:
THE ZERO OF THE FUNCTION EXP(-X * 3) * (X - 1) + X ** 3, IN THE
INTERVAL [0, 1], MAY BE CALCULATED BY THE FOLLOWING PROGRAM:
"BEGIN" "REAL" X, Y;
"REAL" "PROCEDURE" F(X); "VALUE" X; "REAL" X;
F:= EXP(-X * 3) * ( X - 1) + X ** 3;
X:= 0; Y:= 1;
"IF" ZEROIN(X, Y, F(X), ABS(X) * "-14 + "-14) "THEN"
OUTPUT(71, "("/4B,"("CALCULATED ZERO:")"B+.15D"+3D")", X)
"ELSE" OUTPUT(71, "("/4B,"("NO ZERO FOUND")"")")
"END"
RESULT:
CALCULATED ZERO: +.489702748548240"+000
1SECTION : 5.1.1.1.1 (OCTOBER 1975) PAGE 4
SUBSECTION: ZEROINRAT.
CALLING SEQUENCE:
THE HEADING OF THIS PROCEDURE READS:
"BOOLEAN" "PROCEDURE" ZEROINRAT(X, Y, FX, TOLX);
"REAL" X, Y, FX, TOLX;
"CODE" 34436;
ZEROINRAT SEARCHES FOR A ZERO OF A REAL FUNCTION F DEFINED ON A
CERTAIN INTERVAL J;
ZEROINRAT := "TRUE" WHEN A (SUFFICIENTLY SMALL) SUBINTERVAL
OF J CONTAINING A ZERO OF F HAS BEEN FOUND; OTHERWISE,
ZEROINRAT := "FALSE";
LET A REAL FUNCTION T DEFINED ON J, DENOTE A TOLERANCE
FUNCTION DEFINING THE REQUIRED PRECISION OF THE ZERO;
(FOR INSTANCE
T(X) = ABS(X) * RE + AE,
WHERE RE AND AE ARE THE REQUIRED RELATIVE AND ABSOLUTE
PRECISION RESPECTIVELY);
THE MEANING OF THE FORMAL PARAMETERS IS:
X: <REAL VARIABLE>;
A JENSEN VARIABLE; THE ACTUAL PARAMETERS FOR FX AND TOLX
(MAY) DEPEND ON THE ACTUAL PARAMETER FOR X;
ENTRY: ONE ENDPOINT OF INTERVAL J IN WHICH A ZERO IS
SEARCHED FOR;
EXIT: A VALUE APPROXIMATING THE ZERO WITHIN THE TOLERANCE
2 * T(X) WHEN ZEROINRAT HAS THE VALUE "TRUE", AND A
PRESUMABLY WORTHLESS ARGUMENT VALUE OTHERWISE;
Y: <REAL VARIABLE>;
ENTRY: THE OTHER ENDPOINT OF INTERVAL J IN WHICH A ZERO IS
SEARCHED FOR; UPON ENTRY X < Y AS WELL AS Y < X IS
ALLOWED;
EXIT: THE OTHER STRADDLING APPROXIMATION OF THE ZERO,
I.E. UPON EXIT THE VALUES OF Y AND X SATISFY
1. F(X) * F(Y) <= 0, 2. ABS(X - Y) <= 2 * T(X) AND
3. ABS(F(X)) <= ABS(F(Y)) WHEN ZEROINRAT HAS THE
VALUE "TRUE", AND A PRESUMABLY WORTHLESS ARGUMENT
VALUE SATISFYING CONDITIONS 2 AND 3 BUT NOT 1
OTHERWISE;
FX: <ARITHMETIC EXPRESSION>;
DEFINES FUNCTION F AS A FUNCTION DEPENDING ON THE ACTUAL
PARAMETER FOR X;
TOLX: <ARITHMETIC EXPRESSION>;
DEFINES THE TOLERANCE FUNCTION T WHICH MAY DEPEND ON THE
ACTUAL PARAMETER FOR X;
ONE SHOULD CHOOSE TOLX POSITIVE AND NEVER SMALLER THAN THE
PRECISION OF THE MACHINE'S ARITHMETIC AT X, I.E. IN THIS
ARITHMETIC X + TOLX AND X - TOLX SHOULD ALWAYS YIELD
VALUES DISTINCT FROM X; OTHERWISE THE PROCEDURE MAY GET
INTO A LOOP.
1SECTION : 5.1.1.1.1 (OCTOBER 1975) PAGE 5
PROCEDURES USED: DWARF = CP30003;
EXECUTION FIELD LENGTH: NO AUXILIARY ARRAYS ARE DECLARED IN ZEROINRAT.
LANGUAGE: ALGOL 60.
METHOD AND PERFORMANCE:
THE METHOD USED IS DESCRIBED IN DETAIL IN [1].
THE NUMBER OF EVALUATIONS OF FX AND TOLX IS AT MOST
5 * LOG(ABS(X - Y)) / TAU,
WHERE X AND Y ARE THE ARGUMENT VALUES GIVEN UPON ENTRY, LOG DENOTES
THE BASE 2 LOGARITHM AND TAU IS THE MINIMUM OF THE TOLERANCE
FUNCTION TOLX ON THE INITIAL INTERVAL. IF UPON ENTRY X AND Y
SATISFY F(X) * F(Y) <= 0, THEN CONVERGENCE IS GUARANTEED AND THE
ASYMPTOTIC ORDER OF CONVERGENCE IS 1.839 FOR SIMPLE ZEROES.
EXAMPLE OF USE:
THE ZERO OF THE FUNCTION EXP(-X * 3) * (X - 1) + X ** 3, IN THE
INTERVAL [0, 1], MAY BE CALCULATED BY THE FOLLOWING PROGRAM:
"BEGIN" "REAL" X, Y;
"REAL" "PROCEDURE" F(X); "VALUE" X; "REAL" X;
F:= EXP(-X * 3) * ( X - 1) + X ** 3;
X:= 0; Y:= 1;
"IF" ZEROINRAT(X, Y, F(X), ABS(X) * "-14 + "-14) "THEN"
OUTPUT(71, "("/4B,"("CALCULATED ZERO:")"B+.15D"+3D")", X)
"ELSE" OUTPUT(71, "("/4B,"("NO ZERO FOUND")"")")
"END"
RESULT:
CALCULATED ZERO: +.489702748548240"+000
REFERENCES:
[1]: BUS, J.C.P. AND DEKKER, T.J.,
TWO EFFICIENT ALGORITHMS WITH GUARANTEED CONVERGENCE FOR
FINDING A ZERO OF A FUNCTION.
MATHEMATICAL CENTRE, REPORT NW 13/74, AMSTERDAM (1974),
(ALSO TO APPEAR IN TOMS 1975).
1SECTION : 5.1.1.1.1 (OCTOBER 1975) PAGE 6
SOURCE TEXT(S):
0"CODE" 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 "OR" 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
1SECTION : 5.1.1.1.1 (OCTOBER 1975) PAGE 7
;
"EOP"
"CODE" 34436;
"BOOLEAN" "PROCEDURE" ZEROINRAT(X, Y, FX, TOLX);
"REAL" X, Y, FX, TOLX;
"BEGIN" "INTEGER" EXT; "BOOLEAN" FIRST;
"REAL" B, FB, A, FA, D, FD, C, FC, FDB, FDA, W,
MB, TOL, M, P, Q, DW;
DW:= DWARF; B:= X; FB:= FX; A:= X:= Y; FA:= FX; FIRST:= "TRUE";
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) * .5; MB:= M - B;
"IF" ABS(MB) > TOL "THEN"
"BEGIN" "IF" EXT > 3 "THEN" W:= MB "ELSE"
"BEGIN" TOL:= TOL * SIGN(MB);
P:= (B - A) * FB; "IF" FIRST "THEN"
"BEGIN" Q:= FA - FB; FIRST:= "FALSE" "END" "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";
"IF" EXT = 3 "THEN" P:= P * 2;
W:= "IF" P < DW "OR" 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;
ZEROINRAT:= "IF" FC >= 0 "THEN" FB <= 0 "ELSE" FB >= 0
"END" ZEROINRAT;
"EOP"
1SECTION : 5.1.1.1.2 (OCTOBER 1975) PAGE 1
AUTHOR: T.J. DEKKER.
CONTRIBUTORS: T.J. DEKKER AND T.H.P. REYMER.
INSTITUTE: UNIVERSITY OF AMSTERDAM.
RECEIVED: 750615.
BRIEF DESCRIPTION:
THIS SECTION CONTAINS ONE PROCEDURE FOR FINDING A ZERO OF A GIVEN
DIFFERENTIABLE FUNCTION IN A GIVEN INTERVAL;
ZEROINDER APPROXIMATES A ZERO MAINLY BY MEANS OF CONFLUENT 3-POINT
RATIONAL INTERPOLATION USING NOT ONLY VALUES OF THE
GIVEN FUNCTION BUT ALSO OF ITS DERIVATIVE.
ZEROINDER IS TO PREFER TO ZEROIN OR ZEROINRAT (SECTION 5.1.1.1.1),
IF THE DERIVATIVE IS (MUCH) CHEAPER TO EVALUATE THAN THE FUNCTION.
KEYWORDS:
ZERO SEARCHING,
ANALYTIC EQUATIONS,
SINGLE NONLINEAR EQUATION,
DERIVATIVE AVAILABLE.
CALLING SEQUENCE:
THE HEADING OF THIS PROCEDURE READS:
"BOOLEAN" "PROCEDURE" ZEROINDER(X, Y, FX, DFX, TOLX);
"REAL" X, Y, FX, DFX, TOLX;
"CODE" 34453;
ZEROINDER SEARCHES FOR A ZERO OF A DIFFERENTIABLE REAL FUNCTION F
DEFINED ON A CERTAIN INTERVAL J;
ZEROINDER := "TRUE" WHEN A (SUFFICIENTLY SMALL) SUBINTERVAL
OF J CONTAINING A ZERO OF F HAS BEEN FOUND; OTHERWISE,
ZEROINDER := "FALSE";
LET DF AND T DENOTE REAL FUNCTIONS DEFINED ON J, WHERE DF
IS THE DERIVATIVE OF F AND T A TOLERANCE FUNCTION DEFINING
THE REQUIRED PRECISION OF THE ZERO; ( FOR INSTANCE
T(X) = ABS(X) * RE + AE,
WHERE RE AND AE ARE THE REQUIRED RELATIVE AND ABSOLUTE
PRECISION RESPECTIVELY);
1SECTION : 5.1.1.1.2 (OCTOBER 1975) PAGE 2
THE MEANING OF THE FORMAL PARAMETERS IS:
X: <REAL VARIABLE>;
A JENSEN VARIABLE; THE ACTUAL PARAMETERS FOR FX, DFX AND
TOLX (MAY) DEPEND ON THE ACTUAL PARAMETER FOR X;
ENTRY: ONE ENDPOINT OF INTERVAL J IN WHICH A ZERO IS
SEARCHED FOR;
EXIT: A VALUE APPROXIMATING THE ZERO WITHIN THE TOLERANCE
2 * T(X) WHEN ZEROINDER HAS THE VALUE "TRUE", AND A
PRESUMABLY WORTHLESS ARGUMENT VALUE OTHERWISE;
Y: <REAL VARIABLE>;
ENTRY: THE OTHER ENDPOINT OF INTERVAL J IN WHICH A ZERO IS
SEARCHED FOR; UPON ENTRY X < Y AS WELL AS Y < X IS
ALLOWED;
EXIT: THE OTHER STRADDLING APPROXIMATION OF THE ZERO,
I.E. UPON EXIT THE VALUES OF Y AND X SATISFY
1. F(X) * F(Y) <= 0, 2. ABS(X - Y) <= 2 * T(X) AND
3. ABS(F(X)) <= ABS(F(Y)) WHEN ZEROINDER HAS THE
VALUE "TRUE", AND A PRESUMABLY WORTHLESS ARGUMENT
VALUE SATISFYING CONDITIONS 2 AND 3 BUT NOT 1
OTHERWISE;
FX: <ARITHMETIC EXPRESSION>;
DEFINES FUNCTION F AS A FUNCTION DEPENDING ON THE ACTUAL
PARAMETER FOR X;
DFX: <ARITHMETIC EXPRESSION>;
DEFINES THE DERIVATIVE DF OF F AS A FUNCTION DEPENDING ON
THE ACTUAL PARAMETER FOR X;
TOLX: <ARITHMETIC EXPRESSION>;
DEFINES THE TOLERANCE FUNCTION T WHICH MAY DEPEND ON THE
ACTUAL PARAMETER FOR X;
ONE SHOULD CHOOSE TOLX POSITIVE AND NEVER SMALLER THAN THE
PRECISION OF THE MACHINE'S ARITHMETIC AT X, I.E. IN THIS
ARITHMETIC X + TOLX AND X - TOLX SHOULD ALWAYS YIELD
VALUES DISTINCT FROM X; OTHERWISE THE PROCEDURE MAY GET
INTO A LOOP.
PROCEDURES USED: DWARF = CP30003;
REQUIRED CENTRAL MEMORY: NO AUXILIARY ARRAYS ARE DECLARED IN ZEROINDER.
RUNNING TIME: SEE METHOD AND PERFORMANCE.
LANGUAGE: ALGOL 60.
1SECTION : 5.1.1.1.2 (OCTOBER 1975) PAGE 3
METHOD AND PERFORMANCE:
THE METHOD USED IS CONFLUENT 3-POINT RATIONAL INTERPOLATION, I.E.
THE INTERPOLATION FUNCTION OF THE FORM (X - A) / (BX + C) IS FITTED
EXACTLY AT 3 POINTS 2 OF WHICH ARE COINCIDING; MOREOVER, IN ORDER
TO IMPROVE THE GLOBAL BEHAVIOUR OF THE PROCESS, LINEAR
INTERPOLATION ON THE FUNCTION F / DF OR BISECTION ARE INCLUDED IN
SOME STEPS;
THE PERFORMANCE IS AS FOLLOWS:
THE NUMBER OF EVALUATIONS OF FX, DFX AND TOLX IS AT MOST
4 LOG(ABS(X - Y)) / TAU,
WHERE X AND Y ARE THE ARGUMENT VALUES GIVEN UPON ENTRY, LOG DENOTES
THE BASE 2 LOGARITHM, AND TAU IS THE MINIMUM OF THE TOLERANCE
FUNCTION ON J (I.E. ZEROINDER REQUIRES AT MOST 4 TIMES THE NUMBER
OF STEPS REQUIRED FOR BISECTION); IF UPON ENTRY X AND Y SATISFY
F(X) * F(Y) <= 0, THEN CONVERGENCE TO A ZERO IS GUARANTEED, SO THAT
UPON EXIT X AND Y SATISFY CONDITION 1 TO 3 MENTIONED ABOVE (SEE
PARAMETER Y) AND ZEROINDER HAS THE VALUE "TRUE";
FOR A SIMPLE ZERO OF F, THE ASYMPTOTIC ORDER OF CONVERGENCE
APPROXIMATELY EQUALS 2.414.
EXAMPLE OF USE:
THE ZERO OF THE FUNCTION EXP(-X * 3) * (X - 1) + X ** 3, IN THE
INTERVAL [0, 1], MAY BE CALCULATED BY THE FOLLOWING PROGRAM:
"BEGIN" "REAL" X, Y;
"REAL" "PROCEDURE" F(X); "VALUE" X; "REAL" X;
F:= EXP(-X * 3) * ( X - 1) + X ** 3;
"REAL" "PROCEDURE" DF(X); "VALUE" X; "REAL" X;
DF:= EXP(-X * 3) * (-3 * X + 4) + 3 * X ** 2;
X:= 0; Y:= 1;
"IF" ZEROINDER(X, Y, F(X), DF(X), ABS(X) * "-14 + "-14) "THEN"
OUTPUT(71, "("/4B,"("CALCULATED ZERO AND FUNCTION VALUE:")",
/8B, 2(B+.15D"+3D4B), /4B,
"("OTHER STRADDLING APPROXIMATION AND FUNCTION VALUE:")",
/8B, 2(B+.15D"+3D4B)")", X, F(X), Y, F(Y))
"ELSE" OUTPUT(71, "("/4B, "("NO ZERO FOUND")"")")
"END"
RESULT:
CALCULATED ZERO AND FUNCTION VALUE:
+.489702748548240"+000 -.444089209850060"-015
OTHER STRADDLING APPROXIMATION AND FUNCTION VALUE:
+.489702748548250"+000 +.177635683940030"-013
1SECTION : 5.1.1.1.2 (OCTOBER 1975) PAGE 4
REFERENCES:
[1]: BUS, J.C.P. AND DEKKER, T.J.,
TWO EFFICIENT ALGORITHMS WITH GUARANTEED CONVERGENCE FOR
FINDING A ZERO OF A FUNCTION.
MATHEMATICAL CENTRE, REPORT NW 13/74, AMSTERDAM (1974),
(ALSO TO APPEAR IN TOMS 1975).
[2]: OSTROWSKI, A.M.,
SOLUTION OF EQUATIONS AND SYSTEMS OF EQUATIONS.
ACADEMIC PRESS 1966. CHAPTERS 3 AND 11.
SOURCE TEXT(S):
0"CODE" 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;
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 "OR" 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;
"EOP"
1SECTION : 5.1.1.2.2 (OCTOBER 1974) PAGE 1
AUTHOR: J.C.P.BUS.
INSTITUTE: MATHEMATICAL CENTRE.
RECEIVED: 740218.
BRIEF DESCRIPTION:
THIS SECTION CONTAINS TWO PROCEDURES FOR SOLVING SYSTEMS OF
NON-LINEAR EQUATIONS, OF WHICH THE JACOBIAN IS KNOWN TO BE A BAND
MATRIX.
QUANEWBND ASKS FOR AN APPROXIMATION OF THE JACOBIAN AT THE INITIAL
GUESS.
QUANEWBND1 CALCULATES AN APPROXIMATION OF THE JACOBIAN AT THE
INITIAL GUESS, USING FORWARD DIFFERENCES.
KEYWORDS:
NON-LINEAR EQUATIONS,
SYSTEMS OF EQUATIONS,
NO EXPLICIT JACOBIAN.
1SECTION : 5.1.1.2.2 (OCTOBER 1974) PAGE 2
SUBSECTION: QUANEWBND.
CALLING SEQUENCE:
THE HEADING OF THIS PROCEDURE READS :
"PROCEDURE" QUANEWBND(N, LW, RW, X, F, JAC, FUNCT, IN, OUT);
"VALUE" N, LW, RW; "INTEGER" N, LW, RW;
"ARRAY" X, F, JAC, IN, OUT; "BOOLEAN" "PROCEDURE" FUNCT;
"CODE" 34430;
THE MEANING OF THE FORMAL PARAMETERS IS:
N: <ARITHMETIC EXPRESSION>;
THE NUMBER OF INDEPENDENT VARIABLES; THE NUMBER OF
EQUATIONS SHOULD ALSO BE EQUAL TO N;
LW: <ARITHMETIC EXPRESSION>;
THE NUMBER OF CODIAGONALS TO THE LEFT OF THE MAIN DIAGONAL
OF THE JACOBIAN;
RW: <ARITHMETIC EXPRESSION>;
THE NUMBER OF CODIAGONALS TO THE RIGHT OF THE MAIN DIAGONAL
OF THE JACOBIAN;
X: <ARRAY IDENTIFIER>;
"ARRAY" X[1:N];
ENTRY: AN INITIAL ESTIMATE OF THE SOLUTION OF THE SYSTEM
THAT HAS TO BE SOLVED;
EXIT: THE CALCULATED SOLUTION OF THE SYSTEM;
F: <ARRAY IDENTIFIER>;
"ARRAY" F[1:N];
ENTRY: THE VALUES OF THE FUNCTION COMPONENTS AT THE
INITIAL GUESS;
EXIT: THE VALUES OF THE FUNCTION COMPONENTS AT THE
CALCULATED SOLUTION;
JAC: <ARRAY IDENTIFIER>;
"ARRAY" JAC[1:(LW + RW) * (N - 1) + N];
ENTRY: AN APPROXIMATION OF THE JACOBIAN AT THE INITIAL
ESTIMATE OF THE SOLUTION;
EXIT: AN APPROXIMATION OF THE JACOBIAN AT THE CALCULATED
SOLUTION;
AN APPROXIMATION OF THE (I, J)-TH ELEMENT OF THE JACOBIAN
IS GIVEN IN JAC[(LW + RW) * (I - 1) + J], FOR I = 1, ..., N
AND J = MAX(1, I - LW), ..., MIN(N, I + RW);
1SECTION : 5.1.1.2.2 (OCTOBER 1974) PAGE 3
FUNCT: <PROCEDURE IDENTIFIER>;
THE HEADING OF THIS PROCEDURE READS :
"BOOLEAN" "PROCEDURE" FUNCT(N, L, U, X, F);
"VALUE" N, L, U; "INTEGER" N, L, U; "ARRAY" X, F;
THE MEANING OF THE FORMAL PARAMETERS IS :
N: <ARITHMETIC EXPRESSION>;
THE NUMBER OF INDEPENDENT VARIABLES OF THE FUNCTION F;
L, U: <ARITHMETIC EXPRESSION>;
LOWER AND UPPER BOUND OF THE FUNCTION COMPONENT
SUBSCRIPT;
X: <ARRAY IDENTIFIER>;
THE INDEPENDENT VARIABLES ARE GIVEN IN X[1:N];
F: <ARRAY IDENTIFIER>;
AFTER A CALL OF FUNCT THE FUNCTION COMPONENTS F[I],
I = L, ..., U, SHOULD BE GIVEN IN F[L:U];
IF THE VALUE OF THE PROCEDURE IDENTIFIER EQUALS FALSE,
THEN THE EXECUTION OF QUANEWBND WILL BE TERMINATED, WHILE
THE VALUE OF OUT[5] IS SET EQUAL TO 2;
IN: <ARRAY IDENTIFIER>;
"ARRAY" IN[0:4];
ENTRY :
IN THIS AUXILIARY ARRAY ONE SHOULD GIVE THE FOLLOWING
VALUES FOR CONTROLLING THE PROCESS:
IN[0]: THE MACHINE PRECISION;
IN[1]: THE RELATIVE PRECISION ASKED FOR;
IN[2]: THE ABSOLUTE PRECISION ASKED FOR; IF THE VALUE,
DELIVERED IN OUT[5] EQUALS ZERO, THEN THE LAST
CORRECTION VECTOR D, SAY, WHICH IS A MEASURE FOR
THE ERROR IN THE SOLUTION, SATIFIES THE INEQUALITY
NORM(D) <= NORM(X) * IN[1] + IN[2],
WHEREBY X DENOTES THE CALCULATED SOLUTION, GIVEN IN
ARRAY X AND NORM(.) DENOTES THE EUCLIDIAN NORM;
HOWEVER,WE CAN NOT GUARANTEE THAT THE TRUE ERROR IN
THE SOLUTION SATISFIES THIS INEQUALITY, ESPECIALLY
IF THE JACOBIAN IS (NEARLY) SINGULAR AT THE
SOLUTION;
IN[3]: THE MAXIMUM VALUE OF THE NORM OF THE RESIDUAL
VECTOR ALLOWED; IF OUT[5] = 0, THEN THIS RESIDUAL
VECTOR F, SAY, SATIFIES: NORM(F) <= IN[3];
IN[4]: THE MAXIMUM NUMBER OF FUNCTION COMPONENT
EVALUATIONS ALLOWED; L - U + 1 FUNCTION COMPONENT
EVALUATIONS ARE COUNTED EACH CALL OF
FUNCT(N, L, U, X, F); IF OUT[5]=1, THEN THE PROCESS
IS TERMINATED, BECAUSE THE NUMBER OF EVALUATIONS
EXCEEDED THE VALUE GIVEN IN IN[4];
1SECTION : 5.1.1.2.2 (OCTOBER 1974) PAGE 4
OUT: <ARRAY IDENTIFIER>;
"ARRAY" OUT[1:5];
EXIT :
OUT[1]: THE EUCLIDIAN NORM OF THE LAST STEP ACCEPTED;
OUT[2]: THE EUCLIDIAN NORM OF THE RESIDUAL VECTOR AT THE
CALCULATED SOLUTION;
OUT[3]: THE NUMBER OF FUNCTION COMPONENT EVALUATIONS
PERFORMED;
OUT[4]: THE NUMBER OF ITERATIONS CARRIED OUT;
OUT[5]: THE INTEGER VALUE DELIVERED IN OUT[5] GIVES SOME
INFORMATION ABOUT THE TERMINATION OF THE PROCESS;
OUT[5] = 0: THE PROCESS IS TERMINATED IN A NORMAL
WAY; THE LAST STEP AND THE NORM OF THE
RESIDUAL VECTOR SATISFY THE CONDITIONS
(SEE IN[2], IN[3]);
IF OUT[5] ^= 0, THEN THE PROCESS IS TERMINATED
PREMATURALY;
OUT[5] = 1: THE NUMBER OF FUNCTION COMPONENT
EVALUATIONS EXCEEDS THE VALUE GIVEN IN
IN[4];
OUT[5] = 2: A CALL OF FUNCT DELIVERED THE VALUE
FALSE;
OUT[5] = 3: THE APPROXIMATION OF THE JACOBIAN
MATRIX TURNS OUT TO BE SINGULAR.
PROCEDURES USED:
MULVEC = CP31020,
DUPVEC = CP31030,
VECVEC = CP34010,
ELMVEC = CP34020,
DECSOLBND = CP34322.
EXECUTION FIELD LENGTH:
THE MAXIMUM NUMBER OF WORDS, NECESSARY FOR THE ARRAYS DECLARED IN
QUANEWBND EQUALS MAX(N * 3 + (N - 1) * (LW + RW), 4N).
RUNNING TIME: PROPORTIONAL TO N * LW * ( LW + RW + 1).
LANGUAGE: ALGOL 60.
1SECTION : 5.1.1.2.2 (OCTOBER 1974) PAGE 5
METHOD AND PERFORMANCE:
THE METHOD USED IN QUANEWBND IS THE SAME AS GIVEN IN [1]; THE SAME
PROBLEMS HAVE BEEN TESTED AND THE RESULTS ARE THE SAME OR BETTER
THAN THOSE REPORTED IN [1]; CITING [1], WE CAN SAY THAT "THIS
METHOD OFFERS A USEFUL IF MODEST IMPROVEMENT UPON NEWTON'S METHOD,
BUT THIS IMPROVEMENT TENDS TO VANISH AS THE NONLINEARITIES BECOME
MORE PRONOUNCED".
EXAMPLE OF USE: SEE QUANEWBND1 (THIS SECTION).
REFERENCES:
[1] BROYDEN C.G.
THE CONVERGENCE OF AN ALGORITHM FOR SOLVING SPARSE NONLINEAR
SYSTEMS.
MATH. COMP., VOL.25 (1971).
SUBSECTION: QUANEWBND1.
CALLING SEQUENCE:
THE HEADING OF THIS PROCEDURE READS :
"PROCEDURE" QUANEWBND1(N, LW, RW, X, F, FUNCT, IN, OUT);
"VALUE" N, LW, RW; "INTEGER" N, LW, RW;
"ARRAY" X, F, IN, OUT; "BOOLEAN" "PROCEDURE" FUNCT;
"CODE" 34431;
THE MEANING OF THE FORMAL PARAMETERS IS:
N: <ARITHMETIC EXPRESSION>;
THE NUMBER OF INDEPENDENT VARIABLES; THE NUMBER OF
EQUATIONS SHOULD ALSO BE EQUAL TO N;
LW: <ARITHMETIC EXPRESSION>;
THE NUMBER OF CODIAGONALS TO THE LEFT OF THE MAIN DIAGONAL
OF THE JACOBIAN;
RW: <ARITHMETIC EXPRESSION>;
THE NUMBER OF CODIAGONALS TO THE RIGHT OF THE MAIN DIAGONAL
OF THE JACOBIAN;
X: <ARRAY IDENTIFIER>;
"ARRAY" X[1:N];
ENTRY: AN INITIAL ESTIMATE OF THE SOLUTION OF THE SYSTEM
THAT HAS TO BE SOLVED;
EXIT: THE CALCULATED SOLUTION OF THE SYSTEM;
F: <ARRAY IDENTIFIER>;
"ARRAY" F[1:N];
EXIT: THE VALUES OF THE FUNCTION COMPONENTS AT THE
CALCULATED SOLUTION;
1SECTION : 5.1.1.2.2 (OCTOBER 1974) PAGE 6
FUNCT: <PROCEDURE IDENTIFIER>;
THE HEADING OF THIS PROCEDURE READS :
"BOOLEAN" "PROCEDURE" FUNCT(N, L, U, X, F);
"VALUE" N, L, U; "INTEGER" N, L, U; "ARRAY" X, F;
THE MEANING OF THE FORMAL PARAMETERS IS :
N: <ARITHMETIC EXPRESSION>;
THE NUMBER OF INDEPENDENT VARIABLES OF THE FUNCTION F;
L, U: <ARITHMETIC EXPRESSION>;
LOWER AND UPPER BOUND OF THE FUNCTION COMPONENT
SUBSCRIPT;
X: <ARRAY IDENTIFIER>;
THE INDEPENDENT VARIABLES ARE GIVEN IN X[1:N];
F: <ARRAY IDENTIFIER>;
AFTER A CALL OF FUNCT THE FUNCTION COMPONENTS F[I],
I = L, ..., U, SHOULD BE GIVEN IN F[L:U];
IF THE VALUE OF THE PROCEDURE IDENTIFIER EQUALS FALSE,
THEN THE EXECUTION OF QUANEWBND WILL BE TERMINATED, WHILE
THE VALUE OF OUT[5] IS SET EQUAL TO 2;
IN: <ARRAY IDENTIFIER>;
"ARRAY" IN[0:4];
ENTRY :
IN THIS AUXILIARY ARRAY ONE SHOULD GIVE THE FOLLOWING
VALUES FOR CONTROLLING THE PROCESS:
IN[0]: THE MACHINE PRECISION;
IN[1]: THE RELATIVE PRECISION ASKED FOR;
IN[2]: THE ABSOLUTE PRECISION ASKED FOR; IF THE VALUE,
DELIVERED IN OUT[5] EQUALS ZERO, THEN THE LAST
CORRECTION VECTOR D, SAY, WHICH IS A MEASURE FOR
THE ERROR IN THE SOLUTION, SATIFIES THE INEQUALITY
NORM(D) <= NORM(X) * IN[1] + IN[2],
WHEREBY X DENOTES THE CALCULATED SOLUTION, GIVEN IN
ARRAY X AND NORM(.) DENOTES THE EUCLIDIAN NORM;
HOWEVER,WE CAN NOT GUARANTEE THAT THE TRUE ERROR IN
THE SOLUTION SATISFIES THIS INEQUALITY, ESPECIALLY
IF THE JACOBIAN IS (NEARLY) SINGULAR AT THE
SOLUTION;
IN[3]: THE MAXIMUM VALUE OF THE NORM OF THE RESIDUAL
VECTOR ALLOWED; IF OUT[5] = 0, THEN THIS RESIDUAL
VECTOR F, SAY, SATIFIES: NORM(F) <= IN[3];
IN[4]: THE MAXIMUM NUMBER OF FUNCTION COMPONENT
EVALUATIONS ALLOWED; L - U + 1 FUNCTION COMPONENT
EVALUATIONS ARE COUNTED EACH CALL OF
FUNCT(N, L, U, X, F); IF OUT[5]=1, THEN THE PROCESS
IS TERMINATED, BECAUSE THE NUMBER OF EVALUATIONS
EXCEEDED THE VALUE GIVEN IN IN[4];
IN[5]: THE JACOBIAN MATRIX AT THE INITIAL GUESS IS
APPROXIMATED USING FORWARD DIFFERENCES, WITH AN
FIXED INCREMENT TO EACH VARIABLE THAT EQUALS THE
VALUE GIVEN IN IN[5];
1SECTION : 5.1.1.2.2 (OCTOBER 1974) PAGE 7
OUT: <ARRAY IDENTIFIER>;
"ARRAY" OUT[1:5];
EXIT :
OUT[1]: THE EUCLIDIAN NORM OF THE LAST STEP ACCEPTED;
OUT[2]: THE EUCLIDIAN NORM OF THE RESIDUAL VECTOR AT THE
CALCULATED SOLUTION;
OUT[3]: THE NUMBER OF FUNCTION COMPONENT EVALUATIONS
PERFORMED;
OUT[4]: THE NUMBER OF ITERATIONS CARRIED OUT;
OUT[5]: THE INTEGER VALUE DELIVERED IN OUT[5] GIVES SOME
INFORMATION ABOUT THE TERMINATION OF THE PROCESS;
OUT[5] = 0: THE PROCESS IS TERMINATED IN A NORMAL
WAY; THE LAST STEP AND THE NORM OF THE
RESIDUAL VECTOR SATISFY THE CONDITIONS
(SEE IN[2], IN[3]);
IF OUT[5] ^= 0, THEN THE PROCESS IS TERMINATED
PREMATURALY;
OUT[5] = 1: THE NUMBER OF FUNCTION COMPONENT
EVALUATIONS EXCEEDS THE VALUE GIVEN IN
IN[4];
OUT[5] = 2: A CALL OF FUNCT DELIVERED THE VALUE
FALSE;
OUT[5] = 3: THE APPROXIMATION OF THE JACOBIAN
MATRIX TURNS OUT TO BE SINGULAR.
PROCEDURES USED:
JACOBNBNDF = CP34439,
QUANEWBND = CP34430.
EXECUTION FIELD LENGTH:
QUANEWBND1 DECLARES AN AUXILIARY ARRAY OF DIMENSION ONE AND ORDER
N + (N - 1) * (LW + RW).
RUNNING TIME: PROPORTIONAL TO N * LW * ( LW + RW + 1).
LANGUAGE: ALGOL 60.
METHOD AND PERFORMANCE:
QUANEWBND1 USES JACOBNBNDF (SECTION 4.3.2.1) TO CALCULATE AN
INITIAL APPROXIMATION OF THE JACOBIAN MATRIX AT THE INITIAL GUESS
GIVEN IN X[1:N] AND SOLVES THE NONLINEAR SYSTEM BY CALLING
QUANEWBND (THIS SECTION).
1SECTION : 5.1.1.2.2 (OCTOBER 1974) PAGE 8
EXAMPLE OF USE:
LET THE FUNCTION F BE DEFINED BY (SEE [1]):
F[1] = (3 - 2 * X[1]) * X[1] + 1 - 2 * X[2],
F[I] = (3 - 2 * X[I]) * X[I] + 1 - X[I - 1] - 2 * X[I + 1], I = 2,
..., N - 1,
F[N] = (3 - 2 * X[N]) * X[N] + 1 - X[N - 1];
LET AN INITIAL ESTIMATE OF THE SOLUTION OF THE SYSTEM F(X) = 0 BE
GIVEN BY X[I] = -1, I = 1, ..., N; THEN THE FOLLOWING PROGRAM MAY
SOLVE THIS SYSTEM FOR N = 600 AND PRINTS SOME RESULTS.
"BEGIN"
"BOOLEAN" "PROCEDURE" FUN(N, L, U, X, F); "VALUE" N, L, U;
"INTEGER" N, L, U; "ARRAY" X, F;
"BEGIN" "INTEGER" I; "REAL" X1, X2, X3;
X1:= "IF" L = 1 "THEN" 0 "ELSE" X[L - 1]; X2:= X[L];
X3:= "IF" L = N "THEN" 0 "ELSE" X[L + 1];
"FOR" I:= L "STEP" 1 "UNTIL" U "DO"
"BEGIN" F[I]:= (3 - 2 * X2) * X2 + 1 - X1 - X3 * 2;
X1:= X2; X2:= X3;
X3:= "IF" I <= N - 2 "THEN" X[I + 2] "ELSE" 0
"END"; FUN:= "TRUE"
"END" FUN;
"INTEGER" I; "ARRAY" X, F[1:600], IN[0:5], OUT[1:5];
"FOR" I := 1 "STEP" 1 "UNTIL" 600 "DO" X[I]:= -1;
IN[0]:= "-14; IN[1]:= IN[2]:= IN[3]:= "-6; IN[4]:= 20000;
IN[5]:= 0.001;
QUANEWBND1(600, 1, 1, X, F, FUN, IN, OUT);
OUTPUT(71, "("//,"(" NORM RESIDUALVECTOR: ")"+.15D"+3D,/,
"(" LENGTH OF LAST STEP: ")"+.15D"+3D,/,
"(" NUMBER OF FUNCTION COMPONENT EVALUATIONS: ")"5ZD,/,
"(" NUMBER OF ITERATIONS: ")"4ZD/,"("REPORT: ")"D/")",
OUT[2], OUT[1], OUT[3], OUT[4], OUT[5])
"END"
RESULTS:
NORM RESIDUALVECTOR: +.221010684482660"-006
LENGTH OF LAST STEP: +.302712457332660"-006
NUMBER OF FUNCTION COMPONENT EVALUATIONS: 6598
NUMBER OF ITERATIONS: 7
REPORT: 0
REFERENCES:
[1] BROYDEN C.G.
THE CONVERGENCE OF AN ALGORITHM FOR SOLVING SPARSE NONLINEAR
SYSTEMS.
MATH. COMP., VOL.25 (1971).
1SECTION : 5.1.1.2.2 (OCTOBER 1974) PAGE 9
SOURCE TEXT(S):
0"CODE" 34430;
"PROCEDURE" QUANEWBND(N, LW, RW, X, F, JAC, FUNCT, IN, OUT);
"VALUE" N, LW, RW; "INTEGER" N, LW, RW;
"ARRAY" X, F, JAC, IN, OUT; "BOOLEAN" "PROCEDURE" FUNCT;
"BEGIN" "INTEGER" L, IT, FCNT, FMAX, ERR, B;
"REAL" MACHEPS, RELTOL, ABSTOL, TOLRES, ND, MZ, RES;
"ARRAY" DELTA[1:N];
"REAL" "PROCEDURE" EVALUATE(N, X, F); "VALUE" N;
"INTEGER" N; "ARRAY" X, F;
"BEGIN" FCNT:= FCNT + N; "IF" ^ FUNCT(N, 1, N, X, F) "THEN"
"BEGIN" ERR:= 2; "GOTO" EXIT "END";
"IF" FCNT > FMAX "THEN" ERR:= 1;
EVALUATE:= SQRT(VECVEC(1, N, 0, F, F))
"END" EVAL;
"BOOLEAN" "PROCEDURE" DIRECTION;
"BEGIN" "ARRAY" LU[1:L], AUX[1:5]; AUX[2]:= MACHEPS;
MULVEC(1, N, 0, DELTA, F, -1); DUPVEC(1, L, 0, LU, JAC);
DECSOLBND(LU, N, LW, RW, AUX, DELTA);
DIRECTION:= AUX[3] = N
"END" SOLLINSYS;
"BOOLEAN" "PROCEDURE" TEST(ND, TOLD, NRES, TOLRES, ERR);
"VALUE" ND, TOLD; "INTEGER" ERR; "REAL" ND, TOLD, NRES, TOLRES;
TEST:= ERR ^= 0 "OR" (NRES < TOLRES "AND" ND < TOLD);
"PROCEDURE" UPDATE JAC;
"BEGIN" "INTEGER" I, J, K, R, M; "REAL" MUL, CRIT;
"ARRAY" PP, S[1:N];
CRIT:= ND * MZ;
"FOR" I:= 1 "STEP" 1 "UNTIL" N "DO" PP[I]:= DELTA[I] ** 2;
R:= 1; K:= 1; M:= RW + 1;
"FOR" I:= 1 "STEP" 1 "UNTIL" N "DO"
"BEGIN" MUL:= 0; "FOR" J:= R "STEP" 1 "UNTIL" M "DO"
MUL:= MUL + PP[J]; J:= R - K;
"IF" ABS(MUL) > CRIT "THEN"
ELMVEC(K, M - J, J, JAC, DELTA, F[I] / MUL); K:= K + B;
"IF" I > LW "THEN" R:= R + 1 "ELSE" K:= K - 1;
"IF" M < N "THEN" M:= M + 1
"END"
"END" UPDATEJAC
1SECTION : 5.1.1.2.2 (OCTOBER 1974) PAGE 10
;
MACHEPS:= IN[0]; RELTOL:= IN[1]; ABSTOL:= IN[2];
TOLRES:= IN[3]; FMAX:= IN[4]; MZ:= MACHEPS ** 2;
IT:= FCNT:= 0; B:= LW + RW; L:= (N - 1) * B + N; B:= B + 1;
RES:= SQRT(VECVEC(1, N, 0, F, F)); ERR:= 0;
ITERATE: "IF" ^ TEST(SQRT(ND), SQRT(VECVEC(1, N, 0, X, X)) * RELTOL
+ ABSTOL, RES, TOLRES, ERR) "THEN"
"BEGIN" IT:= IT + 1; "IF" IT ^= 1 "THEN" UPDATEJAC;
"IF" ^ DIRECTION "THEN" ERR:= 3 "ELSE"
"BEGIN" ELMVEC(1, N, 0, X, DELTA, 1);
ND:= VECVEC(1, N, 0, DELTA, DELTA);
RES:= EVALUATE(N, X, F); "GOTO" ITERATE
"END"
"END";
EXIT: OUT[1]:= SQRT(ND); OUT[2]:=RES; OUT[3]:= FCNT;
OUT[4]:= IT; OUT[5]:= ERR
"END" QUANEWBND;
"EOP"
"CODE" 34431;
"PROCEDURE" QUANEWBND1(N, LW, RW, X, F, FUNCT, IN, OUT);
"VALUE" N, LW, RW; "INTEGER" N, LW, RW; "ARRAY" X, F, IN, OUT;
"BOOLEAN" "PROCEDURE" FUNCT;
"BEGIN" "INTEGER" I, K; "REAL" S;
"ARRAY" JAC[1:(LW + RW) * (N - 1) + N];
FUNCT(N, 1, N, X, F); S:= IN[5];
K:= (LW + RW)*(N - 1) + N*2 - ((LW - 1)*LW + (RW - 1)*RW) // 2;
IN[4]:= IN[4] - K;
JACOBNBNDF(N, LW, RW, X, F, JAC, I, S, FUNCT);
QUANEWBND(N, LW, RW, X, F, JAC, FUNCT, IN, OUT);
IN[4]:= IN[4] + K; OUT[3]:= OUT[3] + K
"END" QUANEWBND1;
"EOP"
1SECTION : 5.1.2.1.1 ( DECEMBER 1978 ) PAGE 1
AUTHOR : J. C. P. BUS
INSTITUTE : MATHEMATICAL CENTRE.
RECEIVED : 741101.
BRIEF DESCRIPTION :
THIS SECTION CONTAINS THE PROCEDURE MININ, FOR MINIMIZING
A FUNCTION OF ONE VARIABLE IN A GIVEN INTERVAL;
KEYWORDS :
MINIMIZATION,
FUNCTIONS OF ONE VARIABLE.
CALLING SEQUENCE :
THE HEADING OF THIS PROCEDURE IS :
"REAL" "PROCEDURE" MININ(X, A, B, FX, TOLX);
"REAL" X, A, B, FX, TOLX;
"CODE" 34433;
MININ DELIVERS THE CALCULATED MINIMUM VALUE OF THE FUNCTION,
DEFINED BY FX, ON THE INTERVAL WITH ENDPOINTS A AND B.
THE MEANING OF THE FORMAL PARAMETERS IS :
X : <REAL VARIABLE>;
A JENSEN VARIABLE; THE ACTUAL PARAMETERS FOR FX AND TOLX
DEPEND ON X;
EXIT : THE CALCULATED APPROXIMATION OF THE POSITION OF THE
MINIMUM;
A, B : <REAL VARIABLE>;
ENTRY : THE ENDPOINTS OF THE INTERVAL ON WHICH A MINIMUM
IS SEARCHED FOR;
EXIT : THE ENDPOINTS OF THE INTERVAL WITH LENGTH LESS THAN
4 * TOL(X) SUCH THAT A < X < B;
FX : <ARITHMATIC EXPRESSION>;
THE FUNCTION ISGIVEN BY THE ACTUAL PARAMETER FX, WHICH
DEPENDS ON X;
TOLX : <ARITHMETIC EXPRESSION>;
THE TOLERANCE IS GIVEN BY THE ACTUAL PARAMETER TOLX, WHICH MAY
DEPEND ON X; A SUITABLE TOLERANCE FUNCTION IS : ABS(X)*RE + AE,
WHERE RE IS THE RELATIVE PRECISION DESIRED AND AE IS AN ABSOLUTE
PRECISION WHICH SHOULD NOT BE CHOSEN EQUAL TO ZERO.
1SECTION : 5.1.2.1.1 ( DECEMBER 1978 ) PAGE 2
DATA AND RESULTS :
THE USER SHOULD BE AWARE OF THE FACT THAT THE CHOICE OF TOLX MAY
HIGHLY AFFECT THE BEHAVIOUR OF THE ALGORITHM, ALTHOUGH CONVERGENCE
TO A POINT FOR WHICH THE GIVEN FUNCTION IS MINIMAL ON THE INTERVAL
IS ASSURED; THE ASYMPTOTIC BEHAVIOUR WILL USUALLY BE FINE AS LONG AS
THE NUMERICAL FUNCTION IS STRICTLY DELTA-UNIMODAL ON THE GIVEN
INTERVAL (SEE [1]) AND THE TOLERANCE FUNCTION SATISFIES TOL(X)>=DELTA,
FOR ALL X IN THE GIVEN INTERVAL.
PROCEDURES USED : NONE.
REQUIRED CENTRAL MEMORY : NO AUXILIARY ARRAYS ARE DECLARED IN MININ.
METHOD AND PERFORMANCE :
MININ IS A SLIGHTLY MODIFIED VERSION OF THE ALGORITHM GIVEN IN [1].
EXAMPLE OF USE:
THE FOLLOWING PROGRAM MAY BE USED TO CALCULATE THE MINIMUM OF THE
FUNCTION F(X) = SUM(((I * 2 - 5)/(X - I ** 2)) ** 2; I = 1 (1) 20)
ON THE INTERVAL [1 + TOL, 4 - TOL] (SEE [1]).
"BEGIN"
"REAL" M, X, A, B; "INTEGER" CNT;
"REAL" "PROCEDURE" F(X); "VALUE" X; "REAL" X;
"BEGIN" "INTEGER" I; "REAL" S;
S:= 0; "FOR" I:= 1 "STEP" 1 "UNTIL" 20 "DO"
S:= S + ((I * 2 - 5) / (X - I ** 2)) ** 2;
CNT:= CNT + 1; F:= S
"END" F;
"REAL" "PROCEDURE" TOL(X); "VALUE" X; "REAL" X;
TOL:= ABS(X) * "-7 + "-7;
A:= 1 + TOL(1); B:= 4 - TOL(4); CNT:= 0;
M:= MININ(X, A, B, F(X), TOL(X));
OUTPUT(61, "("4B,"("MINIMUM IS ")",N,/4B,
"("FOR X IS ")",N,/4B,
"("IN THE INTERVAL WITH ENDPOINTS ")",/8B,2(N),/4B,
"("THE NUMBER OF FUNCTION EVALUATIONS NEEDED IS ")",2ZD,/")",
M, X, A, B, CNT)
"END"
1SECTION : 5.1.2.1.1 ( DECEMBER 1978 ) PAGE 3
RESULTS :
MINIMUM IS +3.6766990169019"+000
FOR X IS +3.0229153387991"+000
IN THE INTERVAL WITH ENDPOINTS
+3.0229149365075"+000 +3.0229157410906"+000
THE NUMBER OF FUNCTION EVALUATIONS NEEDED IS 13
SOURCE TEXT:
0"CODE" 34433;
"REAL" "PROCEDURE" MININ(X, A, B, FX, TOLX);
"REAL" X, A, B, FX, TOLX;
"BEGIN" "COMMENT" SEE BRENT, 1973, P79;
"REAL" Z, C, D, E, M, P, Q, R, TOL, T, U, V, W, FU, FV, FW, FZ;
C:= (3 - SQRT(5)) / 2; "IF" A > B "THEN"
"BEGIN" Z:= A; A:= B; B:= Z "END";
W:= X:= A; FW:= FX; Z:= X:= B; FZ:= FX; "IF" FZ > FW "THEN"
"BEGIN" Z:= W; W:= X; V:= FZ; FZ:= FW; FW:= V "END";
V:= W; FV:= FW; E:= 0;
LOOP: M:= (A + B) * 0.5; TOL:= TOLX; T:= TOL * 2;
"IF" ABS(Z - M) > T - (B - A) * 0.5 "THEN"
"BEGIN" P:= Q:= R:= 0; "IF" ABS(E) > TOL "THEN"
"BEGIN" R:= (Z - W) * (FZ - FV);
Q:= (Z - V) * (FZ - FW); P:= (Z - V) * Q - (Z - W) * R;
Q:= (Q - R) * 2; "IF" Q>0 "THEN" P:= -P "ELSE" Q:= -Q;
R:= E; E:= D
"END";
"IF" ABS(P) < ABS(Q * R * 0.5) "AND" P > (A - Z) * Q
"AND" P < (B - Z) * Q "THEN"
"BEGIN" D:= P / Q; U:= Z + D;
"IF" U - A < T "OR" B - U < T "THEN"
D:= "IF" Z < M "THEN" TOL "ELSE" -TOL
"END" "ELSE"
"BEGIN" E:= ("IF" Z < M "THEN" B "ELSE" A) - Z; D:= C * E
"END";
U:= X:= Z + ("IF" ABS(D) >= TOL "THEN" D "ELSE" "IF" D > 0
"THEN" TOL "ELSE" -TOL); FU:= FX;
"IF" FU <= FZ "THEN"
"BEGIN" "IF" U < Z "THEN" B:= Z "ELSE" A:= Z;
V:= W; FV:= FW; W:= Z; FW:= FZ; Z:= U; FZ:= FU
"END" "ELSE"
"BEGIN" "IF" U < Z "THEN" A:= U "ELSE" B:= U;
"IF" FU <= FW "THEN"
"BEGIN" V:= W; FV:= FW; W:= U; FW:= FU "END" "ELSE"
"IF" FU <= FV "OR" V = W "THEN"
"BEGIN" V:= U; FV:= FU "END"
"END"; "GOTO" LOOP
"END"; X:= Z; MININ:= FZ
"END" MININ;
"EOP"
1SECTION : 5.1.2.1.2 (OCTOBER 1975) PAGE 1
AUTHOR: J. C. P. BUS.
INSTITUTE: MATHEMATICAL CENTRE.
RECEIVED: 741101.
BRIEF DESCRIPTION:
THIS SECTION CONTAINS THE PROCEDURE MININDER, FOR MINIMIZING A
FUNCTION OF ONE VARIABLE IN A GIVEN INTERVAL, WHEN THE ANALYTICAL
DERIVATIVE OF THE FUNCTION IS AVAILABLE.
KEYWORDS :
MINIMIZATION,
FUNCTIONS OF ONE VARIABLE.
CALLING SEQUENCE:
THE HEADING OF THIS PROCEDURE IS:
"REAL" "PROCEDURE" MININDER(X, Y, FX, DFX, TOLX);
"REAL" X, Y, FX, DFX, TOLX;
"CODE" 34435;
MININDER DELIVERS THE CALCULATED MINIMUM VALUE OF THE FUNCTION,
DEFINED BY FX, ON THE INTERVAL WITH END POINTS A AND B.
THE MEANING OF THE FORMAL PARAMETERS IS:
X: <REAL VARIABLE>;
A JENSEN VARIABLE; THE ACTUAL PARAMETERS FOR FX, DFX AND
TOLX DEPEND ON X;
ENTRY: ONE OF THE END POINTS OF THE INTERVAL ON WHICH THE
FUNCTION HAS TO BE MINIMIZED;
EXIT: THE CALCULATED APPROXIMATION OF THE POSITION OF THE
MINIMUM;
Y: <REAL VARIABLE>;
ENTRY: THE OTHER END POINT OF THE INTERVAL ON WHICH THE
FUNCTION HAS TO BE MINIMIZED;
EXIT: A VALUE SUCH THAT ABS(X - Y) <= TOL(X) * 3;
FX: <ARITHMETIC EXPRESSION>;
THE FUNCTION IS GIVEN BY THE ACTUAL PARAMETER FX WHICH
DEPENDS ON X;
DFX: <ARITHMETIC EXPRESSION>;
THE DERIVATIVE OF THE FUNCTION IS GIVEN BY THE ACTUAL
PARAMETER DFX WHICH DEPENDS ON X; FX AND DFX ARE EVALUATED
SUCCESSIVELY FOR A CERTAIN VALUE OF X;
TOLX: <ARITHMETIC EXPRESSION>;
THE TOLERANCE IS GIVEN BY THE ACTUAL PARAMETER TOLX, WHICH
MAY DEPEND ON X; A SUITABLE TOLERANCE FUNCTION IS:
ABS(X) * RE + AE, WHERE RE IS THE RELATIVE PRECISION
DESIRED AND AE IS AN ABSOLUTE PRECISION WHICH SHOULD NOT
BE CHOSEN EQUAL TO ZERO.
1SECTION : 5.1.2.1.2 (OCTOBER 1975) PAGE 2
DATA AND RESULTS:
THE USER SHOULD BE AWARE OF THE FACT THAT THE CHOICE OF TOLX
MAY HIGHLY AFFECT THE BEHAVIOUR OF THE ALGORITHM, ALTHOUGH
CONVERGENCE TO A POINT FOR WHICH THE GIVEN FUNCTION IS
MINIMAL ON THE GIVEN INTERVAL IS ASSURED; THE ASYMPTOTIC
BEHAVIOUR WILL USUALLY BE FINE AS LONG AS THE NUMERICAL FUNCTION IS
STRICTLY DELTA-UNIMODAL ON THE GIVEN INTERVAL (SEE [1]) AND THE
TOLERANCE FUNCTION SATISFIES TOL(X) >= DELTA, FOR ALL X IN THE
GIVEN INTERVAL; LET THE VALUE OF DFX AT THE BEGIN AND END POINT OF
THE INITIAL INTERVAL BE DENOTED BY DFA AND DFB, RESPECTIVELY, THEN,
FINDING A GLOBAL MINIMUM IS ONLY GUARANTEED IF THE FUNCTION IS
CONVEX AND DFA <= 0 AND DFB >= 0; IF THESE CONDITIONS ARE NOT
SATISFIED, THEN A LOCAL MINIMUM OR A MINIMUM AT ONE OF THE END
POINTS MIGHT BE FOUND.
PROCEDURES USED: NONE.
REQUIRED CENTRAL MEMORY: NO AUXILIARY ARRAYS ARE DECLARED IN MININDER.
LANGUAGE: ALGOL 60.
METHOD AND PERFORMANCE:
MININDER HAS ALMOST THE SAME STRUCTURE AS THE PROCEDURE GIVEN IN
[1]; HOWEVER, CUBIC INTERPOLATION (SEE [2]) IS USED INSTEAD OF
QUADRATIC INTERPOLATION TO APPROXIMATE THE MINIMIUM.
REFERENCES:
[1]: BRENT, R.P.
ALGORITHMS FOR MINIMIZATION WITHOUT DERIVATIVES. CH.5.
PRENTICE HALL, 1973.
[2]: DAVIDON, W.C.
VARIABLE METRIC METHODS FOR MINIMIZATION.
REP. A.N.L. 5990, 1959.
1SECTION : 5.1.2.1.2 (OCTOBER 1975) PAGE 3
EXAMPLE OF USE:
THE FOLLOWING PROGRAM MAY BE USED TO CALCULATE THE MINIMUM OF THE
FUNCTION F(X) = SUM(((I * 2 - 5)/(X - I ** 2)) ** 2; I = 1 (1) 20)
ON THE INTERVAL [1.01,3.99] (SEE [1]).
"BEGIN"
"REAL" M, X, Y; "INTEGER" CNT;
"REAL" "PROCEDURE" F(X); "VALUE" X; "REAL" X;
"BEGIN" "INTEGER" I; "REAL" S;
S:= 0; "FOR" I:= 1 "STEP" 1 "UNTIL" 20 "DO"
S:= S + ((I * 2 - 5) / (X - I ** 2)) ** 2;
CNT:= CNT + 1; F:= S
"END" F;
"REAL" "PROCEDURE" DF(X); "VALUE" X; "REAL" X;
"BEGIN" "INTEGER" I; "REAL" S;
S:= 0; "FOR" I:= 1 "STEP" 1 "UNTIL" 20 "DO"
S:= S + (I * 2 - 5) ** 2 / (X - I ** 2) ** 3;
DF:= -S * 2
"END" DF;
"REAL" "PROCEDURE" TOL(X); "VALUE" X; "REAL" X;
TOL:= ABS(X) * "-7 + "-7;
X:= 1.01; Y:= 3.99; CNT:= 0;
M:= MININDER(X, Y, F(X), DF(X),TOL(X));
OUTPUT(61 ,"("4B,"("MINIMUM IS ")",N,/4B,
"("FOR X IS ")",N,/4B,
"("AND Y IS ")",N,/4B,
"("THE NUMBER OF FUNCTION EVALUATIONS NEEDED IS ")",2ZD,/")",
M, X, Y, CNT)
"END"
RESULTS:
MINIMUM IS +3.6766990169021"+000
FOR X IS +3.0229155250302"+000
AND Y IS +3.0229151227386"+000
THE NUMBER OF FUNCTION EVALUATIONS NEEDED IS 9
1SECTION : 5.1.2.1.2 (NOVEMBER 1976) PAGE 4
SOURCE TEXT(S):
"CODE"34435;
"REAL" "PROCEDURE" MININDER(X, Y, FX, DFX, TOLX);
"REAL" X, Y, FX, DFX, TOLX;
"BEGIN" "COMMENT" THE FUNCTION IS APPROXIMATED BY A CUBIC AS
GIVEN BY DAVIDON, 1958, THE STRUCTURE IS SIMILAR TO THE
STRUCTURE OF THE PROGRAM GIVEN BY BRENT, 1973, THIS IS
A REVISION OF 760407;
"INTEGER" SGN;
"REAL" A, B, C, FA, FB, FU, DFA, DFB, DFU, E, D, TOL, BA,
Z, P, Q, S;
"IF" X <= Y "THEN"
"BEGIN" A:= X; FA:= FX; DFA:= DFX;
B:= X:= Y; FB:= FX; DFB:= DFX
"END" "ELSE"
"BEGIN" B:= X; FB:= FX; DFB:= DFX;
A:= X:= Y; FA:= FX; DFA:= DFX
"END";
C:= (3 - SQRT(5)) / 2; D:= B - A; E:= D * 2; Z:= E * 2;
LOOP: BA:= B - A; TOL:= TOLX; "IF" BA >= TOL * 3 "THEN"
"BEGIN" "IF" ABS(DFA) <= ABS(DFB) "THEN"
"BEGIN" X:=A; SGN:= 1 "END" "ELSE"
"BEGIN" X:= B; SGN:= -1 "END";
"IF" DFA <= 0 "AND" DFB >= 0 "THEN"
"BEGIN" Z:= (FA - FB) * 3 / BA + DFA + DFB;
S:= SQRT(Z ** 2 - DFA * DFB);
P:= "IF" SGN = 1 "THEN" DFA - S - Z "ELSE"
DFB + S - Z; P:= P * BA;
Q:= DFB - DFA + S * 2; Z:= E; E:= D;
D:= "IF" ABS(P) <= ABS(Q) * TOL "THEN" TOL * SGN
"ELSE" -P / Q
"END" "ELSE" D:= BA;
"IF" ABS(D) >= ABS(Z * 0.5) "OR" ABS(D) > BA * 0.5 "THEN"
"BEGIN" E:= BA; D:= C * BA * SGN "END";
X:= X + D; FU:= FX; DFU:= DFX;
"IF" DFU >= 0 "OR" (FU >= FA "AND" DFA <= 0) "THEN"
"BEGIN" B:= X; FB:= FU; DFB:= DFU "END" "ELSE"
"BEGIN" A:= X; FA:= FU; DFA:= DFU "END";
"GOTO" LOOP
"END"; "IF" FA <= FB "THEN"
"BEGIN" X:= A; Y:= B; MININDER:= FA "END" "ELSE"
"BEGIN" X:= B; Y:= A; MININDER:= FB "END"
"END" MININDER;
"EOP"
1SECTION : 5.1.2.2.1 (DECEMBER 1975) PAGE 1
AUTHOR: J.C.P.BUS.
INSTITUTE: MATHEMATICAL CENTRE.
RECEIVED: 730620.
BRIEF DESCRIPTION:
THIS SECTION CONTAINS FOUR PROCEDURES, LINEMIN, RNK1UPD, DAVUPD AND
FLEUPD, THAT ARE AUXILIARY PROCEDURES FOR THE PROCEDURES RNK1MIN
AND FLEMIN (SECTION 5.1.2.2.2).
KEYWORDS:
AUXILIARY PROCEDURE.
SUBSECTION: LINEMIN.
CALLING SEQUENCE:
THE HEADING OF THIS AUXILIARY PROCEDURE IS:
"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;"CODE" 34210;
THE MEANING OF THE FORMAL PARAMETERS IS:
N: <ARITHMETIC EXPRESSION>;
THE NUMBER OF VARIABLES OF THE GIVEN FUNCTION F;
X: <ARRAY IDENTIFIER>;
"ARRAY" X[1 : N];
ENTRY: A VECTOR X0, SUCH THAT F IS DECREASING IN X0, IN
THE DIRECTION GIVEN BY D;
EXIT: THE CALCULATED APPROXIMATION OF THE VECTOR FOR
WHICH F IS MINIMAL ON THE LINE DEFINED BY:
X0 + ALFA * D, (ALFA > 0);
D: <ARRAY IDENTIFIER>;
"ARRAY" D[1 : N];
ENTRY: THE DIRECTION OF THE LINE ON WHICH F HAS TO BE
MINIMIZED;
ND: <ARITHMETIC EXPRESSION>;
ENTRY: THE EUCLIDEAN NORM OF THE VECTOR GIVEN IN D[1 : N];
ALFA: <VARIABLE>;
THE INDEPENDENT VARIABLE, THAT DEFINES THE POSITION ON THE
LINE ON WHICH F HAS TO BE MINIMIZED;
THIS LINE IS DEFINED BY X0 + ALFA * D, (ALFA > 0);
ENTRY: AN ESTIMATE ALFA0 OF THE VALUE FOR WHICH
H(ALFA) = F(X0 + ALFA * D), (ALFA > 0), IS MINIMAL;
EXIT: THE CALCULATED APPROXIMATION ALFAM OF THE VALUE FOR
WHICH H(ALFA) IS MINIMAL;
1SECTION : 5.1.2.2.1 (FEBRUARY 1979) PAGE 2
G: <ARRAY IDENTIFIER>;
"ARRAY" G[1 : N];
EXIT: THE GRADIENT OF F AT THE CALCULATED APPROXIMATION
OF THE MINIMUM;
FUNCT: <PROCEDURE IDENTIFIER>;
THE HEADING OF THIS PROCEDURE SHOULD BE:
"REAL" "PROCEDURE" FUNCT(N, X, G); "VALUE" N;
"INTEGER" N; "ARRAY" X, G;
A CALL OF FUNCT SHOULD EFFECTUATE :
1: FUNCT:= F(X);
2: THE VALUE OF G[I], (I = 1, ..., N), BECOMES THE VALUE
OF THE I - TH COMPONENT OF THE GRADIENT OF F AT X;
F0: <ARITHMETIC EXPRESSION>;
ENTRY: THE VALUE OF H(0), (SEE ALFA);
F1: <VARIABLE>;
ENTRY: THE VALUE OF H(ALFA0);
EXIT: THE VALUE OF H(ALFAM), (SEE ALFA);
DF0: <ARITHMETIC EXPRESSION>;
ENTRY: THE VALUE OF THE DERIVATIVE OF H AT ALFA = 0;
DF1: <VARIABLE>;
ENTRY: THE VALUE OF THE DERIVATIVE OF H AT ALFA = ALFA0;
EXIT: THE VALUE OF THE DERIVATIVE OF H AT ALFA = ALFAM;
EVLMAX: <VARIABLE>;
ENTRY: THE MAXIMUM ALLOWED NUMBER OF CALLS OF FUNCT;
EXIT: THE NUMBER OF TIMES FUNCT HAS BEEN CALLED;
STRONGSEARCH:
<BOOLEAN EXPRESSION>;
IF THE VALUE OF STRONGSEARCH IS TRUE, THEN THE PROCESS
MAKES USE OF TWO STOPPING CRITERIA:
A: THE NUMBER OF TIMES FUNCT HAS BEEN CALLED EXCEEDS THE
GIVEN VALUE OF EVLMAX;
B: AN INTERVAL IS FOUND WITH LENGTH LESS THAN TWO TIMES
THE PRESCRIBED PRECISION,ON WICH A MINIMUM IS EXPECTED;
IF THE VALUE OF STRONGSEARCH IS FALSE, THE PROCESS MAKES
ALSO USE OF A THIRD STOPPING CRITERION :
C: MU <= (H(ALFAK) - H(ALFA0)) / (ALFAK * DF0) <= 1 - MU,
WHEREBY ALFAK IS THE CURRENT ITERATE AND MU A
PRESCRIBED CONSTANT;
IN: <ARRAY IDENTIFIER>;
ENTRY:
"ARRAY" IN[1:3];
IN[1]: THE RELATIVE PRECISION, EPSR, NECESSARY FOR THE
STOPPING CRITERION B, (SEE STRONGSEARCH);
IN[2]: THE ABSOLUTE PRECISION, EPSA, NECESSARY FOR THE
STOPPING CRITERION B, (SEE STRONGSEARCH);
THE PRESCRIBED PRECISION, EPS, AT ALFA = ALFAK IS GIVEN BY:
EPS = NORM ( X0 + ALPHA * D ) * EPSR + EPSA, WHERE
NORM ( . ) DENOTES THE EUCLIDEAN NORM.
IN[3]: THE PARAMETER MU NECESSARY FOR STOPPING CRITERION C;
THIS PARAMETER MUST SATISFY: 0 < MU < 0.5 ; IN
PRACTICE,A CHOICE OF MU = 0.0001 IS ADVISED.
1SECTION : 5.1.2.2.1 (FEBRUARY 1979) PAGE 3
DATA AND RESULTS:
LINEMIN CALCULATES AN APPROXIMATION OF A MINIMUM OF A
HIGHER - DIMENSIONAL FUNCTION ON A GIVEN LINE;
THE QUANTITY DF0 MUST SATIFY: DF0 < 0;
IF MOREOVER DF1 > 0, THEN THE PROCEDURE WILL YIELD A RESULT THAT
SATISFIES ONE OF THE CHOSEN STOPPING CRITERIA, (SEE STRONGSEARCH),
OTHERWISE WE CAN NOT GUARANTEE SUCH A RESULT.
PROCEDURES USED:
VECVEC = CP34010,
ELMVEC = CP34020,
DUPVEC = CP31030.
REQUIRED CENTRAL MEMORY:
N WORDS.
METHOD AND PERFORMANCE:
AN APPROXIMATION TO THE MINIMUM ON THE GIVEN LINE IS CALCULATED
WITH CUBIC INTERPOLATION ([2]);THE STOPPING CRITERION USED WHEN THE
VALUE OF STRONGSEARCH IS FALSE IS DESCRIBED IN [3] AND [4]; A
DETAILED DESCRIPTION OF THIS PROCEDURE IS GIVEN IN [1].
REFERENCES:
[1] BUS, J. C. P.
MINIMIZATION OF FUNCTIONS OF SEVERAL VARIABLES (DUTCH).
MATHEMATICAL CENTRE, AMSTERDAM, NR 29/72 (1972).
[2] DAVIDON, W. C.
VARIABLE METRIC METHOD FOR MINIMIZATION.
ARGONNE NAT. LAB. REPORT, ANL 5990 (1959).
[3] FLETCHER, R.
A NEW APPROACH TO VARIABLE METRIC ALGORITHMS.
COMP. J. 6, (1963), P.163 - 168.
[4] GOLDSTEIN, A. A. AND PRICE, J. F.
AN EFFECTIVE ALGORITHM FOR MINIMIZATION.
NUMER. MATH. 10, (1967), P.184 - 189.
1SECTION : 5.1.2.2.1 (FEBRUARY 1979) PAGE 4
SUBSECTION: RNK1UPD.
CALLING SEQUENCE:
THE HEADING OF THIS AUXILIARY PROCEDURE IS:
"PROCEDURE" RNK1UPD(H, N, V, C); "VALUE" N, C;
"INTEGER" N; "REAL" C; "ARRAY" H, V;
"CODE" 34211;
THE MEANING OF THE FORMAL PARAMETERS IS:
N: <ARITHMETIC EXPRESSION>;
THE ORDER OF THE SYMMETRIC MATRIX, WHOSE UPPERTRIANGLE IS
STORED COLUMNWISE IN THE ONE - DIMENSIONAL ARRAY H;
C: <ARITHMETIC EXPRESSION>;
SEE V;
V: <ARRAY IDENTIFIER>;
"ARRAY" V[1 : N];
THE GIVEN MATRIX IS UPDATED (ANOTHER MATRIX IS ADDED TO IT)
WITH A SYMMETRIC MATRIX , U, OF RANK ONE, DEFINED BY:
U[I,J] = C * V[I] * V[J];
H: <ARRAY IDENTIFIER>;
"ARRAY" H[1 : N * (N + 1) // 2];
ENTRY: THE UPPERTRIANGLE (STORED COLUMNWISE, I.E. :
A[I,J] = H[(J-1)*J//2+I], 1 <= I <= J <= N)
OF THE SYMMETRIC MATRIX THAT HAS TO BE UPDATED;
EXIT: THE UPPERTRIANGLE (STORED COLUMNWISE) OF THE
UPDATED MATRIX.
PROCEDURES USED:
ELMVEC = CP34020.
REQUIRED CENTRAL MEMORY:
NO AUXILIARY ARRAYS ARE DECLARED IN RNK1UPD.
1SECTION : 5.1.2.2.1 (FEBRUARY 1979) PAGE 5
SUBSECTION: DAVUPD.
CALLING SEQUENCE:
THE HEADING OF THIS AUXILIARY PROCEDURE IS:
"PROCEDURE" DAVUPD(H, N, V, W, C1, C2); "VALUE" N, C1, C2;
"INTEGER" N; "REAL" C1, C2; "ARRAY" H, V, W;
"CODE" 34212;
THE MEANING OF THE FORMAL PARAMETERS IS:
N: <ARITHMETIC EXPRESSION>;
THE ORDER OF THE SYMMETRIC MATRIX WHOSE UPPERTRIANGLE IS
STORED COLUMNWISE IN THE ONE - DIMENSIONAL ARRAY H;
C1: <ARITHMETIC EXPRESSION>;
SEE W;
C2: <ARITHMETIC EXPRESSION>;
SEE W;
V: <ARRAY IDENTIFIER>;
"ARRAY" V[1 : N];
SEE W;
W: <ARRAY IDENTIFIER>;
"ARRAY" W[1 : N];
THE GIVEN MATRIX IS UPDATED WITH A SYMMETRIC MATRIX U OF
RANK TWO, DEFINED BY:
U[I,J] = C1 * V[I] * V[J] - C2 * W[I] * W[J];
H: <ARRAY IDENTIFIER>;
"ARRAY" H[1 : N * (N + 1) // 2];
ENTRY: THE UPPERTRIANGLE (STORED COLUMNWISE, I.E. :
A[I,J] = H[(J - 1) * J // 2 + I], 1 <= I <= J <= N)
OF THE MATRIX THAT HAS TO BE UPDATED;
EXIT: THE UPPERTRIANGLE (STORED COLUMNWISE) OF THE
UPDATED MATRIX.
PROCEDURES USED: NONE.
REQUIRED CENTRAL MEMORY:
NO AUXILIARY ARRAYS ARE DECLARED IN DAVUPD.
1SECTION : 5.1.2.2.1 (FEBRUARY 1979) PAGE 6
SUBSECTION: FLEUPD.
CALLING SEQUENCE:
THE HEADING OF THIS AUXILIARY PROCEDURE IS:
"PROCEDURE" FLEUPD(H, N, V, W, C1, C2); "VALUE" N, C1, C2;
"INTEGER" N; "REAL" C1, C2; "ARRAY" H, V, W;
"CODE" 34213;
THE MEANING OF THE FORMAL PARAMETERS IS:
N: <ARITHMETIC EXPRESSION>;
THE ORDER OF THE SYMMETRIC MATRIX WHOSE UPPERTRIANGLE IS
STORED COLUMNWISE IN THE ONE - DIMENSIONAL ARRAY H;
C1: <ARITHMETIC EXPRESSION>;
SEE W;
C2: <ARITHMETIC EXPRESSION>;
SEE W;
V: <ARRAY IDENTIFIER>;
"ARRAY" V[1 : N];
SEE W;
W: <ARRAY IDENTIFIER>;
"ARRAY" W[1 : N];
THE GIVEN MATRIX IS UPDATED WITH A SYMMETRIC MATRIX U OF
RANK TWO, DEFINED BY:
U[I,J]= C2 * V[I] * V[J] - C1 *(V[I] * W[J] + W[I] * V[J]);
H: <ARRAY IDENTIFIER>;
"ARRAY" H[1 : N * (N + 1) // 2];
ENTRY: THE UPPERTRIANGLE (STORED COLUMNWISE, I.E. :
A[I,J] = H[(J - 1) * J // 2 + I], 1 <= I <= J <= N)
OF THE MATRIX THAT HAS TO BE UPDATED;
EXIT: THE UPPERTRIANGLE (STORED COLUMNWISE) OF THE
UPDATED MATRIX.
PROCEDURE USED: NONE.
REQUIRED CENTRAL MEMORY:
NO AUXILIARY ARRAYS ARE DECLARED IN FLEUPD.
1SECTION : 5.1.2.2.1 (DECEMBER 1975) PAGE 7
SOURCE TEXT(S):
0"CODE" 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];
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 "AND" 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 "OR" STRONGSEARCH "THEN" "TRUE" "ELSE"
Q < MU "OR" Q > 1 - MU) "AND" EVL < EVLMAX "THEN"
"BEGIN" "IF" NOTININT "OR" DF > 0 "OR" 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
1SECTION : 5.1.2.2.1 (DECEMBER 1975) PAGE 8
;
"EOP"
0"CODE" 34211;
"PROCEDURE" RNK1UPD(H, N, V, C);"VALUE" N, C; "INTEGER" N;
"REAL" C;"ARRAY" H, V;
"BEGIN" "INTEGER" J, K;
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;
"EOP"
0"CODE" 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;
"EOP"
0"CODE" 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;
"EOP"
1SECTION : 5.1.2.2.2 (DECEMBER 1979) PAGE 1
AUTHOR: J.C.P. BUS.
INSTITUTE: MATHEMATICAL CENTRE.
RECEIVED: 741101.
BRIEF DESCRIPTION:
THIS SECTION CONTAINS THE PROCEDURE PRAXIS;
PRAXIS MINIMIZES A FUNCTION OF SEVERAL VARIABLES.
KEYWORDS:
MINIMIZATION,
FUNCTION OF SEVERAL VARIABLES.
CALLING SEQUENCE:
THE HEADING OF THIS PROCEDURE IS:
"PROCEDURE" PRAXIS(N, X, FUNCT, IN, OUT); "VALUE" N;
"INTEGER" N; "ARRAY" X, IN, OUT; "REAL" "PROCEDURE" FUNCT;
"CODE" 34432;
THE MEANING OF THE FORMAL PARAMETERS IS:
N: <ARITHMETIC EXPRESSION>;
THE NUMBER OF VARIABLES OF THE FUNCTION TO BE MINIMIZED;
X: <ARRAY IDENTIFIER>;
"ARRAY" X[1 : N];
THE VARIABLES OF THE FUNCTION;
ENTRY: AN APPROXIMATION OF THE POSITION OF THE MINIMUM;
EXIT: THE CALCULATED POSITION OF THE MINIMUM;
FUNCT: <PROCEDURE IDENTIFIER>;
THE HEADING OF THIS PROCEDURE SHOULD BE:
"REAL" "PROCEDURE" FUNCT(N, X); "VALUE" N;
"INTEGER" N; "ARRAY" X;
FUNCT SHOULD DELIVER THE VALUE OF THE FUNCTION TO BE
MINIMIZED, AT THE POINT GIVEN BY X[1:N];
THE MEANING OF THE FORMAL PARAMETERS IS:
N: <ARITHMETIC EXPRESSION>;
THE NUMBER OF VARIABLES;
X: <ARRAY IDENTIFIER>; "ARRAY" X[1:N];
THE VALUES OF THE VARIABLES FOR WHICH THE FUNCTION HAS
TO BE EVALUATED;
IN: <ARRAY IDENTIFIER>;
"ARRAY" IN[0:9];
ENTRY:
IN[0]: THE MACHINE PRECISION; FOR THE CYBER 73 A
SUITABLE VALUE IS "-14;
1SECTION : 5.1.2.2.2 (OCTOBER 1975) PAGE 2
IN[1], IN[2]: RELATIVE AND ABSOLUTE TOLERANCE,
RESPECTIVELY, FOR THE STEPVECTOR
(RELATIVE TO THE CURRENT ESTIMATES OF
THE VARIABLES); THE PROCESS IS TERMINATED WHEN
IN IN[8] + 1 SUCCESSIVE ITERATION STEPS THE
EUCLIDEAN NORM OF THE STEP VECTOR IS LESS THAN
(IN[1] * NORM(X) + IN[2]) * 0.5;
IN[1] SHOULD BE CHOSEN IN AGREEMENT WITH THE
PRECISION IN WHICH THE FUNCTION IS CALCULATED;
USUALLY IN[1] SHOULD BE CHOSEN SUCH THAT
IN[1] >= SQRT(IN[0]); IN[0] SHOULD BE CHOSEN
DIFFERENT FROM ZERO.
IN[3], IN[4] ARE NEITHER USED NOR CHANGED;
IN[5]: THE MAXIMUM NUMBER OF FUNCTION EVALUATIONS
ALLOWED (I.E. CALLS OF FUNCT);
IN[6]: THE MAXIMUM STEP SIZE; IN[6] SHOULD BE EQUAL TO
THE MAXIMUM EXPECTED DISTANCE BETWEEN THE GUESS
AND THE MINIMUM; IF IN[6] IS TOO SMALL OR TOO
LARGE, THEN THE INITIAL RATE OF CONVERGENCE
WILL BE SLOW;
IN[7]: THE MAXIMUM SCALING FACTOR; THE VALUE OF IN[7]
MAY BE USED TO OBTAIN AUTOMATIC SCALING OF THE
VARIABLES; HOWEVER, THIS SCALING IS WORTHWHILE
BUT MAY BE UNRELIABLE; THEREFORE, THE USER
SHOULD TRY TO SCALE HIS PROBLEM HIMSELF AS WELL
AS POSSIBLE AND SET IN[7]:= 1; IN EITHER CASE,
IN[7] SHOULD NOT BE CHOSEN GREATER THAN 10;
IN[8]: THE PROCESS TERMINATES IF NO SUBSTANTIAL
IMPROVEMENT OF THE VALUES OF THE VARIABLES IS
OBTAINED IN IN[8] + 1 SUCCESSIVE ITERATION
STEPS (SEE IN[1], IN[2]); IN[8] = 4 IS VERY
CAUTIOUS; USUALLY, IN[8] = 1 IS SATISFACTORY;
IN[9]: IF THE PROBLEM IS KNOWN TO BE ILL-CONDITIONED
(SEE [1]), THEN THE VALUE OF IN[9] SHOULD BE
NEGATIVE, OTHERWISE IN[9] >= 0;
OUT: <ARRAY IDENTIFIER>;
"ARRAY" OUT[1:6];
EXIT:
OUT[1]: THIS VALUE GIVES INFORMATION ABOUT THE
TERMINATION OF THE PROCESS;
OUT[1] = 0: NORMAL TERMINATION;
OUT[1] = 1: THE PROCESS IS BROKEN OFF, BECAUSE,
AT THE END OF AN ITERATION STEP,
THE NUMBER OF CALLS OF FUNCT
EXCEEDED THE VALUE GIVEN IN IN[5];
OUT[1] = 2: THE PROCESS IS BROKEN OFF, BECAUSE
THE CONDITION OF THE PROBLEM IS TOO
BAD;
OUT[2]: THE CALCULATED MINIMUM OF THE FUNCTION;
OUT[3]: THE VALUE OF THE FUNCTION AT THE INITIAL GUESS;
OUT[4]: THE NUMBER OF FUNCTION EVALUATIONS NEEDED TO
OBTAIN THIS RESULT;
OUT[5]: THE NUMBER OF LINE SEARCHES (SEE [1]);
OUT[6]: THE STEP SIZE IN THE LAST ITERATION STEP.
1SECTION : 5.1.2.2.2 (DECEMBER 1979) PAGE 3
PROCEDURES USED:
INIVEC = CP31010,
INIMAT = CP31011,
DUPVEC = CP31030,
DUPMAT = CP31035,
DUPCOLVEC = CP31034,
MULROW = CP31021,
MULCOL = CP31022,
VECVEC = CP34010,
TAMMAT = CP34014,
MATTAM = CP34015,
ICHROWCOL = CP34033,
ELMVECCOL = CP34021,
QRISNGVALDEC = CP34273,
SETRANDOM = CP11014,
RANDOM = CP11015,
DWARF = CP30003.
REQUIRED CENTRAL MEMORY:
EXECUTION FIELD LENGTH: ONE ARRAY OF LENGTH N SQUARED AND FIVE
ARRAYS OF LENGTH N ARE DECLARED;
RUNNING TIME:
THE NUMBER OF ITERATION STEPS DEPENDS STRONGLY ON THE PROBLEM TO BE
SOLVED.
METHOD AND PERFORMANCE:
THIS PROCEDURE IS ADOPTED FROM [1].
REFERENCES:
[1] R. P. BRENT,
ALGORITHMS FOR MINIMIZATION WITHOUT DERIVATIVES, CH. 7.
PRENTICE HALL, 1973.
1SECTION : 5.1.2.2.2 (DECEMBER 1979) PAGE 4
EXAMPLE OF USE:
THE FOLLOWING PROGRAM MAY BE USED TO CALCULATE THE MINIMUM OF THE
FUNCTION F(X) = 100 * (X[2] - X[1] ** 2) ** 2 + (1 - X[1]) ** 2,
USING (-1.2, 1) AS AN INITIAL ESTIMATE.
"BEGIN"
"ARRAY" X[1:2], IN[0:9], OUT[1:6];
"REAL" "PROCEDURE" F(N, X); "VALUE" N; "INTEGER" N; "ARRAY" X;
F:= (X[2] - X[1] ** 2) ** 2 * 100 + (1 - X[1]) ** 2;
IN[0]:= "-14; IN[1]:= IN[2]:= "-6; IN[5]:= 250;
IN[6]:= 1; IN[7]:= 1; IN[8]:= 1; IN[9]:= 1;
X[1]:= -1.2; X[2]:= 1;
PRAXIS(2, X, F, IN, OUT);
"IF" OUT[1] = 0 "THEN" OUTPUT(61,"(""(" NORMAL TERMINATION")"
,//")");
OUTPUT(61, "("4B,"("MINIMUM IS ")",N,/,4B,
"("FOR X IS ")", 2(N),/,4B,
"("THE INITIAL FUNCTION VALUE WAS ")" ,N,/,4B,
"("THE NUMBER OF FUNCTION EVALUATIONS NEEDED WAS ")",3ZD,/,4B,
"("THE NUMBER OF LINE SEARCHES WAS ")",3ZD,/,4B,
"("THE STEP SIZE IN THE LAST ITERATION STEP WAS ")", N,/")",
OUT[2], X[1], X[2], OUT[3], OUT[4], OUT[5], OUT[6])
"END"
RESULTS:
NORMAL TERMINATION
MINIMUM IS +1.5694986738789"-021
FOR X IS +1.0000000000389"+000 +1.0000000000785"+000
THE INITIAL FUNCTION VALUE WAS +2.4200000000001"+001
THE NUMBER OF FUNCTION EVALUATIONS NEEDED WAS 189
THE NUMBER OF LINE SEARCHES WAS 72
THE STEP SIZE IN THE LAST ITERATION STEP WAS +5.3830998470105"-009
1SECTION : 5.1.2.2.2 (DECEMBER 1979) PAGE 5
SOURCE TEXT(S):
0"CODE" 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" 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
1SECTION : 5.1.2.2.2 (OCTOBER 1975) PAGE 6
;
"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 "AND" T2 > S "THEN" T2:= S;
"IF"T2<SMALL"THEN"T2:= SMALL;
"IF"T2>0.01*H "THEN"T2:= 0.01*H;
"IF"FK"AND"F1<=FM "THEN"
"BEGIN"XM:=X1; FM:= F1 "END";
"IF" ^ FK"OR"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;
"COMMENT"
1SECTION : 5.1.2.2.2 (DECEMBER 1979) PAGE 7
;
L1: F2:=FLIN(X2);
"IF"K<NITS"AND"F2>F0"THEN"
"BEGIN"K:=K+1;
"IF"F0<F1"AND"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)"AND"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);
"COMMENT"
1SECTION : 5.1.2.2.2 (DECEMBER 1979) PAGE 8
;
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] "OR" 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 "OR" 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 "AND" 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;
"COMMENT"
1SECTION : 5.1.2.2.2 (OCTOBER 1975) PAGE 9
;
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;
"EOP"
1SECTION : 5.1.2.2.3 (DECEMBER 1975) PAGE 1
AUTHOR: J.C.P.BUS.
INSTITUTE: MATHEMATICAL CENTRE.
RECEIVED: 730620.
BRIEF DESCRIPTION:
THIS SECTION CONTAINS TWO PROCEDURES, RNK1MIN AND FLEMIN, FOR
MINIMIZING A GIVEN DIFFERENTIABLE FUNCTION OF SEVERAL VARIABLES;
BOTH PROCEDURES USE A VARIABLE METRIC METHOD; THE USER HAS TO
PROGRAM THE EVALUATION OF THE FUNCTION AND ITS GRADIENT;
THE CHOICE OF RNK1MIN AND FLEMIN IS DEPENDENT ON THE PROBLEM
INVOLVED; IF THE NUMBER OF VARIABLES OF THE FUNCTION TO BE
MINIMIZED IS VERY LARGE AND THE CALCULATION OF THE FUNCTION AND ITS
GRADIENT IS RELATIVELY CHEAP (THE NUMBER OF ARITHMETIC OPERATIONS
IS OF ORDER AT MOST N ** 2),THEN THE USER IS ADVISED TO USE FLEMIN;
IF THE HESSIAN OF THE FUNCTION IS EXPECTED TO BE (ALMOST) SINGULAR
AT THE MINIMUM, THEN RNK1MIN IS PREFERRED;
KEYWORDS:
OPTIMIZATION,
HIGHER - DIMENSIONAL,
UNCONSTRAINED,
VARIABLE METRIC METHOD.
1SECTION : 5.1.2.2.3 (DECEMBER 1975) PAGE 2
SUBSECTION: RNK1MIN.
CALLING SEQUENCE:
THE HEADING OF THIS PROCEDURE IS:
"REAL" "PROCEDURE" RNK1MIN(N, X, G, H, FUNCT, IN, OUT);
"VALUE" N; "INTEGER" N;
"ARRAY" X, G, H, IN, OUT;
"REAL" "PROCEDURE" FUNCT;
"CODE" 34214;
RNK1MIN: DELIVERS THE CALCULATED LEAST VALUE OF THE GIVEN FUNCTION;
THE MEANING OF THE FORMAL PARAMETERS IS:
N: <ARITHMETIC EXPRESSION>;
THE NUMBER OF VARIABLES OF THE FUNCTION TO BE MINIMIZED;
X: <ARRAY IDENTIFIER>;
"ARRAY" X[1 : N];
THE INDEPENDENT VARIABLES;
ENTRY: AN APPROXIMATION OF A MINIMUM OF THE FUNCTION;
EXIT: THE CALCULATED MINIMUM OF THE FUNCTION;
G: <ARRAY IDENTIFIER>;
"ARRAY" G[1 : N];
EXIT: THE GRADIENT OF THE FUNCTION AT THE CALCULATED
MINIMUM;
H: <ARRAY IDENTIFIER>;
"ARRAY" H[1 : N * (N + 1) // 2];
THE UPPERTRIANGLE OF AN APPROXIMATION OF THE INVERSE
HESSIAN IS STORED COLUMNWISE IN H (I.E. THE I,J-TH ELEMENT=
H[ (J - 1) * J // 2 + I], 1 <= I<= J <= N );
IF IN[6] > 0 INITIALIZING OF H WILL BE DONE AUTOMATICALLY
AND THE INITIAL APPROXIMATION OF THE INVERSE HESSIAN WILL
EQUAL THE UNITMATRIX MULTIPLIED WITH THE VALUE OF IN[6];
IF IN[6] < 0 NO INITIALIZING OF H WILL BE DONE AND THE USER
SHOULD GIVE IN H AN APPROXIMATION OF THE INVERSE HESSIAN,
AT THE STARTING POINT;THE UPPERTRIANGLE OF AN APPROXIMATION
OF THE INVERSE HESSIAN AT THE CALCULATED MINIMUM IS
DELIVERED IN H;
FUNCT: <PROCEDURE IDENTIFIER>;
THE HEADING OF THIS PROCEDURE SHOULD BE:
"REAL" "PROCEDURE" FUNCT(N, X, G); "VALUE" N;
"INTEGER" N; "ARRAY" X, G;
A CALL OF FUNCT MUST EFFECTUATE IN:
1: FUNCT BECOMES THE VALUE OF THE FUNCTION TO BE MINIMIZED
AT THE POINT X;
2: THE VALUE OF G[I], (I = 1, ..., N), BECOMES THE VALUE
OF THE I - TH COMPONENT OF THE GRADIENT OF THE FUNCTION
AT X;
1SECTION : 5.1.2.2.3 (DECEMBER 1975) PAGE 3
IN: <ARRAY IDENTIFIER>;
"ARRAY" IN[0 : 8];
ENTRY:
IN[0]: THE MACHINE PRECISION;
FOR THE CYBER 73-26 A SUITABLE VALUE IS "-14;
IN[1]: THE RELATIVE TOLERANCE FOR THE SOLUTION;
THIS TOLERANCE SHOULD NOT BE CHOSEN SMALLER THAN
IN[0];
IN[2]: THE ABSOLUTE TOLERANCE FOR THE SOLUTION;
IN[3]; A PARAMETER USED FOR CONTROLLING LINEMINIMIZATION,
([3], [4]); USUALLY A SUITABLE VALUE IS: 0.0001;
IN[4]: THE ABSOLUTE TOLERANCE FOR THE EUCLIDEAN NORM OF
THE GRADIENT AT THE SOLUTION;
IN[5]: A LOWERBOUND FOR THE FUNCTIONVALUE;
IN[6]: THIS PARAMETER CONTROLS THE INITIALIZATION OF THE
APPROXIMATION OF THE INVERSE HESSIAN (METRIC),
SEE H; USUALLY THE CHOICE IN[6] = 1 WILL GIVE GOOD
RESULTS;
IN[7]: THE MAXIMUM ALLOWED NUMBER OF CALLS OF FUNCT;
IN[8]: A PARAMETER USED FOR CONTROLLING THE UPDATING OF
THE METRIC; IT IS USED TO AVOID UNBOUNDEDNESS OF
THE METRIC (SEE: [6], FORMULA (19));
THE VALUE OF IN[8] SHOULD SATISFY:
SQRT(IN[0] / IN[1]) / N < IN[8] < 1;
USUALLY A SUITABLE VALUE WILL BE 0.01;
OUT: <ARRAY IDENTIFIER>;
"ARRAY" OUT[0:4];
EXIT:
OUT[0]: THE EUCLIDEAN NORM OF THE PRODUCT OF THE METRIC AND
THE GRADIENT AT THE CALCULATED MINIMUM;
OUT[1]: THE EUCLIDEAN NORM OF THE GRADIENT AT THE
CALCULATED MINIMUM;
OUT[2]: THE NUMBER OF CALLS OF FUNCT, NECESSARY TO ATTAIN
THIS RESULT;
OUT[3]: THE NUMBER OF ITERATIONS IN WHICH A LINESEARCH WAS
NECESSARY;
OUT[4]: THE NUMBER OF ITERATIONS IN WHICH A DIRECTION HAD
TO BE CALCULATED WITH THE METHOD GIVEN IN [5];
IN SUCH AN ITERATION A CALCULATION OF THE
EIGENVALUES AND EIGENVECTORS OF THE METRIC IS
NECESSARY.
DATA AND RESULTS:
USUALLY THE CALCULATED SOLUTION WILL SATISFY:
NORM ( XMIN - XCAL ) < NORM ( XCAL ) * IN[1] + IN[2].
WHERE AT XMIN THE GIVEN FUNCTION IS MINIMAL, XCAL THE CALCULATED
APPROXIMATION OF XMIN AND NORM( . ) DENOTES THE EUCLIDEAN NORM
OF X; HOWEVER, WE CANNOT GUARANTEE SUCH A RESULT; THE CALCULATED
SOLUTION POSSIBLY WILL NOT SATISFY THE ABOVE INEQUALITY IF THE
PROBLEM IS VERY ILL - CONDITIONED; THE USER CAN DISCOVER SUCH A
SITUATION BY LOOKING AT THE EUCLIDEAN NORM OF THE METRIC, DELIVERED
IN H; THE PROBLEM IS ILL - CONDITIONED IF THIS NORM IS LARGE
RELATIVE TO 1.
1SECTION : 5.1.2.2.3 (DECEMBER 1975) PAGE 4
PROCEDURES USED:
VECVEC = CP34010,
MATVEC = CP34011,
TAMVEC = CP34012,
SYMMATVEC = CP34018,
INIVEC = CP31010,
INISYMD = CP31013,
MULVEC = CP31020,
DUPVEC = CP31030,
EIGSYM1 = CP34156,
LINEMIN = CP34210,
RNK1UPD = CP34211,
DAVUPD = CP34212,
FLEUPD = CP34213.
REQUIRED CENTRAL MEMORY:
EXECUTION FIELD LENGTH: VARIES FROM 5 * N + 26 TO
N ** 2 + N * (N + 1) // 2 + 5 * N + 35 WORDS.
RUNNING TIME:
DEPENDS STRONGLY ON THE PROBLEM TO BE SOLVED;
LANGUAGE: ALGOL 60.
METHOD AND PERFORMANCE:
RNK1MIN CALCULATES AN APPROXIMATION OF A MINIMUM OF A GIVEN
FUNCTION BY MEANS OF A VARIABLE METRIC METHOD; THE RANK - ONE
UPDATING FORMULA, USED IN THIS ALGORITHM IS GIVEN IN [6],
(FORMULA (4)); TO AVOID UNBOUNDEDNESS OF THE METRIC (SEE [8]),
SOMETIMES A RANK - TWO UPDATING FORMULA IS USED ([3],
FORMULAS (1) AND (5)); TO AVOID LINESEARCHES AS MUCH AS POSSIBLE A
STRATEGY GIVEN IN [4] IS USED; IF IN AN ITERATION THE FUNCTION IS
INCREASING IN THE DIRECTION GIVEN BY THE VARIABLE METRIC ALGORITHM,
BECAUSE THE METRIC IS NOT POSITIVE DEFINITE, THEN A METHOD GIVEN IN
[5] IS USED TO CALCULATE A NEW DIRECTION; THIS METHOD REQUIRES
THE CALCULATION OF THE EIGENVECTORS AND EIGENVALUES OF THE METRIC;
USUALLY,THE NUMBER OF TIMES SUCH A CALCULATION IS NECESSARY IS VERY
SMALL RELATIVE TO THE NUMBER OF ITERATIONS (AND OFTEN EQUALS ZERO);
IF THE NUMBER OF VARIABLES OF THE FUNCTION IS VERY LARGE AND THE
CALCULATION OF THE FUNCTION AND ITS GRADIENT IS RELATIVELY CHEAP
(THE NUMBER OF ARITHMETICAL OPERATIONS IS OF ORDER AT MOST N ** 2),
THEN THE USER IS ADVISED TO USE FLEMIN (CP32105);
A DETAILED DESCRIPTION OF THE ALGORITHM AND SOME RESULTS ABOUT ITS
CONVERGENCE IS GIVEN IN [1].
1SECTION : 5.1.2.2.3 (DECEMBER 1975) PAGE 5
SUBSECTION: FLEMIN.
CALLING SEQUENCE:
THE HEADING OF THIS PROCEDURE IS:
"REAL" "PROCEDURE" FLEMIN(N, X, G, H, FUNCT, IN, OUT);
"VALUE" N; "INTEGER" N;
"ARRAY" X, G, H, IN, OUT; "REAL" "PROCEDURE" FUNCT;
"CODE" 34215;
FLEMIN: DELIVERS THE CALCULATED LEAST VALUE OF THE GIVEN FUNCTION;
THE MEANING OF THE FORMAL PARAMETERS IS:
N: <ARITHMETIC EXPRESSION>;
THE NUMBER OF VARIABLES OF THE FUNCTION TO BE MINIMIZED;
X: <ARRAY IDENTIFIER>;
"ARRAY" X[1 : N];
THE INDEPENDENT VARIABLES;
ENTRY: AN APPROXIMATION OF A MINIMUM OF THE FUNCTION;
EXIT: THE CALCULATED MINIMUM OF THE FUNCTION;
G: <ARRAY IDENTIFIER>;
"ARRAY" G[1 : N];
EXIT: THE GRADIENT OF THE FUNCTION AT THE CALCULATED
MINIMUM;
H: <ARRAY IDENTIFIER>;
"ARRAY" H[1 : N * (N + 1) // 2];
THE UPPERTRIANGLE OF AN APPROXIMATION OF THE INVERSE
HESSIAN IS STORED COLUMNWISE IN H (I.E. THE I,J-TH ELEMENT=
H[ (J - 1) * J // 2 + I], 1 <= I <= J <= N);
IF IN[6] > 0 INITIALIZING OF H WILL BE DONE AUTOMATICALLY
AND THE INITIAL APPROXIMATION OF THE INVERSE HESSIAN WILL
EQUAL THE UNITMATRIX MULTIPLIED WITH THE VALUE OF IN[6]; IF
IN[6] < 0 NO INITIALIZING OF H WILL BE DONE AND THE USER
SHOULD GIVE IN H AN APPROXIMATION OF THE INVERSE HESSIAN
AT THE STARTING POINT;
THE UPPERTRIANGLE OF AN APPROXIMATION OF THE INVERSE
HESSIAN AT THE CALCULATED MINIMUM IS DELIVERED IN H;
FUNCT: <PROCEDURE IDENTIFIER>;
THE HEADING OF THIS PROCEDURE SHOULD BE :
"REAL" "PROCEDURE" FUNCT(N, X, G); "VALUE" N;
"INTEGER" N; "ARRAY" X, G;
A CALL OF FUNCT SHOULD EFFECTUATE IN:
1: FUNCT BECOMES THE VALUE OF THE FUNCTION TO BE MINIMIZED
AT THE POINT X;
2: THE VALUE OF G[I], (I = 1, ..., N), BECOMES THE VALUE
OF THE I - TH COMPONENT OF THE GRADIENT OF THE FUNCTION
AT X;
1SECTION : 5.1.2.2.3 (DECEMBER 1975) PAGE 6
IN: <ARRAY IDENTIFIER>;
"ARRAY" IN[1 : 7];
ENTRY:
IN[1]: THE RELATIVE TOLERANCE FOR THE SOLUTION;
IN[2]: THE ABSOLUTE TOLERANCE FOR THE SOLUTION;
IN[3]: A PARAMETER USED FOR CONTROLLING LINEMINIMIZATION
([3], [4]); USUALLY A SUITABLE VALUE IS 0.0001;
IN[4]: THE ABSOLUTE TOLERANCE FOR THE EUCLIDEAN NORM OF
THE GRADIENT AT THE SOLUTION;
IN[5]: A LOWERBOUND FOR THE FUNCTION VALUE;
IN[6]: THIS PARAMETER CONTROLS THE INITIALIZATION OF THE
APPROXIMATION OF THE INVERSE HESSIAN (METRIC) (SEE
H); USUALLY IN[6] = 1 WILL GIVE GOOD RESULTS;
IN[7]: THE MAXIMUM ALLOWED NUMBER OF CALLS OF FUNCT;
OUT: <ARRAY IDENTIFIER>;
"ARRAY" OUT[0:4];
EXIT:
OUT[0]: THE EUCLIDEAN NORM OF THE PRODUCT OF THE METRIC AND
THE GRADIENT AT THE CALCULATED MINIMUM;
OUT[1]: THE EUCLIDEAN NORM OF THE GRADIENT AT THE
CALCULATED MINIMUM;
OUT[2]: THE NUMBER OF CALLS OF FUNCT, NECESSARY TO ATTAIN
THESE RESULTS;
OUT[3]: THE NUMBER OF ITERATIONS IN WHICH A LINESEARCH WAS
NECESSARY;
OUT[4]: IF OUT[4] = - 1, THEN THE PROCESS IS BROKEN OFF
BECAUSE NO DOWNHILL DIRECTION COULD BE CALCULATED;
THE PRECISION ASKED FOR MAY NOT BE ATTAINED AND IS
POSSIBLY CHOSEN TOO HIGH;
NORMALLY OUT[4] = 0;
DATA AND RESULTS:
USUALLY THE CALCULATED SOLUTION WILL SATISFY:
NORM ( XMIN - XCAL ) < NORM ( XCAL ) * IN[1] + IN[2].
WHERE AT XMIN THE GIVEN FUNCTION IS MINIMAL, XCAL THE CALCULATED
APPROXIMATION OF XMIN AND NORM ( . ) DENOTES THE EUCLIDEAN NORM
OF X; HOWEVER, WE CAN NOT GUARANTEE SUCH A RESULT; THE CALCULATED
SOLUTION POSSIBLY WILL NOT SATISFY THE ABOVE INEQUALITY IF THE
PROBLEM IS VERY ILL - CONDITIONED; THE USER CAN DISCOVER SUCH A
SITUATION BY LOOKING AT THE EUCLIDEAN NORM OF THE METRIC, DELIVERED
IN H; THE PROBLEM IS ILL - CONDITIONED IF THIS NORM IS LARGE
RELATIVE TO 1.
1SECTION : 5.1.2.2.3 (DECEMBER 1975) PAGE 7
PROCEDURES USED:
VECVEC = CP34010,
ELMVEC = CP34020,
SYMMATVEC = CP34018,
INIVEC = CP31010,
INISYMD = CP31013,
MULVEC = CP31020,
DUPVEC = CP31030,
LINEMIN = CP34210,
DAVUPD = CP34212,
FLEUPD = CP34213.
REQUIRED CENTRAL MEMORY:
EXECUTION FIELD LENGTH: 3 * N + 19 WORDS.
RUNNING TIME:
DEPENDS STRONGLY ON THE PROBLEM TO BE SOLVED;
LANGUAGE: ALGOL 60.
METHOD AND PERFORMANCE:
FLEMIN CALCULATES AN APPROXIMATION OF A MINIMUM OF A GIVEN FUNCTION
BY MEANS OF THE VARIABLE METRIC ALGORITHM GIVEN IN [3], EXCEPT FOR
SOME DETAILS (SEE [1]).
REFERENCES:
[1] BUS, J. C. P.
MINIMIZATION OF FUNCTIONS OF SEVERAL VARIABLES (DUTCH).
MATHEMATICAL CENTRE, AMSTERDAM, NR 29/72 (1972).
[2] DAVIDON, W. C.
VARIABLE METRIC METHOD FOR MINIMIZATION.
ARGONNE NAT. LAB. REPORT, ANL 5990 (1959).
[3] FLETCHER, R.
A NEW APPROACH TO VARIABLE METRIC ALGORITHMS.
COMP. J. 6, (1963), P.163 - 168.
[4] GOLDSTEIN, A. A. AND PRICE, J. F.
AN EFFECTIVE ALGORITHM FOR MINIMIZATION.
NUMER. MATH. 10, (1967), P.184 - 189.
[5] GREENSTADT, J. L.
ON THE RELATIVE EFFICIENCIES OF GRADIENT METHODS.
MATH. COMP. 21, (1967), P.360 - 367.
[6] POWELL, M. J. D.
RANK ONE METHODS FOR UNCONSTRAINED OPTIMIZATION.
IN: ABADIE, J. (ED.)
INTEGER AND NONLINEAR PROGRAMMING.
NORTH - HOLLAND, (1970).
1SECTION : 5.1.2.2.3 (DECEMBER 1975) PAGE 8
EXAMPLE OF USE:
THE MINIMUM OF THE FUNCTION:
F(X) = (X[2] - X[1] ** 2) ** 2 * 100 + (1 - X[1]) ** 2,
CALCULATED WITH BOTH RNK1MIN AND FLEMIN MAY BE OBTAINED BY THE
FOLLOWING PROGRAM:
"BEGIN"
"REAL" "PROCEDURE" ROSENBROCK(N, X, G); "VALUE" N;
"INTEGER" N; "ARRAY" X, G;
"BEGIN" ROSENBROCK:= (X[2] - X[1] ** 2) ** 2 * 100
+ (1 - X[1]) ** 2;
G[1]:= ((X[1] ** 2 - X[2]) * 400 + 2) * X[1] - 2;
G[2]:=(X[2] - X[1] ** 2) * 200
"END" ROSENBROCK;
"INTEGER" I; "BOOLEAN" AGAIN; "REAL" F;
"ARRAY" X, G[1:2], H[1:3], IN[0:8], OUT[0:4];
IN[0]:= "-14; IN[1]:= "-5; IN[2]:= "-5; IN[3]:= "-4;
IN[4]:= "-5; IN[5]:= -10; IN[6]:= 1; IN[7]:= 100; IN[8]:= 0.01;
X[1]:= -1.2; X[2]:= 1; AGAIN:= "TRUE";
F:= RNK1MIN(2, X, G, H, ROSENBROCK, IN, OUT);
"GOTO" PRINT;
NEXT: X[1]:= -1.2; X[2]:= 1; AGAIN:= "FALSE";
F:= FLEMIN(2, X, G, H, ROSENBROCK, IN, OUT);
PRINT: OUTPUT(61, "(""("LEAST VALUE:")"B+.15D"+3D,//, "("X:")",
2(B+.15D"+3DB),//,"("GRADIENT:")", 2(B+.15D"+3DB),//, "("METRIC:")"
,2(B+.15D"+3DB),/,32B+.15D"+3D,//,"("OUT:")", 5(B+.15D"+3DB,/),///
")",F, X[1], X[2], G[1], G[2], H[1], H[2], H[3], OUT[0], OUT[1],
OUT[2], OUT[3], OUT[4]);
"IF" AGAIN "THEN" "GOTO" NEXT
"END"
DELIVERS:
1SECTION : 5.1.2.2.3 (DECEMBER 1975) PAGE 9
LEAST VALUE: +.200699798801180"-018
X: +.999999999944840"+000 +.999999999845220"+000
GRADIENT: +.176731305145950"-007 -.889173179530190"-008
METRIC: +.499982414863250"+000 +.999957383810230"+000
+.200489757679290"+001
OUT: +.164157123774660"-009
+.197838933606480"-007
+.550000000000000"+002
+.800000000000000"+001
+.400000000000000"+001
LEAST VALUE: +.811973499921290"-016
X: +.999999999758770"+000 +.999999998616780"+000
GRADIENT: +.359826657359010"-006 -.180154557938290"-006
METRIC: +.501085356975550"+000 +.100198139199600"+001
+.200861655543510"+001
OUT: +.133802289387830"-008
+.402406371833370"-006
+.440000000000000"+002
+.700000000000000"+001
+.000000000000000"+000
1SECTION : 5.1.2.2.3 (DECEMBER 1975) PAGE 10
SOURCE TEXT(S):
0"CODE" 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];
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 "OR" DG > TOLG "OR" ^ OK) "AND" 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"
1SECTION : 5.1.2.2.3 (DECEMBER 1975) PAGE 11
;
"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 "OR" 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
1SECTION : 5.1.2.2.3 (DECEMBER 1975) PAGE 12
;
"EOP"
0"CODE" 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];
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);"COMMENT"
1SECTION : 5.1.2.2.3 (DECEMBER 1975) PAGE 13
;
"FOR" IT := IT +1 "WHILE"
(NRMDELTA > EPS "OR" DG > TOLG ) "AND" 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 "OR" 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;
"EOP"
1SECTION : 5.1.3.1.3 (DECEMBER 1975) PAGE 1
AUTHORS: J.C.P. BUS, B. VAN DOMSELAAR, J. KOK.
CONTRIBUTORS: B. VAN DOMSELAAR, J. KOK.
INSTITUTE: MATHEMATICAL CENTRE.
RECEIVED: 741101.
BRIEF DESCRIPTION:
THIS SECTION CONTAINS TWO PROCEDURES;
MARQUARDT CALCULATES THE LEAST SQUARES SOLUTION OF AN
OVERDETERMINED SYSTEM OF NONLINEAR EQUATIONS WITH MARQUARDT'S
METHOD;
GSSNEWTON CALCULATES THE LEAST SQUARES SOLUTION OF AN
OVERDETERMINED SYSTEM OF NONLINEAR EQUATIONS WITH THE GAUSS-NEWTON
METHOD;
THE USER HAS TO PROGRAM THE EVALUATION OF THE RESIDUAL VECTOR OF
THE SYSTEM AND THE JACOBIAN MATRIX OF ITS PARTIAL DERIVATIVES.
KEYWORDS:
NONLINEAR EQUATIONS,
LEAST SQUARES SOLUTION,
OVERDETERMINED SYSTEM,
MARQUARDT'S METHOD,
GAUSS-NEWTON METHOD,
CURVE FITTING.
1SECTION : 5.1.3.1.3 (DECEMBER 1975) PAGE 2
SUBSECTION: MARQUARDT.
CALLING SEQUENCE:
THE HEADING OF THIS PROCEDURE IS:
"PROCEDURE" MARQUARDT(M, N, PAR, RV, JJINV, FUNCT, JACOBIAN, IN,
OUT); "VALUE" M, N; "INTEGER" M, N;
"ARRAY" PAR, RV, JJINV, IN, OUT; "BOOLEAN" "PROCEDURE" FUNCT;
"PROCEDURE" JACOBIAN;
"CODE" 34440;
THE MEANING OF THE FORMAL PARAMETERS IS:
M: <ARITHMETIC EXPRESSION>;
THE NUMBER OF EQUATIONS;
N: <ARITHMETIC EXPRESSION>;
THE NUMBER OF UNKNOWN VARIABLES; N SHOULD SATISFY N<=M;
PAR: <ARRAY IDENTIFIER>;
"ARRAY" PAR[1 : N];
THE UNKNOWN VARIABLES OF THE SYSTEM;
ENTRY: AN APPROXIMATION TO A LEAST SQUARES SOLUTION
OF THE SYSTEM;
EXIT: THE CALCULATED LEAST SQUARES SOLUTION;
RV: <ARRAY IDENTIFIER>;
"ARRAY" RV[1 : M];
EXIT: THE RESIDUAL VECTOR AT THE CALCULATED SOLUTION;
JJINV: <ARRAY IDENTIFIER>;
"ARRAY" JJINV[1 : N, 1 : N];
EXIT: THE INVERSE OF THE MATRIX J' * J WHERE J DENOTES
THE MATRIX OF PARTIAL DERIVATIVES DRV[I] / DPAR[J]
(I=1,...,M; J=1,...,N) AND J' DENOTES THE
TRANSPOSE OF J.
FUNCT: <PROCEDURE IDENTIFIER>;
THE HEADING OF THIS PROCEDURE SHOULD BE:
"BOOLEAN" "PROCEDURE" FUNCT(M, N, PAR, RV); "VALUE" M, N;
"INTEGER" M, N; "ARRAY" PAR, RV;
ENTRY: M, N, PAR;
M, N HAVE THE SAME MEANING AS IN THE PROCEDURE
MARQUARDT;
"ARRAY" PAR[1:N] CONTAINS THE CURRENT VALUES OF
THE UNKNOWNS AND SHOULD NOT BE ALTERED;
EXIT: "ARRAY" RV[1 : M];
UPON COMPLETION OF A CALL OF FUNCT, THIS ARRAY RV
SHOULD CONTAIN THE RESIDUAL VECTOR, OBTAINED WITH
THE CURRENT VALUES OF THE UNKNOWNS;
E.G. IN CURVE FITTING PROBLEMS:
RV[I] := THEORETICAL VALUE F(X[I], PAR) -
OBSERVED VALUE Y[I];
AFTER A SUCCESSFUL CALL OF FUNCT, THE BOOLEAN PROCEDURE
SHOULD DELIVER THE VALUE TRUE;
HOWEVER, IF FUNCT DELIVERS THE VALUE FALSE, THEN IT IS
ASSUMED THAT THE CURRENT ESTIMATES OF THE UNKNOWNS LIE
OUTSIDE A FEASIBLE REGION AND THE PROCESS IS TERMINATED
(SEE OUT[1]);
1SECTION : 5.1.3.1.3 (DECEMBER 1975) PAGE 3
HENCE, PROPER PROGRAMMING OF FUNCT MAKES IT POSSIBLE TO
AVOID CALCULATION OF A RESIDUAL VECTOR WITH VALUES OF THE
UNKNOWN VARIABLES WHICH MAKE NO SENSE OR WHICH EVEN MAY
CAUSE OVERFLOW IN THE COMPUTATION;
JACOBIAN: <PROCEDURE IDENTIFIER>;
THE HEADING OF THIS PROCEDURE SHOULD BE:
"PROCEDURE" JACOBIAN(M, N, PAR, RV, JAC, LOCFUNCT);
"VALUE" M, N; "INTEGER" M, N; "ARRAY" PAR, RV, JAC;
"PROCEDURE" LOCFUNCT;
ENTRY: M, N, PAR, RV, LOCFUNCT;
FOR M,N,PAR SEE: FUNCT;
RV CONTAINS THE RESIDUAL VECTOR OBTAINED WITH THE
CURRENT VALUES OF THE UNKNOWNS AND SHOULD NOT BE
ALTERED;
A CALL OF LOCFUNCT(M,N,PAR,RV) IS EQUIVALENT WITH
A CALL OF THE USER-DEFINED PROCEDURE
FUNCT(M,N,PAR,RV), BUT, IN ADDITION, THIS CALL IS
COUNTED TO THE TOTAL NUMBER OF CALLS OF FUNCT
(SEE OUT[4]) AND, MOREOVER, IF FUNCT DELIVERS THE
VALUE FALSE THEN THE PROCESS IS TERMINATED;
EXIT: "ARRAY" JAC[1 : M, 1 : N];
UPON COMPLETION OF A CALL OF JACOBIAN, JAC SHOULD
CONTAIN THE PARTIAL DERIVATIVES DRV[I] / DPAR[J],
OBTAINED WITH THE CURRENT VALUES OF THE UNKNOWN
VARIABLES GIVEN IN PAR[1:N];
IT IS A PREREQUISITE FOR THE PROPER OPERATION OF THE
PROCEDURE MARQUARDT THAT THE PRECISION OF THE ELEMENTS OF
THE MATRIX JAC IS AT LEAST THE PRECISION DEFINED BY
IN[3] AND IN[4];
IN: <ARRAY IDENTIFIER>;
"ARRAY" IN[0 : 6];
ENTRY: IN THIS ARRAY THE USER SHOULD GIVE SOME DATA TO
CONTROL THE PROCESS;
IN[0]: THE MACHINE PRECISION;
FOR THE CYBER 73 A SUITABLE VALUE IS "-14;
IN[1], IN[2] ARE NOT USED BY THE PROCEDURE MARQUARDT;
IN[3], IN[4]:
THE RELATIVE AND ABSOLUTE TOLERANCE FOR THE
DIFFERENCE BETWEEN THE EUCLIDEAN NORM OF THE
ULTIMATE AND PENULTIMATE RESIDUAL VECTOR;
THE PROCESS IS TERMINATED IF THE IMPROVEMENT OF
THE SUM OF SQUARES IS LESS THAN
IN[3] * (SUM OF SQUARES) + IN[4] * IN[4];
THESE TOLERANCES SHOULD BE CHOSEN GREATER THAN
THE CORRESPONDING ERRORS OF THE CALCULATED
RESIDUAL VECTOR;
NOTE THAT THE EUCLIDEAN NORM OF THE RESIDUAL
VECTOR IS DEFINED AS THE SQUARE ROOT OF THE SUM
OF SQUARES;
IN[5]: THE MAXIMUM NUMBER OF CALLS OF FUNCT ALLOWED;
1SECTION : 5.1.3.1.3 (DECEMBER 1975) PAGE 4
IN[6]: A STARTING VALUE USED FOR THE RELATION BETWEEN
THE GRADIENT AND THE GAUSS-NEWTON DIRECTION (SEE
[2]); IF THE PROBLEM IS WELL CONDITIONED THEN A
SUITABLE VALUE FOR IN[6] WILL BE 0.01; IF THE
PROBLEM IS ILL CONDITIONED THEN IN[6] SHOULD BE
GREATER, BUT THE VALUE OF IN[6] SHOULD SATISFY:
IN[0] < IN[6] <= 1/IN[0];
OUT: <ARRAY IDENTIFIER>; "ARRAY" OUT[1 : 7];
EXIT : IN ARRAY OUT SOME BY-PRODUCTS ARE DELIVERED;
OUT[1]: THIS VALUE GIVES INFORMATION ABOUT THE
TERMINATION OF THE PROCESS;
OUT[1]=0: NORMAL TERMINATION;
OUT[1]=1: THE PROCESS HAS BEEN BROKEN OFF,
BECAUSE THE NUMBER OF CALLS OF FUNCT
EXCEEDED THE NUMBER GIVEN IN IN[5];
OUT[1]=2: THE PROCESS HAS BEEN BROKEN OFF,
BECAUSE A CALL OF FUNCT DELIVERED THE
VALUE FALSE;
OUT[1]=3: FUNCT BECAME FALSE WHEN CALLED WITH
THE INITIAL ESTIMATES OF PAR[1:N];
THE ITERATION PROCESS WAS NOT STARTED
AND SO JJINV[1:N,1:N] CAN NOT BE USED;
OUT[1]=4: THE PROCESS HAS BEEN BROKEN OFF,
BECAUSE THE PRECISION ASKED FOR CAN
NOT BE ATTAINED; THIS PRECISION IS
POSSIBLY CHOSEN TOO HIGH, RELATIVE TO
THE PRECISION IN WHICH THE RESIDUAL
VECTOR IS CALCULATED (SEE IN[3]);
OUT[2]: THE EUCLIDEAN NORM OF THE RESIDUAL VECTOR
CALCULATED WITH VALUES OF THE UNKNOWNS DELIVERED;
OUT[3]: THE EUCLIDEAN NORM OF THE RESIDUAL VECTOR
CALCULATED WITH THE INITIAL VALUES OF THE
UNKNOWN VARIABLES;
OUT[4]: THE NUMBER OF CALLS OF FUNCT NECESSARY TO OBTAIN
THE CALCULATED RESULT;
OUT[5]: THE TOTAL NUMBER OF ITERATIONS PERFORMED; NOTE
THAT IN EACH ITERATION ONE EVALUATION OF THE
JACOBIAN MATRIX HAD TO BE MADE;
OUT[6]: THE IMPROVEMENT OF THE EUCLIDEAN NORM OF THE
RESIDUAL VECTOR IN THE LAST ITERATION STEP;
OUT[7]: THE CONDITION NUMBER OF J' * J , I.E. THE RATIO
OF ITS LARGEST TO SMALLEST EIGENVALUES;
DATA AND RESULTS:
IF THIS PROCEDURE IS USED FOR CURVE FITTING THEN THE RELATIVE
ACCURACY IN THE CALCULATION OF THE RESIDUAL VECTOR DEPENDS STRONGLY
ON THE ERRORS IN THE EXPERIMENTAL DATA AND THIS SHOULD BE REFLECTED
IN THE PARAMETERS IN[3] AND IN[4];
THE MATRIX JJINV CAN BE USED IF SOME STATISTICAL INFORMATION
ABOUT THE FITTED PARAMETERS IS REQUIRED; THE STANDARD DEVIATION,
COVARIANCE MATRIX AND CORRELATION MATRIX MAY BE CALCULATED EASILY
FROM JJINV ;
1SECTION : 5.1.3.1.3 (DECEMBER 1975) PAGE 5
PROCEDURES USED:
MULCOL = CP31022,
DUPVEC = CP31030,
VECVEC = CP34010,
MATVEC = CP34011,
TAMVEC = CP34012,
MATTAM = CP34015,
QRISNGVALDEC = CP34273.
REQUIRED CENTRAL MEMORY:
EXECUTION FIELD LENGTH: ONE ARRAY OF LENGTH M * N AND FOUR
ARRAYS OF LENGTH N ARE DECLARED;
RUNNING TIME:
THE NUMBER OF ITERATION STEPS DEPENDS STRONGLY ON THE PROBLEM TO BE
SOLVED; HOWEVER, THE WORK DONE EACH ITERATION STEP IS PROPORTIONAL
TO N CUBED;
LANGUAGE: ALGOL 60.
METHOD AND PERFORMANCE:
MARQUARDT USES MARQUARDT'S METHOD; FOR DETAILS SEE [2];
REFERENCES:
[1] D. W. MARQUARDT,
AN ALGORITHM FOR LEAST-SQUARES ESTIMATION OF NONLINEAR
PARAMETERS,
J. SIAM 11 (1963), PP.431-441.
[2] J. C. P. BUS, B. VAN DOMSELAAR, J. KOK,
NONLINEAR LEAST SQUARES ESTIMATION,
MATHEMATICAL CENTRE, AMSTERDAM. (TO APPEAR)
1SECTION : 5.1.3.1.3 (DECEMBER 1975) PAGE 6
EXAMPLE OF USE:
THE PARAMETERS PAR[1 : 3] IN THE CURVE FITTING PROBLEM:
RV[I] = PAR[1] + PAR[2] * EXP(PAR[3] * X[I]) - Y[I]
WITH (X[I], Y[I]), I=1,...,6 AS THE EXPERIMENTAL DATA, MAY BE
OBTAINED BY THE FOLLOWING PROGRAM:
"BEGIN"
"INTEGER" I;
"ARRAY" IN[0:6],OUT[0:7],X,Y,RV[1:6],JJINV[1:3,1:3],PAR[1:3];
"BOOLEAN" "PROCEDURE" EXPFUNCT(M,N,PAR,RV);
"VALUE" M,N; "INTEGER" M,N; "ARRAY" PAR,RV;
"BEGIN" "INTEGER" I;
"FOR" I:=1 "STEP" 1 "UNTIL" M "DO"
"BEGIN" "IF" PAR[3]*X[I]>680 "THEN"
"BEGIN" EXPFUNCT:="FALSE";
"GOTO" STOP
"END";
RV[I]:=PAR[1]+PAR[2]*EXP(PAR[3]*X[I])-Y[I]
"END"; EXPFUNCT:="TRUE";
STOP:
"END" EXPFUNCT;
"PROCEDURE" JACOBIAN(M,N,PAR,RV,JAC,LOCFUNCT);
"VALUE" M,N; "INTEGER" M,N; "ARRAY" PAR,RV,JAC;
"PROCEDURE" LOCFUNCT;
"BEGIN" "INTEGER" I; "REAL" EX;
"FOR" I:=1 "STEP" 1 "UNTIL" M "DO"
"BEGIN" JAC[I,1]:=1;
JAC[I,2]:=EX:=EXP(PAR[3]*X[I]);
JAC[I,3]:=X[I]*PAR[2]*EX
"END"
"END" JACOBIAN;
IN[0]:="-14; IN[3]:="-4; IN[4]:="-1; IN[5]:=75; IN[6]:="-2;
"FOR" I:=1 "STEP" 1 "UNTIL" 6 "DO"
"BEGIN" INREAL(70,X[I]); INREAL(70,Y[I]) "END";
PAR[1]:=580; PAR[2]:=-180; PAR[3]:=-0.160;
MARQUARDT(6,3,PAR,RV,JJINV,EXPFUNCT,JACOBIAN,IN,OUT);
OUTPUT(61,"("3/,"("X[I] Y[I]")",/,6(B,+D,5B,3D.D,/),2/,
"("PARAMETERS")",/,3(+D.3D"+ZD,/),2/,"("OUT:")",/,7(5B+D.6D"+ZD,
/),2/,"("LAST RESIDUAL VECTOR")",/,6(6B+3Z.D,/)")",X[1],Y[1],
X[2],Y[2],X[3],Y[3],X[4],Y[4],X[5],Y[5],X[6],Y[6],PAR[1],PAR[2],
PAR[3],OUT[7],OUT[2],OUT[6],OUT[3],OUT[4],OUT[5],OUT[1],RV[1],
RV[2],RV[3],RV[4],RV[5],RV[6])
"END"
1SECTION : 5.1.3.1.3 (DECEMBER 1975) PAGE 7
WITH THE DATA GIVEN IN THE X - Y - TABLE THIS PROGRAM DELIVERS:
X[I] Y[I]
-5 127.0
-3 151.0
-1 379.0
+1 421.0
+3 460.0
+5 426.0
PARAMETERS
+5.232" +2
-1.568" +2
-1.998" -1
OUT:
+7.220828" +7
+1.157156" +2
+1.728008" -3
+1.654588" +2
+2.300000" +1
+2.200000" +1
+0.000000" +0
LAST RESIDUAL VECTOR
-29.6
+86.6
-47.3
-26.2
-22.9
+39.5
1SECTION : 5.1.3.1.3 (DECEMBER 1975) PAGE 8
SUBSECTION : GSSNEWTON.
CALLING SEQUENCE :
THE HEADING OF THE PROCEDURE READS :
"PROCEDURE" GSSNEWTON(M, N, PAR, RV, JJINV, FUNCT, JACOBIAN, IN,
OUT);
"VALUE" M, N; "INTEGER" M, N; "ARRAY" PAR, RV, JJINV, IN, OUT;
"BOOLEAN""PROCEDURE" FUNCT; "PROCEDURE" JACOBIAN;
"CODE" 34441;
THE MEANING OF THE FORMAL PARAMETERS IS :
M : <ARITHMETIC EXPRESSION>;
THE NUMBER OF EQUATIONS;
N : <ARITHMETIC EXPRESSION>;
THE NUMBER OF UNKNOWNS IN THE M EQUATIONS (N <= M);
PAR : <ARRAY IDENTIFIER>; "ARRAY" PAR[1 : N];
THE UNKNOWNS OF THE EQUATIONS.
ENTRY : AN APPROXIMATION TO A LEAST SQUARES SOLUTION
OF THE SYSTEM.
EXIT : THE CALULATED LEAST SQUARES SOLUTION;
RV : <ARRAY IDENTIFIER>; "ARRAY" RV[1 : M];
EXIT : THE RESIDUAL VECTOR OF THE SYSTEM AT THE
CALCULATED SOLUTION;
JJINV : <ARRAY IDENTIFIER>; "ARRAY" JJINV[1 : N,1 : N];
EXIT : THE INVERSE OF THE MATRIX J' * J, WHERE J
IS THE JACOBIAN MATRIX AT THE SOLUTION AND J' IS
J TRANSPOSED;
FUNCT : <PROCEDURE IDENTIFIER>;
THE HEADING OF THIS PROCEDURE SHOULD BE :
"BOOLEAN""PROCEDURE" FUNCT(M, N, PAR, RV); "VALUE" M,
N; "INTEGER" M, N; "ARRAY" PAR, RV;
ENTRY: M, N, PAR;
M, N HAVE THE SAME MEANING AS IN THE PROCEDURE
GSSNEWTON;
"ARRAY" PAR[1:N] CONTAINS THE CURRENT VALUES OF
THE UNKNOWNS AND SHOULD NOT BE ALTERED.
EXIT: "ARRAY" RV[1 : M];
UPON COMPLETION OF A CALL OF FUNCT, THIS ARRAY RV
SHOULD CONTAIN THE RESIDUAL VECTOR, OBTAINED WITH
THE CURRENT VALUES OF THE UNKNOWNS.
THE PROGRAMMER OF FUNCT MAY DECIDE THAT SOME CURRENT
ESTIMATES OF THE UNKNOWNS LIE OUTSIDE A FEASIBLE
REGION; IN THIS CASE FUNCT SHOULD DELIVER THE VALUE
FALSE AND THE PROCESS IS TERMINATED (SEE OUT[1]).
OTHERWISE FUNCT SHOULD DELIVER THE VALUE TRUE;
1SECTION : 5.1.3.1.3 (DECEMBER 1975) PAGE 9
JACOBIAN : <PROCEDURE IDENTIFIER>;
THE HEADING OF THIS PROCEDURE SHOULD BE :
"PROCEDURE" JACOBIAN(M, N, PAR, RV, JAC, LOCFUNCT);
"VALUE" M, N; "INTEGER" M, N; "ARRAY" PAR, RV, JAC;
"PROCEDURE" LOCFUNCT;
THE MEANING OF THE PARAMETERS OF JACOBIAN IS :
M, N : SEE GSSNEWTON.
PAR : <ARRAY IDENTIFIER>; "ARRAY" PAR[1 : N];
ENTRY : CURRENT ESTIMATES OF THE UNKNOWNS.
THESE VALUES SHOULD NOT BE CHANGED.
RV : <ARRAY IDENTIFIER>; "ARRAY" RV[1 : M];
ENTRY : THE RESIDUAL VECTOR OF THE SYSTEM OF
EQUATIONS CORRESPONDING TO THE VECTOR OF UNKNOWNS
AS GIVEN IN PAR.
EXIT : THE ENTRY VALUES.
JAC : <ARRAY IDENTIFIER>; "ARRAY" JAC[1 : M, 1 : N];
EXIT : THE JACOBIAN MATRIX AT THE CURRENT
ESTIMATES GIVEN IN PAR, I.E. THE MATRIX OF PARTIAL
DERIVATIVES
D(RV)[I] / DPAR[J], I = 1(1)M, J = 1(1)N.
LOCFUNCT : <PROCEDURE IDENTIFIER>; THE HEADING OF THIS
PROCEDURE IS THE SAME AS THE HEADING OF FUNCT.
A CALL OF THE PROCEDURE JACOBIAN SHOULD DELIVER THE
JACOBIAN MATRIX EVALUATED WITH THE CURRENT ESTIMATES
OF THE UNKNOWN VARIABLES GIVEN IN PAR
IN SUCH A WAY, THAT THE PARTIAL DERIVATIVE
D(RV)[I] / DPAR[J] IS DELIVERED IN JAC[I,J], I = 1(1)M,
J = 1(1)N.
FOR THE CALCULATION OF THE DERIVATIVES ONE CAN USE THE
VALUES OF THE CURRENT ESTIMATES OF THE
UNKNOWNS AS GIVEN IN PAR AND THE RESIDUAL VECTOR AS
GIVEN IN RV.
ONE CAN ALSO USE THE PROCEDURE FUNCT
(PARAMETER OF GSSNEWTON) THROUGH CALLS OF THE PROCEDURE
LOCFUNCT (PARAMETER OF JACOBIAN). THIS PARAMETER OF
JACOBIAN MAY BE USED WHEN THE JACOBIAN MATRIX IS
APPROXIMATED USING (FORWARD) DIFFERENCES.
AN APPROPRIATE PROCEDURE TO THIS PURPOSE IS JACOBNMF
(SECTION 4.3.2.1). SUCH A PROCEDURE MAY BE USED ONLY IF
THE MATRIX ELEMENTS ARE COMPUTED SUFFICIENTLY ACCURATE;
IN : <ARRAY IDENTIFIER>; "ARRAY" IN[0 : 7];
IN THIS ARRAY TOLERANCES AND CONTROL PARAMETERS SHOULD
BE GIVEN.
ENTRY :
IN[0] : THE MACHINE PRECISION. FOR CALCULATION ON THE
CYBER 73 A SUITABLE VALUE IS "-14.
1SECTION : 5.1.3.1.3 (DECEMBER 1975) PAGE 10
IN[1], IN[2] :
RELATIVE AND ABSOLUTE TOLERANCE FOR THE STEP VECTOR
(RELATIVE TO THE VECTOR OF CURRENT ESTIMATES IN
PAR).
THE PROCESS IS TERMINATED IF IN SOME ITERATION (BUT
NOT THE FIRST) THE EUCLIDEAN NORM OF THE CALCULATED
NEWTON STEP IS LESS THAN IN[1] * NORM(PAR) + IN[2].
IN[1] SHOULD NOT BE CHOSEN SMALLER THAN IN[0].
IN[3] IS NOT USED BY THE PROCEDURE GSSNEWTON;
IN[4] : ABSOLUTE TOLERANCE FOR THE EUCLIDEAN NORM OF
THE RESIDUAL VECTOR. THE PROCESS IS TERMINATED WHEN
THIS NORM IS LESS THAN IN[4].
IN[5] : THE MAXIMUM ALLOWED NUMBER OF FUNCTION
EVALUATIONS (I.E. CALLS OF FUNCT).
IN[6] : THE MAXIMUM ALLOWED NUMBER OF HALVINGS OF A
CALCULATED NEWTON STEP VECTOR (SEE METHOD AND
PERFORMANCE). A SUITABLE VALUE IS 15.
IN[7] : THE MAXIMUM ALLOWED NUMBER OF SUCCESSIVE IN[6]
TIMES HALVED STEP VECTORS. SUITABLE VALUES ARE 1
AND 2;
OUT : <ARRAY IDENTIFIER>; "ARRAY" OUT[1 : 9];
IN ARRAY OUT INFORMATION ABOUT THE TERMINATION OF THE
PROCESS IS DELIVERED.
EXIT :
OUT[1] :
THE PROCESS WAS TERMINATED BECAUSE (OUT[1] = )
1.THE NORM OF THE RESIDUAL VECTOR IS SMALL WITH
RESPECT TO IN[4],
2.THE CALCULATED NEWTON STEP IS SUFFICIENTLY SMALL
(SEE IN[1], IN[2]),
3.THE CALCULATED STEP WAS COMPLETELY DAMPED (HALVED)
IN IN[7] SUCCESSIVE ITERATIONS,
4.OUT[4] EXCEEDS IN[5], THE MAXIMUM ALLOWED NUMBER OF
CALLS OF FUNCT,
5.THE JACOBIAN WAS NOT FULL-RANK (SEE OUT[8]),
6.FUNCT DELIVERED FALSE AT A NEW VECTOR OF
ESTIMATES OF THE UNKNOWNS,
7.FUNCT DELIVERED FALSE IN A CALL FROM JACOBIAN.
OUT[2] : THE EUCLIDEAN NORM OF THE LAST RESIDUAL
VECTOR.
OUT[3] : THE EUCLIDEAN NORM OF THE INITIAL RESIDUAL
VECTOR.
OUT[4] : THE TOTAL NUMBER OF CALLS OF FUNCT.
OUT[4] WILL BE LESS THAN IN[5] + IN[6].
OUT[5] : THE TOTAL NUMBER OF ITERATIONS.
OUT[6] : THE EUCLIDEAN NORM OF THE LAST STEP VECTOR.
OUT[7] : ITERATION NUMBER OF THE LAST ITERATION IN
WHICH THE NEWTON STEP WAS HALVED.
OUT[8], OUT[9] :
RANK AND MAXIMUM COLUMN NORM OF THE JACOBIAN MATRIX
IN THE LAST ITERATION, AS DELIVERED BY LSQORTDEC
(SECTION 3.1.1.2.1.1) IN AUX[3] AND AUX[5].
1SECTION : 5.1.3.1.3 (DECEMBER 1975) PAGE 11
DATA AND RESULTS :
THE PROCEDURE GSSNEWTON CAN BE USED FOR APPROXIMATING AN EXACT OR A
LEAST SQUARES SOLUTION OF A SYSTEM OF NONLINEAR EQUATIONS. WHEN AN
EXACT SOLUTION IS REQUIRED, THE PROCEDURE MAY TERMINATE ONLY WITH
OUT[1] = 1, AND VERY SMALL VALUES SHOULD BE ASSIGNED TO IN[1] AND
IN[2]. WHEN A LEAST SQUARES SOLUTION IS REQUIRED, POSITIVE RESULTS
OF THE PROCEDURE ARE SIGNALED BY OUT[1] = 1 OR 2. WHENEVER THE
PROCEDURE TERMINATES WITH OUT[1] < 5, THEN THE INVERSE OF J' * J
(SEE MEANING OF THE PARAMETER JJINV) IS DELIVERED IN JJINV. IN
THAT CASE THE COVARIANCE MATRIX AND THE STANDARD DEVIATIONS OF THE
SOLUTION CAN BE CALCULATED.
FOR A CURVE FITTING PROBLEM, SAY :
"ESTIMATE PARAMETERS PAR[1], ... , PAR[N] OF A FUNCTION
"Y = F(X; PAR[1], ... , PAR[N]), WHEN A SET OF DATA (X[I],Y[I]),
"I = 1(1)M, HAS TO BE FITTED,"
THE FOLLOWING SYSTEM OF M EQUATIONS IN THE N UNKNOWN PARAMETERS
PAR[1], ... , PAR[N] CAN BE DERIVED :
F(X[I]; PAR[1], ... , PAR[N]) - Y[I] = 0, I = 1(1)M.
PROCEDURES USED :
VECVEC = CP34010,
DUPVEC = CP31030,
ELMVEC = CP34020,
LSQORTDEC = CP34134,
LSQSOL = CP34131,
LSQINV = CP34136.
REQUIRED CENTRAL MEMORY :
EXECUTION FIELD LENGTH : AN ARRAY OF (M + 1) * N ELEMENTS, FOUR
ARRAYS OF N ELEMENTS AND ONE ARRAY OF M ELEMENTS ARE DECLARED.
RUNNING TIME :
THE RUNNING TIME IS PROPORTIONAL TO THE TOTAL NUMBER OF CALLS OF
FUNCT. BESIDES, IN EACH ITERATION A LINEAR LEAST SQUARES SYSTEM
IS SOLVED (NUMBER OF OPERATIONS PROPORTIONAL TO M * (N SQUARED)).
LANGUAGE : ALGOL 60.
METHOD AND PERFORMANCE :
THE PROCEDURE GSSNEWTON IS BASED UPON THE GAUSS-NEWTON METHOD FOR
CALCULATING A LEAST SQUARES SOLUTION OF A SYSTEM OF NONLINEAR
EQUATIONS (SEE E.G. [1], [2]). IN SEVERAL ITERATIONS A STEP VECTOR
(FOR THE VECTOR OF UNKNOWNS) IS OBTAINED BY SOLVING A LINEARIZED
SYSTEM OF EQUATIONS. THIS STEP IS PERFORMED ONLY IF THE NORM OF THE
RESIDUAL VECTOR DECREASES. OTHERWISE THE NEWTON STEP VECTOR IS
HALVED A NUMBER OF TIMES UNTIL THE NORM OF THE RESIDUAL VECTOR IS
SMALLER THAN THE NORMS OF THE LAST AND SUBSEQUENT RESIDUAL VECTORS
(THIS PROCESS IS CALLED STEP SIZE CONTROL).
FOR FURTHER DETAILS SEE [3] (SEE ALSO [2]).
1SECTION : 5.1.3.1.3 (DECEMBER 1975) PAGE 12
REFERENCES :
[1] H.O. HARTLEY :
THE MODIFIED GAUSS-NEWTON METHOD.
TECHNOMETRICS, V.3 (1961), PP. 269 - 280.
[2] H. SPAETH :
THE DAMPED TAYLOR'S SERIES METHOD FOR MINIMIZING A SUM OF
SQUARES AND FOR SOLVING SYSTEMS OF NONLINEAR EQUATIONS.
ALGORITHM 315, COLLECTED ALGORITHMS FROM CACM,
COMMUNICATIONS OF THE ACM, VOL. 10 (NOV. 1967), PP. 726 - 728.
[3] J.C.P. BUS, B. VAN DOMSELAAR, J. KOK :
NONLINEAR LEAST SQUARES ESTIMATION.
MATHEMATICAL CENTRE (TO APPEAR).
EXAMPLE OF USE :
THE PARAMETERS PAR[1 : 3] IN THE CURVE FITTING PROBLEM:
G[I] = PAR[1] + PAR[2] * EXP(PAR[3] * X[I]) - Y[I]
WITH (X[I], Y[I]), I=1,...,6 AS THE EXPERIMENTAL DATA, MAY BE
OBTAINED BY THE FOLLOWING PROGRAM:
"BEGIN"
"INTEGER" I;
"ARRAY" IN[0:7], OUT[1:9], X, Y, G[1:6], V[1:3, 1:3], PAR[1:3];
"BOOLEAN""PROCEDURE" EXPFUNCT(M, N, PAR, G);
"VALUE" M, N; "INTEGER" M, N; "ARRAY" PAR, G;
"BEGIN""INTEGER" I;
"FOR" I:= 1 "STEP" 1 "UNTIL" M "DO"
"BEGIN""IF" PAR[3] * X[I] > 680 "THEN"
"BEGIN" EXPFUNCT:= "FALSE"; "GO TO" STOP "END";
G[I]:= PAR[1] + PAR[2] * EXP(PAR[3] * X[I]) - Y[I]
"END"; EXPFUNCT:="TRUE";
STOP:
"END" EXPFUNCT;
"PROCEDURE" JACOBIAN(M, N, PAR, G, JAC, LOCFUNCT);
"VALUE" M, N; "INTEGER" M, N; "ARRAY" PAR, G, JAC;
"PROCEDURE" LOCFUNCT;
"BEGIN" "INTEGER" I; "REAL" EX;
"FOR" I:= 1 "STEP" 1 "UNTIL" M "DO"
"BEGIN" JAC[I,1]:=1; JAC[I,2]:= EX:= EXP(PAR[3] * X[I]);
JAC[I,3]:= X[I] * PAR[2] * EX
"END"
"END" JACOBIAN;
1SECTION : 5.1.3.1.3 (DECEMBER 1975) PAGE 13
IN[0]:= "-14; IN[1]:= IN[2]:= "-6; IN[5]:= 75; IN[4]:="-10;
IN[6]:= 14; IN[7]:= 1;
"FOR" I:= 1 "STEP" 1 "UNTIL" 6 "DO"
"BEGIN" INREAL(70,X[I]); INREAL(70,Y[I]) "END";
PAR[1]:= 580; PAR[2]:= - 180; PAR[3]:= - 0.160;
GSSNEWTON(6, 3, PAR, G, V, EXPFUNCT, JACOBIAN, IN, OUT);
OUTPUT(61,"("3/4B,"("X[I] Y[I]")",/, 6(5B+D, 5B3D.D, /), 2/,
4B"("PARAMETERS")",/,3(4B+D.3D"+ZD,/),2/,4B"("OUT:")",/,
3(9B+D.6D"+ZD,/), 5(14B3ZD,/), 9B+D.6D"+ZD,2/4B,
"("LAST RESIDUAL VECTOR")",/,6(10B+3Z.D,/)")", X[1], Y[1],
X[2],Y[2],X[3],Y[3],X[4],Y[4],X[5],Y[5],X[6],Y[6],PAR[1],PAR[2],
PAR[3],OUT[6],OUT[2],OUT[3],OUT[4],OUT[5],OUT[1],OUT[7],OUT[8],
OUT[9], G[1],G[2],G[3],G[4],G[5],G[6])
"END"
WITH THE DATA GIVEN IN THE X - Y - TABLE THIS PROGRAM DELIVERS:
X[I] Y[I]
-5 127.0
-3 151.0
-1 379.0
+1 421.0
+3 460.0
+5 426.0
PARAMETERS
+5.233" +2
-1.569" +2
-1.997" -1
OUT:
+5.260478" -4
+1.157156" +2
+1.654588" +2
16
16
2
0
3
+2.339529" +3
LAST RESIDUAL VECTOR
-29.6
+86.6
-47.3
-26.2
-22.9
+39.5
1SECTION : 5.1.3.1.3 (DECEMBER 1975) PAGE 14
SOURCE TEXTS :
0"CODE" 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" LOCFUNCT(M,N,PAR,G); "VALUE" M, N;
"INTEGER" M,N; "ARRAY" PAR,G;
"BEGIN" FE:= FE+1; "IF" FE >= MAXFE "THEN" ERR:= 1 "ELSE"
"IF" "NOT" 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]<"-7 "THEN" "-8 "ELSE" "-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" "NOT" 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 "AND"
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);
"COMMENT"
1SECTION : 5.1.3.1.3 (DECEMBER 1975) PAGE 15
;
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
1SECTION : 5.1.3.1.3 (DECEMBER 1975) PAGE 16
;
"EOP"
0"CODE" 34441;
"PROCEDURE" GSSNEWTON(M, N, PAR, RV, JJINV, FUNCT, JACOBIAN,
IN, OUT);
"VALUE" M, N; "INTEGER" M, N;
"ARRAY" PAR, RV, JJINV, IN, OUT;
"BOOLEAN" "PROCEDURE" FUNCT;
"PROCEDURE" JACOBIAN;
"BEGIN" "INTEGER" I, J, INR, MIT, TEXT,
IT, ITMAX, INRMAX, TIM, FEVAL, FEVALMAX;
"REAL" RHO, RES1, RES2, RN, RELTOLPAR, ABSTOLPAR, ABSTOLRES,
STAP, NORMX;
"BOOLEAN" CONV, TESTTHF, DAMPING ON;
"ARRAY" JAC[1:M + 1,1:N], PR, AID, SOL[1 : N], FU2[1 : M],
AUX[2 : 5];
"INTEGER""ARRAY" CI[1:N];
"BOOLEAN""PROCEDURE" LOC FUNCT(M, N, PAR, RV);
"VALUE" M, N; "INTEGER" M, N; "ARRAY" PAR, RV;
"BEGIN" LOC FUNCT:= TEST THF:= FUNCT(M, N, PAR, RV)
"AND" TEST THF; FEVAL:= FEVAL + 1
"END" LOC FUNCT;
ITMAX:= FEVALMAX:= IN[5]; AUX[2]:= N * IN[0]; TIM:= IN[7];
RELTOLPAR:= IN[1] ** 2; ABSTOLPAR:= IN[2] ** 2;
ABSTOLRES:= IN[4] ** 2; INRMAX:= IN[6];
DUPVEC(1, N, 0, PR, PAR);
"IF" M < N "THEN"
"FOR" I:= 1 "STEP" 1 "UNTIL" N "DO" JAC[M + 1, I]:= 0;
TEXT:= 4; MIT:= 0; TEST THF:= "TRUE";
RES2:= STAP:= OUT[5]:= OUT[6]:= OUT[7]:= 0;
FUNCT(M, N, PAR, FU2); RN:= VECVEC(1, M, 0, FU2, FU2);
OUT[3]:= SQRT(RN); FEVAL:= 1; DAMPING ON:= "FALSE";
"FOR" IT:= 1, IT + 1 "WHILE" IT <= ITMAX "AND"
FEVAL < FEVALMAX "DO"
"BEGIN" OUT[5]:= IT; JACOBIAN(M, N, PAR, FU2, JAC, LOCFUNCT);
"IF" "NOT" TEST THF "THEN"
"BEGIN" TEXT:= 7; "GO TO" FAIL "END";
LSQORTDEC(JAC, M, N, AUX, AID, CI);
"IF" AUX[3] ^= N "THEN"
"BEGIN" TEXT:= 5; "GO TO" FAIL "END";
LSQSOL(JAC, M, N, AID, CI, FU2); DUPVEC(1, N, 0, SOL, FU2);
STAP:= VECVEC(1, N, 0, SOL, SOL);
RHO:= 2; NORMX:= VECVEC(1, N, 0, PAR, PAR);
"COMMENT"
1SECTION : 5.1.3.1.3 (DECEMBER 1975) PAGE 17
;
"IF" STAP > RELTOLPAR * NORMX + ABSTOLPAR
"OR" IT = 1 "AND" STAP > 0 "THEN"
"BEGIN""FOR" INR:= 0, INR + 1
"WHILE""IF" INR = 1 "THEN" DAMPING ON "OR" RES2 >= RN
"ELSE""NOT" CONV "AND" (RN <= RES1 "OR" RES2 < RES1) "DO"
"BEGIN""COMMENT" DAMPING STOPS WHEN
R0 > R1 "AND" R1 <= R2 (BEST RESULT IS X1, R1)
WITH X1 = X0 + I * DX, I:= 1, .5, .25, .125, ETC. ;
RHO:= RHO / 2; "IF" INR > 0 "THEN"
"BEGIN" RES1:= RES2; DUPVEC(1, M, 0, RV, FU2);
DAMPING ON:= INR > 1
"END";
"FOR" I:= 1 "STEP" 1 "UNTIL" N "DO"
PR[I]:= PAR[I] - SOL[I] * RHO;
FEVAL:= FEVAL + 1;
"IF" "NOT" FUNCT(M, N, PR, FU2) "THEN"
"BEGIN" TEXT:= 6; "GO TO" FAIL "END";
RES2:= VECVEC(1, M, 0, FU2, FU2); CONV:= INR >= INRMAX
"END" DAMPING OF STEP VECTOR;
"IF" CONV "THEN"
"BEGIN""COMMENT" RESIDUE CONSTANT; MIT:= MIT + 1;
"IF" MIT < TIM "THEN" CONV:= "FALSE"
"END" "ELSE" MIT:= 0;
"IF" INR > 1 "THEN"
"BEGIN" RHO:= RHO * 2; ELMVEC(1, N, 0, PAR, SOL, - RHO);
RN:= RES1; "IF" INR > 2 "THEN" OUT[7]:= IT
"END""ELSE"
"BEGIN" DUPVEC(1, N, 0, PAR, PR); RN:= RES2;
DUPVEC(1, M, 0, RV, FU2)
"END";
"IF" RN <= ABSTOLRES "THEN"
"BEGIN" TEXT:= 1; ITMAX:= IT "END""ELSE"
"IF" CONV "AND" INRMAX > 0 "THEN"
"BEGIN" TEXT:= 3; ITMAX:= IT "END"
"ELSE" DUPVEC(1, M, 0, FU2, RV)
"END" ITERATION WITH DAMPING AND TESTS "ELSE"
"BEGIN" TEXT:= 2; RHO:= 1; ITMAX:= IT "END"
"END" OF ITERATIONS;
LSQINV(JAC, N, AID, CI);
"FOR" I:= 1 "STEP" 1 "UNTIL" N "DO"
"BEGIN" JJINV[I,I]:= JAC[I,I];
"FOR" J:= I + 1 "STEP" 1 "UNTIL" N "DO"
JJINV[I,J]:= JJINV[J,I]:= JAC[I,J]
"END" CALCULATION OF INVERSE MATRIX OF NORMAL EQUATIONS;
FAIL :
OUT[6]:= SQRT(STAP) * RHO; OUT[2]:= SQRT(RN); OUT[4]:= FEVAL;
OUT[1]:= TEXT; OUT[8]:= AUX[3]; OUT[9]:= AUX[5]
"END" GSSNEWTON;
"EOP"
1SECTION : 5.2.1.1.1.1 (DECEMBER 1979) PAGE 1
SECTION 5.2.1.1.1.1 CONTAINS NINE PROCEDURES FOR INTIAL-VALUE PROBLEMS
FOR FIRST ORDER ORDINARY DIFERENTIAL EQUATIONS.
A. RK1 SOLVES AN IVP FOR A SINGLE ODE BY MEANS OF A
5-TH ORDER RUNGE-KUTTA METHOD.
B. RKE SOLVES AN IVP FOR A SYSTEM OF ODE'S BY MEANS OF A
5-TH ORDER RUNGE-KUTTA METHOD.
C. RK4A SOLVES AN IVP FOR A SINGLE ODE BY MEANS OF A 5-TH ORDER
RUNGE-KUTTA METHOD. RK4A INTERCHANGES THE DEPENDENT AND
INDEPENDENT VARIABLE.
D. RK4NA SOLVES AN IVP FOR A SYSTEM OF ODE'S BY MEANS OF A
5-TH ORDER RUNGE-KUTTA METHOD. RK4NA INTERCHANGES THE
INDEPENDENT AND ONE DEPENDENT VARIABLE.
E. RK5NA SOLVES AN IVP FOR A SYSTEM OF ODE'S BY MEANS OF A
5-TH ORDER RUNGE-KUTTA METHOD. RK5NA USES THE ARC LENGTH
AS INTEGRATION VARIABLE.
F. MULTISTEP SOLVES AN IVP FOR A SYSTEM OF ODE'S BY MEANS OF A
LINEAR MULTISTEP METHOD. IT USES EITHER THE BACKWARD
DIFFERENTIATION METHODS, OR THE ADAMS-BASHFORTH-MOULTON-METHOD.
G. DIFFSYS SOLVES AN IVP FOR A SYSTEM OF ODE'S BY MEANS OF
A HIGH ORDER EXTRAPOLATION METHOD BASED ON THE MODIFIED
MIDPOINT RULE.
H. ARK SOLVES AN IVP FOR A LARGE SYSTEM OF ODE'S WHICH IS OBTAINED
FROM SEMI-DISCRETIZATION OF AN INITIAL BOUNDARY VALUE PROBLEM
FOR A PARABOLIC OR HYPERBOLIC EQUATION. ARK IS BASED ON
STABILIZED, EXPLICIT RUNGE-KUTTA METHODS OF LOW ORDER.
I. EFRK SOLVES AN IVP FOR A SYSTEM OF ODE'S BY MEANS OF AN
EXPONENTIALLY FITTED EXPLICIT RUNGE-KUTTA METHOD OF FIRST,
SECOND OR THIRD ORDER.
RK1 AND RKE ARE INTENDED FOR NON-STIFF EQUATIONS,WHILE RK4A, RK4NA
AND RK5NA ARE INTENDED FOR NON-STIFF EQUATIONS WHERE DERIVATIVES
BECOME VERY LARGE, SUCH AS IN THE NEIGHBOURHOOD OF SINGULARITIES.
MULTISTEP CAN BE USED FOR NON-STIFF, AS WELL AS STIFF EQUATIONS.
DIFFSYS SHOULD BE USED FOR PROBLEMS FOR WHICH A VERY HIGH ACCURACY
IS DESIRED. ARK IS RECOMMENDED FOR THE INTEGRATION OF SEMI-DISCRETE
PARABOLIC OR HYPERBOLIC PROBLEMS. EFRK IS A SPECIAL PURPOSE PROCEDURE
FOR STIFF EQUATIONS WITH A KNOWN, CLUSTERED EIGENVALUE SPECTRUM.
EXCEPT EFRK, ALL PROCEDURES PERFORM STEPSIZE CONTROL.
1SECTION : 5.2.1.1.1.1.A (FEBRUARY 1979) PAGE 1
PROCEDURE : RK1
AUTHOR:J.A.ZONNEVELD.
CONTRIBUTORS: M.BAKKER AND I.BRINK.
INSTITUTE: MATHEMATICAL CENTRE.
RECEIVED: 730715.
BRIEF DESCRIPTION:
RK1 SOLVES AN INITIAL VALUE PROBLEM FOR A SINGLE FIRST ORDER
ORDINARY DIFFERENTIAL EQUATION DY / DX = F(X,Y).
THE EQUATION IS SUPPOSED TO BE NON-STIFF.
KEYWORDS:
INITIAL VALUE PROBLEM.
SINGLE FIRST ORDER ORDINARY DIFFERENTIAL EQUATIONS.
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE READS:
"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;
"CODE" 33010;
THE MEANING OF THE FORMAL PARAMETERS IS:
X: <VARIABLE>;
THE INDEPENDENT VARIABLE.
UPON COMPLETION OF A CALL
X IS EQUAL TO B;
A: <ARITHMETIC EXPRESSION>;
ENTRY: THE INITIAL VALUE OF X;
B: <ARITHMETIC EXPRESSION>;
ENTRY: A VALUE PARAMETER,GIVING THE END VALUE OF X;
Y: <VARIABLE>;
THE DEPENDENT VARIABLE;
1SECTION : 5.2.1.1.1.1.A (FEBRUARY 1979) PAGE 2
YA: <ARITHMETIC EXPRESSION>;
ENTRY : THE VALUE OF Y AT X=A;
FXY: <ARITHMETIC EXPRESSION>;
AN EXPRESSION,DEPENDING ON X AND Y,GIVING THE VALUE OF DY/DX;
E: <ARRAY IDENTIFIER>;
"ARRAY" E[1:2];
ENTRY:
E[1] : A RELATIVE TOLERANCE,
E[2] : AN ABSOLUTE TOLERANCE ;
D: <ARRAY IDENTIFIER>;
"ARRAY" D[1:4];
EXIT:
ENTIER(D[1]+.5) GIVES THE NUMBER OF STEPS SKIPPED;
D[2] : EQUALS THE STEP LENGTH;
D[3] : IS EQUAL TO B;
D[4] : IS EQUAL TO Y(B);
FI: <BOOLEAN EXPRESSION>;
IF FI="TRUE" RK1 INTEGRATES FROM X=A TO X=B WITH INITIAL VALUE
VALUE Y(A)=YA AND TRIAL STEP B-A. IF FI="FALSE" RK1 INTEGRATES
FROM X=D[3] TO X=B WITH INITIAL VALUE Y(D[3])=D[4] AND FIRST
STEP H=D[2]*SIGN(B-D[3]), WHILE A AND YA ARE IGNORED.
PROCEDURES USED: NONE.
REQUIRED CENTRAL MEMORY : NEGLIGIBLE SMALL.
METHOD AND PERFORMANCE:
RK1 IS BASED ON AN EXPLICIT, 5-TH ORDER RUNGE-KUTTA METHOD AND
IS PROVIDED WITH STEPLENGTH AND ERRORCONTROL. THE ERRORCONTROL
IS BASED ON THE LAST TERM OF THE TAYLOR SERIES WICH IS TAKEN INTO
ACCOUNT. A STEP IS REJECTED IF THE ABSOLUTE VALUE OF THIS LAST TERM
GREATER THAN (ABS(FXY)*E[1]+E[2])*ABS(H)/INT, WHERE
INT = ABS( B-( "IF" FI "THEN" A "ELSE" D[3])) DENOTES THE LENGTH
OF THE INTEGRATION INTERVAL, OTHERWISE, A STEP IS ACCEPTED.
RK1 USES AS ITS MINIMAL ABBSOLUTE STEPLENGTH HMIN = E[1]*INT+E[2].
IF A STEP OF LENGTH ABS(H) = HMIN IS REJECTED, THE STEP IS SKIPPED.
FOR FURTHER DETAILS SEE [1].
1SECTION : 5.2.1.1.1.1.A (FEBRUARY 1979) PAGE 3
REFERENCES:
[1]J.A.ZONNEVELD.
AUTOMATIC NUMERICAL INTEGRATION.
MATHEMATICAL CENTRE TRACT 8(1970).
EXAMPLE OF USE:
THE SOLUTION OF THE DIFFERENTIAL EQUATION DY/DX=-Y
WITH INITIAL CONDITION Y(0)=1 AT X=1 IS COMPUTED
BY MEANS OF THE FOLLOWING PROGRAM:
"BEGIN"
"REAL" X,Y;
"BOOLEAN" FI,FIRST;
"REAL" "ARRAY" E[1:2],D[1:4];
E[1]:=+"-4;E[2]:=+"-4;FIRST:="TRUE";
RK1(X,0.0,1,Y,1.0,-Y,E,D,FIRST);
OUTPUT(61,"("//10B"("X=")".12D"2D,//10B"("Y=")".12D"2D,
10B"("YEXACT=")".12D"2D")",X,Y,EXP(-X));
"END"
IT DELIVERS WITH E[1]=E[2]="-4:
X=.100000000000"01
Y=.367876846355"00 YEXACT=.367879441171"00
SOURCE TEXT(S):
0"CODE" 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; "COMMENT"
1SECTION : 5.2.1.1.1.1.A (AUGUST 1974) PAGE 4
;
"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 "EQV" 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" "NOT"LAST "THEN" D[2]:= H; D[3]:= X; D[4]:= Y
"END" RK1;
"EOP"
1SECTION : 5.2.1.1.1.1.B (FEBRUARY 1979) PAGE 1
PROCEDURE : RKE.
AUTHOR: P.A. BEENTJES.
INSTITUTE: MATHEMATICAL CENTRE.
RECEIVED: 740520.
BRIEF DESCRIPTION:
RKE SOLVES AN INITIAL VALUE PROBLEM FOR A SYSTEM OF FIRST
ORDER ORDINARY DIFFERENTIAL EQUATIONS DY / DX = F(X,Y).
THE SYSTEM IS SUPPOSED TO BE NON-STIFF.
KEYWORDS:
INITIAL VALUE PROBLEM.
SYSTEM OF FIRST ORDER ORDINARY DIFFERENTIAL EQUATIONS.
1SECTION : 5.2.1.1.1.1.B (FEBRUARY 1979) PAGE 2
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE READS:
"PROCEDURE" RKE (X, XE, N, Y, DER, DATA, FI, OUT);
"VALUE" N, FI; "INTEGER" N; "REAL" X, XE; "BOOLEAN" FI;
"ARRAY" Y, DATA;
"PROCEDURE" DER, OUT;
"CODE" 33033;
RKE INTEGRATES THE SYSTEM OF ORDINARY DIFFERENTIAL EQUATIONS
DY / DX = F(X, Y), FROM X = X0 TO X = XE WHERE Y(X0) = Y0.
THE MEANING OF THE FORMAL PARAMETERS IS:
X: <VARIABLE>;
THE INDEPENDENT VARIABLE;
ENTRY: THE INITIAL VALUE X0;
XE: <ARITHMETIC EXPRESSION>;
THE FINAL VALUE OF X;
N: <ARITHMETIC EXPRESSION>;
THE NUMBER OF EQUATIONS OF THE SYSTEM;
Y: <ARRAY IDENTIFIER>;
"ARRAY" Y[1 : N];
THE DEPENDENT VARIABLES;
ENTRY: THE INITIAL VALUES AT X = X0;
EXIT : THE VALUES OF THE SOLUTION AT X = XE;
DER: <PROCEDURE IDENTIFIER>;
THE HEADING OF THIS PROCEDURE READS:
"PROCEDURE" DER (T, V); "VALUE" T; "REAL" T; "ARRAY" V;
THIS PROCEDURE PERFORMS AN EVALUATION OF THE RIGHT HAND
SIDE OF THE SYSTEM WITH DEPENDENT VARIABLES V[1 : N] AND
INDEPENDENT VARIABLE T; UPON COMPLETION OF DER
THE RIGHT HAND SIDE SHOULD BE OVERWRITTEN ON V[1 : N];
DATA: <ARRAY IDENTIFIER>;
"ARRAY" DATA[1 : 6];
IN ARRAY DATA ONE SHOULD GIVE:
DATA[1]: THE RELATIVE TOLERANCE;
DATA[2]: THE ABSOLUTE TOLERANCE;
AFTER EACH STEP DATA[3:6] CONTAINS :
DATA[3]: THE STEPLENGTH USED FOR THE LAST STEP;
DATA[4]: THE NUMBER OF INTEGRATION STEPS PERFORMED;
DATA[5]: THE NUMBER OF INTEGRATION STEPS REJECTED;
DATA[6]: THE NUMBER OF INTEGRATION STEPS SKIPPED;
IF UPON COMPLETION OF RKE DATA[6] > 0 ,
RESULTS SHOULD BE CONSIDERED MOST CRITICALLY;
FI: <BOOLEAN EXPRESSION>;
IF FI = "TRUE" THE INTEGRATION STARTS AT X0 WITH A
TRIAL STEP XE - X0; IF FI = "FALSE" THE INTEGRATION IS
CONTINUED WITH A STEPLENGTH DATA[3] * SIGN(XE - X0);
OUT: <PROCEDURE IDENTIFIER>;
THE HEADING OF THIS PROCEDURE READS:
"PROCEDURE" OUT;
AFTER EACH INTEGRATION STEP PERFORMED OUT CAN BE USED TO
OBTAIN INFORMATION FROM THE SOLUTION PROCESS, E.G. THE VALUES
OF X, Y[1 : N] AND DATA[3 : 6]. POUT CAN ALSO BE USED TO
UPDATE DATA.
1SECTION : 5.2.1.1.1.1.B (FEBRUARY 1979) PAGE 3
PROCEDURES USED : NONE.
REQUIRED CENTRAL MEMORY:
CIRCA 5 * N MEMORY PLACES.
METHOD AND PERFORMANCE:
THE METHOD UPON WHICH THE PROCEDUDRE IS BASED, IS A MEMBER OF A
CLASS OF FIFTH ORDER RUNGE KUTTA FORMULAS PRESENTED IN REFERENCE
[1]. AUTOMATIC STEPSIZE CONTROL IS IMPLEMENTED IN A WAY AS PROPOSED
IN REFERENCE [2]. FOR TESTRESULTS AND FURTHER INFORMATION
SEE REFERENCE [3].
REFERENCES:
[1]. R. ENGLAND.
ERROR ESTIMATES FOR RUNGE KUTTA TYPE SOLUTIONS TO SYSTEMS
OF ORDINARY DIFFERENTIAL EQUATIONS.
THE COMPUTER JOURNAL , VOLUME 12, P 166 - 169, 1969.
[2]. J.A. ZONNEVELD.
AUTOMATIC NUMERICAL INTEGRATION.
MATH. CENTRE TRACT 8(1970).
[3]. P.A. BEENTJES.
SOME SPECIAL FORMULAS OF THE ENGLAND CLASS OF FIFTH ORDER
RUNGE - KUTTA SCHEMES.
MATH. CENTRE REPORT NW 24/74.
1SECTION : 5.2.1.1.1.1.B (DECEMBER 1975) PAGE 4
EXAMPLE OF USE:
THE SOLUTION AT T = 1 AND T = -1 OF THE SYSTEM
DX / DT = Y - Z,
DY / DT = X * X + 2 * Y + 4 * T,
DZ / DT = X * X + 5 * X + Z * Z + 4 * T,
WITH X = Y = 0 AND Z = 2 AT T = 0,
CAN BE OBTAINED BY THE FOLLOWING PROGRAM:
"BEGIN" "REAL" T, TE; "ARRAY" Y[1 : 3], DATA[1 : 6];
"PROCEDURE" RHS(T, Y); "VALUE" T; "REAL" T; "ARRAY" Y;
"BEGIN" "REAL" XX, YY, ZZ;
XX:= Y[1]; YY:= Y[2]; ZZ:= Y[3];
Y[1]:= YY - ZZ;
Y[2]:= XX * XX + 2 * YY + 4 * T;
Y[3]:= XX * (XX + 5) + 2 * ZZ + 4 * T
"END" RHS;
"PROCEDURE" INFO;
"IF" T = TE "THEN"
"BEGIN" "REAL" ET, T2, AEX, AEY, AEZ, REX, REY, REZ;
ET:= EXP(T); T2:= 2 * T;
REX:= -ET * SIN(T2); AEX:= REX - Y[1]; REX:= ABS(AEX / REX);
REY:= ET * ET * (8 + 2 * T2 - SIN(2 * T2)) / 8 - T2 - 1;
REZ:= ET * (SIN(T2) + 2 * COS(T2)) + REY;
AEY:= REY - Y[2]; REY:= ABS(AEY / REY); AEZ:= REZ - Y[3];
REZ:= ABS(AEZ / REZ);
OUTPUT(61, "(""(" T = ")", +D, //,
"(" RELATIVE AND ABSOLUTE ERRORS IN X, Y AND Z :")", //,
"(" RE(X) RE(Y) RE(Z) AE(X) AE(Y) AE(Z)")", //,
6(B,-.2D"+D), //,
"(" NUMBER OF INTEGRATION STEPS PERFORMED :")",4ZD,/,
"(" NUMBER OF INTEGRATION STEPS SKIPPED :")",4ZD,/,
"(" NUMBER OF INTEGRATION STEPS REJECTED :")",4ZD,///")",
T, REX, REY, REZ, ABS(AEX), ABS(AEY), ABS(AEZ),
DATA[4], DATA[6], DATA[5])
"END" INFO;
TE:= 1;
LEFT:
Y[1]:= Y[2]:= 0; Y[3]:= 2; T:=0;
DATA[1]:= DATA[2]:= "-5;
RKE(T, TE, 3, Y, RHS, DATA, "TRUE", INFO);
"IF" TE = 1 "THEN" "BEGIN" TE:= -1; "GOTO" LEFT "END"
"END"
1SECTION : 5.2.1.1.1.1.B (DECEMBER 1975) PAGE 5
THIS PROGRAM DELIVERS:
T = +1
RELATIVE AND ABSOLUTE ERRORS IN X, Y AND Z :
RE(X) RE(Y) RE(Z) AE(X) AE(Y) AE(Z)
.37"-6 .15"-5 .13"-5 .91"-6 .13"-4 .11"-4
NUMBER OF INTEGRATION STEPS PERFORMED : 9
NUMBER OF INTEGRATION STEPS SKIPPED : 0
NUMBER OF INTEGRATION STEPS REJECTED : 5
T = -1
RELATIVE AND ABSOLUTE ERRORS IN X, Y AND Z :
RE(X) RE(Y) RE(Z) AE(X) AE(Y) AE(Z)
.22"-6 .52"-7 .19"-6 .75"-7 .55"-7 .77"-7
NUMBER OF INTEGRATION STEPS PERFORMED : 10
NUMBER OF INTEGRATION STEPS SKIPPED : 0
NUMBER OF INTEGRATION STEPS REJECTED : 7
SOURCE TEXT(S):
0"CODE" 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 "EQV" H >= 0 "THEN"
"BEGIN" LAST:= "TRUE"; H:= XE - X; ABSH:= ABS(H) "END"
"ELSE" LAST:= "FALSE";
"COMMENT"
1SECTION : 5.2.1.1.1.1.B (DECEMBER 1975) PAGE 6
;
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:= .690983005625053"-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 "OR" 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;
"EOP"
1SECTION : 5.2.1.1.1.1.C (FEBRUARY 1979) PAGE 1
PROCEDURE : RK4A.
AUTHOR:J.A.ZONNEVELD.
CONTRIBUTORS:M.BAKKER AND I.BRINK.
INSTITUTE: MATHEMATICAL CENTRE,
RECEIVED: 730715.
BRIEF DESCRIPTION:
RK4A SOLVES AN INITIAL VALUE PROBLEM FOR A SINGLE FIRST ORDER
ORDINARY DIFFERENTIAL EQUATION DY / DX = F(X,Y), WHERE F(X,Y)
MAY BECOME LARGE, E.G. IN THE NEIGHBOURHOOD OF A SINGULARITY.
RK4A INTERCHANGES THE DEPENDENT AND INDEPENDENT VARIABLE.
THE EQUATION IS UPPOSED TO BE NON-STIFF.
KEYWORDS:
INITIAL VALUE PROBLEM,
SINGLE FIRST ORDER ORDINARY DIFFERENTIAL EQUATION
LARGE DERIVATIVE VALUES.
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE READS:
"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;
"CODE" 33016;
1SECTION : 5.2.1.1.1.1.C (FEBRUARY 1979) PAGE 2
THE MEANING OF THE FORMAL PARAMETERS IS:
X: <VARIABLE>;
THE INDEPENDENT VARIABLE ;
UPON COMPLETION OF A CALL X IS EQUAL TO THE MOST RECENT
VALUE OF THE INDEPENDENT VARIABLE;
XA: <ARITHMETIC EXPRESSION>;
ENTRY: THE INITIAL VALUE OF X;
B: <ARITHMETIC EXPRESSION>;
B DEPENDS ON X AND Y.
THE EQUATION B=0 FULFILLED WITHIN THE TOLERANCES E[4] AND
E[5] SPECIFIES THE END OF THE INTEGRATION INTERVAL.
AT THE END OF EACH INTEGRATION STEP B IS EVALUATED AND IS
TESTED FOR CHANGE OF SIGN;
Y: <VARIABLE>;
THE DEPENDENT VARIABLE;
YA: <ARITHMETIC EXPRESSION>;
ENTRY: THE VALUE OF Y AT X=XA;
FXY: <ARITHMETIC EXPRESSION>;
FXY GIVES THE VALUE OF DY/DX;
FXY USES X AND Y AS JENSEN PARAMETERS.
E: <ARRAY IDENTIFIER>;
"ARRAY" E[0:5];
ENTRY:
E[0], E[2] : RELATIVE TOLERANCES, FOR X AND Y RESPECTIVELY;
E[1], E[3] : ABSOLUTE TOLERANCES, FOR X AND Y RESPECTIVELY;
E[4], E[5] : TOLERANCES USED IN THE DETERMINATION OF
THE ZERO OF B;
D: <ARRAY IDENTIFIER>;
"ARRAY" D[0:4];
AFTER COMPLETION OF EACH STEP WE HAVE :
IF D[0]>0 THEN X IS THE INTEGRATION VARIABLE;
IF D[0]<0 THEN Y IS THE INTEGRATION VARIABLE;
D[1] IS THE NUMBER OF STEPS SKIPPED;
D[2] IS THE STEPSIZE;
D[3] IS EQUAL TO THE LAST VALUE OF X;
D[4] IS EQUAL TO THE LAST VALUE OF Y;
FI: <BOOLEAN EXPRESSION>;
IF FI="TRUE" THEN THE INTEGRATION IS STARTED WITH INITIAL
VALUES X=XA,Y=YA.
IF FI="FALSE" THEN THE INTEGRATION IS STARTED WITH X=D[3],
Y=D[4];
XDIR, POS : <BOOLEAN EXPRESSION>;
IF FI="TRUE" THEN THE INTEGRATION STARTS IN SUCH A WAY THAT
IF POS="TRUE" AND XDIR="TRUE" THEN X INCREASES,
IF POS="TRUE" AND XDIR="FALSE" THEN Y INCREASES,
IF POS="FALSE" AND XDIR="TRUE" THEN X DECREASES,
IF POS="FALSE" AND XDIR="FALSE" THEN Y DECREASES.
1SECTION : 5.2.1.1.1.1.C (FEBRUARY 1979) PAGE 3
PROCEDURES USED : ZEROIN = CP34150.
METHOD AND PERFORMANCE:
RK4A IS BASED ON AN EXPLICIT, 5-TH ORDER RUNGE-KUTTA METHOD AND
INTERCHANGES THE DEPENDENT AND INDEPENDENT INTEGRATION VARIABLE.
IF ABS(F(X,Y)) < 1, X IS USED AS INTEGRATION VARIABLE,OTHERWISE Y.
THE PROCEDURE IS PROVIDED WITH STEP SIZE AND ERROR CONTROL.
FOR DETAILS,E.G. HOW TO USE ARRAY E AND HOW TO SPECIFY THE ENDPOINT
SEE [1] ( RK4A IS A SLIGHTLY ADAPTED VERSION OF RK4).
REFERENCES:
[1]J.A.ZONNEVELD,
AUTOMATIC NUMERICAL INTEGRATION.
MATHEMATICAL CENTRE TRACT 8(1970).
EXAMPLE OF USE:
THE SOLUTION OF THE DIFFERENTIAL EQUATION
DY/DX=1-2*(X**2+Y), X>=0,
Y=0 , X =0,
IS REPRESENTED BY THE PARABOLA Y=X*(1-X);
WE WOULD LIKE TO FIND THE VALUE OF X FOR WHICH THE CURVE
OF THE SOLUTION INTERSECTS THE LINE Y+X=0.
THE SOLUTION CAN BE OBTAINED BY THE FOLLOWING PROGRAM:
"BEGIN" "COMMENT" INTEGRATION OF DY/DX=1-2*(Y+X**2), X>=0,
Y(0)=0,UNTIL THE CONDITION Y+X=0 IS SATISFIED;
"REAL" X,Y;"ARRAY" D[0:4],E[0:5];
E[0]:=E[1]:=E[2]:=E[3]:=E[4]:=E[5]:="-6;
RK4A(X,0.0,X+Y,Y,0.0,1-2*(X*X+Y),E,D,"TRUE","TRUE","TRUE");
OUTPUT(61,"("10B"("X=")"+D.9D,10B"("EXACTLY:")"2B+D.9D/,
10B"("Y=")"+D.9D/,10B"("Y-X*(1-X)=")"+.10D")",X,2,
Y,Y-X*(1-X))
"END"
THE PROGRAM PRINTS THE FOLLOWING RESULTS:
X=1.9999998554 EXACTLY: 2.0000000000
Y=-1.9999995347427
Y-X*(1-X)=0.0000000313
1SECTION : 5.2.1.1.1.1.C (AUGUST 1974) PAGE 4
SOURCE TEXT(S):
0"CODE" 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];
"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; "COMMENT"
1SECTION : 5.2.1.1.1.1.C (AUGUST 1974) PAGE 5
;
"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" "NOT"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" "NOT"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 "EQV" XDIR "THEN" H "ELSE"
H * ZL) < 0 "EQV" POS "ELSE" H * D[2] < 0) "THEN" H:= - H
"END";
I:= 1
"END"; "COMMENT"
1SECTION : 5.2.1.1.1.1.C (AUGUST 1974) PAGE 6
;
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" "NOT"(FI "OR" 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;
"EOP"
1SECTION : 5.2.1.1.1.1.D (FEBRUARY 1979) PAGE 1
PROCEDURE : RK4NA.
AUTHOR:J.A.ZONNEVELD.
CONTRIBUTORS:M.BAKKER AND I.BRINK.
INSTITUTE: MATHEMATICAL CENTRE.
RECEIVED: 730715.
BRIEF DESCRIPTION:
RK4NA SOLVES AN INITIAL VALUE PROBLEM FOR A SYSTEM OF FIRST
ORDER ORDINARY DIFFERENTIAL EQUATIONS DY / DX = F(X,Y), OF WHICH
THE DERIVATIVE COMPONENTS ARE SUPPOSED TO BECOME LARGE, E.G. IN
THE NEIGHBOURHOOD OF SINGULARITIES. RK4NA INTERCHANGES THE
INDEPENDENT VARIABLE AND ONE DEPENDENT VARIABLE. THE SYSTEM
IS SUPPOSED TO BE NON-STIFF.
KEYWORDS:
INITIAL VALUE PROBLEM,
SYSTEM OF FIRST ORDER ORDINARY DIFFERENTIAL EQUATIONS,
LARGE DERIVATIVE COMPONENTS.
1SECTION : 5.2.1.1.1.1.D (FEBRUARY 1979) PAGE 2
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE READS:
"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;
"CODE" 33017;
THE MEANING OF THE FORMAL PARAMETERS IS:
X: <ARRAY IDENTIFIER>;
"ARRAY" X[0:N];
X[0] IS THE INDEPENDENT VARIABLE,
X[1],...,X[N] ARE THE DEPENDENT VARIABLES;
EXIT:THE SOLUTION AT B=0;
XA: <ARRAY IDENTIFIER>;
"ARRAY" XA[0:N];
ENTRY: THE INITIAL VALUES OF X[0],...,X[N];
B: <ARITHMETIC EXPRESSION>;
B DEPENDS ON X[0],...,X[N];
IF THE EQUATION B=0 IS SATISFIED WITHIN A
CERTAIN TOLERANCE,THE INTEGRATION IS TERMINATED;
B IS EVALUATED AND TESTED FOR CHANGE OF SIGN AT THE
END OF EACH STEP;
FOR THE TOLERANCE SEE PARAMETER E.
FXJ: <ARITHMETIC EXPRESSION>;
FXJ DEPENDS ON X[0],...,X[N] AND J, DEFINING THE RIGHT
HAND SIDE OF THE DIFFERENTIAL EQUATION;
AT EACH CALL IT DELIVERS :DX[J]/DX[0];
J: <VARIABLE>;
J IS USED AS A JENSEN PARAMETER FOR FXJ;
E: <ARRAY IDENTIFIER>;
"ARRAY" E[0:2*N+3];
ENTRY: E[2*J] AND E[2*J+1] , 0<=J<=N ,
ARE THE RELATIVE AND THE ABSOLUTE TOLERANCE ,
RESPECTIVELY, ASSOCIATED WITH X[J];
E[2*N+2] AND E[2*N+3] ARE THE RELATIVE AND ABSOLUTE
TOLERANCE USED IN THE DETERMINATION OF THE ZERO OF B;
D: <ARRAY IDENTIFIER>;
"ARRAY" D[0:N+3];
AFTER COMPLETION OF EACH STEP WE HAVE :
ENTIER(D[0]+.5) IS THE NUMBER OF STEPS SKIPPED;
D[2] IS THE STEP LENGTH;
D[J+3] IS THE LAST VALUE OF X[J], J=0,...,J=N;
1SECTION : 5.2.1.1.1.1.D (DECEMBER 1975) PAGE 3
FI: <BOOLEAN EXPRESSION>
IF FI="TRUE" THEN THE INTEGRATION IS STARTED WITH INITIAL
CONDITIONS X[J]=XA[J];IF FI="FALSE" THEN THE INTEGRATION IS
CONTINUED WITH X[J]=D[J+3];
N: <ARITHMETIC EXPRESSION>;
THE NUMBER OF EQUATIONS;
L: <ARITHMETIC EXPRESSION>;
AN INTEGER TO BE SUPPLIED BY THE USER, 0<=L<=N (SEE POS);
POS: <BOOLEAN EXPRESSION>
IF FI="TRUE" THEN THE INTEGRATION STARTS IN SUCH A WAY
THAT X[L] INCREASES IF POS="TRUE" AND X[L] DECREASES IF
POS="FALSE";
IF FI="FALSE" THEN POS IS OF NO SIGNIFICANCE.
PROCEDURES USED : ZEROIN = CP34150.
REQUIRED CENTRAL MEMORY : CIRCA 9*N MEMORY PLACES.
METHOD AND PERFORMANCE :
RK4NA IS BASED ON AN EXPLICIT, 5-TH ORDER RUNGE-KUTTA METHOD
AND INTERCHANGES VARIABLES. THE PROCEDURE IS PROVIDED WITH STEPSIZE
AND ERROR CONTROL. FOR DETAILS, E.G. HOW TO USE ARRAY E, HOW TO
SPECIFY THE ENDPOINT, HOW TO USE L AND POS, SEE [1] ( RK4NA IS A
SLIGHTLY ADAPTED VERSION OF RK4N ).
REFERENCES:
[1].J.A.ZONNEVELD.
AUTOMATIC NUMERICAL INTEGRATION.
MATHEMATICAL CENTRE TRACT 8 (1970).
1SECTION : 5.2.1.1.1.1.D (FEBRUARY 1979) PAGE 4
EXAMPLE OF USE:
THE PERIOD OF THE SOLUTION OF THE VAN DER POL EQUATION
DX[1]/DT = X[2]
DX[2]/DT = 10*(1-X[1]**2)*X[2]-X[1], T>=0,
CAN BE OBTAINED BY THE FOLLOWING PROGRAM:
"BEGIN" "COMMENT" VAN DER POL;
"REAL" X0;
"PROCEDURE" PRINT(X);"ARRAY" X;
OUTPUT(61,"("/,4(+ZD.10D3B)")",X[0],X[1],X[2],X0);
"INTEGER" J,K;"BOOLEAN" FIRST;
"ARRAY" E[0:7],XA,X[0:2],D[0:5];
"FOR" K:=0,1,2,3,4,5 "DO" E[K]:=.1"-6; E[6]:=E[7]:="-8 ;
OUTPUT(61,"(""("VAN DER POL")",/BB"("EPS=")"D.10D,/BB
"("THE VALUES OF X[0],X[1],X[2],P,RESPECTIVELY")"")",E[0]);
X0:=XA[0]:=XA[2]:=0;XA[1]:=2;J:=0;PRINT(XA);
FIRST:="TRUE";
"FOR" J:=1,2,3,4 "DO"
"BEGIN" RK4NA(X,XA,X[2],"IF" K=1 "THEN" X[2] "ELSE"
10*(1-X[1]**2)*X[2]-X[1],K,E,D,FIRST,2,0,"TRUE");
X0:=X[0]-X0;PRINT(X);FIRST:="FALSE"; X0:=X[0]
"END"
"END"
THE PROGRAM PRINTS THE FOLLOWING RESULTS:
VAN DER POL
EPS=0.0000001000
THE VALUES OF X[0],X[1],X[2],P,RESPECTIVELY:
+0.00000000 +2.00000000 +0.00000000 +0.00000000
+9.32386570 -2.01428560 +0.00000000 +9.32386570
+18.86305411 +2.01428557 +0.00000000 +9.53918840
+28.40224194 -2.01428858 -0.00000000 +9.53918783
+37.94143003 +2.01428558 +0.00000000 +9.53918809
1SECTION : 5.2.1.1.1.1.D (AUGUST 1974) PAGE 5
SOURCE TEXT(S):
0"CODE" 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];
"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); "COMMENT"
1SECTION : 5.2.1.1.1.1.D (AUGUST 1974) PAGE 6
;
"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] "OR" REJ;
FH:= DISCR[I] / TOL; "IF" FH > FHM "THEN" FHM:= FH
"END"
"END"; "COMMENT"
1SECTION : 5.2.1.1.1.1.D (AUGUST 1974) PAGE 7
;
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" "NOT"(FI "OR" 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 "AND" (Y[L]/Y[IV]*H<0 "EQV" POS)) "OR"
("NOT" FI "AND" 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;
"EOP"
1SECTION : 5.2.1.1.1.1.E (FEBRUARY 1979) PAGE 1
PROCEDURE : RK5NA.
AUTHOR: J.A.ZONNEVELD.
CONTRIBUTORS: M.BAKKER AND I.BRINK.
INSTITUTE: MATHEMATICAL CENTRE.
RECEIVED: 730715.
BRIEF DESCRIPTION:
RK5NA SOLVES AN INITIAL VALUE PROBLEM FOR A SYSTEM OF FIRST ORDER
ORDINARY DIFFERENTIAL EQUATIONS DY / DX = F(X,Y), OF WHICH THE
DERIVATIVE COMPONENTS ARE SUPPOSED TO BECOME LARGE, E.G. IN THE
NEIGHBOURHOOD OF SINGULARITIES. RK5NA INTRODUCES THE ARC LENGTH
AS INTEGRATION VARIABLE. THE SYSTEM IS SUPPOSED TO BE NON-STIFF.
KEYWORDS:
INITIAL VALUE PROBLEM.
SYSTEM OF FIRST ORDER ORDINARY DIFFERENTIAL EQUATIONS.
LARGE DERIVATIVE COMPONENTS.
1SECTION : 5.2.1.1.1.1.E (FEBRUARY 1979) PAGE 2
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE READS:
"PROCEDURE" RK5NA(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;
"CODE" 33018;
THE MEANING OF THE FORMAL PARAMETERS IS:
X: <ARRAY IDENTIFIER>;
"ARRAY" X[0 : N];
THE DEPENDENT VARIABLES;
X[0], ..., X[N] CAN BE USED AS JENSEN PARAMETERS;
XA: <ARRAY IDENTIFIER>;
"ARRAY" XA[0 : N];
ENTRY: THE INITIAL VALUES OF X[J], J = 0, ..., N;
B: <ARITHMETIC EXPRESSION>;
B DEPENDS ON X[0], ..., X[N];
IF,WITHIN SOME TOLERANCE,B = 0 THEN THE INTEGRATION IS TER-
MINATED; SEE ALSO THE EXPLANATION OF THE PARAMETER E;
FXJ: <ARITHMETIC EXPRESSION>;
THE RIGHT HAND SIDE OF THE DIFFERENTIAL EQUATION;
FXJ DEPENDS ON X[0], ..., X[N], J, GIVING THE VALUE OF
DX[J] / DX[0];
J: <VARIABLE>;
J IS USED AS A JENSEN PARAMETER TO DENOTE,IN THE ACTUAL
PARAMETER CORRESPONDING TO FXJ,THE NUMBER OF THE FUNCTION
REQUIRED;
E: <ARRAY IDENTIFIER>;
"ARRAY" E[0 : 2 * N + 3];
ENTRY:
E[2 * J] AND E[2 * J + 1] ARE THE RELATIVE AND THE ABSOLUTE
TOLERANCE,RESPECTIVELY,ASSOCIATED WITH X[J],J = 0,..., N, WHILE
E[2 * N + 2] AND E[2 * N + 3] ARE THE ONES ASSOCIATED WITH B;
D: <ARRAY IDENTIFIER>;
"ARRAY" D[1 : N + 3];
AFTER COMPLETION OF EACH STEP WE HAVE:
ABS(D[1]) THE ARC LENGTH,
D[2] THE STEP LENGTH,
D[I + 3] THE LATEST VALUE OF X[I],
I = 0, ..., N;
FI: <BOOLEAN EXPRESSION>;
IF FI = "TRUE" THEN THE INTEGRATION IS STARTED WITH INITIAL
CONDITIONS X[I] = XA[I], I = 0, ..., N;
IF FI = "FALSE" THEN THE INTEGRATION IS CONTINUED WITH
X[I] = D[I + 3];
N: <ARITHMETIC EXPRESSION>;
THE NUMBER OF EQUATIONS;
1SECTION : 5.2.1.1.1.1.E (FEBRUARY 1979) PAGE 3
L: <ARITHMETIC EXPRESSION>;
1 <= L <= N; SEE THE EXPLANATION OF POS;
POS: <BOOLEAN EXPRESSION>;
IF FI = "TRUE" THEN THE INTEGRATION STARTS IN SUCH A WAY THAT
X[L] INCREASES IF POS = "TRUE" AND DECREASES IF POS = "FALSE".
IF FI = "FALSE" THEN POS IS IGNORED.
PROCEDURES USED : ZEROIN = CP34150.
REQUIRED CENTRAL MEMORY : CIRCA 9 * N MEMORY PLACES.
METHOD AND PERFORMANCE :
RK5NA IS BASED ON A 5-TH ORDER RUNGE-KUTTA METHOD AND INTEGRATES
THE SYSTEM DX[J] / DX[0] = F(J,X[0],..,X[N]) / F(0,X[0],..,X[N]).
THE ARC LENGTH IS INTRODUCED AS INTEGRATION VARIABLE.
THE INTEGRATION PROCESS IS TERMINATED IF SOME CONDITION ON
X[0], .. ,X[N], TO BE SUPPLIED BY THE USER, IS SATISFIED.
RK5NA USES STEPLENGTH AND ERROR CONTROL. DETAILS ABOUT THE
PROCEDURE AND THE UNDERLYING THEORY ARE GIVEN IN [1] ( RK5NA IS
A SLIGHTLY ADAPTED VERSION OF RK5N).
REFERENCES:
[1]. J.A.ZONNEVELD,
AUTOMATIC NUMERICAL INTEGRATION,
MATH.CENTRE TRACT 8 (1970) .
1SECTION : 5.2.1.1.1.1.E (AUGUST 1974) PAGE 4
EXAMPLE OF USE:
THE VAN DER POL EQUATION IN THE PHASE PLANE
DX[1] / DX[0] = (10*(1-X[0]**2)*X[1]-X[0])/X[1]
CAN BE INTEGRATED BY THE PROCEDURE RK5NA; THE STARTING VALUES ARE
X[0] = 2, X[1] = 0. THE INTEGRATION PROCEEDS UNTIL THE NEXT ZERO OF
X[1],THEN IT CONTINUES UNTIL THE NEXT ZERO AND SO ON UNTIL THE
FOURTH ZERO IS ENCOUNTERED.IN THE EXAMPLE THE OUTPUT IS GIVEN FOR
THE TOLERANCES E[0]=E[1]=E[2]=E[3]= "-6, E[4]=E[5]= "-10.
THE PROGRAM READS AS FOLLOWS:
"BEGIN" "COMMENT" VAN DER POL IN THE PHASE PLANE;
"INTEGER" J,K; "BOOLEAN" FIRST;
"ARRAY" E[0:5],XA,X[0:1],D[1:4];
"PROCEDURE" PRINT(X); "ARRAY" X;
"BEGIN" OUTPUT(61,"("/B"("X[0]=")"+D.10D,
10B"("X[1]=")"+D.10D,10B"("S=")"3D.10D")",X[0],
X[1],ABS(D[1]))
"END";
"FOR" K:=0,1,2,3 "DO" E[K]:="-6 ; E[4]:=E[5]:="-10 ; D[1]:=0;
XA[0]:=2; XA[1]:=0; J:=0; PRINT(XA); AA:
FIRST:=J=0;
RK5NA(X,XA,X[1],"IF" K=0 "THEN" X[1] "ELSE"
10*(1-X[0]**2)*X[1]-X[0],K,E,D,FIRST,1,1,"FALSE");;J:=J+1;
PRINT(X); "IF" J<4 "THEN" "GO TO" AA
"END"
RESULTS:
X[0]=+2.0000000000 X[1]=+0.0000000000 S=000.0000000000
X[0]=-2.0142853657 X[1]=-0.0000000012 S=029.3873834087
X[0]=+2.0142853659 X[1]=+0.0000000001 S=058.7884331939
X[0]=-2.0142853659 X[1]=-0.0000000000 S=088.1894829781
X[0]=+2.0142853659 X[1]=+0.0000000000 S=117.5905327623
1SECTION : 5.2.1.1.1.1.E (AUGUST 1974) PAGE 5
SOURCE TEXT(S):
"CODE" 33018 ;
"PROCEDURE" RK5NA(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;
"BOOLEAN" FIRST, FIR, REJ;
"REAL" FHM, S, S0, COND0, S1, COND1, H, ABSH, TOL, FH,
HL, MU, MU1;
"ARRAY" Y, XL, DISCR[0:N], K[0:5,0:N], E1[1:2];
"REAL" "PROCEDURE" SUM(J,A,B,XJ) ; "INTEGER" J,A,B ; "REAL" XJ ;
"BEGIN" "REAL" S ; S:= 0 ;
"FOR" J:=A "STEP" 1 "UNTIL" B "DO" S:=S+XJ ; SUM:= S
"END" SUM ;
"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:= 0 "STEP" 1 "UNTIL" N "DO" Y[J]:= FXJ;
P:= H / SQRT(SUM(I, 0, N, Y[I] ** 2));
"FOR" I:= 0 "STEP" 1 "UNTIL" N "DO" K[T,I]:= Y[I] * P
"END" F;
"IF" D = 2 "THEN" "GOTO" INTEGRATE; "IF" D = 1 "THEN"
"BEGIN" "FOR" I:= 0 "STEP" 1 "UNTIL" N "DO" K[0,I]:= K[0,I]
* MU; "GOTO" A
"END";
"FOR" I:= 0 "STEP" 1 "UNTIL" N "DO" X[I]:= XL[I]; F(0);
A: "FOR" I:= 0 "STEP" 1 "UNTIL" N "DO" X[I]:= XL[I] +
K[0,I] / 4.5; F(1);
"FOR" I:= 0 "STEP" 1 "UNTIL" N "DO" X[I]:= XL[I] + (K[0,I]
+ K[1,I] * 3) / 12; F(2);
"FOR" I:= 0 "STEP" 1 "UNTIL" N "DO" X[I]:= XL[I] + (K[0,I]
+ K[2,I] * 3) / 8; F(3);
"FOR" I:= 0 "STEP" 1 "UNTIL" N "DO" X[I]:= XL[I] + (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] +
(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" DISCR[I]:=
ABS(K[0,I] * 21 - K[2,I] * 162 + K[3,I] * 224
- K[4,I] * 125 + K[5,I] * 42) / 14; "GOTO" END
"END";
INTEGRATE: "FOR" I:= 0 "STEP" 1 "UNTIL" N "DO" X[I]:= XL[I]
+ ( - 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" X[I]:= XL[I] + (K[0,I]
* 35 + K[2,I] * 162 + K[4,I] * 125 + K[5,I] * 14)
/ 336;
END:
"END" RKSTEP; "COMMENT"
1SECTION : 5.2.1.1.1.1.E (AUGUST 1974) PAGE 6
;
"REAL" "PROCEDURE" FZERO;
"BEGIN" "IF" S = S0 "THEN" FZERO:= COND0 "ELSE" "IF" S = S1
"THEN" FZERO:= COND1 "ELSE"
"BEGIN" RKSTEP(S - S0, 3); FZERO:= B "END"
"END" FZERO;
"IF" FI "THEN"
"BEGIN" "FOR" I:= 0 "STEP" 1 "UNTIL" N "DO" D[I + 3]:= XA[I];
D[1]:= D[2]:= 0
"END";
"FOR" I:= 0 "STEP" 1 "UNTIL" N "DO" X[I]:= XL[I]:= D[I + 3];
S:= D[1]; FIRST:= FIR:= "TRUE"; H:= E[0] + E[1];
"FOR" I:= 1 "STEP" 1 "UNTIL" N "DO"
"BEGIN" ABSH:= E[2 * I] + E[2 * I + 1];
"IF" H > ABSH "THEN" H:= ABSH
"END";
"IF" FI "THEN"
"BEGIN" J:= L; "IF" FXJ * H < 0 "EQV" POS "THEN" H:= - H "END"
"ELSE" "IF" D[2] * H < 0 "THEN" H:= - H; I:= 0;
AGAIN: RKSTEP(H, I); REJ:= "FALSE"; FHM:= 0;
ABSH:= ABS(H);
"FOR" I:= 0 "STEP" 1 "UNTIL" N "DO"
"BEGIN" TOL:= E[2 * I] * ABS(K[0,I]) + E[2 * I + 1] *
ABSH; REJ:= TOL < DISCR[I] "OR" REJ;
FH:= DISCR[I] / TOL; "IF" FH > FHM "THEN" FHM:= FH
"END";
MU:= 1 / (1 + FHM) + .45; "IF" REJ "THEN"
"BEGIN" H:= H * MU; I:= 1; "GOTO" AGAIN "END";
"IF" FIRST "THEN"
"BEGIN" FIRST:= FIR; HL:= H; H:= MU * H "END"
"ELSE"
"BEGIN" FH:= MU * H / HL + MU - MU1; HL:= H; H:= FH * H
"END";
ACCEPT: RKSTEP(HL, 2); MU1:= MU; S:= S + HL;
"IF" FIR "THEN"
"BEGIN" COND0:= B; FIR:= "FALSE"; "IF" "NOT"FI "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];
D[1]:= S0:= S; I:= 0; "GOTO" AGAIN;
ZERO: E1[1]:= E[2 * N + 2]; E1[2]:= E[2 * N + 3];
S1:=S ; S:=S0 ;
ZEROIN(S,S1,FZERO,ABS(E1[1]*S)+ABS(E1[2])) ;
RKSTEP(S - S0, 3);
"FOR" I:= 0 "STEP" 1 "UNTIL" N "DO" D[I + 3]:= X[I]; D[1]:= S
"END" RK5NA;
"EOP"
1SECTION : 5.2.1.1.1.1.F (FEBRUARY 1979) PAGE 1
PROCEDURE : MULTISTEP.
AUTHOR: P.W.HEMKER.
INSTITUTE: MATHEMATICAL CENTRE.
RECEIVED: 730515.
BRIEF DESCRIPTION:
MULTISTEP SOLVES AN INITIAL VALUE PROBLEM, FOR A SYSTEM OF
FIRST ORDER ORDINARY DIFFERENTIAL EQUATIONS DY = F(Y).
IN PARTICULAR THIS PROCEDURE IS SUITABLE FOR THE INTEGRATION OF
STIFF DIFFERENTIAL EQUATIONS. IT CAN ALSO BE USED FOR
NON-STIFF PROBLEMS.
KEYWORDS:
INITIAL VALUE PROBLEM,
SYSTEM OF FIRST ORDER ORDINARY DIFFERENTIAL EQUATIONS.
STIFF EQUATIONS,
1SECTION : 5.2.1.1.1.1.F (FEBRUARY 1979) PAGE 2
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE READS:
"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;
"CODE" 33080;
MULTISTEP DELIVERS THE FOLLOWING BOOLEAN VALUE:
IF DIFFICULTIES ARE ENCOUNTERED DURING THE INTEGRATION
(I.E. SAVE[-1] ^= 0 "OR" SAVE[-2] ^= 0 ) MULTISTEP IS SET
TO "FALSE", OTHERWISE MULTISTEP IS SET "TRUE".
THE MEANING OF THE FORMAL PARAMETERS IS:
X: <VARIABLE>;
THE INDEPENDENT VARIABLE X.
CAN BE USED IN DERIV, AVAILABLE ETC.;
ENTRY: THE INITIAL VALUE X0;
EXIT : THE FINAL VALUE 'XEND';
XEND: <ARITHMETIC EXPRESSION>;
THE FINAL VALUE OF X ( XEND >= X );
Y: <ARRAY IDENTIFIER>;
"ARRAY" Y[1:6*N];
THE DEPENDENT VARIABLE;
ENTRY Y[1:N] : THE INITIAL VALUES OF THE SOLUTION OF THE
SYSTEM OF DIFFERENTIAL EQUATIONS AT X = X0;
EXIT Y[1:N] : THE FINAL VALUES OF THE SOLUTION AT X = XEND;
HMIN,HMAX: <ARITHMETIC EXPRESSION>;
ENTRY : MINIMAL RESP. MAXIMAL STEPLENGTH ALLOWED;
YMAX: <ARRAY IDENTIFIER>;
"ARRAY" YMAX[1:N];
ENTRY: THE ABSOLUTE LOCAL ERROR BOUND DIVIDED BY EPS
EXIT : YMAX[1] GIVES THE MAXIMAL VALUE OF THE ENTRY VALUE
OF YMAX[I] AND THE VALUES OF ABS(Y[I]) DURING
INTEGRATION;
EPS: <ARITHMETIC EXPRESSION>;
THE RELATIVE LOCAL ERROR BOUND;
FIRST: <IDENTIFIER>;
IF FIRST = "TRUE" THEN THE PROCEDURE STARTS THE INTEGRATION
WITH A FIRST ORDER ADAMS METHOD AND A STEPLENGTH EQUAL
TO HMIN. UPON COMPLETION OF A CALL FIRST:= "FALSE";
IF FIRST = "FALSE" THEN THE PROCEDURE CONTINUES
INTEGRATION;
1SECTION : 5.2.1.1.1.1.F (DECEMBER 1979) PAGE 3
SAVE: <ARRAY IDENTIFIER>;
"ARRAY" SAVE[-38:6*N];
IN THIS ARRAY THE PROCEDURE STORES INFORMATION WHICH CAN BE
USED IN A CONTINUING CALL WITH FIRST="FALSE";
BESIDES THE FOLLOWING MESSAGES ARE DELIVERED:
SAVE[ 0]=0 : AN ADAMS METHOD HAS BEEN USED;
1 : THE PROCEDURE SWITCHED TO GEARS METHOD;
SAVE[-1]=0 : NO ERROR MESSAGE;
1 : WITH THE HMIN SPECIFIED THE PROCEDURE CANNOT
HANDLE THE NONLINEARITY (DECREASE HMIN! );
SAVE[-2] NUMBER OF TIMES THAT THE REQUESTED LOCAL ERROR
BOUND WAS EXCEEDED;
SAVE[-3] IF SAVE[-2] IS NONZERO THEN SAVE[-3] GIVES AN
ESTIMATE OF THE MAXIMAL LOCAL ERROR BOUND,
OTHERWISE SAVE[-3]=0;
DERIV: <PROCEDURE IDENTIFIER>;
THE HEADING OF THIS PROCEDURE READS:
"PROCEDURE" DERIV(DF); "ARRAY" DF;
THIS PROCEDURE SHOULD DELIVER DY[I]/DX IN DF[I];
AVAILABLE: <BOOLEAN EXPRESSION>;
IF AN ANALYTICAL EXPRESSION OF THE JACOBIAN MATRIX IS NOT
AVAILABLE THIS EXPRESSION IS SET TO "FALSE";
OTHERWISE THIS EXPRESSION IS SET TO "TRUE" AND THE
EVALUATION OF THIS BOOLEAN EXPRESSION MUST EFFECT THE
FOLLOWING SIDE-EFFECT:
THE ENTRIES OF THE JACOBIAN MATRIX D(DY[I]/DX)/DY[J] ARE
DELIVERED IN THE ARRAY ELEMENTS JACOBIAN[I,J];
JACOBIAN: <ARRAY IDENTIFIER>;
"ARRAY" JACOBIAN[1:N,1:N];
AT EACH EVALUATION OF THE BOOLEAN EXPRESSION AVAILABLE WITH
THE RESULT AVAILABLE:="TRUE", THE JACOBIAN MATRIX HAS TO BE
ASSIGNED TO THIS ARRAY (SEE THE EXAMPLE OF USE);
STIFF: <BOOLEAN EXPRESSION>;
IF STIFF = "TRUE" THE PROCEDURE SKIPS AN ATTEMPT TO SOLVE
THE PROBLEM WITH ADAMS-BASHFORTH- OR ADAMS-MOULTON
METHODS, DIRECTLY USING GEARS METHOD;
N: <ARITHMETIC EXPRESSION>;
THE NUMBER OF EQUATIONS;
OUT: <PROCEDURE IDENTIFIER>;
THE HEADING OF THIS PROCEDURE READS:
"PROCEDURE" OUT(H,K); "VALUE" H,K; "REAL" H; "INTEGER" K;
AT THE END OF EACH ACCEPTED STEP OF THE INTEGRATION PROCESS
THIS PROCEDURE IS CALLED. THE LAST STEPLENGTH USED (H) AND
THE ORDER OF THE METHOD (K) ARE DELIVERED.
AT EACH CALL OF THE PROCEDURE OUT, THE CURRENT VALUES OF
THE INDEPENDENT VARIABLE (X) AND OF THE SOLUTION (Y[I](X) )
ARE AVAILABLE FOR USE. MOREOVER, IN THE NEIGHBOURHOOD OF
THE CURRENT VALUE OF X, ANY VALUE OF Y[I](X SPECIFIED) CAN
BE COMPUTED BY MEANS OF THE FOLLOWING INTERPOLATION FORMULA
Y[I](X SPECIFIED) =
SUM(J,0,K, Y[I+J*N] * ((X SPECIFIED - X)/H) ** J ).
1SECTION : 5.2.1.1.1.1.F (DECEMBER 1979) PAGE 4
PROCEDURES USED:
MATVEC = CP34011 ,
DEC = CP34300 ,
SOL = CP34051 .
REQUIRED CENTRAL MEMORY: CIRCA N * ( 2 * N + 5 ) MEMORY PLACES.
METHOD AND PERFORMANCE :
MULTISTEP IS BASED ON TWO LINEAR MULTISTEP METHODS. FOR STIFF
PROBLEMS IT USES THE BACKWARD DIFFERENTIATION METHODS, FOR
FOR NON-STIFF PROBLEMS THE ADAMS-BASHFORTH-MOULTON METHODS.
MULTISTEP IS PROVIDED WITH ORDER, STEPSIZE AND ERROR CONTROL.
REFERENCES:
[1].P.W.HEMKER.
AN ALGOL 60 PROCEDURE FOR THE SOLUTION OF STIFF DIFFERENTIAL
EQUATIONS.
MATH. CENTRE, AMSTERDAM. REPORT MR 128/71;
EXAMPLE OF USE:
THE SOLUTION AT X=1 AND AT X=10 OF THE DIFFERENTIAL EQUATIONS:
DY[1]/DX = 0.04 * (1-Y[1]-Y[2]) - Y[1] * ("4*Y[2] + 3"7*Y[1])
DY[2]/DX = 3"7 Y[1]**2
WITH THE INITIAL CONDITIONS AT X = 0 :
Y[1] = 0 AND Y[2] = 0
MAY BE OBTAINED BY THE FOLLOWING PROGRAM:
1SECTION : 5.2.1.1.1.1.F (AUGUST 1974) PAGE 5
"BEGIN"
"BOOLEAN" FIRST;
"INTEGER" I,J,CF,CJ,CA;
"REAL" X,XEND,HMIN,EPS,R;
"ARRAY" Y[1:12],YMAX[1:2],D[-40:12],JAC[1:2,1:2];
"PROCEDURE" DER (F);"ARRAY" F;
"BEGIN" "REAL" R; CF:=CF+1;
F[2]:= R:= 3"7*Y[1]*Y[1];
F[1]:= 0.04*(1-Y[1]-Y[2]) - "4*Y[1]*Y[2] - R;
"END" F;
"BOOLEAN" "PROCEDURE" AVAIL;
"BEGIN" "REAL" R; CJ:= CJ+1;
AVAIL:= "TRUE";
JAC[2,1]:= R:= 6"7*Y[1];
JAC[1,1]:= -0.04 - "4*Y[2] - R;
JAC[1,2]:= -0.04 - "4*Y[1];
JAC[2,2]:= 0
"END" JAC AVAIL;
"PROCEDURE" OUT(H,K);
"VALUE" H, K; "REAL" H; "INTEGER" K; CA:= CA+1;
LABEL:
OUTPUT(61,"("/,"("HMIN,EPS?")",/")");
INREAL(70,HMIN); INREAL(70,EPS);
"IF" HMIN<0 "THEN" "GOTO" ESCAPE;
FIRST:= "TRUE"; CA:=CF:=CJ:=0;
X:=0; Y[1]:= Y[2]:= 0;
YMAX[1]:= 0.0001; YMAX[2]:= 1;
"FOR" XEND:= 1, 10 "DO"
"BEGIN"
MULTISTEP(X,XEND,Y,HMIN,5,YMAX,EPS,FIRST,D,DER,AVAIL,
JAC,"TRUE",2,OUT);
OUTPUT(61,"("3(5ZD,2B),2(+.13D"+2D,2B),/")",
CA,CF,CJ,Y[1],Y[2]);
"END";
"GOTO" LABEL;
ESCAPE:
"END"
IT DELIVERS WITH HMIN = "-10 AND EPS = "-9:
240 648 2 +.3074626[602000]"-04 +.3350951[493111]"-01
315 902 3 +.16233909[62091]"-04 +.15861383[92015]"+00
(NON-SIGNIFICANT DIGITS ARE PLACED BETWEEN [ ] ).
1SECTION : 5.2.1.1.1.1.F (DECEMBER 1979) PAGE 6
SOURCE TEXT(S):
0"CODE" 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" NORM2(AI); "REAL" AI;
"BEGIN" "REAL" S,A; S:= 1.0"-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; "COMMENT"
1SECTION : 5.2.1.1.1.1.F (AUGUST 1974) PAGE 7
;
"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; "COMMENT"
1SECTION : 5.2.1.1.1.1.F (DECEMBER 1979) PAGE 8
;
"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.0"-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 "OR" FAILS ^= 0
"THEN" 0 "ELSE"
0.70 * (TOLUP/NORM2(DELTA[I] - LAST DELTA[I])) **
(0.5/(K+2));
"IF" A1 > A2 "AND" 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:= "NOT" STIFF; WITH JACOBIAN:= "NOT" ADAMS;
"IF" WITH JACOBIAN "THEN" EVALUATE JACOBIAN;
METHOD;
NEW START: K:= 1; SAME:= 2; ORDER; DERIV(DF);
H:= "IF" "NOT" 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:= "NOT" ADAMS; CH:= 1;
K:=KOLD; RESET; ORDER;
DECOMPOSE:= WITH JACOBIAN
"END";
FAILS:= 0; "COMMENT"
1SECTION : 5.2.1.1.1.1.F (AUGUST 1974) PAGE 9
;
"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 "AND" ABS(DFI) < TOLCONV * YMAX[I]
"END";
"IF" CONV "THEN"
"BEGIN" ERROR:= NORM2(DELTA[I]);
"GOTO" CONVERGENCE
"END"
"END"; "COMMENT"
1SECTION : 5.2.1.1.1.1.F (DECEMBER 1979) PAGE 10
;
"COMMENT" ACCEPTANCE OR REJECTION;
"IF" "NOT" CONV "THEN"
"BEGIN" "IF" "NOT" WITH JACOBIAN "THEN"
"BEGIN" EVALUATE:= WITH JACOBIAN:= SAME >= K
"OR" H<1.1 * HMIN;
"IF" "NOT" WITH JACOBIAN "THEN" CH:= CH/4;
"END" "ELSE"
"IF" "NOT" DECOMPOSED "THEN" DECOMPOSE:= "TRUE" "ELSE"
"IF" "NOT" 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" "COMMENT"
1SECTION : 5.2.1.1.1.1.F (AUGUST 1974) PAGE 11
;
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 "AND" SAVE[-2]=0
"END" MULTISTEP;
"EOP"
1SECTION : 5.2.1.1.1.1.G (FEBRUARY 1979) PAGE 1
PROCEDURE : DIFFSYS.
AUTHORS : R.BULIRSCH AND J.STOER.
CONTRIBUTOR: K.DEKKER.
INSTITUTE: MATHEMATICAL CENTRE.
RECEIVED: 731231.
BRIEF DESCRIPTION:
DIFFSYS SOLVES AN INITIAL VALUE PROBLEM ,FOR A SYSTEM OF FIRST
ORDER ORDINARY DIFFERENTIAL EQUATIONS DY / DX = F(X,Y).
THE METHOD IS RECOMMENDED IF HIGH ACCURACY IS DESIRED.
DIFFSYS IS NOT SUITED FOR STIFF EQUATIONS.
KEYWORDS:
INITIAL VALUE PROBLEMS,
SYSTEM OF FIRST ORDER ORDINARY DIFFERENTIAL EQUATIONS.
1SECTION : 5.2.1.1.1.1.G (FEBRUARY 1979) PAGE 2
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE DIFFSYS READS:
"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;
"CODE" 33180;
THE MEANING OF THE FORMAL PARAMETERS IS:
X: <VARIABLE>;
THE INDEPENDENT VARIABLE ;
ENTRY: THE INITIAL VALUE X0;
EXIT : THE FINAL VALUE XE;
XE: <ARITHMETIC EXPRESSION>;
THE FINAL VALUE OF X (XE>=X);
N: <ARITHMETIC EXPRESSION>;
THE NUMBER OF EQUATIONS;
Y: <ARRAY IDENTIFIER>;
"REAL" "ARRAY" Y[1:N];
THE DEPENDENT VARIABLE;
ENTRY: THE INITIAL VALUES OF THE SYSTEM OF DIFFERENTIAL
EQUATIONS AT X=X0;
EXIT : THE FINAL VALUES OF THE SOLUTION AT X=XE;
DERIVATIVE: <PROCEDURE IDENTIFIER>;
THE HEADING OF THIS PROCEDURE READS:
"PROCEDURE" DERIVATIVE(X,Y,DY); "REAL" X; "ARRAY" Y,DY;
THIS PROCEDURE SHOULD DELIVER THE RIGHT HAND SIDE OF
THE I-TH DIFFERENTIAL EQUATION AT THE POINT (X,Y) AS DY[I],
I=1,...,N;
AETA: <ARITHMETIC EXPRESSION>;
REQUIRED ABSOLUTE PRECISION IN THE INTEGRATION PROCESS;
RETA: <ARITHMETIC EXPRESSION>;
REQUIRED RELATIVE PRECISION IN THE INTEGRATION PROCESS;
S: <ARRAY IDENTIFIER>;
"REAL" "ARRAY" S[1:N];
THE ARRAY S IS USED TO CONTROL THE ACCURACY OF THE COMPUTED
VALUES OF Y;
ENTRY: IT IS ADVISABLE TO SET S[I]=0, I=1,...,N;
EXIT : THE MAXIMUM VALUE OF ABS(Y[I]), ENCOUNTERED DURING
INTEGRATION, IF THIS VALUE EXCEEDS THE VALUE OF S[I]
ON ENTRY;
H0: <VARIABLE>;
THE INITIAL STEP TO BE TAKEN;
OUTPUT: <PROCEDURE IDENTIFIER>;
THE HEADING OF THIS PROCEDURE READS;
"PROCEDURE" OUTPUT;
THIS PROCEDURE IS CALLED AT THE END OF EACH INTEGRATION
STEP ; THE USER CAN ASK FOR OUTPUT OF SOME PARAMETERS , FOR
EXAMPLE X, Y, S.
1SECTION : 5.2.1.1.1.1.G (FEBRUARY 1979) PAGE 3
PROCEDURES USED: NONE.
REQUIRED CENTRAL MEMORY : CIRCA 28* N MEMORY PLACES.
METHOD AND PERFORMANCE:
THE PROCEDURE DIFFSYS IS A SLIGHT MODIFICATION OF THE ALGORITHM
PUBLISHED BY BULIRSCH AND STOER (SEE REF[1]) . BY THIS MODIFICATION
INTEGRATION FROM X0 UNTIL XE CAN BE PERFORMED BY ONE CALL OF
DIFFSYS. A NUMBER OF INTEGRATION STEPS ARE TAKEN, STARTING WITH THE
INITIAL STEP H0. IN EACH INTEGRATION STEP A NUMBER OF SOLUTIONS ARE
COMPUTED BY MEANS OF THE MODIFIED MIDPOINT RULE . EXTRAPOLATION IS
USED TO IMPROVE THESE SOLUTIONS,UNTIL THE REQUIRED ACCURACY IS MET.
AN INTEGRATION STEP IS REJECTED, IF THE ACCURACY REQUIREMENTS ARE
NOT FULFILLED AFTER NINE EXTRAPOLATION STEPS . IN THESE CASES THE
INTEGRATION STEP IS REJECTED , AND INTEGRATION IS TRIED AGAIN WITH
THE INTEGRATION STEP HALVED.
THE ALGORITHM IS FOR EACH STEP A VARIABLE ORDER METHOD (THE HIGHEST
ORDER IS 14 ), AND USES A VARIABLE NUMBER OF FUNCTION EVALUATIONS,
DEPENDING ON THE ORDER (MINIMUM IS 3, MAXIMUM IS 217).
THE ALGORITHM IS LESS SENSITIVE TO TOO SMALL VALUES OF THE INITIAL
STEPSIZE THAN THE ORIGINAL ALGORITHM ( SEE REF [2] ); HOWEVER BAD
GUESSES REQUIRE STILL SOME MORE COMPUTATIONS.
REFERENCES:
[1]. R.BULIRSCH AND J.STOER.
NUMERICAL TREATMENT OF ORDINARY DIFFERENTIAL EQUATIONS BY
EXTRAPOLATION METHODS.
NUMERISCHE MATHEMATIK, VOLUME 8, PAGE 1-13, 1965.
[2]. PHYLLIS FOX.
A COMPARATIVE STUDY OF COMPUTER PROGRAMS FOR INTEGRATING
DIFFERENTIAL EQUATIONS.
COMMUNICATIONS OF THE A.C.M., VOLUME 15, PAGE 941-948, 1972.
[3]. T.E.HULL, W.H.ENRIGHT, B.M.FELLEN AND A.E.SEDGWICK.
COMPARING NUMERICAL METHODS FOR ORDINARY DIFFERENTIAL
EQUATIONS.
SIAM JOURNAL ON NUMERICAL ANALYSIS,VOLUME 9,PAGE 603-635,1972.
1SECTION : 5.2.1.1.1.1.G (AUGUST 1974) PAGE 4
EXAMPLE OF USE:
THE FOLLOWING PROGRAM ILLUSTRATES THE COSTS AND THE ACCURACIES
WHICH ARE OBTAINED WHEN SOLVING A SYSTEM OF DIFFERENTIAL EQUATIONS
ARISING FROM THE RESTRICTED PROBLEM OF THREE BODIES ( SEE REF[1] ).
THE SOLUTION IS A CLOSED ORBIT WITH PERIOD T=6.192169331396.
"BEGIN"
"INTEGER" PASSES,K;
"REAL" X,XE,TIME,TOL,H0;
"REAL" "ARRAY" Y,S[1:4];
"PROCEDURE" DER(X,Y,DY); "REAL" X; "ARRAY" Y,DY;
"BEGIN" "REAL" MU,MU1,Y1,Y2,Y3,Y4,S1,S2;
MU:=1/82.45; MU1:=1-MU;
PASSES:=PASSES+1;
Y1:=Y[1]; Y2:=DY[1]:=Y[2]; Y3:=Y[3]; Y4:=DY[3]:=Y[4];
S1:=(Y1+MU)**2+Y3**2; S2:=(Y1-MU1)**2+Y3**2;
S1:=S1*SQRT(S1); S2:=S2*SQRT(S2);
DY[2]:=Y1+2*Y4-MU1*(Y1+MU)/S1-MU*(Y1-MU1)/S2;
DY[4]:=Y3-2*Y2-MU1*Y3/S1-MU*Y3/S2
"END";
"PROCEDURE" OUT;
"BEGIN" K:=K+1;
"IF" X>=XE "THEN"
OUTPUT(61,"("2(-5ZD),2(4B+Z.3DB3DB3DB3D),-5ZD.3D,/")",K,
PASSES,Y[1],Y[3],CLOCK-TIME)
"END";
OUTPUT(61,"(""(" THIS LINE AND THE FOLLOWING TEXT IS ")"
"("PRINTED BY THIS PROGRAM")",//,
"(" THE RESULTS WITH DIFFSYS - H0=.2 - ARE: ")",/,
"(" K DER.EV. Y[1] Y[3] ")",
"(" TIME")",/")");
"FOR" TOL:="-4,"-6,"-8,"-10,"-12 "DO"
"BEGIN" PASSES:=K:=0; X:=0; XE:=6.192169331396;
Y[1]:=1.2; Y[2]:=Y[3]:=0; Y[4]:=-1.04935750983;
S[1]:=S[2]:=S[3]:=S[4]:=0; H0:=.2; TIME:=CLOCK;
DIFFSYS(X,XE,4,Y,DER,TOL,TOL,S,H0,OUT);
"END"
"END"
THIS LINE AND THE FOLLOWING TEXT IS PRINTED BY THIS PROGRAM:
THE RESULTS WITH DIFFSYS - H0=.2 - ARE:
K DER.EV. Y[1] Y[3] TIME
30 2591 +1.320 357 347 741 -.032 645 454 836 5.686
33 3414 +1.200 078 037 878 -.000 053 906 067 7.455
37 4213 +1.200 003 282 801 -.000 002 363 741 9.267
44 4618 +1.199 999 999 711 -.000 000 000 095 10.242
56 6299 +1.200 000 000 003 -.000 000 000 090 13.827
1SECTION : 5.2.1.1.1.1.G (AUGUST 1974) PAGE 5
SOURCE TEXT:
0"CODE" 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+"-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 "AND" 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" "COMMENT"
1SECTION : 5.2.1.1.1.1.G (AUGUST 1974) PAGE 6
;
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 "AND" 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" "NOT" LAST "THEN" "GOTO" NEXT;
"END" DIFFSYS;
"EOP"
1SECTION : 5.2.1.1.1.1.H (FEBRUARY 1979) PAGE 1
PROCEDURE : ARK.
AUTHOR: P.A. BEENTJES.
INSTITUTE: MATHEMATICAL CENTRE.
RECEIVED: 740510.
BRIEF DESCRIPTION:
ARK SOLVES AN INITIAL VALUE PROBLEM, FOR A SYSTEM OF FIRST ORDER
ORDINARY DIFFERENTIAL EQUATIONS . ARK IS RECOMMENDED FOR THE
INTEGRATION OF SEMI-DISCRETE PARABOLIC AND HYPERBOLIC
INITIAL-BOUNDARY PROBLEMS.
KEYWORDS:
INITIAL VALUE PROBLEM,
SEMI-DISCRETE PARABOLIC AND HYPERBOLIC PROBLEM.
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE READS:
"PROCEDURE" ARK (T, TE, M0, M, U, DERIVATIVE, DATA, OUT);
"INTEGER" M0, M; "REAL" T, TE; "ARRAY" U, DATA;
"PROCEDURE" DERIVATIVE, OUT;
"CODE" 33061;
ARK : INTEGRATES THE SYSTEM OF ORDINARY DIFFERENTIAL EQUATIONS
DU / DT = H(T, U), U = U0 AT T = T0.
THE MEANING OF THE FORMAL PARAMETERS IS:
T: <VARIABLE>;
THE INDEPENDENT VARIABLE T;
ENTRY: THE INITIAL VALUE T0;
EXIT : THE FINAL VALUE TE;
TE: <ARITHMETIC EXPRESSION>;
THE FINAL VALUE OF T (TE >= T);
M0,M: <ARITHMETIC EXPRESSION>;
INDICES OF THE FIRST AND LAST EQUATION OF THE SYSTEM;
U: <ARRAY IDENTIFIER>;
"ARRAY" U[M0 : M];
ENTRY: THE INITIAL VALUES OF THE SOLUTION OF THE SYSTEM OF
DIFFERENTIAL EQUATIONS AT T = T0;
EXIT : THE VALUES OF THE SOLUTION AT T = TE;
1SECTION : 5.2.1.1.1.1.H (FEBRUARY 1979) PAGE 2
DERIVATIVE: <PROCEDURE IDENTIFIER>;
THE HEADING OF THIS PROCEDURE READS:
"PROCEDURE" DERIVATIVE(T, V); "REAL" T; "ARRAY" V;
THIS PROCEDURE PERFORMS AN EVALUATION OF THE RIGHT HAND
SIDE OF THE SYSTEM WITH DEPENDENT VARIABLES V[M0 : M] AND
INDEPENDENT VARIABLE T; UPON COMPLETION OF DERIVATIVE, THE
RIGHT HAND SIDE SHOULD BE OVERWRITTEN ON V[M0 : M];
DATA: <ARRAY IDENTIFIER>;
"ARRAY" DATA[1 : 10 + DATA[1]];
IN ARRAY DATA ONE SHOULD GIVE:
DATA[1]: THE NUMBER OF EVALUATIONS OF H(T, U) PER
INTEGRATION STEP(DATA[1] >= DATA[2]);
DATA[2]: THE ORDER OF ACCURACY OF THE METHOD (DATA[2]<=3);
DATA[3]: STABILITY BOUND(SEE REFERENCE [3]);
DATA[4]: THE SPECTRAL RADIUS OF THE JACOBIAN MATRIX WITH
RESPECT TO THOSE EIGENVALUES, WHICH ARE LOCATED
IN THE NON-POSITIVE HALF PLANE;
DATA[5]: THE MINIMAL STEPSIZE;
DATA[6]: THE ABSOLUTE TOLERANCE;
DATA[7]: THE RELATIVE TOLERANCE;
IF BOTH DATA[6] AND DATA[7] ARE NEGATIVE, THE
INTEGRATION IS PERFORMED WITH A CONSTANT STEP
DATA[5];
DATA[8]: DATA[8] SHOULD BE 0 IF ARK IS CALLED FOR
A FIRST TIME; FOR CONTINUED INTEGRATION
DATA[8] SHOULD NOT BE CHANGED;
DATA[11], ..., DATA[10 + DATA[1]]: POLYNOMIAL COEFFICIENTS
(SEE REFERENCE [3]);
AFTER EACH STEP THE FOLLOWING BY-PRODUCTS ARE DELIVERED:
DATA[8]: THE NUMBER OF INTEGRATION STEPS PERFORMED;
DATA[9]: AN ESTIMATION OF THE LOCAL ERROR LAST MADE;
DATA[10]: INFORMATIVE MESSAGES:
DATA[10] = 0: NO DIFFICULTIES;
DATA[10] = 1: MINIMAL STEPLENGTH EXCEEDS THE
STEPLENGTH PRESCRIBED BY STABILITY
THEORY, I.E. DATA[5] > DATA[3] / DATA[4];
(TERMINATION OF ARK);
DECREASE MINIMAL STEPLENGTH;
IF NECESSARY, DATA[I],I = 4(1)7, CAN BE UPDATED(AFTER EACH
STEP) BY MEANS OF PROCEDURE OUT;
OUT: <PROCEDURE IDENTIFIER>;
THE HEADING OF THIS PROCEDURE READS:
"PROCEDURE" OUT;
AFTER EACH INTEGRATION STEP PERFORMED INFORMATION CAN BE
OBTAINED OR UPDATED BY THIS PROCEDURE, E.G. THE VALUES OF
T, U[M0 : M] AND DATA[I], I = 4(1)10.
1SECTION : 5.2.1.1.1.1.H (FEBRUARY 1979) PAGE 3
DATA AND RESULTS:
FOR THE INDICES M0 AND M THE FOLLOWING REMARKS CAN BE MADE:
WHEN THE METHOD OF LINES IS APPLIED TO HYPERBOLIC DIFFERENTIAL
EQUATIONS THE NUMBER OF RELEVANT ORDINARY DIFFERENTIAL EQUATIONS
DECREASES DURING THE INTEGRATION PROCESS; IN PROCEDURE ARK
THIS MAY BE REALIZED BY INTEGERS M0 AND M, WHICH ARE
DEFINED AS FUNCTIONS OF THE NUMBER OF RIGHT HAND SIDE EVALUATIONS.
A SELECTION OF POSSIBLE ENTRIES FOR ARRAY DATA (DEPENDENT ON THE
KIND OF INITIAL VALUE PROBLEM) IS GIVEN IN REFERENCE [4],SECTION 8.
PROCEDURES USED:
INIVEC = CP31010,
MULVEC = CP31020,
DUPVEC = CP31030,
VECVEC = CP34010,
ELMVEC = CP34020,
DECSOL = CP34301.
REQUIRED CENTRAL MEMORY : CIRCA 75 + 2 * (M - M0) MEMORY PLACES.
METHOD AND PERFORMANCE:
ARK IS AN IMPLEMENTATION OF LOW ORDER STABILIZED RUNGE KUTTA
METHODS (SEE REFERENCE [1]);
AUTOMATIC STEPSIZE CONTROL IS PROVIDED BUT STEP-REJECTION HAS BEEN
EXCLUDED IN ORDER TO SAVE STORAGE;
BECAUSE OF ITS LIMITED STORAGE REQUIREMENTS AND ADAPTIVE STABILITY
FACILITIES THE METHOD IS WELL SUITED FOR THE SOLUTION OF INITIAL
BOUNDARY VALUE PROBLEMS FOR PARTIAL DIFFERENTIAL EQUATIONS;
NUMERICAL RESULTS, OBTAINED WITH A SLIGHTLY DIFFERENT
IMPLEMENTATION CAN BE FOUND IN REFERENCE [2].
REFERENCES:
[1]. P.J. VAN DER HOUWEN.
STABILIZED RUNGE KUTTA METHOD WITH LIMITED
STORAGE REQUIREMENTS.
MATH. CENTR. REPORT TW 124/71;
[2]. P.A. BEENTJES.
AN ALGOL 60 VERSION OF STABILIZED RUNGE KUTTA
METHODS (DUTCH).
MATH. CENTR. REPORT NR 23/72;
1SECTION : 5.2.1.1.1.1.H (DECEMBER 1975) PAGE 4
[3]. P.J. VAN DER HOUWEN, J. KOK.
NUMERICAL SOLUTION OF A MINIMAX PROBLEM.
MATH. CENTR. REPORT TW 123/71;
[4]. P.J. VAN DER HOUWEN ET AL.
ONE STEP METHODS FOR LINEAR INITIAL VALUE PROBLEMS, I.I.I.
NUMERICAL EXAMPLES,
MATH. CENTR. REPORT TW 130/71.
EXAMPLE OF USE:
THE VALUES OF
1. Y(1) AND Y(2) OF THE INITIAL VALUE PROBLEM
DY / DX = Y - 2 * X / Y, Y(0) = 1
AND
2. U(.6, 0) OF THE CAUCHY PROBLEM (SEE REFERENCE [2]):
DU / DT = .5 * DU / DX, U(0, X) = EXP(-X * X)
MAY BE OBTAINED BY THE FOLLOWING PROGRAM:
"BEGIN" "INTEGER" M0, M, I; "REAL" T, TE, DAT;
"ARRAY" Y[1 : 1], U[-150 : 150], DATA[1 : 14];
"PROCEDURE" DER1(T, V); "REAL" T; "ARRAY" V;
V[1]:= V[1] - 2 * T / V[1];
"PROCEDURE" DER2(T, V); "REAL" T; "ARRAY" V;
"BEGIN" "INTEGER" J; "REAL" V1, V2, V3;
V2:= V[M0]; M0:= M0 + 1; M:= M - 1; V3:= V[M0];
"FOR" J:= M0 "STEP" 1 "UNTIL" M "DO"
"BEGIN" V1:= V2; V2:= V3; V3:= V[J + 1];
V[J]:= 250 * (V3 - V1) / 3
"END"
"END" DER2;
1SECTION : 5.2.1.1.1.1.H (DECEMBER 1975) PAGE 5
"PROCEDURE" OUT1;
"IF" T = TE "THEN"
"BEGIN" "IF" T = 1 "THEN" OUTPUT(61, "("/, "(" PROBLEM 1")", //,
"(" X NUMBER OF INTEGRATION STEPS Y(COMPUTED) Y(EXACT)")",
//")");
OUTPUT(61, "("ZD, 13ZD,12B,2(-3ZD.7D),"("...")", /")",
T, DATA[8], Y[1], SQRT(2 * T + 1));
TE:= 2
"END" OUT1;
"PROCEDURE" OUT2;
"IF" T = .6 "THEN"
OUTPUT(61, "("//, "(" PROBLEM 2")", //,
"(" NUMBER OF DERIVATIVE CALLS")",
"(" U(.6, 0)COMPUTED U(.6, 0)EXACT")", //, 13ZD,
2(-10Z.7D), "("...")"")", DATA[1] * DATA[8], U[0], EXP(-.09));
I:= 1;
"FOR" DAT:= 3, 3, 1, 1, "-3, "-6, "-6, 0, 0, 0, 1, .5, 1 / 6 "DO"
"BEGIN" DATA[I]:= DAT; I:= I + 1 "END";
T:= 0; Y[1]:= 1; TE:= 1;
ARK(T, TE, 1, 1, Y, DER1, DATA, OUT1);
I:= 1;
"FOR" DAT:= 4, 3, SQRT(8), 500 / 3, DATA[3] / DATA[4], -1, -1,
0, 0, 0, 1, .5, 1 / 6, 1 / 24 "DO"
"BEGIN" DATA[I]:= DAT; I:= I + 1 "END";
M0:= -150; M:= 150; T:= 0; U[0]:= 1;
"FOR" I:= 1 "STEP" 1 "UNTIL" M "DO"
U[I]:= U[-I]:= EXP(-(.003 * I) ** 2);
ARK(T, .6, M0, M, U, DER2, DATA, OUT2)
"END"
THIS PROGRAM DELIVERS:
PROBLEM 1
X NUMBER OF INTEGRATION STEPS Y(COMPUTED) Y(EXACT)
1 38 1.7320535 1.7320508...
2 56 2.2360928 2.2360680...
PROBLEM 2
NUMBER OF DERIVATIVE CALLS U(.6, 0)COMPUTED U(.6, 0)EXACT
144 .9139326 .9139312...
1SECTION : 5.2.1.1.1.1.H (FEBRUARY 1979) PAGE 6
SOURCE TEXT(S):
0"CODE" 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" 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;
"COMMENT"
1SECTION : 5.2.1.1.1.1.H (DECEMBER 1979) PAGE 7
;
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]:= " - 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
1SECTION : 5.2.1.1.1.1.H (DECEMBER 1975) PAGE 8
;
"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
1SECTION : 5.2.1.1.1.1.H (DECEMBER 1975) PAGE 9
;
"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;
"EOP"
1SECTION : 5.2.1.1.1.1.I (FEBRUARY 1979) PAGE 1
PROCEDURE : EFRK.
AUTHOR: K.DEKKER.
INSTITUTE: MATHEMATICAL CENTRE.
RECEIVED: 740710.
BRIEF DESCRIPTION:
EFRK SOLVES AN INITIAL VALUE PROBLEM FOR A SYSTEM OF FIRST
ORDER ORDINARY DIFFERENTIAL EQUATIONS DU / DT = H(T,U) .
EFRK IS A SPECIAL PURPOSE PROCEDURE FOR STIFF EQUATIONS WITH A
KNOWN, CLUSTERED EIGENVALUE SPECTRUM.
KEYWORDS:
INITIAL VALUE PROBLEM,
SYSTEM OF FIRST ORDER ORDINARY DIFFERENTIAL EQUATIONS,
STIFF EQUATION.
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE EFRK READS:
"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;
"CODE" 33070;
THE MEANING OF THE FORMAL PARAMETERS IS:
T: <VARIABLE>;
THE INDEPENDENT VARIABLE T;
ENTRY: THE INITIAL VALUE T0;
EXIT : THE FINAL VALUE TE;
TE: <ARITHMETIC ETPRESSION>;
THE FINAL VALUE OF T (TE>=T);
M0: <ARITHMETIC EXPRESSION>;
THE INDEX OF THE FIRST EQUATION;
M: <ARITHMETIC EXPRESSION>;
THE INDEX OF THE LAST EQUATION;
1SECTION : 5.2.1.1.1.1.I (FEBRUARY 1979) PAGE 2
U: <ARRAY IDENTIFIER>;
"REAL" "ARRAY" U[M0:M];
THE DEPENDENT VARIABLE;
ENTRY: THE INITIAL VALUES OF THE SOLUTION OF THE SYSTEM OF
DIFFERENTIAL EQUATIONS AT T = T0;
EXIT : THE VALUES OF THE SOLUTION AT T = TE;
SIGMA: <ARITHMETIC EXPRESSION>;
THE MODULUS OF THE POINT AT WHICH EXPONENTIAL FITTING IS
DESIRED , FOR EXAMPLE AN APPROXIMATION OF THE CENTRE OF THE
LEFT HAND CLUSTER;
PHI: <ARITHMETIC EXPRESSION>;
THE ARGUMENT OF THE CENTRE OF THE LEFT HAND CLUSTER; IN THE
CASE OF TWO COMPLEX CONJUGATED CLUSTERS , THE ARGUMENT OF
THE CENTRE IN THE SECOND QUADRANT SHOULD BE TAKEN;
DIAMETER: <ARITHMETIC EXPRESSION>;
THE DIAMETER OF THE LEFT HAND CLUSTER OF EIGENVALUES OF THE
JACOBIAN MATRIX OF THE SYSTEM OF DIFFERENTIAL EQUATIONS;
IN CASE OF NON-LINEAR EQUATIONS DIAMETER SHOULD HAVE SUCH A
VALUE THAT THE VARIATION OF THE EIGENVALUES IN THIS CLUSTER
IN THE PERIOD ( T ,T+STEP ) IS LESS THAN HALF THE DIAMETER;
DERIVATIVE: <PROCEDURE IDENTIFIER>;
THE HEADING OF THIS PROCEDURE READS:
"PROCEDURE" DERIVATIVE(T,U); "REAL" T; "ARRAY" U;
THIS PROCEDURE SHOULD DELIVER THE VALUE OF H(T,U) IN THE
POINT (T,U) IN THE ARRAY U;
K: <VARIABLE>;
COUNTS THE NUMBER OF INTEGRATION STEPS TAKEN;
FOR EXAMPLE, K MAY BE USED IN THE EXPRESSION FOR TE;
ENTRY: AN (ARBIRARY) CHOSEN VALUE K0, E.G. K0=0;
EXIT : K0 + THE NUMBER OF INTEGRATION STEPS PERFORMED;
STEP: <ARITHMETIC EXPRESSION>;
THE STEPSIZE CHOSEN WILL BE AT MOST EQUAL TO STEP ;
THIS STEPSIZE MAY BE REDUCED BY STABILITY CONSTRAINTS,
IMPOSED BY A POSITIVE DIAMETER , OR BY CONSIDERATIONS OF
INTERNAL STABILITY (SEE REF[1], PAGE 11);
R: <ARITHMETIC EXPRESSION>;
R + L: THE NUMBER OF EVALUATIONS OF H(T, U) ON WHICH THE
RUNGE-KUTTA SCHEME IS BASED;
FOR R=1,2,>=3 FIRST, SECOND AND THIRD ORDER ACCURACY MAY BE
OBTAINED BY AN APPROPRIATE CHOICE OF THE ARRAY BETA;
L: <ARITHMETIC EXPRESSION>;
ENTRY:
IF PHI = 4*ARCTAN(1): THE ORDER OF THE EXPONENTIAL FITTING,
ELSE TWICE THE ORDER OF THE EXPONENTIAL FITTING;
NOTE THAT L SHOULD BE EVEN IN THE LATTER CASE;
BETA: <ARRAY IDENTIFIER>;
"REAL" "ARRAY" BETA[0:R+L];
ENTRY: THE ELEMENTS BETA[I] , I=0, ... ,R SHOULD HAVE THE
VALUE OF THE R+1 FIRST COEFFICIENTS OF THE STABILITY
POLYNOMIAL;
1SECTION : 5.2.1.1.1.1.I (FEBRUARY 1979) PAGE 3
THIRDORDER: <BOOLEAN EXPRESSION>;
IF THIRD ORDER ACCURACY IS DESIRED , THIRDORDER SHOULD HAVE
THE VALUE "TRUE" , IN COMBINATION WITH APPROPRIATE CHOICES
OF R (R>=3) AND THE ARRAY BETA ( BETA[I]=1/I!, I=0,1,2,3 );
IN ALL OTHER CASES THIRDORDER MUST HAVE THE VALUE "FALSE";
TOL: <ARITHMETIC EXPRESSION>;
AN UPPERBOUND FOR THE ROUNDING ERRORS IN THE COMPUTATIONS
IN ONE RUNGE-KUTTA STEP ; IN SOME CASES ( E.G. LARGE VALUES
OF SIGMA AND R ) TOL WILL CAUSE A DECREASE OF THE STEPSIZE;
OUTPUT: <PROCEDURE IDENTIFIER>;
THE HEADING OF THIS PROCEDURE READS;
"PROCEDURE" OUTPUT;
THIS PROCEDURE IS CALLED AT THE END OF EACH INTEGRATION
STEP ; THE USER CAN ASK FOR OUTPUT OF SOME PARAMETERS , FOR
EXAMPLE T, K, U, AND COMPUTE NEW VALUES FOR SIGMA, PHI, AND
DIAMETER.
PROCEDURES USED:
INIVEC= CP31010,
ELMVEC= CP34020,
DEC = CP34300,
SOL = CP34051.
REQUIRED CENTRAL MEMORY : CIRCA 30 + (M - M0) + L * (5 + L).
METHOD AND PERFORMANCE:
EFRK IS BASED ON EXPLICIT RUNGE-KUTTA METHODS OF ORDER 1, 2 AND 3,
WHICH MAKE USE OF EXPONENTIAL FITTING. AUTOMATIC ERROR CONTROL
IS NOT PROVIDED.
A DETAILED DESCRIPTION OF THE METHOD AND SOME NUMERICAL EXAMPLES
ARE GIVEN IN REF[1]. REF [3], PAGE 170 REPRESENTS A BRIEF SURVEY. A
COMPARATIVE TEST OVER A LARGE CLASS OF DIFFERENTIAL EQUATIONS IS
GIVEN IN REF [4].
FROM THESE RESULTS IT APPEARS THAT CALLS WITH THIRDORDER = "TRUE"
ARE LESS ADVISABLE.
1SECTION : 5.2.1.1.1.1.I (FEBRUARY 1979) PAGE 4
REFERENCES:
[1]. K. DEKKER.
AN ALGOL 60 VERSION OF EXPONENTIALLY FITTED RUNGE-KUTTA
METHODS (DUTCH).
NR 25 (1972), MATHEMATICAL CENTRE.
[2]. T. J. DEKKER, P. W. HEMKER AND P. J. VAN DER HOUWEN.
COLLOQUIUM STIFF DIFFERENTIAL EQUATIONS 1 (DUTCH).
MC SYLLABUS 15.1, (1972) MATHEMATICAL CENTRE.
[3]. P. A. BEENTJES, K. DEKKER, H. C. HEMKER, S.P.N. VAN KAMPEN AND
G. M. WILLEMS.
COLLOQUIUM STIFF DIFFERENTIAL EQUATIONS 2 (DUTCH).
MC SYLLABUS 15.2, (1973) MATHEMATICAL CENTRE.
[4]. P. A. BEENTJES, K. DEKKER, H. C. HEMKER AND M. V. VELDHUIZEN.
COLLOQUIUM STIFF DIFFERENTIAL EQUATIONS 3 (DUTCH).
MC SYLLABUS 15.3, (1974) MATHEMATICAL CENTRE.
EXAMPLE OF USE:
CONSIDER THE SYSTEM OF DIFFERENTIAL EQUATIONS:
DY[1]/DX = -Y[1] + Y[1] * Y[2] + .99 * Y[2]
DY[2]/DX = -1000 * ( -Y[1] + Y[1] * Y[2] + Y[2] )
WITH THE INITIAL CONDITIONS AT X = 0:
Y[1] = 1 AND Y[2] = 0. (SEE REF[2], PAGE 11).
THE SOLUTION AT X = 50 IS APPROXIMATELY:
Y[1] = .765 878 320 487 AND Y[2] = .433 710 353 5768.
THE FOLLOWING PROGRAM SHOWS SOME DIFFERENT CALLS OF THE PROCEDURE
EFRK:
1SECTION : 5.2.1.1.1.1.I (AUGUST 1974) PAGE 5
"BEGIN"
"INTEGER" K,R,L,PASSES;
"REAL" X,SIGMA,PHI,TIME,STEP,DIAMETER;
"REAL" "ARRAY" Y[1:2],BETA[0:6];
"PROCEDURE" DER(X,Y); "REAL" X; "ARRAY" Y;
"BEGIN" "REAL" Y1,Y2; Y1:=Y[1]; Y2:=Y[2];
Y[1]:=(Y1+.99)*(Y2-1)+.99;
Y[2]:=1000*((1+Y1)*(1-Y2)-1);
PASSES:=PASSES+1
"END";
"PROCEDURE" OUT;
"BEGIN" "REAL" S;
S:=(-1000*Y[1]-1001+Y[2])/2;
SIGMA:=ABS(S-SQRT(S*S+10*(Y[2]-1)));
DIAMETER:=2*STEP*ABS(1000*(1.99*Y[2]-2*Y[1]*(1-Y[2])));
"IF" X=50 "THEN"
OUTPUT(61,"("4BD,2BD,2(-5ZD),2(4B+.3DB3DB3D),-5ZD.3D,/")",
R,L,K,PASSES,Y[1],Y[2],CLOCK-TIME)
"END";
OUTPUT(61,"(""(" THIS LINE AND THE FOLLOWING TEXT IS ")"
"("PRINTED BY THIS PROGRAM")",//,
"(" THE RESULTS WITH EFRK ARE:")",/,
"(" R L K DER.EV. Y[1] Y[2]")"
"(" TIME")",/")");
PHI:=4*ARCTAN(1); BETA[0]:=BETA[1]:=1;
"FOR" R:=1,2,3 "DO" "FOR" L:=1,2,3 "DO"
"BEGIN" "FOR" K:=2 "STEP" 1 "UNTIL" R "DO"
BETA[K]:=BETA[K-1]/K;
"FOR" STEP:=1,.1 "DO"
"BEGIN" PASSES:=K:=0; X:=Y[2]:=0; Y[1]:=1; TIME:=CLOCK;
OUT;
EFRK(X,50.0,1,2,Y,SIGMA,PHI,DIAMETER,DER,K,STEP,R,L,BETA,
R>=3,"-4,OUT);
"END"; OUTPUT(61,"("/")");
"END";
"END"
1SECTION : 5.2.1.1.1.1.I (AUGUST 1974) PAGE 6
THIS LINE AND THE FOLLOWING TEXT IS PRINTED BY THIS PROGRAM:
THE RESULTS WITH EFRK ARE:
R L K DER.EV. Y[1] Y[2] TIME
1 1 237 474 +.765 812 555 +.433 689 306 1.395
1 1 501 1002 +.765 847 870 +.433 700 619 3.381
1 2 52 156 +.765 570 874 +.433 615 119 0.465
1 2 501 1503 +.765 848 220 +.433 700 709 4.200
1 3 52 208 +.765 571 278 +.433 615 202 0.531
1 3 500 2000 +.765 848 512 +.433 700 827 4.879
2 1 3317 9951 +.765 878 320 +.433 710 353 21.808
2 1 1050 3150 +.765 878 321 +.433 710 330 7.153
2 2 174 696 +.765 878 335 +.433 710 335 1.385
2 2 501 2004 +.765 878 323 +.433 709 211 4.915
2 3 57 285 +.765 881 339 +.433 817 185 0.642
2 3 501 2505 +.765 878 323 +.433 709 725 5.756
3 1 7010 28040 +.765 878 320 +.433 710 354 55.298
3 1 3255 13020 +.765 878 320 +.433 710 374 25.772
3 2 949 4745 +.765 878 319 +.433 711 893 8.499
3 2 1384 6920 +.765 862 498 +.449 724 830 13.452
3 3 917 5502 +.765 878 018 +.434 105 184 9.143
3 3 1166 6996 +.765 861 696 +.433 705 641 15.512
SOURCE TEXT(S):
0"CODE" 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];
"COMMENT"
1SECTION : 5.2.1.1.1.1.I (AUGUST 1974) PAGE 7
;
"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]; "COMMENT"
1SECTION : 5.2.1.1.1.1.I (AUGUST 1974) PAGE 8
;
"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; "COMMENT"
1SECTION : 5.2.1.1.1.1.I (AUGUST 1974) PAGE 9
;
"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; "COMMENT"
1SECTION : 5.2.1.1.1.1.I (AUGUST 1974) PAGE 10
;
"PROCEDURE" STEPSIZE;
"BEGIN" "REAL" D,HSTAB,HSTABINT;
H:=STEP;
D:=ABS(SIGMA*SIN(PHI));
COMPLEX:=L//2*2=L "AND" 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 "OR" ((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 "OR" 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.0**(-48); PI:=PHI0:=PHIL:=4*ARCTAN(1);
INIVEC(M0, M, RL, 0);
NEXTLEVEL:
STEPSIZE;
"IF" CHANGE "THEN" COEFFICIENT;
K:=K+1;
DIFFERENCE SCHEME;
OUTPUT;
"IF" "NOT" LAST "THEN" "GOTO" NEXTLEVEL;
ENDOFEFRK:
"END" EXPONENTIALLY FITTED RUNGE KUTTA;
"EOP"
1SECTION : 5.2.1.1.1.2 (NOVEMBER 1976) PAGE 1
SECTION 5.2.1.1.1.2 CONTAINS SIX ALTERNATIVE PROCEDURES FOR SOLVING
FIRST-ORDER INITIAL VALUE PROBLEMS WITH THE JACOBIAN MATRIX AVAILABLE.
A. EFSIRK SOLVES AN INITIAL VALUE PROBLEM, GIVEN AS AN AUTONOMOUS
SYSTEM OF FIRST ORDER DIFFERENTIAL EQUATIONS DY/DX = F(Y), BY
MEANS OF AN EXPONENTIALLY FITTED, SEMI-IMPLICIT RUNGE-KUTTA
METHOD; IN PARTICULAR THIS PROCEDURE IS SUITABLE FOR THE
INTEGRATION OF STIFF EQUATIONS.
B. EFERK SOLVES INITIAL VALUE PROBLEMS, GIVEN AS AN AUTONOMOUS SYSTEM
OF FIRST ORDER DIFFERENTIAL EQUATIONS, BY MEANS OF AN EXPONENTIALLY
FITTED, EXPLICIT RUNGE KUTTA METHOD OF THIRD ORDER, WHICH INVOLVES
THE USE OF THE JACOBIAN MATRIX. AUTOMATIC STEP CONTROL IS PROVIDED.
IN PARTICULAR THIS METHOD IS SUITABLE FOR THE INTEGRATION OF STIFF
DIFFERENTIAL EQUATIONS.
C. LINIGER1VS SOLVES INITIAL VALUE PROBLEMS, GIVEN AS AN AUTONOMOUS
SYSTEM OF FIRST ORDER DIFFERENTIAL EQUATIONS, BY MEANS OF AN
IMPLICIT, FIRST ORDER ACCURATE, EXPONENTIALLY FITTED ONESTEP
METHOD.
AUTOMATIC STEPSIZE CONTROL IS PROVIDED.
D. LINIGER2 SOLVES INITIAL VALUE PROBLEMS, GIVEN AS AN AUTONOMOUS
SYSTEM OF FIRST ORDER DIFFERENTIAL EQUATIONS, BY MEANS OF AN
EXPONENTIALLY FITTED ONESTEP METHOD.
NO AUTOMATIC STEPSIZE CONTROL IS PROVIDED.
E. GMS SOLVES AN INITIAL VALUE PROBLEM, GIVEN AS AN AUTONOMOUS SYSTEM
OF FIRST ORDER DIFFERENTIAL EQUATIONS DY / DX = F(Y), BY MEANS OF A
THIRD ORDER GENERALIZED LINEAR MULTISTEP METHOD.
F. IMPEX SOLVES AN INITIAL VALUE PROBLEM,GIVEN AS AN AUTONOMOUS SYSTEM
OF FIRST ORDER DIFFERENTIAL EQUATIONS, BY MEANS OF THE IMPLICIT
MID-POINT RULE WITH SMOOTHING AND EXTRAPOLATION.
AUTOMATIC STEPSIZE CONTROL IS PROVIDED.
IN PARTICULAR ALL THESE METHODS ARE SUITABLE FOR THE INTEGRATION OF
STIFF DIFFERENTIAL EQUATIONS.
1SECTION : 5.2.1.1.1.2.A (AUGUST 1974) PAGE 1
AUTHOR: S.P.N. VAN KAMPEN.
INSTITUTE: MATHEMATICAL CENTRE.
RECEIVED: 730529.
BRIEF DESCRIPTION:
EFSIRK SOLVES AN INITIAL VALUE PROBLEM, GIVEN AS AN AUTONOMOUS
SYSTEM OF FIRST ORDER DIFFERENTIAL EQUATIONS DY/DX = F(Y), BY
MEANS OF AN EXPONENTIALLY FITTED, SEMI-IMPLICIT RUNGE-KUTTA
METHOD; IN PARTICULAR THIS PROCEDURE IS SUITABLE FOR THE
INTEGRATION OF STIFF EQUATIONS.
KEYWORDS:
DIFFERENTIAL EQUATIONS,
INITIAL VALUE PROBLEM,
AUTONOMOUS SYSTEM,
STIFF EQUATIONS,
SEMI-IMPLICIT RUNGE-KUTTA METHOD,
EXPONENTIAL FITTING.
CALLING SEQUENCE:
HEADING:
"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;
"ARRAY" Y, J;
"BOOLEAN" LINEAR;
"CODE" 33160;
THE MEANING OF THE FORMAL PARAMETERS IS:
X: <VARIABLE>;
THE INDEPENDENT VARIABLE X;
ENTRY: THE INITIAL VALUE X0;
EXIT : THE END VALUE XE;
XE: <ARITHMETIC EXPRESSION>;
THE END VALUE OF X;
M: <ARITHMETIC EXPRESSION>;
THE NUMBER OF DIFFERENTIAL EQUATIONS;
Y: <ARRAY IDENTIFIER>;
"ARRAY" Y[1 : M];
THE DEPENDENT VARIABLE;
DURING THE INTEGRATION PROCESS THE COMPUTED SOLUTION
AT THE POINT X IS ASSIGNED TO THE ARRAY Y;
ENTRY: THE INITIAL VALUES OF THE SOLUTION OF THE SYSTEM;
1SECTION : 5.2.1.1.1.2.A (AUGUST 1974) PAGE 2
DELTA: <ARITHMETIC EXPRESSION>;
DELTA DENOTES THE REAL PART OF THE POINT AT WHICH
EXPONENTIAL FITTING IS DESIRED;
ALTERNATIVES:
DELTA = (AN ESTIMATE OF) THE REAL PART OF THE, IN ABSOLUTE
VALUE, LARGEST EIGENVALUE OF THE JACOBIAN MATRIX OF THE
SYSTEM;
DELTA < -10**14, IN ORDER TO OBTAIN ASYMPTOTIC
STABILITY;
DELTA = 0, IN ORDER TO OBTAIN A HIGHER ORDER OF ACCURACY IN
CASE OF LINEAR OR ALMOST LINEAR EQUATIONS;
DERIVATIVE: <PROCEDURE IDENTIFIER>;
"PROCEDURE" DERIVATIVE(A); "ARRAY" A;
WHEN IN EFSIRK DERIVATIVE IS CALLED, A[I] CONTAINS THE
VALUES OF Y[I];
UPON COMPLETION OF A CALL OF DERIVATIVE, THE ARRAY A
SHOULD CONTAIN THE VALUES OF F(Y);
NOTE THAT THE VARIABLE X SHOULD NOT BE USED IN DERIVATIVE,
BECAUSE THE DIFFERENTIAL EQUATION IS SUPPOSED TO BE
AUTONOMOUS;
JACOBIAN: <PROCEDURE IDENTIFIER>;
"PROCEDURE" JACOBIAN(J, Y); "ARRAY" J, Y;
WHEN IN EFSIRK JACOBIAN IS CALLED THE ARRAY Y CONTAINS
THE VALUES OF THE DEPENDENT VARIABLE;
UPON COMPLETION OF A CALL OF JACOBIAN THE ARRAY J SHOULD
CONTAIN THE VALUES OF THE JACOBIAN MATRIX OF F(Y);
J: <ARRAY IDENTIFIER>;
J[1 : M, 1 : M];
J IS AN AUXILLIARY ARRAY WHICH IS USED IN THE PROCEDURE
JACOBIAN;
N: <VARIABLE>;
AN INTEGER WHICH COUNTS THE INTEGRATION STEPS;
AETA, RETA:
<ARITHMETIC EXPRESSION>;
REQUIRED ABSOLUTE AND RELATIVE LOCAL ACCURACY;
HMIN, HMAX:
<ARITHMETIC EXPRESSION>;
MINIMAL AND MAXIMAL STEPSIZE BY WHICH THE INTEGRATION IS
PERFORMED;
LINEAR: <BOOLEAN EXPRESSION>;
IF LINEAR = "TRUE" THE PROCEDURE JACOBIAN WILL ONLY BE
CALLED IF N = 1; THE INTEGRATION WILL THEN BE PERFORMED
WITH A STEPSIZE HMAX; THE CORRESPONDING REDUCTION
OF COMPUTING TIME CAN BE EXPLOITED IN CASE OF LINEAR OR
ALMOST LINEAR EQUATIONS;
OUTPUT: <PROCEDURE IDENTIFIER>;
"PROCEDURE" OUTPUT;
IN OUTPUT ONE MAY PRINT THE VALUES OF E.G. X,
Y[I], J[K, L] AND N.
1SECTION : 5.2.1.1.1.2.A (AUGUST 1974) PAGE 3
DATA AND RESULTS: SEE REF[2] AND [3].
PROCEDURES USED:
VECVEC = CP34010,
MATVEC = CP34011,
MATMAT = CP34013,
GSSELM = CP34231,
SOLELM = CP34061.
REQUIRED CENTRAL MEMORY:
EXECUTION FIELD LENGTH: CIRCA M * M + 5 * M.
RUNNING TIME:
DEPENDS STRONGLY ON THE DIFFERENTIAL EQUATION TO BE SOLVED
LANGUAGE: ALGOL 60.
METHOD AND PERFORMANCE:
THE PROCEDURE EFSIRK IS AN EXPONENTIALLY FITTED, A-STABLE,
SEMI-IMPLICIT RUNGE-KUTTA METHOD OF THIRD ORDER (SEE REF[1]
AND [2]). THE ALGORITHM USES FOR EACH STEP TWO FUNCTION EVALUATIONS
AND IF LINEAR = "FALSE" ONE EVALUATION OF THE JACOBIAN MATRIX.
THE STEPSIZE IS NOT DETERMINED BY THE ACCURACY OF THE NUMERICAL
SOLUTION, BUT BY THE AMOUNT BY WHICH THE GIVEN DIFFERENTIAL
EQUATION DIFFERS FROM A LINEAR EQUATION (SEE REF[2]).
THE PROCEDURE DOES NOT REJECT INTEGRATION STEPS.
REFERENCES:
[1].P.J. VAN DER HOUWEN.
ONE-STEP METHODS WITH ADAPTIVE STABILITY FUCNTIONS
FOR THE INTEGRATION OF DIFFERENTIAL EQUATIONS.
LECTURE NOTES OF THE CONFERENCE ON
NUMERISCHE, INSBESONDERE APPROXIMATIONSTHEORETISCHE
BEHANDLUNG VON FUNKTIONALGLEICHUNGEN.
OBERWOLFACH, DECEMBER, 3 - 12, 1972.
[2].SYLLABUS COLLOQUIUM STIFF DIFFERENTIAL EQUATIONS 2 (DUTCH).
MATH.CENTR. SYLLABUS 15.2/73.
[3].SYLLABUS COLLOQUIUM STIFF DIFFERENTIAL EQUATIONS 3 (DUTCH).
MATH.CENTR. SYLLABUS 15.3/73.
TO APPEAR IN 1973.
1SECTION : 5.2.1.1.1.2.A (AUGUST 1974) PAGE 4
EXAMPLE OF USE:
WE CONSIDER THE DIFFERENTIAL EQUATION
DY / DX = -EXP(X) * (Y - LN(X)) + 1 / X,
ON THE INTERVAL [0.01, 8], WITH INITIAL VALUE Y(0.01) = LN(0.01)
AND ANALYTICAL SOLUTION Y(X) = LN(X);
FOR THE FIT POINT WE USE THE EIGENVALUE OF THE JACOBIAN MATRIX,
I.E. DELTA = -EXP(X);
"BEGIN"
"PROCEDURE" DER(Y); "ARRAY" Y;
"BEGIN" "REAL" Y2; Y2:= Y[2];
DELTA:= -EXP(Y2); LNX:= LN(Y2);
Y[1]:= (Y[1] - LNX) * DELTA + 1 / Y2;
Y[2]:= 1
"END" DER;
"PROCEDURE" JAC(J, Y); "ARRAY" J, Y;
"BEGIN" "REAL" Y2; Y2:= Y[2];
J[1, 1]:= DELTA;
J[1, 2]:= (Y[1] - LNX - 1 / Y2) * DELTA - 1 / (Y2 * Y2);
J[2, 1]:= J[2, 2]:= 0
"END" JAC;
"PROCEDURE" OUTP;
"IF" X = XE "THEN"
"BEGIN" "REAL" Y1; Y1:= Y[1]; LNX:= LN(X);
OUTPUT(61, "(""("N = ")", 2ZD,
"(" X = ")", +D.D,
"(" Y(X) = ")", +D.5D,
"(" DELTA = ")", +3ZD.2D, /,
"("ABS. ERR. = ")", .2D"+2D,
"(" REL. ERR. = ")", .2D"+2D, //")",
N, X, Y1, DELTA,
ABS(Y1 - LNX), ABS((Y1 - LNX) / LNX));
"IF" X = 0.4 "THEN" XE:= 8
"END" OUTP;
"INTEGER" N;
"REAL" X, XE, DELTA, LNX;
"ARRAY" Y[1 : 2], J[1 : 2, 1 : 2];
XE:= 0.4; X:= 0.01; Y[1]:= LN(0.01); Y[2]:= X;
EFSIRK(X, XE, 2, Y, DELTA, DER, JAC, J,
N, "-2, "-2, 0.005, 1.5, "FALSE", OUTP)
"END"
THIS PROGRAM DELIVERS:
N = 10 X = +0.4 Y(X) = -0.91099 DELTA = -1.44
ABS. ERR. = .53"-02 REL. ERR. = .58"-02
N = 98 X = +8.0 Y(X) = +2.07911 DELTA = -2980.02
ABS. ERR. = .33"-03 REL. ERR. = .16"-03
1SECTION : 5.2.1.1.1.2.A (AUGUST 1974) PAGE 5
SOURCE TEXT(S):
0"CODE" 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" STEPSIZE;
"BEGIN" "REAL" DISCR, ETA, S;
"IF" LINEAR "THEN" S:= H:= HMAX "ELSE"
"IF" N = 1 "OR" 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 "AND" 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) > " - 6 * ABS(Z1) "OR" 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 < - "14 "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" "100;
ALPHA1:= ((A - B) * E - A - B) /
(((2 - Z1) * E - 2 - Z1) * 3 * Z1)
"END"; "COMMENT"
1SECTION : 5.2.1.1.1.2.A (AUGUST 1974) PAGE 6
;
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" "NOT" LINEAR "OR" N = 1 "THEN" JACOBIAN(J, Y);
"IF" "NOT" 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]:= "-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;
"EOP"
1SECTION : 5.2.1.1.1.2.B (AUGUST 1974) PAGE 1
AUTHOR: K.DEKKER.
INSTITUTE: MATHEMATICAL CENTRE.
RECEIVED: 1973/07/31.
BRIEF DESCRIPTION:
EFERK SOLVES INITIAL VALUE PROBLEMS , GIVEN AS AN AUTONOMOUS SYSTEM
OF FIRST ORDER DIFFERENTIAL EQUATIONS, BY MEANS OF AN EXPONENTIALLY
FITTED, EXPLICIT RUNGE KUTTA METHOD OF THIRD ORDER, WHICH INVOLVES
THE USE OF THE JACOBIAN MATRIX. AUTOMATIC STEP CONTROL IS PROVIDED.
IN PARTICULAR THIS METHOD IS SUITABLE FOR THE INTEGRATION OF STIFF
DIFFERENTIAL EQUATIONS.
KEYWORDS:
DIFFERENTIAL EQUATIONS,
INITIAL VALUE PROBLEMS,
STIFF EQUATIONS,
EXPONENTIAL FITTING,
EXPLICIT RUNGE KUTTA METHODS.
1SECTION : 5.2.1.1.1.2.B (AUGUST 1974) PAGE 2
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE EFERK READS:
"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;
"CODE" 33120;
THE MEANING OF THE FORMAL PARAMETERS IS:
X: <VARIABLE>;
THE INDEPENDENT VARIABLE X;
CAN BE USED IN DERIVATIVE, JACOBIAN, OUTPUT, ETC.;
ENTRY: THE INITIAL VALUE X0;
EXIT : THE FINAL VALUE XE;
XE: <ARITHMETIC EXPRESSION>;
THE FINAL VALUE OF X (XE>=X);
M: <ARITHMETIC EXPRESSION>;
THE NUMBER OF EQUATIONS;
Y: <ARRAY IDENTIFIER>;
"REAL" "ARRAY" Y[1:M];
THE DEPENDENT VARIABLE;
ENTRY: THE INITIAL VALUES OF THE SYSTEM OF DIFFERENTIAL
EQUATIONS: Y[I] AT X=X0;
EXIT : THE FINAL VALUES OF THE SOLUTION: Y[I] AT X=XE;
SIGMA: <ARITHMETIC EXPRESSION>;
THE MODULUS OF THE POINT AT WHICH EXPONENTIAL FITTING IS
DESIRED, FOR EXAMPLE THE LARGEST NEGATIVE EIGENVALUE OF THE
JACOBIAN MATRIX OF THE SYSTEM OF DIFFERENTIAL EQUATIONS;
PHI: <ARITHMETIC EXPRESSION>;
THE ARGUMENT OF THE COMPLEX POINT AT WHICH EXPONENTIAL
FITTING IS DESIRED;
DERIVATIVE: <PROCEDURE IDENTIFIER>;
THE HEADING OF THIS PROCEDURE READS:
"PROCEDURE" DERIVATIVE(Y); "ARRAY" Y;
THIS PROCEDURE SHOULD DELIVER THE RIGHT HAND SIDE OF THE
I-TH DIFFERENTIAL EQUATION AT THE POINT (Y) AS Y[I];
J: <ARRAY IDENTIFIER>;
"REAL" "ARRAY" J[1:M,1:M];
THE JACOBIAN MATRIX OF THE SYSTEM;
THE ARRAY J SHOULD BE UPDATED IN THE PROCEDURE JACOBIAN;
1SECTION : 5.2.1.1.1.2.B (AUGUST 1974) PAGE 3
JACOBIAN: <PROCEDURE IDENTIFIER>;
THE HEADING OF THIS PROCEDURE READS:
"PROCEDURE" JACOBIAN(J,Y); "ARRAY" J,Y;
IN THIS PROCEDURE THE JACOBIAN AT THE POINT (Y) HAS TO BE
ASSIGNED TO THE ARRAY J;
K: <VARIABLE>;
COUNTS THE NUMBER OF INTEGRATION STEPS TAKEN;
FOR EXAMPLE, MAY BE USED IN THE EXPRESSION FOR XE;
L: <ARITHMETIC EXPRESSION>;
ENTRY:
IF PHI = 4*ARCTAN(1): THE ORDER OF THE EXPONENTIAL FITTING,
ELSE TWICE THE ORDER OF THE EXPONENTIAL FITTING;
AUT: <BOOLEAN EXPRESSION>;
IF THE SYSTEM HAS BEEN WRITTEN IN AUTONOMOUS FORM BY ADDING
THE EQUATION DY[M]/DX = 1 TO THE SYSTEM , THEN AUT MAY HAVE
THE VALUE "FALSE", ELSE AUT SHOULD HAVE THE VALUE "TRUE";
AETA: <ARITHMETIC EXPRESSION>;
REQUIRED ABSOLUTE PRECISION IN THE INTEGRATION PROCESS;
AETA HAS TO BE POSITIVE;
RETA: <ARITHMETIC EXPRESSION>;
REQUIRED RELATIVE PRECISION IN THE INTEGRATION PROCESS;
RETA HAS TO BE POSITIVE;
HMIN: <ARITHMETIC EXPRESSION>;
THE STEPLENGTH CHOSEN WILL BE AT LEAST EQUAL TO HMIN;
HMAX: <ARITHMETIC EXPRESSION>;
THE STEPLENGTH CHOSEN WILL BE AT MOST EQUAL TO HMAX;
LINEAR: <ARITHMETIC EXPRESSION>;
THE PROCEDURE JACOBIAN IS CALLED ONLY IF LINEAR="FALSE" OR
K=0; SO IF THE SYSTEM IS LINEAR , LINEAR MAY HAVE THE VALUE
"TRUE";
OUTPUT: <PROCEDURE IDENTIFIER>;
THE HEADING OF THIS PROCEDURE READS;
"PROCEDURE" OUTPUT;
THIS PROCEDURE IS CALLED AT THE END OF EACH INTEGRATION
STEP ; THE USER CAN ASK FOR OUTPUT OF SOME PARAMETERS , FOR
EXAMPLE X, K, Y.
DATA AND RESULTS: SEE EXAMPLE OF USE, AND REF[4].
PROCEDURES USED:
VECVEC= CP34010,
MATVEC= CP34011,
DEC = CP34300,
SOL = CP34051.
1SECTION : 5.2.1.1.1.2.B (AUGUST 1974) PAGE 4
REQUIRED CENTRAL MEMORY:
EXECUTION FIELD LENGTH: CIRCA 30 + 4 * M + L * (5+L).
RUNNING TIME: DEPENDS STRONGLY ON THE DIFFERENTIAL EQUATION TO SOLVE.
LANGUAGE: ALGOL 60.
METHOD AND PERFORMANCE:
THE PROCEDURE EFERK IS AN EXPONENTIALLY FITTED, SEMI-EXPLICIT RUNGE
KUTTA METHOD OF THIRD ORDER ( SEE REF [1] AND [3] ) . THE ALGORITHM
USES FOR EACH STEP TWO FUNCTION EVALUATIONS AND IF LINEAR = "FALSE"
ONE EVALUATION OF THE JACOBIAN MATRIX.THE STEPSIZE IS DETERMINED BY
AN ESTIMATION OF THE LOCAL TRUNCATION ERROR BASED ON THE RESIDUAL
FUNCTION (SEE REF[3]). INTEGRATION STEPS ARE NOT REJECTED.
REFERENCES:
[1]. P.J.VAN DER HOUWEN.
ONE-STEP METHODS WITH ADAPTIVE STABILITY FUNCTIONS FOR THE
INTEGRATION OF DIFFERENTIAL EQUATIONS.
LECTURES NOTES OF THE CONFERENCE ON NUMERISCHE, INSBESONDERE
APPROXIMATIONSTHEORETISCHE BEHANDLUNG VON FUNKTIONAL-
GLEICHUNGEN.
OBERWOLFACH, DECEMBER, 3 -12, 1972.
[2]. T.J.DEKKER, P.W.HEMKER AND P.J.VAN DER HOUWEN.
COLLOQUIUM STIFF DIFFERENTIAL EQUATIONS 1 (DUTCH).
MC SYLLABUS 15.1, (1972) MATHEMATICAL CENTRE.
[3]. P.A.BEENTJES, K.DEKKER, H.C.HEMKER, S.P.N.VAN KAMPEN
AND G.M.WILLEMS.
COLLOQUIUM STIFF DIFFERENTIAL EQUATIONS 2 (DUTCH).
MC SYLLABUS 15.2, (1973) MATHEMATICAL CENTRE.
[4]. (TO APPEAR).
COLLOQUIUM STIFF DIFFERENTIAL EQUATIONS 3 (DUTCH).
MC SYLLABUS 15.3, (1973) MATHEMATICAL CENTRE.
EXAMPLE OF USE:
CONSIDER THE SYSTEM OF DIFFERENTIAL EQUATIONS:
DY[1]/DX = -Y[1] + Y[1] * Y[2] + .99 * Y[2]
DY[2]/DX = -1000 * ( -Y[1] + Y[1] * Y[2] + Y[2] )
WITH THE INITIAL CONDITIONS AT X = 0:
Y[1] = 1 AND Y[2] = 0. (SEE REF[2], PAGE 11).
THE SOLUTION AT X = 50 IS APPROXIMATELY:
Y[1] = .765 878 320 487 AND Y[2] = .433 710 353 5768.
THE FOLLOWING PROGRAM SHOWS SOME DIFFERENT CALLS OF THE PROCEDURE
EFERK,AND ILLUSTRATES THE ACCURACIES WHICH MAY BE OBTAINED BY THEM:
1SECTION : 5.2.1.1.1.2.B (AUGUST 1974) PAGE 5
"BEGIN"
"INTEGER" K,PASSES,PASJAC;
"REAL" X,SIGMA,PHI,TIME,TOL;
"REAL" "ARRAY" Y[1:2],J[1:2,1:2];
"PROCEDURE" DER(Y); "ARRAY" Y;
"BEGIN" "REAL" Y1,Y2; Y1:=Y[1]; Y2:=Y[2];
Y[1]:=(Y1+.99)*(Y2-1)+.99;
Y[2]:=1000*((1+Y1)*(1-Y2)-1);
PASSES:=PASSES+1
"END";
"PROCEDURE" JACOBIAN(J,Y); "ARRAY" J,Y;
"BEGIN" J[1,1]:=Y[2]-1; J[1,2]:=.99+Y[1];
J[2,1]:=1000*(1-Y[2]); J[2,2]:=-1000*(1+Y[1]);
SIGMA:=ABS(J[2,2]+J[1,1]-SQRT((J[2,2]-J[1,1])**2+
4*J[2,1]*J[1,2]))/2;
PASJAC:=PASJAC+1
"END" JACOBIAN;
"PROCEDURE" OUT;
"IF" X=50 "THEN"
OUTPUT(61,"("3(-5ZD),2(4B+.3DB3DB3D),-5ZD.3D,/")",K,PASSES,
PASJAC,Y[1],Y[2],CLOCK-TIME);
OUTPUT(61,"(""(" THIS LINE AND THE FOLLOWING TEXT IS ")"
"("PRINTED BY THIS PROGRAM")",//,
"(" THE RESULTS WITH EFERK -FIRST ORDER FIT- ARE:")",/,
"(" K DER.EV. JAC.EV. Y[1] Y[2]")"
"(" TIME")",/")");
PHI:=4*ARCTAN(1);
"FOR" TOL:=1,"-1,"-2,"-3 "DO"
"BEGIN" PASSES:=PASJAC:=0; X:=Y[2]:=0; Y[1]:=1; TIME:=CLOCK;
EFERK(X,50.0,2,Y,SIGMA,PHI,DER,J,JACOBIAN,K,1,"TRUE",TOL,
TOL,"-6,50.0,"FALSE",OUT);
"END";
"END"
THIS LINE AND THE FOLLOWING TEXT IS PRINTED BY THIS PROGRAM:
THE RESULTS WITH EFERK -FIRST ORDER FIT- ARE:
K DER.EV. JAC.EV. Y[1] Y[2] TIME
93 186 93 +.765 883 211 +.428 752 781 1.170
105 210 105 +.765 878 445 +.433 569 561 1.296
147 294 147 +.765 878 317 +.433 708 489 1.834
266 532 266 +.765 878 320 +.433 710 229 3.297
1SECTION : 5.2.1.1.1.2.B (AUGUST 1974) PAGE 6
SOURCE TEXT(S):
0"CODE" 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" 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; "COMMENT"
1SECTION : 5.2.1.1.1.2.B (AUGUST 1974) PAGE 7
;
"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)<"-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)<"-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"; "COMMENT"
1SECTION : 5.2.1.1.1.2.B (AUGUST 1974) PAGE 8
;
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 "AND" L=2 "OR" 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"; "COMMENT"
1SECTION : 5.2.1.1.1.2.B (AUGUST 1974) PAGE 9
;
"IF" H<HMIN "THEN" H:=HMIN;
"IF" H>HMAX "THEN" H:=HMAX;
B:=ABS(H*SIGMA);
CHANGE:=ABS(1-B/B0)>.05 "OR" PHI^=PHI0;
"IF" 1.1*H>=XE-X "THEN"
"BEGIN" CHANGE:=LAST:="TRUE"; H:=XE-X "END";
"IF" "NOT" 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" "NOT" LINEAR "OR" K=0 "THEN" JACOBIAN(J,Y);
STEPSIZE;
"IF" CHANGE "THEN" COEFFICIENT;
OUTPUT;
DIFFERENCE SCHEME;
K:=K+1;
X:=X+H;
"IF" "NOT" LAST "THEN" "GOTO" NEXT LEVEL;
END OF EFERK: OUTPUT;
"END" EFERK;
"EOP"
1SECTION : 5.2.1.1.1.2.C (OCTOBER 1974) PAGE 1
AUTHOR: K.DEKKER.
INSTITUTE: MATHEMATICAL CENTRE.
RECEIVED: 1973/09/01.
BRIEF DESCRIPTION:
LINIGER1VS SOLVES INITIAL VALUE PROBLEMS , GIVEN AS AN AUTONOMOUS
SYSTEM OF FIRST ORDER DIFFERENTIAL EQUATIONS , BY MEANS OF AN
IMPLICIT,FIRST ORDER ACCURATE, EXPONENTIALLY FITTED ONESTEP METHOD.
AUTOMATIC STEPSIZE CONTROL IS PROVIDED.
IN PARTICULAR THIS METHOD IS SUITABLE FOR THE INTEGRATION OF STIFF
DIFFERENTIAL EQUATIONS.
KEYWORDS:
DIFFERENTIAL EQUATIONS,
INITIAL VALUE PROBLEMS,
STIFF EQUATIONS,
EXPONENTIAL FITTING,
IMPLICIT ONESTEP METHODS.
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE LINIGER1VS READS:
"PROCEDURE" LINIGER1VS (X,XE,M,Y,SIGMA,DERIVATIVE,J,JACOBIAN,
ITMAX,HMIN,HMAX,AETA,RETA,INFO,OUTPUT);
"VALUE" M;
"INTEGER" M,ITMAX;
"REAL" X,XE,SIGMA,HMIN,HMAX,AETA,RETA;
"ARRAY" Y,J,INFO;
"PROCEDURE" DERIVATIVE,JACOBIAN,OUTPUT;
"CODE" 33132;
THE MEANING OF THE FORMAL PARAMETERS IS:
X: <VARIABLE>;
THE INDEPENDENT VARIABLE X;
ENTRY: THE INITIAL VALUE X0;
EXIT : THE FINAL VALUE XE;
XE: <ARITHMETIC EXPRESSION>;
THE FINAL VALUE OF X (XE>=X);
M: <ARITHMETIC EXPRESSION>;
THE NUMBER OF EQUATIONS;
Y: <ARRAY IDENTIFIER>;
"ARRAY" Y[1:M];
THE DEPENDENT VARIABLE;
ENTRY: THE INITIAL VALUES OF THE SYSTEM OF DIFFERENTIAL
EQUATIONS: Y[I] AT X=X0;
EXIT : THE FINAL VALUES OF THE SOLUTION: Y[I] AT X=XE;
1SECTION : 5.2.1.1.1.2.C (OCTOBER 1974) PAGE 2
SIGMA: <ARITHMETIC EXPRESSION>;
THE MODULUS OF THE POINT AT WHICH EXPONENTIAL FITTING IS
DESIRED, FOR EXAMPLE THE LARGEST NEGATIVE EIGENVALUE OF THE
JACOBIAN OF THE SYSTEM OF DIFFERENTIAL EQUATIONS;
DERIVATIVE: <PROCEDURE IDENTIFIER>;
THE HEADING OF THIS PROCEDURE READS:
"PROCEDURE" DERIVATIVE(Y); "ARRAY" Y;
THIS PROCEDURE SHOULD DELIVER THE RIGHT HAND SIDE OF THE
I-TH DIFFERENTIAL EQUATION AT THE POINT (Y) AS Y[I];
J: <ARRAY IDENTIFIER>;
"ARRAY" J[1:M,1:M];
THE JACOBIAN MATRIX OF THE SYSTEM;
THE ARRAY J SHOULD BE UPDATED IN THE PROCEDURE JACOBIAN;
JACOBIAN: <PROCEDURE IDENTIFIER>;
THE HEADING OF THIS PROCEDURE READS:
"PROCEDURE" JACOBIAN(J,Y); "ARRAY" J,Y;
IN THIS PROCEDURE (AN APPROXIMATION OF) THE JACOBIAN HAS TO
BE ASSIGNED TO THE ARRAY J;
ITMAX: <ARITHMETIC EXPRESSION>;
AN UPPERBOUND FOR THE NUMBER OF ITERATIONS IN NEWTON'S
PROCESS, USED TO SOLVE THE IMPLICIT EQUATIONS;
HMIN: <ARITHMETIC EXPRESSION>;
MINIMAL STEPSIZE BY WHICH THE INTEGRATION IS PERFORMED;
HMAX: <ARITHMETIC EXPRESSION>;
MAXIMAL STEPSIZE BY WHICH THE INTEGRATION IS PERFORMED;
AETA: <ARITHMETIC EXPRESSION>;
REQUIRED ABSOLUTE PRECISION IN THE INTEGRATION PROCESS;
RETA: <ARITHMETIC EXPRESSION>;
REQUIRED RELATIVE PRECISION IN THE INTEGRATION PROCESS;
IF BOTH AETA AND RETA HAVE NEGATIVE VALUES , INTEGRATION
WILL BE PERFORMED WITH A STEPSIZE EQUAL TO HMAX , WHICH MAY
BE VARIATED BY USER ; IN THIS CASE THE ABSOLUTE VALUES OF
AETA AND RETA WILL CONTROL THE NEWTON ITERATION;
INFO: <ARRAY IDENTIFIER>;
"ARRAY" INFO[1:9];
DURING INTEGRATION AND UPON EXIT THIS ARRAY CONTAINS THE
FOLLOWING INFORMATION:
INFO[1]: NUMBER OF INTEGRATION STEPS TAKEN;
INFO[2]: NUMBER OF DERIVATIVE EVALUATIONS USED;
INFO[3]: NUMBER OF JACOBIAN EVALUATIONS USED;
INFO[4]: NUMBER OF INTEGRATION STEPS EQUAL TO HMIN TAKEN ;
INFO[5]: NUMBER OF INTEGRATION STEPS EQUAL TO HMAX TAKEN ;
INFO[6]: MAXIMAL NUMBER OF ITERATIONS TAKEN IN THE NEWTON
PROCESS;
INFO[7]: LOCAL ERROR TOLERANCE;
INFO[8]: ESTIMATED LOCAL ERROR;
INFO[9]: MAXIMUM VALUE OF THE ESTIMATED LOCAL ERROR;
OUTPUT: <PROCEDURE IDENTIFIER>;
THE HEADING OF THIS PROCEDURE READS;
"PROCEDURE" OUTPUT;
THIS PROCEDURE IS CALLED AT THE END OF EACH INTEGRATION
STEP ; THE USER CAN ASK FOR OUTPUT OF THE PARAMETERS , FOR
EXAMPLE X, Y, INFO.
1SECTION : 5.2.1.1.1.2.C (OCTOBER 1974) PAGE 3
DATA AND RESULTS: SEE EXAMPLE OF USE, AND REF[2].
PROCEDURES USED:
INIVEC= CP31010,
MULVEC= CP31020,
MULROW= CP31021,
DUPVEC= CP31030,
MATVEC= CP34011,
ELMVEC= CP34020,
VECVEC= CP34010,
DEC = CP34300,
SOL = CP34051.
REQUIRED CENTRAL MEMORY:
EXECUTION FIELD LENGTH : CIRCA 20 + M * (5 + M).
RUNNING TIME: DEPENDS STRONGLY ON THE DIFFERENTIAL EQUATION TO SOLVE.
LANGUAGE: ALGOL 60.
METHOD AND PERFORMANCE:
LINIGER1VS: INTEGRATES THE SYSTEM OF DIFFERENTIAL EQUATIONS FROM X0
UNTIL XE, BY MEANS OF A FIRST ORDER FORMULA.
THE INTEGRATION METHOD IS BASED ON THE F(1) FORMULA DESCRIBED BY
LINIGER AND WILLOUGHBY (SEE REF[1]). ERROR ESTIMATES AND A STEPSIZE
STRATEGY FOR THIS METHOD ARE DESCRIBED IN [2] , AND A VARIABLE STEP
METHOD IS CONSTRUCTED FOR THE CONVENIENCE OF THE USER. HOWEVER, THE
STEPSIZE STRATEGY REQUIRES MANY EXTRA ARRAY OPERATIONS. THE USER
MAY AVOID THIS EXTRA WORK BY GIVING AETA AND RETA A NEGATIVE VALUE
AND PRESCRIBING A STEPSIZE (HMAX) HIMSELF.
REFERENCES:
[1]. W.LINIGER AND R.A.WILLOUGHBY.
EFFICIENT INTEGRATION METHODS FOR STIFF SYSTEMS OF ORDINARY
DIFFERENTIAL EQUATIONS.
SIAM J. NUM. ANAL. 7 (1970) PAGE 47.
[2]. K.DEKKER.
ERROR ESTIMATES AND STEPSIZE STRATEGIES FOR THE LINIGER-
WILLOUGHBY FORMULAE.
(TO APPEAR IN 1974).
1SECTION : 5.2.1.1.1.2.C (OCTOBER 1974) PAGE 4
EXAMPLE OF USE:
CONSIDER THE SYSTEM OF DIFFERENTIAL EQUATIONS:
DY[1]/DX = -Y[1] + Y[1] * Y[2] + .99 * Y[2]
DY[2]/DX = -1000 * ( -Y[1] + Y[1] * Y[2] + Y[2] )
WITH THE INITIAL CONDITIONS AT X = 0:
Y[1] = 1 AND Y[2] = 0.
THE SOLUTION AT X = 50 IS APPROXIMATELY:
Y[1] = .765 878 320 2487 AND Y[2] = .433 710 353 5768.
THE FOLLOWING PROGRAM SHOWS INTEGRATION OF THIS PROBLEM WITH
VARIABLE AND CONSTANT STEPSIZES:
"BEGIN" "COMMENT" TEST LINIGER1VS;
"INTEGER" ITMAX;
"REAL" X,SIGMA,RETA,TIME;
"REAL" "ARRAY" Y[1:2],J[1:2,1:2],INFO[1:9];
"PROCEDURE" F(A); "ARRAY" A;
"BEGIN" "REAL" A1,A2; A1:=A[1]; A2:=A[2];
A[1]:=(A1+.99)*(A2-1)+.99;
A[2]:=1000*((1+A1)*(1-A2)-1);
"END";
"PROCEDURE" JACOBIAN(J,Y); "ARRAY" J,Y;
"BEGIN" J[1,1]:=Y[2]-1; J[1,2]:=.99+Y[1];
J[2,1]:=1000*(1-Y[2]); J[2,2]:=-1000*(1+Y[1]);
SIGMA:=ABS(J[2,2]+J[1,1]-SQRT((J[2,2]-J[1,1])**2+
4*J[2,1]*J[1,2]))/2;
"END" JACOBIAN;
"PROCEDURE" OUT;
"IF" X=50 "THEN"
OUTPUT(61,"("6(3ZDB),2BD"-ZD,2(2B+.3DB3D),-3ZD.3D,/")",
INFO[1],INFO[2],INFO[3],INFO[4],INFO[5],INFO[6],INFO[9],Y[1],
Y[2],CLOCK-TIME);
"FOR" RETA:="-2,"-4,"-6 "DO"
"BEGIN" X:=Y[2]:=0; Y[1]:=1; TIME:=CLOCK;
LINIGER1VS(X,50.0,2,Y,SIGMA,F,J,JACOBIAN,10,.1,50.0,RETA,
RETA,INFO,OUT);
"END"; OUTPUT(61,"("//")");
"FOR" RETA:=-"-2,-"-4,-"-6 "DO"
"BEGIN" X:=Y[2]:=0; Y[1]:=1; TIME:=CLOCK;
LINIGER1VS(X,50.0,2,Y,SIGMA,F,J,JACOBIAN,10,.1,1.0,RETA,
RETA,INFO,OUT);
"END";
"END"
17 21 8 2 0 2 2" -2 +.772 017 +.435 672 0.525
13 25 23 2 0 2 2" -2 +.767 414 +.434 202 0.717
105 210 105 2 0 2 2" -2 +.766 027 +.433 758 4.741
50 52 1 0 50 2 0" 0 +.766 670 +.433 081 0.549
50 104 3 0 50 3 0" 0 +.766 183 +.433 811 1.158
50 152 12 0 50 4 0" 0 +.766 185 +.433 809 1.653
1SECTION : 5.2.1.1.1.2.C (OCTOBER 1974) PAGE 5
SOURCE TEXT(S):
"CODE" 33132;
"PROCEDURE" LINIGER1VS(X,XE,M,Y,SIGMA,DERIVATIVE,J,
JACOBIAN,ITMAX,HMIN,HMAX,AETA,RETA,INFO,OUTPUT);
"VALUE" M;
"INTEGER" M,ITMAX;
"REAL" X,XE,SIGMA,AETA,RETA,HMIN,HMAX;
"ARRAY" Y,J,INFO;
"PROCEDURE" DERIVATIVE,JACOBIAN,OUTPUT;
"BEGIN" "INTEGER" I,ST,LASTJAC;
"REAL" H,HNEW,MU,MU1,BETA,P,E,E1,ETA,ETA1,DISCR;
"BOOLEAN" LAST,FIRST,EVALJAC,EVALCOEF;
"INTEGER" "ARRAY" PI[1:M];
"REAL" "ARRAY" DY,YL,YR,F[1:M],A[1:M,1:M],AUX[1:3];
"REAL" "PROCEDURE" NORM(A); "ARRAY" A;
NORM:=SQRT(VECVEC(1,M,0,A,A));
"PROCEDURE" COEFFICIENT;
"BEGIN" "REAL" B,E; B:=ABS(H*SIGMA);
"IF" B>40 "THEN"
"BEGIN" MU:=1/B; BETA:=1; P:=2+2/(B-2)
"END" "ELSE"
"IF" B<.04 "THEN"
"BEGIN" E:=B*B/30; P:=3-E;
MU:=.5-B/12*(1-E/2);
BETA:=.5+B/6*(1-E)
"END" "ELSE"
"BEGIN" E:=EXP(B)-1;
MU:=1/B-1/E;
BETA:=(1-B/E)*(1+1/E);
P:=(BETA-MU)/(.5-MU)
"END";
MU1:=H*(1-MU);
LUDECOMP
"END" COEFFICIENT; "COMMENT"
1SECTION : 5.2.1.1.1.2.C (OCTOBER 1974) PAGE 6
;
"PROCEDURE" LUDECOMP;
"BEGIN" "INTEGER" I;
"FOR" I:=1 "STEP" 1 "UNTIL" M "DO"
"BEGIN" MULROW(1,M,I,I,A,J,-MU1);
A[I,I]:=A[I,I]+1
"END";
AUX[2]:=0; DEC(A,M,AUX,PI)
"END" LUDECOMP;
"PROCEDURE" STEPSIZE;
"IF" ETA<0 "THEN"
"BEGIN" "REAL" HL; HL:=H;
H:=HNEW:=HMAX; INFO[5]:=INFO[5]+1;
"IF" 1.1*HNEW>XE-X "THEN"
"BEGIN" LAST:="TRUE"; H:=HNEW:=XE-X
"END";
EVALCOEF:=H^=HL;
"END" "ELSE"
"IF" FIRST "THEN"
"BEGIN" H:=HNEW:=HMIN; FIRST:="FALSE"; INFO[4]:=INFO[4]+1
"END" "ELSE"
"BEGIN" "REAL" B,HL;
B:=DISCR/ETA; HL:=H; "IF" B<.01 "THEN" B:=.01;
HNEW:= "IF" B>0 "THEN" H*B**(-1/P) "ELSE" HMAX;
"IF" HNEW<HMIN "THEN"
"BEGIN" HNEW:=HMIN; INFO[4]:=INFO[4]+1
"END" "ELSE"
"IF" HNEW>HMAX "THEN"
"BEGIN" HNEW:=HMAX; INFO[5]:=INFO[5]+1 "END";
"IF" 1.1*HNEW>=XE-X "THEN"
"BEGIN" LAST:="TRUE"; H:=HNEW:=XE-X
"END" "ELSE"
"IF" ABS(H/HNEW-1)>.1 "THEN" H:=HNEW;
EVALCOEF:=H^=HL
"END" STEPSIZE;
"PROCEDURE" LINEARITY(ERROR); "REAL" ERROR;
"BEGIN" "INTEGER" K;
"FOR" K:=1 "STEP" 1 "UNTIL" M "DO"
DY[K]:=Y[K]-MU1*F[K];
SOL(A,M,PI,DY);
ELMVEC(1,M,0,DY,Y,-1);
ERROR:=NORM(DY)
"END" LINEARITY; "COMMENT"
1SECTION : 5.2.1.1.1.2.C (OCTOBER 1974) PAGE 7
;
"PROCEDURE" ITERATION(I); "INTEGER" I;
"IF" RETA<0 "THEN"
"BEGIN" "INTEGER" K;
"IF" I=1 "THEN"
"BEGIN" MULVEC(1,M,0,DY,F,H);
"FOR" K:=1 "STEP" 1 "UNTIL" M "DO" YL[K]:=Y[K]+MU*DY[K];
SOL(A,M,PI,DY); E:=1;
"END" "ELSE"
"BEGIN" "FOR" K:=1 "STEP" 1 "UNTIL" M "DO"
DY[K]:=YL[K]-Y[K]+MU1*F[K];
"IF" E*NORM(Y)>E1*E1 "THEN"
"BEGIN" EVALJAC:=I>=3;
"IF" I>3 "THEN"
"BEGIN" INFO[3]:=INFO[3]+1; JACOBIAN(J,Y);
LUDECOMP
"END";
"END";
SOL(A,M,PI,DY)
"END";
E1:=E; E:=NORM(DY);
ELMVEC(1,M,0,Y,DY,1);
ETA:=NORM(Y)*RETA+AETA;
DISCR:=0;
DUPVEC(1,M,0,F,Y);
DERIVATIVE(F);
INFO[2]:=INFO[2]+1;
"END" "ELSE"
"BEGIN" "INTEGER" K;
"IF" I=1 "THEN"
"BEGIN" LINEARITY(E);
"IF" E*(ST-LASTJAC)>ETA "THEN"
"BEGIN" JACOBIAN(J,Y); LASTJAC:=ST;
INFO[3]:=INFO[3]+1;
H:=HNEW; COEFFICIENT;
LINEARITY(E)
"END";
EVALJAC:= E*(ST+1-LASTJAC)>ETA;
MULVEC(1,M,0,DY,F,H);
"FOR" K:=1 "STEP" 1 "UNTIL" M "DO" YL[K]:=Y[K]+MU*DY[K];
SOL(A,M,PI,DY);
"FOR" K:=1 "STEP" 1 "UNTIL" M "DO"
YR[K]:=H*BETA*MATVEC(1,M,K,J,DY);
SOL(A,M,PI,YR);
ELMVEC(1,M,0,YR,DY,1); "COMMENT"
1SECTION : 5.2.1.1.1.2.C (OCTOBER 1974) PAGE 8
;
"END" "ELSE"
"BEGIN" "FOR" K:=1 "STEP" 1 "UNTIL" M "DO"
DY[K]:=YL[K]-Y[K]+MU1*F[K];
"IF" E>ETA1 "AND" DISCR>ETA1 "THEN"
"BEGIN" INFO[3]:=INFO[3]+1; JACOBIAN(J,Y);
LUDECOMP
"END";
SOL(A,M,PI,DY);
E:=NORM(DY)
"END";
ELMVEC(1,M,0,Y,DY,1);
ETA:=NORM(Y)*RETA+AETA;
ETA1:=ETA/SQRT(RETA);
DUPVEC(1,M,0,F,Y);
DERIVATIVE(F);
INFO[2]:=INFO[2]+1;
"FOR" K:=1 "STEP" 1 "UNTIL" M "DO" DY[K]:=YR[K]-H*F[K];
DISCR:=NORM(DY)/2
"END" ITERATION;
FIRST:=EVALJAC:="TRUE"; LAST:=EVALCOEF:="FALSE";
INIVEC(1,9,INFO,0);
ETA:=RETA*NORM(Y)+AETA;
ETA1:=ETA/SQRT(ABS(RETA));
DUPVEC(1,M,0,F,Y);
DERIVATIVE(F);
INFO[2]:=1;
"FOR" ST:=1,ST+1 "WHILE" ^LAST "DO"
"BEGIN" STEPSIZE; INFO[1]:=INFO[1]+1;
"IF" EVALJAC "THEN"
"BEGIN" JACOBIAN(J,Y);
INFO[3]:=INFO[3]+1;
H:=HNEW;
COEFFICIENT;
EVALJAC:="FALSE"; LASTJAC:=ST
"END" "ELSE"
"IF" EVALCOEF "THEN" COEFFICIENT;
"FOR" I:=1,I+1 "WHILE" E>ABS(ETA) "AND" DISCR>1.3*ETA
"AND" I<=ITMAX "DO"
"BEGIN" ITERATION(I); "IF" I>INFO[6] "THEN" INFO[6]:=I;
"END"; INFO[7]:=ETA; INFO[8]:=DISCR;
X:=X+H;
"IF" DISCR>INFO[9] "THEN" INFO[9]:=DISCR;
OUTPUT;
"END";
"END" LINIGER1VS;
"EOP"
1SECTION : 5.2.1.1.1.2.D (AUGUST 1974) PAGE 1
AUTHOR: K.DEKKER.
INSTITUTE: MATHEMATICAL CENTRE.
RECEIVED: 1973/07/16.
BRIEF DESCRIPTION:
LINIGER2 SOLVES INITIAL VALUE PROBLEMS , GIVEN AS AN AUTONOMOUS
SYSTEM OF FIRST ORDER DIFFERENTIAL EQUATIONS , BY MEANS OF AN
EXPONENTIALLY FITTED ONESTEP METHOD.
NO AUTOMATIC STEPSIZE CONTROL IS PROVIDED.
IN PARTICULAR THIS METHOD IS SUITABLE FOR THE INTEGRATION OF STIFF
DIFFERENTIAL EQUATIONS.
KEYWORDS:
DIFFERENTIAL EQUATIONS,
INITIAL VALUE PROBLEMS,
STIFF EQUATIONS,
EXPONENTIAL FITTING,
IMPLICIT ONESTEP METHODS.
1SECTION : 5.2.1.1.1.2.D (AUGUST 1974) PAGE 2
CALLING SEQUENCE :
THE HEADING OF THE PROCEDURE LINIGER2 READS:
"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;
"CODE" 33131;
THE MEANING OF THE FORMAL PARAMETERS IS:
X: <VARIABLE>;
THE INDEPENDENT VARIABLE X;
CAN BE USED IN F, JACOBIAN, OUTPUT, ETC.;
ENTRY: THE INITIAL VALUE X0;
EXIT : THE FINAL VALUE XE;
XE: <ARITHMETIC EXPRESSION>;
THE FINAL VALUE OF X (XE>=X);
M: <ARITHMETIC EXPRESSION>;
THE NUMBER OF EQUATIONS;
Y: <ARRAY IDENTIFIER>;
"ARRAY" Y[1:M];
THE DEPENDENT VARIABLE;
ENTRY: THE INITIAL VALUES OF THE SYSTEM OF DIFFERENTIAL
EQUATIONS: Y[I] AT X=X0;
EXIT : THE FINAL VALUES OF THE SOLUTION: Y[I] AT X=XE;
SIGMA1: <ARITHMETIC EXPRESSION>;
THE MODULUS OF THE POINT AT WHICH EXPONENTIAL FITTING IS
DESIRED; THIS POINT MAY BE COMPLEX OR REAL AND NEGATIVE;
SIGMA2: <ARITHMETIC EXPRESSION>;
SIGMA2 MAY DEFINE THREE DIFFERENT TYPES OF EXPONENTIAL
FITTING: FITTING IN TWO COMPLEX CONJUGATED POINTS , FITTING
IN TWO REAL NEGATIVE POINTS , OR FITTING IN ONE POINT
COMBINED WITH THIRD ORDER ACCURACY;
IF THIRD ORDER ACCURACY IS DESIRED , SIGMA2 SHOULD HAVE THE
VALUE 0;
IF FITTING IN A SECOND NEGATIVE POINT IS DESIRED , SIGMA2
SHOULD HAVE THE VALUE OF THE MODULUS OF THIS POINT;
IF FITTING IN TWO COMPLEX CONJUGATED POINTS IS DESIRED ,
THEN SIGMA2 SHOULD BE MINUS THE VALUE OF THE ARGUMENT OF
THE POINT IN THE SECOND QUADRANT (THUS A VALUE BETWEEN - PI
AND - PI/2);
F: <PROCEDURE IDENTIFIER>;
THE HEADING OF THIS PROCEDURE READS:
"REAL" "PROCEDURE" F(I); "INTEGER" I;
THIS PROCEDURE SHOULD DELIVER THE RIGHT HAND SIDE OF THE
I-TH DIFFERENTIAL EQUATION AS F;
1SECTION : 5.2.1.1.1.2.D (AUGUST 1974) PAGE 3
EVALUATE: <PROCEDURE IDENTIFIER>;
THE HEADING OF THIS PROCEDURE READS:
"BOOLEAN" "PROCEDURE" EVALUATE(ITNUM); "INTEGER" ITNUM;
EVALUATE SHOULD HAVE THE VALUE "TRUE", IF IT IS DESIRED
THAT THE JACOBIAN OF THE SYSTEM IS UPDATED IN THE ITNUM-TH
ITERATION STEP OF THE NEWTON PROCESS;
J: <ARRAY IDENTIFIER>;
"ARRAY" J[1:M,1:M];
THE JACOBIAN MATRIX OF THE SYSTEM;
THE ARRAY J SHOULD BE UPDATED IN THE PROCEDURE JACOBIAN;
JACOBIAN: <PROCEDURE IDENTIFIER>;
THE HEADING OF THIS PROCEDURE READS:
"PROCEDURE" JACOBIAN(J,Y); "ARRAY" J,Y;
IN THIS PROCEDURE THE JACOBIAN HAS TO BE ASSIGNED TO THE
THE ARRAY J , OR AN APPROXIMATION OF THE JACOBIAN , IF ONLY
SECOND ORDER ACCURACY IS REQUIRED;
K: <VARIABLE>;
COUNTS THE NUMBER OF INTEGRATION STEPS TAKEN;
FOR EXAMPLE, CAN BE USED IN EVALUATE;
ITMAX: <ARITHMETIC EXPRESSION>;
AN UPPERBOUND FOR THE NUMBER OF ITERATIONS IN NEWTON'S
PROCESS, USED TO SOLVE THE IMPLICIT EQUATIONS;
STEP: <ARITHMETIC EXPRESSION>;
THE LENGTH OF THE INTEGRATION STEP, TO BE PRESCRIBED BY THE
THE USER;
AETA: <ARITHMETIC EXPRESSION>;
REQUIRED ABSOLUTE PRECISION IN THE NEWTON PROCESS, USED TO
SOLVE THE IMPLICIT EQUATIONS;
RETA: <ARITHMETIC EXPRESSION>;
REQUIRED RELATIVE PRECISION IN THE NEWTON PROCESS, USED TO
SOLVE THE IMPLICIT EQUATIONS;
OUTPUT: <PROCEDURE IDENTIFIER>;
THE HEADING OF THIS PROCEDURE READS;
"PROCEDURE" OUTPUT;
THIS PROCEDURE IS CALLED AT THE END OF EACH INTEGRATION
STEP ; THE USER CAN ASK FOR OUTPUT OF THE PARAMETERS , FOR
EXAMPLE X, K, Y.
DATA AND RESULTS: SEE EXAMPLE OF USE, AND REF[3].
PROCEDURES USED:
VECVEC= CP34010,
MATVEC= CP34011,
MATMAT= CP34013,
DEC = CP34300,
SOL = CP34051.
REQUIRED CENTRAL MEMORY:
EXECUTION FIELD LENGTH: CIRCA 20 + M * (4+M).
1SECTION : 5.2.1.1.1.2.D (AUGUST 1974) PAGE 4
RUNNING TIME: DEPENDS STRONGLY ON THE DIFFERENTIAL EQUATION TO SOLVE.
LANGUAGE: ALGOL 60.
METHOD AND PERFORMANCE:
LINIGER2: INTEGRATES THE SYSTEM OF DIFFERENTIAL EQUATIONS FROM X0
UNTIL XE, BY MEANS OF A SECOND ORDER FORMULA (IF SIGMA2=0
AND EVALUATE="TRUE" EVEN THIRD ORDER).
SEE ALSO REF[1] AND REF[2].
REFERENCES:
[1]. W.LINIGER AND R.A.WILLOUGHBY.
EFFICIENT INTEGRATION METHODS FOR STIFF SYSTEMS OF ORDINARY
DIFFERENTIAL EQUATIONS.
SIAM J. NUM. ANAL. 7 (1970) PAGE 47.
[2]. T.J.DEKKER, P.W.HEMKER AND P.W.VAN DER HOUWEN.
COLLOQUIUM STIFF DIFFERENTIAL EQUATIONS 1 (DUTCH).
MC SYLLABUS 15.1, (1972) MATHEMATICAL CENTRE.
[3]. P.A.BEENTJES, K.DEKKER, H.C.HEMKER, S.P.N.VAN KAMPEN AND
G.M.WILLEMS.
COLLOQUIUM STIFF DIFFERENTIAL EQUATIONS 2 (DUTCH).
MC SYLLABUS 15.2, (1973) MATHEMATICAL CENTRE.
EXAMPLE OF USE:
CONSIDER THE SYSTEM OF DIFFERENTIAL EQUATIONS:
DY[1]/DX = -Y[1] + Y[1] * Y[2] + .99 * Y[2]
DY[2]/DX = -1000 * ( -Y[1] + Y[1] * Y[2] + Y[2] )
WITH THE INITIAL CONDITIONS AT X = 0:
Y[1] = 1 AND Y[2] = 0. (SEE REF[2], PAGE 11).
THE SOLUTION AT X = 50 IS APPROXIMATELY:
Y[1] = .765 878 320 2487 AND Y[2] = .433 710 353 5768.
THE FOLLOWING PROGRAM SHOWS SOME DIFFERENT CALLS OF THE PROCEDURE
LINIGER2, AND ILLUSTRATES THE ACCURACY WHICH MAY BE OBTAINED BY IT:
"BEGIN"
"INTEGER" K,ITMAX,PASSES,PASJAC;
"REAL" X,SIGMA,STEP,TIME;
"REAL" "ARRAY" Y[1:2],J[1:2,1:2];
"REAL" "PROCEDURE" F(I); "INTEGER" I;
"IF" I=1 "THEN" F:=(Y[1]+.99)*(Y[2]-1)+.99 "ELSE"
"BEGIN" PASSES:=PASSES+1; F:=1000*((1+Y[1])*(1-Y[2])-1) "END";
1SECTION : 5.2.1.1.1.2.D (AUGUST 1974) PAGE 5
"PROCEDURE" JACOBIAN(J,Y); "ARRAY" J,Y;
"BEGIN" J[1,1]:=Y[2]-1; J[1,2]:=.99+Y[1];
J[2,1]:=1000*(1-Y[2]); J[2,2]:=-1000*(1+Y[1]);
SIGMA:=ABS(J[2,2]+J[1,1]-SQRT((J[2,2]-J[1,1])**2+
4*J[2,1]*J[1,2]))/2;
PASJAC:=PASJAC+1
"END" JACOBIAN;
"BOOLEAN" "PROCEDURE" EVALUATE1(I); "INTEGER" I;
EVALUATE1:= I=1;
"BOOLEAN" "PROCEDURE" EVALUATE2(I); "INTEGER" I;
EVALUATE2:= "TRUE";
"PROCEDURE" OUT;
"IF" X=50 "THEN"
OUTPUT(61,"("3(-4ZDB),2(4B+.3DB3DB3D),-5ZD.3D,/")",K,PASSES,
PASJAC,Y[1],Y[2],CLOCK-TIME);
OUTPUT(61,"(""(" THIS LINE AND THE FOLLOWING TEXT IS ")"
"("PRINTED BY THIS PROGRAM")",//,
"(" THE RESULTS WITH LINIGER2 -SECOND ORDER- ARE:")",/,
"(" K DER.EV. JAC.EV. Y[1] Y[2]")"
"(" TIME")",/")");
"FOR" STEP:=10,1 "DO"
"FOR" ITMAX:=1,3 "DO"
"BEGIN" PASSES:=PASJAC:=0; X:=Y[2]:=0; Y[1]:=1; TIME:=CLOCK;
LINIGER2(X,50.0,2,Y,SIGMA,0.0,F,EVALUATE1,J,JACOBIAN,K,ITMAX,
STEP,"-4,"-4,OUT);
"END";
OUTPUT(61,"("//,
"(" THE RESULTS WITH LINIGER2 -THIRD ORDER- ARE:")",/,
"(" K DER.EV. JAC.EV. Y[1] Y[2]")"
"(" TIME")",/")");
"FOR" STEP:=10,1 "DO"
"FOR" ITMAX:=1,3 "DO"
"BEGIN" PASSES:=PASJAC:=0; X:=Y[2]:=0; Y[1]:=1; TIME:=CLOCK;
LINIGER2(X,50.0,2,Y,SIGMA,0.0,F,EVALUATE2,J,JACOBIAN,K,ITMAX,
STEP,"-4,"-4,OUT);
"END";
"END"
THIS LINE AND THE FOLLOWING TEXT IS PRINTED BY THIS PROGRAM:
THE RESULTS WITH LINIGER2 -SECOND ORDER- ARE:
K DER.EV. JAC.EV. Y[1] Y[2] TIME
5 5 5 +.766 392 210 +.434 218 863 0.092
5 15 5 +.765 755 853 +.433 671 223 0.175
50 50 50 +.765 884 310 +.433 715 687 0.949
50 101 50 +.765 877 388 +.433 710 059 1.494
THE RESULTS WITH LINIGER2 -THIRD ORDER- ARE:
K DER.EV. JAC.EV. Y[1] Y[2] TIME
5 5 5 +.766 392 210 +.434 218 863 0.092
5 15 15 +.765 882 250 +.433 711 614 0.300
50 50 50 +.765 884 310 +.433 715 687 0.949
50 101 101 +.765 878 873 +.433 710 531 2.080
1SECTION : 5.2.1.1.1.2.D (AUGUST 1974) PAGE 6
SOURCE TEXT(S):
0"CODE" 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];
"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 "OR" B2<.1 "THEN" "GOTO" THIRDORDER;
"IF" ABS(B1-B2)<B1*B1*"-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; "COMMENT"
1SECTION : 5.2.1.1.1.2.D (AUGUST 1974) PAGE 7
;
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*"-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; "COMMENT"
1SECTION : 5.2.1.1.1.2.D (AUGUST 1974) PAGE 8
;
"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 "AND" 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" "NOT" LAST "THEN" "GOTO" NEXT LEVEL
"END" LINIGER2;
"EOP"
1SECTION : 5.2.1.1.1.2.E (OCTOBER 1974) PAGE 1
AUTHOR: J.G. VERWER.
INSTITUTE: MATHEMATICAL CENTRE.
RECEIVED: 740809.
BRIEF DESCRIPTION:
GMS SOLVES AN INITIAL VALUE PROBLEM, GIVEN AS AN AUTONOMOUS
SYSTEM OF FIRST ORDER DIFFERENTIAL EQUATIONS DY/DX = F(Y), BY
MEANS OF A THIRD ORDER GENERALIZED LINEAR MULTISTEP METHOD;
IN PARTICULAR THIS PROCEDURE IS SUITABLE FOR THE INTEGRATION
OF STIFF EQUATIONS.
KEYWORDS:
DIFFERENTIAL EQUATIONS,
INITIAL VALUE PROBLEM,
AUTONOMOUS SYSTEM,
STIFF EQUATIONS,
GENERALIZED LINEAR MULTISTEP METHOD.
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE READS:
"PROCEDURE" GMS(X, XE, R, Y, H, HMIN, HMAX, DELTA, DERIVATIVE,
JACOBIAN, AETA, RETA, N, JEV, LU, NSJEV,
LINEAR, OUT);
"VALUE" R;
"REAL" X, XE, H, HMIN, HMAX, DELTA, AETA, RETA;
"INTEGER" R, N, JEV, NSJEV, LU;
"BOOLEAN" LINEAR;
"ARRAY" Y;
"PROCEDURE" DERIVATIVE, JACOBIAN, OUT;
"CODE" 33191;
GMS INTEGRATES THE SYSTEM OF DIFFERENTIAL EQUATIONS DY/DX = F(Y)
FROM X = X0 TO X = XE;
THE MEANING OF THE FORMAL PARAMETERS IS:
X: <VARIABLE>;
THE INDEPENDENT VARIABLE X;
ENTRY: THE INITIAL VALUE OF X;
EXIT : THE END VALUE OF X;
XE: <ARITHMETIC EXPRESSION>;
ENTRY: THE END VALUE OF X;
R: <ARITHMETIC EXPRESSION>;
ENTRY: THE NUMBER OF DIFFERENTIAL EQUATIONS;
1SECTION : 5.2.1.1.1.2.E (MARCH 1977) PAGE 2
Y: <ARRAY IDENTIFIER>;
"ARRAY" Y[1:R];
THE DEPENDENT VARIABLE;
ENTRY: THE INITIAL VALUE OF Y;
EXIT : THE SOLUTION Y AT THE POINT X AFTER EACH
INTEGRATION STEP;
H: <ARITHMETIC EXPRESSION>;
ENTRY: THE STEPLENGTH WHEN THE INTEGRATION HAS TO BE
PERFORMED WITHOUT THE STEPSIZE MECHANISM, OTHER-
WISE THE INITIAL STEPLENGTH (SEE THE PARAMETERS
HMIN AND HMAX);
HMIN, HMAX: <ARITHMETIC EXPRESSION>;
ENTRY: MINIMAL AND MAXIMAL STEPLENGTH BY WHICH THE INTE-
GRATION IS ALLOWED TO BE PERFORMED;
BY PUTTING HMIN = HMAX THE STEPSIZE MECHANISM IS
ELIMINATED; IN THIS CASE THE GIVEN VALUES FOR HMIN AND
HMAX ARE IRRELEVANT, WHILE THE INTEGRATION IS PERFORMED
WITH THE STEPLENGTH GIVEN BY H;
DELTA: <ARITHMETIC EXPRESSION>;
ENTRY: THE REAL PART OF THE POINT AT WHICH EXPONENTIAL
FITTING IS DESIRED;
(SEE METHOD AND PERFORMANCE);
ALTERNATIVES:
DELTA = (AN ESTIMATE OF) THE REAL PART OF THE LARGEST
EIGENVALUE IN MODULUS OF THE JACOBIAN MATRIX OF THE
SYSTEM;
DELTA <= -10**15, IN ORDER TO OBTAIN ASYMPTOTIC STABILITY;
DELTA = 0, IN ORDER TO OBTAIN A HIGHER ORDER OF ACCURACY
IN CASE OF LINEAR EQUATIONS;
DERIVATIVE: <PROCEDURE IDENTIFIER>;
"PROCEDURE" DERIVATIVE(Y); "ARRAY" Y;
<REPLACEMENT OF THE I-TH COMPONENT OF THE SOLUTION Y BY
THE I-TH COMPONENT OF THE DERIVATIVE F(Y), I = 1,..., R>;
JACOBIAN: <PROCEDURE IDENTIFIER>;
"PROCEDURE" JACOBIAN(J, Y); "ARRAY" J, Y;
WHEN IN GMS JACOBIAN IS CALLED THE ARRAY Y CONTAINS
THE VALUES OF THE DEPENDENT VARIABLE;
UPON COMPLETION OF A CALL OF JACOBIAN THE ARRAY J SHOULD
CONTAIN THE VALUES OF THE JACOBIAN MATRIX OF F(Y);
AETA, RETA: <ARITHMETIC EXPRESSION>;
ENTRY: MEASURE OF THE ABSOLUTE AND RELATIVE LOCAL
ACCURACY REQUIRED;
THESE VALUES ARE IRRELEVANT WHEN THE INTEGRATION IS PER-
FORMED WITHOUT THE STEPSIZE MECHANISM;
N: <VARIABLE>;
EXIT : THE NUMBER OF INTEGRATION STEPS;
JEV: <VARIABLE>;
EXIT: THE NUMBER OF JACOBIAN EVALUATIONS;
LU: <VARIABLE>;
EXIT: THE NUMBER OF LU-DECOMPOSITIONS;
1SECTION : 5.2.1.1.1.2.E (OCTOBER 1974) PAGE 3
NSJEV: <VARIABLE>;
ENTRY: NUMBER OF INTEGRATION STEPS PER
JACOBIAN EVALUATION;
THE VALUE OF NSJEV IS RELEVANT ONLY WHEN THE INTEGRATION
IS PERFORMED WITHOUT THE STEPSIZE MECHANISM AND THE
SYSTEM TO BE SOLVED IS NON-LINEAR;
LINEAR: <BOOLEAN EXPRESSION>;
ENTRY: TRUE WHEN THE SYSTEM TO BE INTEGRATED IS LINEAR,
OTHERWISE FALSE;
IF LINEAR IS TRUE THE STEPSIZE MECHANISM IS AUTOMATICALLY
ELIMINATED;
OUT: <PROCEDURE IDENTIFIER>;
"PROCEDURE" OUT;
<BY MEANS OF OUT ONE MAY PRINT THE VALUES OF THE RELEVANT
PARAMETERS OCCURRING IN THE PARAMETERLIST; OUT IS CALLED
AFTER EACH INTEGRATION STEP>;
DATA AND RESULTS: SEE REF[2].
PROCEDURES USED:
VECVEC = CP34010,
MATVEC = CP34011,
MATMAT = CP34013,
ELMROW = CP34024,
ELMVEC = CP34020,
DUPVEC = CP31030,
GSSELM = CP34231,
SOLELM = CP34061,
COLCST = CP31131,
MULVEC = CP31020.
REQUIRED CENTRAL MEMORY:
EXECUTION FIELD LENGTH: 8 * R + 3 * R * R;
RUNNING TIME:
DEPENDS STRONGLY ON THE DIFFERENTIAL EQUATION TO BE SOLVED.
LANGUAGE: ALGOL 60.
1SECTION : 5.2.1.1.1.2.E (MARCH 1977) PAGE 4
METHOD AND PERFORMANCE:
THE PROCEDURE GMS DESCRIBES AN IMPLEMENTATION OF A THIRD ORDER
THREE-STEP GENERALIZED LINEAR MULTISTEP METHOD WITH QUASI-ZERO
PARASITIC ROOTS AND QUASI-ADAPTIVE STABILITY FUNCTION. IN PARTI-
CULAR THE ALGORITHM IS DEVELOPED FOR THE INTEGRATION OF STIFF
SYSTEMS OF ORDINARY DIFFERENTIAL EQUATIONS. THE PROCEDURE SUPPLIES
THE ADDITIONAL STARTING VALUES AND PERFORMS A STEPSIZE CONTROL
WHICH IS BASED ON THE NON-LINEARITY OF THE DIFFERENTIAL EQUATION.
BY THIS CONTROL THE JACOBIAN MATRIX IS INCIDENTALLY EVALUATED. IT
IS POSSIBLE TO ELIMINATE THE STEPSIZE CONTROL. THEN, ONE HAS
TO GIVE THE NUMBER OF INTEGRATION STEPS PER JACOBIAN EVALUATION.
FOR LINEAR EQUATIONS THE STEPSIZE CONTROL IS AUTOMATICALLY ELIMIN-
ATED, WHILE THE PROCEDURE PERFORMS ONE EVALUATION OF THE JACOBIAN.
MOREOVER, IN THIS CASE THE THREE-STEP SCHEME IS REDUCED TO A ONE-
STEP SCHEME. THE PROCEDURE USES ONE FUNCTION EVALUATION PER INTE-
GRATION STEP AND IT DOES NOT REJECT INTEGRATION STEPS. EACH CHANGE
IN THE STEPLENGTH OR EACH REEVALUATION OF THE JACOBIAN COSTS ONE
LU-DECOMPOSITION. IT IS POSSIBLE TO FIT EXPONENTIALLY, THIS FIT-
TING IS EQUIVALENT TO FITTING IN THE SENSE OF LINIGER AND
WILLOUGHBY, ONLY WHEN THE JACOBIAN MATRIX IS EVALUATED AT EACH IN-
TEGRATION STEP. WHEN THE SYSTEM TO BE INTEGRATED IS NON-LINEAR
AND THE JACOBIAN MATRIX IS NOT EVALUATED AT EACH INTEGRATION STEP,
IT IS RECOMMENDED TO FIT AT INFINITY (DELTA <= -10**15).
DETAILS ARE GIVEN IN REFERENCE 2.
REFERENCES:
[1] HOUWEN, P. J. VAN DER AND VERWER, J. G.,
GENERALIZED LINEAR MULTISTEP METHODS 1, DEVELOPMENT OF ALGO-
RITHMS WITH ZERO-PARASITIC ROOTS,
REPORT NW 10/74, MATHEMATISCH CENTRUM, AMSTERDAM 1974.
[2] VERWER, J. G.,
GENERALIZED LINEAR MULTISTEP METHODS 2, NUMERICAL
APPLICATIONS, REPORT NW 12/74, MATHEMATISCH CENTRUM,
AMSTERDAM, 1974.
EXAMPLE OF USE:
WE CONSIDER THE DIFFERENTIAL EQUATION
DY1/DX = -1000 * Y1 * (Y1 + Y2 -1.999987),
DY2/DX = -2500 * Y2 * (Y1 + Y2 - 2),
ON THE INTERVAL [0,50], WITH INITIAL VALUE Y1(0) = Y2(0) = 1.
THE REFERENCE SOLUTION AT X = 50 IS GIVEN BY:
Y1(50) = .5976546988,
Y2(50) = 1.4023434075.
1SECTION : 5.2.1.1.1.2.E (MARCH 1977) PAGE 5
"BEGIN"
"PROCEDURE" DER(Y); "ARRAY" Y;
"BEGIN" "REAL" Y1, Y2;
Y1:= Y[1]; Y2:= Y[2];
Y[1]:= -1000 * Y1 * (Y1 + Y2 - 1.999987);
Y[2]:= -2500 * Y2 * (Y1 + Y2 - 2)
"END" DER;
"PROCEDURE" JAC(J, Y); "ARRAY" J, Y;
"BEGIN" "REAL" Y1, Y2; Y1:= Y[1]; Y2:= Y[2];
J[1,1]:= 1999.987 - 1000 * (2 * Y1 + Y2);
J[1,2]:= -1000 * Y1;
J[2,1]:= -2500 * Y2;
J[2,2]:= 2500 * (2 - Y1 - 2 * Y2)
"END" JAC;
"PROCEDURE" OUTP;
"IF" X = 50 "THEN"
"BEGIN" "REAL" YE1, YE2;
YE1:= .5976546988; YE2:= 1.4023434075;
OUTPUT(61, "("
"("X = ")", 2D2B,
"("N = ")", 3ZD2B,
"("JEV = ")", 3ZD2B,
"("LU = ")", 3ZD, 2/,
"("Y1 = ")", +.13D"+2D2B,
"("REL. ERR. = ")", .2D"+2D, /,
"("Y2 = ")", +.13D"+2D2B,
"("REL. ERR. = ")", .2D"+2D")",
X, N, JEV, LU, Y[1], ABS((Y[1] - YE1) / YE1),
Y[2], ABS((Y[2] - YE2) / YE2))
"END" OUTP;
"INTEGER" N, JEV, LU; "REAL" X;
"ARRAY" Y[1:2]; X:= 0.0; Y[1]:= Y[2]:= 1.0;
GMS(X, 50.0, 2, Y, .01, .001, .5, -"15,
DER, JAC, "-5, "-5, N, JEV,
LU, 0, "FALSE", OUTP)
"END"
THIS PROGRAM DELIVERS:
X = 50 N = 109 JEV = 3 LU = 12
Y1 = +.5976547958004"+00 REL. ERR. = .16"-06
Y2 = +.1402343310813"+01 REL. ERR. = .69"-07
1SECTION : 5.2.1.1.1.2.E (MARCH 1977) PAGE 6
SOURCE TEXT:
"CODE" 33191;
"PROCEDURE" GMS(X, XE, R, Y, H, HMIN, HMAX, DELTA, DERIVATIVE,
JACOBIAN, AETA, RETA, N, JEV, LU, NSJEV,
LINEAR, OUT);
"VALUE" R;
"REAL" X, XE, H, HMIN, HMAX, DELTA, AETA, RETA;
"INTEGER" R, N, JEV, NSJEV, LU;
"BOOLEAN" LINEAR;
"ARRAY" Y;
"PROCEDURE" DERIVATIVE, JACOBIAN, OUT;
"BEGIN"
"INTEGER" I, J, K, L, NSJEV1, COUNT, COUNT1, KCHANGE;
"REAL" A, A1, ALFA, E, S1, S2, Z1, X0, XL0, XL1,
XL2, ETA, H0, H1, Q, Q1, Q2, Q12, Q22, Q1Q2, DISCR;
"BOOLEAN" UPDATE, CHANGE, REEVAL, STRATEGY;
"INTEGER" "ARRAY" RI, CI[1:R];
"ARRAY" AUX[1:9], BD1, BD2[1:3,1:3], Y1,
Y0[1:R], HJAC, H2JAC2, RQZ[1:R,1:R], YL, FL[1:3 * R];
"PROCEDURE" INITIALIZATION;
"BEGIN" LU:= JEV:= N:= NSJEV1:= KCHANGE:= 0; X0:= X; DISCR:= 0;
K:=1; H1:= H0:= H; COUNT:= -2; AUX[2]:= "-14; AUX[4]:= 8;
DUPVEC(1, R, 0, YL, Y); REEVAL:= CHANGE:= "TRUE";
STRATEGY:= HMIN ^= HMAX "AND" ^LINEAR; Q1:= -1; Q2:= -2;
COUNT1:= 0; XL0:= XL1:= XL2:= 0
"END" INITIALIZATION; "COMMENT"
1SECTION : 5.2.1.1.1.2.E (OCTOBER 1974) PAGE 7
;
"PROCEDURE" COEFFICIENT;
"BEGIN" XL2:= XL1; XL1:= XL0; XL0:= X0;
"IF" CHANGE "THEN"
"BEGIN" "IF" N > 2 "THEN"
"BEGIN" Q1:= (XL1 - XL0) / H1;
Q2:= (XL2 - XL0) / H1
"END";
Q12:= Q1 * Q1; Q22:= Q2 * Q2; Q1Q2:= Q1 * Q2;
A:= -(3 * ALFA + 1) / 12;
BD1[1,3]:= 1 + (1 / 3 - (Q1 + Q2) * .5) / Q1Q2;
BD1[2,3]:= (1 / 3 - Q2 * .5) / (Q12 - Q1Q2);
BD1[3,3]:= (1 / 3 - Q1 * .5) / (Q22 - Q1Q2);
BD2[1,3]:= -ALFA * .5 + A * (1 - Q1 - Q2) / Q1Q2;
BD2[2,3]:= A * (1 - Q2) / (Q12 - Q1Q2);
BD2[3,3]:= A * (1 - Q1) / (Q22 - Q1Q2);
"IF" STRATEGY "OR" N <= 2 "THEN"
"BEGIN" BD1[2,2]:= 1 / (2 * Q1);
BD1[1,2]:= 1 - BD1[2,2];
BD2[2,2]:= -(3 * ALFA + 1) / (12 * Q1);
BD2[1,2]:= -BD2[2,2] - ALFA * .5
"END"
"END"
"END" COEFFICIENT;
"PROCEDURE" OPERATOR CONSTRUCTION;
"BEGIN" "IF" REEVAL "THEN"
"BEGIN" JACOBIAN(HJAC, Y);
JEV:= JEV + 1; NSJEV1:= 0;
"IF" DELTA <= -"15 "THEN" ALFA:= 1 / 3 "ELSE"
"BEGIN" Z1:= H1 * DELTA;
A:= Z1 * Z1 + 12; A1:= 6 * Z1;
"IF" ABS(Z1) < .1 "THEN"
ALFA:= (Z1 * Z1 / 140 - 1) * Z1 / 30 "ELSE"
"IF" Z1 < -33 "THEN"
ALFA:= (A + A1) / (3 * Z1 * (2 + Z1)) "ELSE"
"BEGIN" E:= EXP(Z1); ALFA:= ((A - A1) *
E - A - A1) / (((2 - Z1) * E - 2 - Z1) *
Z1 * 3)
"END"
"END";
S1:= -(1 + ALFA) * .5; S2:= (ALFA * 3 + 1) / 12
"END"; "COMMENT"
1SECTION : 5.2.1.1.1.2.E (OCTOBER 1974) PAGE 8
;
A:= H1 / H0; A1:= A * A;
"IF" REEVAL "THEN" A:= H1;
"IF" A ^= 1 "THEN"
"FOR" J:= 1 "STEP" 1 "UNTIL" R "DO"
COLCST(1, R, J, HJAC, A);
"FOR" I:= 1 "STEP" 1 "UNTIL" R "DO"
"BEGIN" "FOR" J:= 1 "STEP" 1 "UNTIL" R "DO"
"BEGIN" Q:= H2JAC2[I,J]:= "IF" REEVAL "THEN"
MATMAT(1, R, I, J, HJAC, HJAC)
"ELSE" H2JAC2[I,J] * A1;
RQZ[I,J]:= S2 * Q
"END";
RQZ[I,I]:= RQZ[I,I] + 1;
ELMROW(1, R, I, I, RQZ, HJAC, S1)
"END";
GSSELM(RQZ, R, AUX, RI, CI); LU:= LU + 1;
REEVAL:= UPDATE:= "FALSE"
"END" OPERATOR CONSTRUCTION;
"PROCEDURE" DIFFERENCE SCHEME;
"BEGIN" "IF" COUNT ^= 1 "THEN"
"BEGIN" DUPVEC(1, R, 0, FL, YL);
DERIVATIVE(FL); N:= N + 1; NSJEV1:= NSJEV1 + 1
"END";
MULVEC(1, R, 0, Y0, YL, (1 - ALFA) / 2 - BD1[1,K]);
"FOR" L:= 2 "STEP" 1 "UNTIL" K "DO"
ELMVEC(1, R, R * (L - 1), Y0, YL, -BD1[L,K]);
"FOR" L:= 1 "STEP" 1 "UNTIL" K "DO"
ELMVEC(1, R, R * (L - 1), Y0, FL, H1 * BD2[L,K]);
"FOR" I:= 1 "STEP" 1 "UNTIL" R "DO"
Y[I]:= MATVEC(1, R, I, HJAC, Y0);
MULVEC(1, R, 0, Y0, YL, (1 - 3 * ALFA) / 12 - BD2[1,K]);
"FOR" L:= 2 "STEP" 1 "UNTIL" K "DO"
ELMVEC(1, R, R * (L - 1), Y0, YL, -BD2[L,K]);
"FOR" I:= 1 "STEP" 1 "UNTIL" R "DO"
Y[I]:= Y[I] + MATVEC(1, R, I, H2JAC2, Y0);
DUPVEC(1, R, 0, Y0, YL);
"FOR" L:= 1 "STEP" 1 "UNTIL" K "DO"
ELMVEC(1, R, R * (L - 1), Y0, FL, H1 * BD1[L,K]);
ELMVEC(1, R, 0, Y, Y0, 1); SOLELM(RQZ, R, RI, CI, Y)
"END" DIFFERENCE SCHEME;
"PROCEDURE" NEXT INTEGRATION STEP;
"BEGIN" "FOR" L:= 2, 1 "DO"
"BEGIN" DUPVEC(L * R + 1, (L + 1) * R, -R, YL, YL);
DUPVEC(L * R + 1, (L + 1) * R, -R, FL, FL)
"END";
DUPVEC(1, R, 0, YL, Y)
"END" NEXT INTEGRATION STEP; "COMMENT"
1SECTION : 5.2.1.1.1.2.E (OCTOBER 1974) PAGE 9
;
"PROCEDURE" TEST ACCURACY;
"BEGIN" K:= 2;
DUPVEC(1, R, 0, Y1, Y); DIFFERENCE SCHEME; K:= 3;
ETA:= AETA + RETA * SQRT(VECVEC(1, R, 0, Y1, Y1));
ELMVEC(1, R, 0, Y, Y1, -1);
DISCR:= SQRT(VECVEC(1, R, 0, Y, Y));
DUPVEC(1, R, 0, Y, Y1)
"END" TEST ACCURACY;
"PROCEDURE" STEPSIZE;
"BEGIN" X0:= X; H0:= H1;
"IF" N <= 2 "AND" ^LINEAR "THEN" K:= K + 1;
"IF" COUNT = 1 "THEN"
"BEGIN" A:= ETA / (.75 * (ETA + DISCR)) + .33;
H1:= "IF" A <= .9 "OR" A >= 1.1 "THEN" A * H0
"ELSE" H0; COUNT:= 0;
REEVAL:= A <= .9 "AND" NSJEV1 ^= 1;
COUNT1:= "IF" A >= 1 "OR" REEVAL "THEN" 0 "ELSE"
COUNT1 + 1; "IF" COUNT1 = 10 "THEN"
"BEGIN" COUNT1:= 0; REEVAL:= "TRUE";
H1:= A * H0
"END"
"END" "ELSE"
"BEGIN" H1:= H; REEVAL:= NSJEV = NSJEV1 "AND"
^STRATEGY "AND" ^LINEAR
"END";
"IF" STRATEGY "THEN" H1:= "IF" H1 > HMAX
"THEN" HMAX "ELSE" "IF" H1 < HMIN "THEN" HMIN "ELSE" H1;
X:= X + H1; "IF" X >= XE "THEN"
"BEGIN" H1:= XE - X0; X:= XE "END";
"IF" N <= 2 "AND" ^LINEAR "THEN" REEVAL:= "TRUE";
"IF" H1 ^= H0 "THEN"
"BEGIN" UPDATE:= "TRUE"; KCHANGE:= 3 "END";
"IF" REEVAL "THEN" UPDATE:= "TRUE";
CHANGE:= KCHANGE > 0 "AND" ^LINEAR;
KCHANGE:= KCHANGE - 1
"END" STEPSIZE;
INITIALIZATION; OUT; X:= X + H1;
OPERATOR CONSTRUCTION;
BD1[1,1]:= 1; BD2[1,1]:= -ALFA * .5;
"IF" ^LINEAR "THEN" COEFFICIENT;
NEXT STEP: DIFFERENCE SCHEME;
"IF" STRATEGY "THEN" COUNT:= COUNT + 1;
"IF" COUNT = 1 "THEN" TEST ACCURACY;
OUT; "IF" X >= XE "THEN" "GOTO" END;
STEPSIZE; "IF" UPDATE "THEN" OPERATOR CONSTRUCTION;
"IF" ^LINEAR "THEN" COEFFICIENT;
NEXT INTEGRATION STEP; "GOTO" NEXT STEP;
END:
"END" GMS;
"EOP"
1SECTION : 5.2.1.1.1.2.F (OCTOBER 1975) PAGE 1
AUTHOR: B.LINDBERG.
CONTRIBUTOR: K.DEKKER.
INSTITUTE: MATHEMATICAL CENTRE.
RECEIVED: 741101.
BRIEF DESCRIPTION:
IMPEX SOLVES AN INITIAL VALUE PROBLEM,GIVEN AS AN AUTONOMOUS SYSTEM
OF FIRST ORDER DIFFERENTIAL EQUATIONS , BY MEANS OF THE IMPLICIT
MIDPOINT RULE WITH SMOOTHING AND EXTRAPOLATION.
AUTOMATIC STEPSIZE CONTROL IS PROVIDED.
IN PARTICULAR THIS METHOD IS SUITABLE FOR THE INTEGRATION OF STIFF
DIFFERENTIAL EQUATIONS.
KEYWORDS:
DIFFERENTIAL EQUATIONS,
INITIAL VALUE PROBLEMS,
STIFF EQUATIONS,
IMPLICIT MIDPOINT RULE,
SMOOTHING,
EXTRAPOLATION.
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE IMPEX READS:
"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;
"CODE" 33135;
IMPEX: INTEGRATES THE SYSTEM OF DIFFERENTIAL EQUATIONS , GIVEN AS
DY/DT=F(T,Y), FROM T0 UNTIL TEND.
THE MEANING OF THE FORMAL PARAMETERS IS:
N: <ARITHMETIC EXPRESSION>;
THE NUMBER OF EQUATIONS;
T0: <ARITHMETIC EXPRESSION>;
THE INITIAL VALUE OF THE INDEPENDENT VARIABLE;
1SECTION : 5.2.1.1.1.2.F (OCTOBER 1975) PAGE 2
TEND: <ARITHMETIC EXPRESSION>;
THE FINAL VALUE OF THE INDEPENDENT VARIABLE;
Y0: <ARRAY IDENTIFIER>;
"REAL" "ARRAY" Y0[1:N];
ENTRY: THE INITIAL VALUES OF THE SYSTEM OF DIFFERENTIAL
EQUATIONS: Y0[I] AT T=T0;
DERIV: <PROCEDURE" IDENTIFIER>;
THE HEADING OF THIS PROCEDURE READS:
"PROCEDURE" DERIV(T,Y,F,N);
"INTEGER" N; "REAL" T; "ARRAY" Y,F;
THIS PROCEDURE SHOULD DELIVER THE VALUE OF F(T,Y) IN THE
ARRAY F[1:N];
AVAILABLE: <PROCEDURE IDENTIFIER>;
THE HEADING OF THIS PROCEDURE READS:
"BOOLEAN" "PROCEDURE" AVAILABLE(T,Y,A,N);
"INTEGER" N; "REAL" T; "ARRAY" Y,A;
IF AN ANALYTIC EXPRESSION OF THE JACOBIAN MATRIX AT THE
POINT (T,Y) IS NOT AVAILABLE, THIS PROCEDURE SHOULD DELIVER
THE VALUE "FALSE";
OTHERWISE THE PROCEDURE SHOULD DELIVER THE VALUE "TRUE",
AND THE JACOBIAN MATRIX SHOULD BE ASSIGNED TO THE ARRAY
A[1:N,1:N];
H0: <ARITHMETIC EXPRESSION>;
THE INITIAL STEPSIZE;
HMAX: <ARITHMETIC EXPRESSION>;
MAXIMAL STEPSIZE BY WHICH THE INTEGRATION IS PERFORMED;
PRESCH: <BOOLEAN EXPRESSION>;
INDICATOR FOR CHOICE OF STEPSIZE;
THE STEPSIZE IS AUTOMATICALLY CONTROLLED IF PRESCH="FALSE";
OTHERWISE THE STEPSIZE HAS TO BE PRESCRIBED , EITHER ONLY
INITIALLY OR ALSO BY THE PROCEDURE CONTROL;
EPS: <ARITHMETIC EXPRESSION>;
BOUND FOR THE ESTIMATE OF THE LOCAL ERROR;
WEIGHTS: <ARRAY IDENTIFIER>;
"REAL" "ARRAY" WEIGHTS[1:N];
WEIGHTS FOR THE COMPUTATION OF THE WEIGHTED EUCLIDEAN NORM
OF THE ERRORS;
ENTRY: INITIAL WEIGHTS;
NOTE THAT THE CHOICE WEIGHTS[I] = 1 IMPLIES AN ESTIMATION
OF THE ABSOLUTE ERROR , WHEREAS WEIGTHS[I] = Y[I] DEFINES A
RELATIVE ERROR;
UPDATE: <PROCEDURE IDENTIFIER>;
THE HEADING OF THIS PROCEDURE READS:
"PROCEDURE" UPDATE(WEIGHTS,Y2,N);
"INTEGER" N; "ARRAY" WEIGHTS,Y2;
THIS PROCEDURE MAY CHANGE THE ARRAY WEIGHTS , ACCORDING TO
THE VALUE OF AN APPROXIMATION FOR Y(T) , GIVEN IN THE ARRAY
Y2[1:N];
1SECTION : 5.2.1.1.1.2.F (OCTOBER 1975) PAGE 3
FAIL: <BOOLEAN EXPRESSION>;
EXIT :
IF THE PROCEDURE FAILS TO SOLVE THE SYSTEM OF EQUATIONS,
FAIL WILL HAVE THE VALUE "TRUE" UPON EXIT;
THIS MAY OCCUR UPON DIVERGENCE OF THE ITERATION PROCESS,
USED IN THE MIDPOINT RULE , WHILE INTEGRATION IS PERFORMED
WITH A USER DEFINED PRESCRIBED STEPSIZE;
CONTROL: <PROCEDURE IDENTIFIER>;
THE HEADING OF THIS PROCEDURE READS:
"PROCEDURE" CONTROL(TPRINT,T,H,HNEW,Y,ERROR,N);
"INTEGER" N; "REAL" TPRINT,T,H,HNEW; "ARRAY" Y,ERROR;
CONTROL IS CALLED ON ENTRY OF IMPEX, AND FURTHER AS SOON AS
THE INEQUALITY TPRINT <= T HOLDS;
DURING A CALL OF CONTROL PRINTING OF RESULTS AND
CHANGE OF STEPSIZE (IF PRESCH = "TRUE") IS THEN POSSIBLE;
THE MEANING OF THE FORMAL PARAMETERS IS:
TPRINT: <VARIABLE>;
ENTRY: THE VALUE OF THE INDEPENDENT VARIABLE AT
WHICH A CALL OF CONTROL WAS DESIRED;
EXIT: A NEW VALUE (TPRINT>T) AT WHICH A CALL OF
CONTROL IS DESIRED;
T: <VARIABLE>;
THE ACTUAL VALUE OF THE INDEPENDENT VARIABLE, UP TO
WHICH INTEGRATION HAS BEEN PERFORMED;
H: <VARIABLE>;
HALVE THE ACTUAL STEPSIZE;
HNEW: <VARIABLE>;
THE NEW STEPSIZE;
IF PRESCH="TRUE", THEN THE USER MAY PRESCRIBE A NEW
STEPSIZE BY CHANGING HNEW;
Y: <ARRAY IDENTIFIER>;
"REAL" "ARRAY" Y[1:5,1:N];
THE VALUE OF THE DEPENDENT VARIABLE AND ITS FIRST
FOUR DIVIDED DIFFERENCES AT THE POINT T ARE GIVEN
IN THIS ARRAY;
ERROR: <ARRAY IDENTIFIER>;
"REAL" "ARRAY" ERROR[1:3];
THE ELEMENTS OF THIS ARRAY CONTAIN THE FOLLOWING
ERRORS:
ERROR[1]: THE LOCAL ERROR;
ERROR[2]: THE GLOBAL ERROR OF SECOND ORDER IN H;
ERROR[3]: THE GLOBAL ERROR OF FOURTH ORDER IN H;
N: <VARIABLE>;
THE NUMBER OF EQUATIONS;
EXAMPLE OF USE: SEE EXAMPLE OF USE OF THE PROCEDURE IMPEX;
DATA AND RESULTS:
FOR DATA, SEE REF[1].
THE RESULTS OF THE INTEGRATION ARE ATTAINABLE THROUGH THE PROCEDURE
CONTROL , WHICH IS CALLED AT SPECIFIED, USER DEFINED, VALUES OF THE
INDEPENDENT VARIABLE . IN PARTICULAR , THE VALUES OF THE DEPENDENT
VARIABLE AT THE ENDPOINT OF INTEGRATION ARE OBTAINED BY A CALL OF
CONTROL WITH TPRINT=TEND.
1SECTION : 5.2.1.1.1.2.F (OCTOBER 1975) PAGE 4
PROCEDURES USED:
INIVEC = CP31010,
INIMAT = CP31011,
MULVEC = CP31020,
MULROW = CP31021,
DUPVEC = CP31030,
DUPROWVEC= CP31032,
DUPMAT = CP31035,
VECVEC = CP34010,
MATVEC = CP34011,
MATMAT = CP34013,
ELMVEC = CP34020,
ELMROW = CP34024,
DEC = CP34300,
SOL = CP34051.
REQUIRED CENTRAL MEMORY:
EXECUTION FIELD LENGTH: CIRCA N * ( 23 + 2 * N ) (DECIMAL).
RUNNING TIME: DEPENDS STRONGLY ON THE DIFFERENTIAL EQUATION TO SOLVE.
LANGUAGE: ALGOL 60.
METHOD AND PERFORMANCE:
THE INTEGRATION METHOD (REF[1]) IS BASED ON THE COMPUTATION OF TWO
INDEPENDENT SOLUTIONS Y(T,H) AND Y(T,H/2) BY THE IMPLICIT MIDPOINT
RULE. PASSIVE SMOOTHING AND PASSIVE EXTRAPOLATION IS PERFORMED TO
OBTAIN STABILITY AND HIGH ACCURACY . THE ALGORITHM USES FOR EACH
STEP AT LEAST THREE FUNCTION EVALUATIONS, AND ON CHANGE OF STEPSIZE
OR AT SLOW CONVERGENCE IN THE ITERATION PROCESS AN APPROXIMATION OF
THE JACOBIAN MATRIX (COMPUTED BY DIVIDED DIFFERENCES OR EXPLICITLY
SPECIFIED BY THE USER) . IF THE COMPUTED LOCAL ERROR EXCEEDS THE
TOLERANCE , THE LAST STEP IS REJECTED. MOREOVER , TWO GLOBAL ERRORS
ARE COMPUTED.
REFERENCES:
[1]. B.LINDBERG.
IMPEX 2 , A PROCEDURE FOR THE SOLUTION OF SYSTEMS OF STIFF
DIFFERENTIAL EQUATIONS.
ROYAL INSTITUTE OF TECHNOLOGY,STOCKHOLM. TRITA-NA-7303 (1973).
[2]. (TO APPEAR)
COLLOQUIUM STIFF DIFFERENTIAL EQUATIONS 3 (DUTCH).
M.C. SYLLABUS 15.3 (1974), MATHEMATICAL CENTRE.
1SECTION : 5.2.1.1.1.2.F (OCTOBER 1975) PAGE 5
EXAMPLE OF USE:
CONSIDER THE AUTONOMOUS SYSTEM OF DIFFERENTIAL EQUATIONS:
DY[1]/DX = .2 * ( Y[2] - Y[1] ),
DY[2]/DX = 10 * Y[1] - ( 60 - Y[3]/8 ) * Y[2] + Y[3]/8,
DY[3]/DX = 1,
WITH INITIAL CONDITIONS AT X=0 : Y[1]=Y[2]=Y[3]=0 (SEE REF[2]).
THE SOLUTION AT SEVERAL POINTS IN THE INTERVAL [0, 400] MAY BE
OBTAINED BY THE FOLLOWING PROGRAM:
(THE SOLUTION AT X=400 IS: Y[1]=22.24222011, Y[2]=27.11071335)
"BEGIN" "INTEGER" N,NFE,NJE,POINT;
"REAL" T,TEND,EPS,HMAX,L,H2,TIME;
"ARRAY" Y,SW[1:3],PRINT[1:5];
"BOOLEAN" FAIL;
"PROCEDURE" LIPEST(L,Y,EPS,T,F,N);
"REAL" T,L,EPS; "ARRAY" Y; "INTEGER" N; "PROCEDURE" F;
"BEGIN" "REAL" N1,N2; "INTEGER" I,IT; "ARRAY" F1,F2,Z,X[1:N];
"REAL" "PROCEDURE" NORM(Y); "ARRAY" Y;
NORM:=SQRT(VECVEC(1,N,0,Y,Y));
DUPVEC(1,N,0,Z,Y);
"FOR" I:=1 "STEP" 1 "UNTIL" N "DO"
X[I]:="IF" Y[I]=0 "THEN" EPS "ELSE" (1+EPS)*Y[I];
N1:=NORM(X)*EPS; F(T,X,F1,N);
"FOR" IT:=1 "STEP" 1 "UNTIL" 5 "DO"
"BEGIN" F(T,Z,F2,N);
ELMVEC(1,N,0,F2,F1,-1);
N2:=N1/NORM(F2);
DUPVEC(1,N,0,Z,X); ELMVEC(1,N,0,Z,F2,N2)
"END";
F(T,Z,F2,N);
ELMVEC(1,N,0,F2,F1,-1);
L:=NORM(F2)/N1
"END" LIPEST;
"PROCEDURE" F(T,Y,F1,N); "VALUE" T; "REAL" T; "ARRAY" Y,F1;
"INTEGER" N;
"BEGIN" NFE:=NFE+1;
F1[1]:=0.2*(Y[2]-Y[1]);
F1[2]:=10*Y[1]-(60-.125*Y[3])*Y[2]+.125*Y[3];
F1[3]:=1
"END";
"BOOLEAN" "PROCEDURE" AVAILABLE(T,Y,A,N);
"INTEGER" N; "REAL" T; "ARRAY" Y,A;
"BEGIN" NJE:=NJE+1; AVAILABLE:="TRUE";
A[1,1]:=-.2; A[1,2]:=.2; A[1,3]:=A[3,1]:=A[3,2]:=A[3,3]:=0;
A[2,1]:=10; A[2,2]:=.125*Y[3]-60; A[2,3]:=.125*(1+Y[2])
"END"
1SECTION : 5.2.1.1.1.2.F (OCTOBER 1975) PAGE 6
"PROCEDURE" UPDATE(SW,R1,N); "INTEGER" N; "ARRAY" SW,R1;
"BEGIN" "REAL" S1,S2; "INTEGER" I;
"FOR" I:=1 "STEP" 1 "UNTIL" N "DO"
"BEGIN" S1:=1/SW[I]; S2:=ABS(R1[I]);
"IF" S1<S2 "THEN" SW[I]:=1/S2
"END"
"END";
"PROCEDURE" CONTROL(TP,T,H,HNEW,Y,ERR,N);
"REAL" TP,T,H,HNEW; "ARRAY" Y,ERR; "INTEGER" N;
"BEGIN" "INTEGER" I;
"ARRAY" C[3:5],X[1:N];
"REAL" S,S2,S3,S4,C1;
NEXT: S:=(T-TP)/H;
S2:=S*S; S3:=S2*S; S4:=S3*S;
C[3]:=(S2-S)/2;
C[4]:=-S3/6+S2/2-S/3;
C[5]:=S4/24-S3/4+11*S2/24-S/4;
"FOR" I:=1 "STEP" 1 "UNTIL" N "DO"
X[I]:=Y[1,I]-S*Y[2,I]+C[3]*Y[3,I]+C[4]*Y[4,I]+C[5]*Y[5,I];
OUTPUT(61,"("3ZD.2D2B,D.D"-D2B,2(+D.8D"-D2B),2(4ZD),3ZD.2D,
/")",TP,ERR[3],X[1],X[2],NFE,NJE,CLOCK-TIME);
"IF" TP<TEND "THEN"
"BEGIN" POINT:=POINT+1; TP:=PRINT[POINT];
"IF" TP<=T "THEN" "GOTO" NEXT
"END"
"END" CONTROL;
N:=3; NJE:=NFE:=0; T:=0; TEND:=400; EPS:="-5; HMAX:=400;
Y[1]:=Y[2]:=Y[3]:=0; SW[1]:=SW[2]:=SW[3]:=1;
PRINT[1]:=.1; PRINT[2]:=1; PRINT[3]:=10; PRINT[4]:=100;
PRINT[5]:=400; POINT:= 0;
LIPEST(L,Y,"-5,T,F,N);
H2:=(EPS*320)**(1/5)/(4*L);
OUTPUT(61,"(""("EPS=")",D.2D"-D,/,"("INTERVAL OF INTEGRATION=(")",
3ZD,"(",")",3ZD,"(")")",/,"("MAXIMALLY ALLOWED STEPSIZE=")",
D.2D"-D,//")",EPS,T,TEND,HMAX);
OUTPUT(61,"(""("LIPSCHCONST=")",BD.3D"+D,/,"("STARTING STEPSIZE")"
"("=")",BD.2D"+D,/,"("FUNCTIONAL EVAL=")",4ZD,//")",L,H2,NFE);
TIME:=CLOCK;
OUTPUT(61,"(""(" X ERROR Y[1] Y[2]")"
"(" NFE NJE TIME")",/")");
IMPEX(N,T,TEND,Y,F,AVAILABLE,H2,HMAX,"FALSE",EPS,SW,UPDATE,FAIL,
CONTROL);
OUTPUT(61,"("/"("NO OF FUNCTIONAL EVALUATIONS= ")",3ZD,/,
"("NO OF JACOBEAN EVALUATIONS= ")",3ZD,/")",NFE,NJE)
"END"
1SECTION : 5.2.1.1.1.2.F (OCTOBER 1975) PAGE 7
THIS PROGRAM DELIVERS:
EPS=1.00"-5
INTERVAL OF INTEGRATION=( 0, 400)
MAXIMALLY ALLOWED STEPSIZE=4.00" 2
LIPSCHCONST= 6.003"+1
STARTING STEPSIZE= 1.32"-3
FUNCTIONAL EVAL= 7
X ERROR Y[1] Y[2] NFE NJE TIME
0.00 0.0" 0 +0.00000000" 0 +0.00000000" 0 7 0 0.01
0.10 6.3"-7 +1.49614151"-6 +1.74013792"-4 46 4 0.72
1.00 1.5"-6 +1.91041887"-4 +2.08361269"-3 85 8 1.48
10.00 8.7"-7 +1.30147663"-2 +2.34487800"-2 119 9 1.99
100.00 1.3"-5 +3.06302487"-1 +3.27552180"-1 225 13 3.47
400.00 1.4"-5 +2.22406546" 1 +2.71090507" 1 556 30 7.51
NO OF FUNCTIONAL EVALUATIONS= 556
NO OF JACOBEAN EVALUATIONS= 30
1SECTION : 5.2.1.1.1.2.F (OCTOBER 1975) PAGE 8
SOURCE TEXT(S):
0"CODE" 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" 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:="-6*Y[I]; "IF" ABS(SL)<"-6 "THEN" SL:="-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
1SECTION : 5.2.1.1.1.2.F (OCTOBER 1975) PAGE 9
;
"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" "NOT" 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]:="-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-"6; T3:=2*T2+1;
RECOMP(A1,H,T,S1,MISS,PS1);RECOMP(A2,H2,T,W1,MISS,PS2);
"END"
1SECTION : 5.2.1.1.1.2.F (OCTOBER 1975) PAGE 10
;
"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];
"INTEGER" I, K;
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" "FOR" I:=1 "STEP" 1 "UNTIL" N "DO" PS2[I]:= PS1[I];
DUPMAT(1,N,1,N,A2,A1) "END";
"IF" TWO "THEN"
"BEGIN" "FOR" I:=1 "STEP" 1 "UNTIL" N "DO" PS1[I]:= PS2[I];
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" HNEW^=H2
1SECTION : 5.2.1.1.1.2.F (OCTOBER 1975) PAGE 11
;
"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 "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 "AND" 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"
1SECTION : 5.2.1.1.1.2.F (OCTOBER 1975) PAGE 12
;
"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 "AND" 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); INIMAT(2, 5, 1, N, R, 0.0);
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 "AND" 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;
"EOP"
1SECTION : 5.2.1.1.1.3 (AUGUST 1974) PAGE 1
SECTION 5.2.1.1.1.3 CONTAINS TWO ALTERNATIVE PROCEDURES FOR SOLVING
FIRST-ORDER INITIAL VALUE PROBLEMS WITH SEVERAL DERIVATIVES AVAILABLE.
A. MODIFIED TAYLOR SOLVES AN INITIAL ( BOUNDARY ) VALUE PROBLEM, GIVEN
AS A SYSTEM OF FIRST ORDER DIFFERENTIAL EQUATIONS , BY MEANS OF A
ONE-STEP TAYLOR-METHOD.
IN PARTICULAR THIS METHOD IS SUITABLE FOR THE INTEGRATION OF LARGE
SYSTEMS ARISING FROM PARTIAL DIFFERENTIAL EQUATIONS, PROVIDED THAT
HIGHER ORDER DERIVATIVES CAN BE EASILY OBTAINED.
B. EXPONENTIALLY FITTED TAYLOR SOLVES AN INITIAL VALUE PROBLEM, GIVEN
AS A SYSTEM OF FIRST ORDER DIFFERENTIAL EQUATIONS , BY MEANS OF A
ONE-STEP TAYLOR-METHOD . AUTOMATIC STEPSIZE CONTROL IS PROVIDED.
IN PARTICULAR THIS METHOD IS SUITABLE FOR THE INTEGRATION OF STIFF
DIFFERENTIAL EQUATIONS , PROVIDED THAT HIGHER ORDER DERIVATIVES CAN
BE EASILY OBTAINED.
1SECTION : 5.2.1.1.1.3.A (AUGUST 1974) PAGE 1
AUTHORS: P.J. VAN DER HOUWEN AND P.A.BEENTJES.
INSTITUTE: MATHEMATICAL CENTRE.
RECEIVED: 730616.
BRIEF DESCRIPTION:
MODIFIED TAYLOR SOLVES AN INITIAL ( BOUNDARY ) VALUE PROBLEM, GIVEN
AS A SYSTEM OF FIRST ORDER DIFFERENTIAL EQUATIONS , BY MEANS OF A
ONE-STEP TAYLOR-METHOD.
IN PARTICULAR THIS METHOD IS SUITABLE FOR THE INTEGRATION OF LARGE
SYSTEMS ARISING FROM PARTIAL DIFFERENTIAL EQUATIONS , PROVIDED THAT
HIGHER ORDER DERIVATIVES CAN BE EASILY OBTAINED.
KEYWORDS:
DIFFERENTIAL EQUATIONS,
INITIAL (BOUNDARY) VALUE PROBLEMS,
ONE-STEP TAYLOR-METHOD.
1SECTION : 5.2.1.1.1.3.A (DECEMBER 1975) PAGE 2
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE READS:
"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;
"CODE" 33040;
THE MEANING OF THE FORMAL PARAMETERS IS:
T: <VARIABLE>;
THE INDEPENDENT VARIABLE T;
MAY BE USED IN DERIVATIVE, SIGMA ETC.;
ENTRY: THE INITIAL VALUE T0;
EXIT : THE FINAL VALUE TE;
TE: <ARITHMETIC EXPRESSION>;
THE FINAL VALUE OF T (TE >= T);
M0,M: <ARITHMETIC EXPRESSION>;
INDICES OF THE FIRST AND LAST EQUATION OF THE SYSTEM TO BE
SOLVED;
U: <ARRAY IDENTIFIER>;
"ARRAY" U[M0:M];
THE DEPENDENT VARIABLE;
ENTRY: THE INITIAL VALUES OF THE SOLUTION OF THE SYSTEM OF
DIFFERENTIAL EQUATIONS AT T = T0;
EXIT : THE VALUES OF THE SOLUTION AT T = TE;
SIGMA: <ARITHMETIC EXPRESSION>;
THE SPECTRAL RADIUS OF THE JACOBIAN MATRIX WITH RESPECT
TO THOSE EIGENVALUES WHICH ARE LOCATED IN THE LEFT
HALFPLANE;
IF SIGMA TENDS TO INFINITY , PROCEDURE MODIFIED TAYLOR
TERMINATES;
TAUMIN: <ARITHMETIC EXPRESSION>;
MINIMAL STEP LENGTH BY WHICH THE INTEGRATION IS PERFORMED;
HOWEVER,ACTUAL STEPSIZES WILL ALWAYS BE WITHIN THE INTERVAL
[MIN(HMIN,HSTAB),HSTAB],WHERE HSTAB(= DATA[0]/SIGMA) IS THE
STEPLENGTH PRESCRIBED BY STABILITY CONSIDERATIONS;
I: <VARIABLE>;
A JENSEN PARAMETER FOR PROCEDURE DERIVATIVE;
MAY BE USED IN M0 AND M;
DERIVATIVE: <PROCEDURE IDENTIFIER>;
THE HEADING OF THIS PROCEDURE READS:
"PROCEDURE" DERIVATIVE(I,A); "INTEGER" I; "ARRAY" A;
WHEN THIS PROCEDURE IS CALLED, ARRAY A[M0 : M] CONTAINS THE
COMPONENTS OF THE (I-1)-ST DERIVATIVE OF U AT THE POINT T;
UPON COMPLETION OF DERIVATIVE, ARRAY A SHOULD CONTAIN THE
COMPONENTS OF THE I-TH DERIVATIVE OF U AT THE POINT T;
K: <VARIABLE>;
INDICATES THE NUMBER OF INTEGRATION STEPS PERFORMED;
ENTRY: K = 0;
1SECTION : 5.2.1.1.1.3.A (AUGUST 1974) PAGE 3
DATA: <ARRAY IDENTIFIER>;
"ARRAY" DATA[-2 : DATA[-2]];
ENTRY:
DATA[-2]: THE ORDER OF THE HIGHEST DERIVATIVE UPON WHICH
THE TAYLOR METHOD IS BASED;
DATA[-1]: ORDER OF ACCURACY OF THE METHOD;
DATA[0] : STABILITY PARAMETER;
DATA[1] , ... , DATA[DATA[-2]] : POLYNOMIAL COEFFICIENTS;
FOR FURTHER EXPLANATION AND POSSIBLE VALUES OF THE ELEMENTS
OF ARRAY DATA SEE REFERENCES [2] AND [3];
ALFA: <ARITHMETIC EXPRESSION>;
GROWTH FACTOR FOR THE INTEGRATION STEP LENGTH;
NORM: <ARITHMETIC EXPRESSION>;
IF NORM = 1 DISCREPANCY AND TOLERANCE ARE ESTIMATED IN THE
MAXIMUM NORM, OTHERWISE IN THE EUCLIDIAN NORM;
AETA,RETA: <ARITHMETIC EXPRESSION>;
DESIRED ABSOLUTE AND RELATIVE ACCURACY;
IF BOTH AETA AND RETA ARE NEGATIVE , ACCURACY CONDITIONS
WILL BE IGNORED;
ETA,RHO: <VARIABLE>;
COMPUTED TOLERANCE AND DISCREPANCY;
OUT: <PROCEDURE IDENTIFIER>;
THE HEADING OF THIS PROCEDURE READS : "PROCEDURE" OUT;
THROUGH THIS PROCEDURE THE VALUES AFTER EACH INTEGRATION
STEP OF FOR INSTANCE T, U, ETA AND RHO ARE ACCESSIBLE.
DATA AND RESULTS:
FOR FURTHER EXPLANATION OF THE PARAMETERS AETA, RETA, ETA, RHO, M0,
M AND THE ARRAY DATA SEE REFERENCES [2] AND [3].
AS FOR THE INDICES M0 AND M THE FOLLOWING MAY BE REMARKED: WHEN
THE METHOD OF LINES IS APPLIED TO HYPERBOLIC DIFFERENTIAL EQUATIONS
THE NUMBER OF RELEVANT ORDINARY DIFFERENTIAL EQUATIONS DECREASES
DURING THE INTEGRATION PROCESS.
IN PROCEDURE MODIFIED TAYLOR , THIS MAY BE REALIZED BY INTEGER
PROCEDURES M0 AND M WHICH ARE DEFINED AS FUNCTIONS OF I, K AND
DATA[-2].
PROCEDURES USED: VECVEC = CP34010.
REQUIRED CENTRAL MEMORY:
EXECUTION FIELD LENGTH: CIRCA 75 + M - M0.
RUNNING TIME:
DEPENDS STRONGLY ON THE DIFFERENTIAL EQUATION TO BE SOLVED.
LANGUAGE: ALGOL 60.
1SECTION : 5.2.1.1.1.3.A (AUGUST 1974) PAGE 4
METHOD AND PERFORMANCE: SEE REFERENCES.
REFERENCES:
[1].P.J. VAN DER HOUWEN.
ONE-STEP METHODS FOR LINEAR INITIAL VALUE PROBLEMS I,
POLYNOMIAL METHODS,TW REPORT 119,
MATHEMATICAL CENTRE, AMSTERDAM (1970).
[2].P.J. VAN DER HOUWEN, P.BEENTJES, K.DEKKER AND E.SLAGT
ONE-STEP METHODS FOR LINEAR INITIAL VALUE PROBLEMS III,
NUMERICAL EXAMPLES, TW REPORT 130/71,
MATHEMATICAL CENTRE, AMSTERDAM (1971).
[3].P.J. VAN DER HOUWEN, J.KOK.
NUMERICAL SOLUTION OF A MINIMAX PROBLEM, TW REPORT 123/71,
MATHEMATICAL CENTRE, AMSTERDAM (1971).
EXAMPLE OF USE:
THE SOLUTION AT T=EXP(1) AND T=EXP(2) OF THE DIFFERENTIAL EQUATION
DU/DT=-EXP(T)*(U-LN(T)) + 1/T WITH INITIAL CONDITION U(.01)=LN(.01)
AND ANALYTICAL SOLUTION U(T) = LN(T), MAY BE OBTAINED AS FOLLOWS:
"BEGIN" "INTEGER" I,K;"REAL" T,TE,ETA,RHO,EXPT,LNT,C0,C1,C2,C3;
"ARRAY" U[0:0],DATA[-2:4];
"PROCEDURE" OP;"IF" T=TE "THEN"
OUTPUT(61,"(""("NUMBER OF STEPS:")",3ZD,/,
"("SOLUTION: T= ")",+D.5D,
"(" U(T) = ")",+D.7D,//")",K,T,U[0]);
"PROCEDURE" DER(I,A);"INTEGER" I;"ARRAY" A;
"BEGIN" "IF" I=1 "THEN"
"BEGIN" EXPT:=EXP(T);LNT:=LN(T);C0:=A[0];
C1:=A[0]:=-EXPT*C0+1/T+EXPT*LNT
"END";
"IF" I=2 "THEN" C2:=A[0]:=EXPT*(LNT+1/T-C0-C1)-1/T/T;
"IF" I=3 "THEN" C3:=A[0]:=
EXPT*(LNT+2/T-C0-2*C1-C2-1/T/T)+2/T/T/T;
"IF" I=4 "THEN" A[0]:=C3-2*(1+3/T)/T/T/T+
EXPT*((1-(2-2/T)/T)/T-C1-C2*2-C3)
"END";
I:=-2;"FOR" T:=4,3,6.025,1,.5,1/6,.018455702 "DO"
"BEGIN" DATA[I]:=T;I:=I+1 "END";
T:=U[0]:="-2;K:=0;"FOR" TE:=EXP(1),TE*TE "DO"
MODIFIED TAYLOR(T,TE,0,0,U,EXP(T),"-4,I,DER,K,DATA,1.5,1,"-5,
"-4,ETA,RHO,OP)
"END"
1SECTION : 5.2.1.1.1.3.A (AUGUST 1974) PAGE 5
THIS PROGRAM DELIVERS:
NUMBER OF STEPS: 46
SOLUTION: T= +2.71828 U(T) = +1.0000285
NUMBER OF STEPS: 424
SOLUTION: T= +7.38906 U(T) = +1.9999967
SOURCE TEXT(S):
0"CODE" 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;
"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"; "COMMENT"
1SECTION : 5.2.1.1.1.3.A (AUGUST 1974) PAGE 6
;
"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"
1SECTION : 5.2.1.1.1.3.A (AUGUST 1974) PAGE 7
"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<"-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 "AND" 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;
"EOP"
1SECTION : 5.2.1.1.1.3.B (AUGUST 1974) PAGE 1
AUTHORS: P.J. VAN DER HOUWEN AND K.DEKKER.
INSTITUTE: MATHEMATICAL CENTRE.
RECEIVED: 740416.
BRIEF DESCRIPTION:
EXPONENTIALLY FITTED TAYLOR SOLVES AN INITIAL VALUE PROBLEM, GIVEN
AS A SYSTEM OF FIRST ORDER DIFFERENTIAL EQUATIONS , BY MEANS OF A
ONE-STEP TAYLOR-METHOD . AUTOMATIC STEPSIZE CONTROL IS PROVIDED.
IN PARTICULAR THIS METHOD IS SUITABLE FOR THE INTEGRATION OF STIFF
DIFFERENTIAL EQUATIONS , PROVIDED THAT HIGHER ORDER DERIVATIVES CAN
BE EASILY OBTAINED.
KEYWORDS:
DIFFERENTIAL EQUATIONS,
INITIAL VALUE PROBLEMS,
EXPONENTIAL FITTING,
STIFF EQUATIONS,
THREE-CLUSTER METHOD,
ONE-STEP TAYLOR-METHOD.
1SECTION : 5.2.1.1.1.3.B (AUGUST 1974) PAGE 2
CALLING SEQUENCE:
THE HEADING OF THE PROCEDURE READS:
"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;
"CODE" 33050;
THE MEANING OF THE FORMAL PARAMETERS IS:
T: <VARIABLE>;
THE INDEPENDENT VARIABLE T;
MAY BE USED IN DERIVATIVE, SIGMA ETC.;
ENTRY: THE INITIAL VALUE T0;
EXIT : THE FINAL VALUE TE;
TE: <ARITHMETIC EXPRESSION>;
THE FINAL VALUE OF T (TE >= T);
M0: <ARITHMETIC EXPRESSION>;
INDEX OF THE FIRST EQUATION OF THE SYSTEM TO BE SOLVED;
M: <ARITHMETIC EXPRESSION>;
INDEX OF THE LAST EQUATION OF THE SYSTEM TO BE SOLVED;
U: <ARRAY IDENTIFIER>;
"ARRAY" U[M0:M];
THE DEPENDENT VARIABLE;
ENTRY: THE INITIAL VALUES OF THE SOLUTION OF THE SYSTEM OF
DIFFERENTIAL EQUATIONS AT T = T0;
EXIT : THE VALUES OF THE SOLUTION AT T = TE;
SIGMA: <ARITHMETIC EXPRESSION>;
THE MODULUS OF THE (COMPLEX) POINT AT WHICH EXPONENTIAL
FITTING IS DESIRED , FOR EXAMPLE AN APPROXIMATION OF THE
MODULUS OF THE CENTRE OF THE LEFT HAND CLUSTER;
PHI: <ARITHMETIC EXPRESSION>;
THE ARGUMENT OF THE (COMPLEX) POINT AT WHICH EXPONENTIAL
FITTING IS DESIRED;
PHI SHOULD HAVE A VALUE FROM THE RANGE [PI/2,PI];
DIAMETER: <ARITHMETIC EXPRESSION>;
THE DIAMETER OF THE LEFT HAND CLUSTER;
DERIVATIVE: <PROCEDURE IDENTIFIER>;
THE HEADING OF THIS PROCEDURE READS:
"PROCEDURE" DERIVATIVE(I,A); "INTEGER" I; "ARRAY" A;
I ASSUMES THE VALUES 1,2,3 AND A IS A ONE-DIMENSIONAL ARRAY
A[M0:M];
WHEN THIS PROCEDURE IS CALLED , ARRAY A CONTAINS THE
COMPONENTS OF THE (I-1)-ST DERIVATIVE OF U AT THE POINT T;
UPON COMPLETION OF DERIVATIVE, ARRAY A SHOULD CONTAIN THE
COMPONENTS OF THE I-TH DERIVATIVE OF U AT THE POINT T;
I: <VARIABLE>;
A JENSEN PARAMETER FOR PROCEDURE DERIVATIVE;
MAY BE USED IN M0 AND M;
1SECTION : 5.2.1.1.1.3.B (AUGUST 1974) PAGE 3
K: <VARIABLE>;
INDICATES THE NUMBER OF INTEGRATION STEPS PERFORMED;
ENTRY: K = 0;
EXIT : THE NUMBER OF INTEGRATION STEPS PERFORMED;
ALFA: <ARITHMETIC EXPRESSION>;
MAXIMAL GROWTH FACTOR FOR THE INTEGRATION STEP LENGTH;
NORM: <ARITHMETIC EXPRESSION>;
IF NORM = 1 DISCREPANCY AND TOLERANCE ARE ESTIMATED IN THE
MAXIMUM NORM, OTHERWISE IN THE EUCLIDIAN NORM;
AETA: <ARITHMETIC EXPRESSION>;
DESIRED ABSOLUTE LOCAL ACCURACY ; AETA SHOULD BE POSITIVE;
RETA: <ARITHMETIC EXPRESSION>;
DESIRED RELATIVE LOCAL ACCURACY ; RETA SHOULD BE POSITIVE;
ETA: <VARIA2LE>;
COMPUTED TOLERANCE;
RHO: <VARIABLE>;
COMPUTED DISCREPANCY;
HMIN: <ARITHMETIC EXPRESSION>;
MINIMAL STEPSIZE BY WHICH THE INTEGRATION IS PERFORMED;
HOWEVER, A SMALLER STEP WILL BE TAKEN IF HMIN EXCEEDS THE
STEPSIZE HSTAB , PRESCRIBED BY THE STABILITY CONDITIONS
(SEE REF[2], FORMULA 6.12);
IF HSTAB TENDS TO ZERO, THE PROCEDURE TERMINATES;
HSTART: <VARIABLE>;
ENTRY: THE INTITIAL STEPSIZE ; HOWEVER, IF K = 0 ON ENTRY,
THE VALUE OF HSTART IS NOT TAKEN INTO CONSIDERATION;
EXIT: A SUGGESTION FOR THE STEPSIZE , IF THE INTEGRATION
SHOULD BE CONTINUED FOR T>TE;
HSTART MAY BE USED IN SUCCESSIVE CALLS OF THE PROCEDURE, IN
ORDER TO OBTAIN THE SOLUTION IN SEVERAL POINTS TE1,TE2,ETC;
OUTPUT: <PROCEDURE IDENTIFIER>;
THE HEADING OF THIS PROCEDURE READS:
"PROCEDURE" OUTPUT;
THROUGH THIS PROCEDURE THE VALUES AFTER EACH INTEGRATION
STEP OF FOR INSTANCE T, U, ETA AND RHO ARE ACCESSIBLE;
DATA AND RESULTS:
FOR FURTHER EXPLANATION OF THE PARAMETERS SIGMA,PHI,DIAMETER,AETA,
RETA,ETA,RHO,M0,M SEE REF[2];
FOR RESULTS: SEE EXAMPLE OF USE AND REF[2];
PROCEDURES USED:
INIVEC = CP 31010;
DUPVEC = CP 31030;
VECVEC = CP 34010;
ELMVEC = CP 34020;
ZEROIN = CP 34150.
1SECTION : 5.2.1.1.1.3.B (AUGUST 1974) PAGE 4
REQUIRED CENTRAL MEMORY:
EXECUTION FIELD LENGTH: CIRCA 40 + 2 * (M - M0).
RUNNING TIME:
DEPENDS STRONGLY ON THE DIFFERENTIAL EQUATION TO BE SOLVED.
LANGUAGE: ALGOL 60.
METHOD AND PERFORMANCE: SEE REFERENCES.
REFERENCES:
[1]. P.J. VAN DER HOUWEN.
ONE-STEP METHODS FOR LINEAR INITIAL VALUE PROBLEMS II,
POLYNOMIAL METHODS.
TW REPORT 122, (1970) MATHEMATICAL CENTRE.
[2]. P.J. VAN DER HOUWEN, P.BEENTJES, K.DEKKER AND E.SLAGT.
ONE-STEP METHODS FOR LINEAR INITIAL VALUE PROBLEMS III,
NUMERICAL EXAMPLES.
TW REPORT 130, (1971) MATHEMATICAL CENTRE.
EXAMPLE OF USE:
THE SOLUTION AT T=EXP(1) AND T=EXP(2) OF THE DIFFERENTIAL EQUATION
DU/DT=-EXP(T)*(U-LN(T)) + 1/T WITH INITIAL CONDITION U(.01)=LN(.01)
AND ANALYTICAL SOLUTION U(T) = LN(T), MAY BE OBTAINED AS FOLLOWS:
"BEGIN" "INTEGER" I,K;
"REAL" T,TE,TE1,TE2,RETA,ETA,RHO,PI,HS,EXPT,LNT,TIME,U0,U1,U2;
"REAL" "ARRAY" U[0:0];
"PROCEDURE" DERIVATIVE(I,U); "INTEGER" I; "ARRAY" U;
"IF" I=1 "THEN" "BEGIN" EXPT:=EXP(T); LNT:=LN(T); U0:=U[0];
U1:=U[0]:=EXPT*(LNT-U0)+1/T
"END" "ELSE"
"IF" I=2 "THEN" U2:=U[0]:=EXPT*(LNT-U0-U1+1/T)-1/T/T
"ELSE" U[0]:=EXPT*(LNT-U0-2*U1-U2+2/T-1/T/T)+2/T/T/T;
"PROCEDURE" OUT;
"IF" T=TE "THEN" OUTPUT(61,"("6ZD,+3ZD.3DB3DB3D")",K,U[0]);
1SECTION : 5.2.1.1.1.3.B (AUGUST 1974) PAGE 5
"PROCEDURE" OUT1;
OUTPUT(61,"("4BD"-D,3Z.3D,/")",RETA,CLOCK-TIME);
OUTPUT(61,"(""(" THIS LINE AND THE FOLLOWING TEXT IS ")"
"("PRINTED BY THIS PROGRAM")",//,
"(" THE RESULTS WITH EFT ARE -CONFER REF[2]- :")",/,
"(" K U(TE1) K U(TE2)")"
"(" RETA TIME")",/")");
PI:=4*ARCTAN(1); TE1:=EXP(1); TE2:=EXP(2);
"FOR" RETA:="-1,"-2,"-3,"-4 "DO"
"BEGIN" T:=.01; U[0]:=LN(T); K:=0; HS:=0; TIME:=CLOCK;
"FOR" TE:=TE1,TE2 "DO"
EXPONENTIALLY FITTED TAYLOR
(T,TE,0,0,U,EXP(T),PI,2*EXP(2*T/3),DERIVATIVE,I,K,1.5,2,
RETA/10,RETA,ETA,RHO,"-4,HS,OUT); OUT1
"END";
OUTPUT(61,"("//,"(" WITH RELAXED ACCURACY CONDITIONS FOR ")"
"("T>3:")",/,"(" K U(TE1) K U(TE2)")"
"(" RETA TIME")",/")");
"FOR" RETA:="-1,"-2,"-3,"-4 "DO"
"BEGIN" T:=.01; U[0]:=LN(T); K:=0; HS:=0; TIME:=CLOCK;
"FOR" TE:=TE1,TE2 "DO"
EXPONENTIALLY FITTED TAYLOR
(T,TE,0,0,U,EXP(T),PI,2*EXP(2*T/3),DERIVATIVE,I,K,1.5,2,
RETA/10*("IF" T<3 "THEN" 1 "ELSE" EXP(2*(T-3))),
RETA*("IF" T<3 "THEN" 1 "ELSE" EXP(2*(T-3))),
ETA,RHO,"-4,HS,OUT); OUT1
"END"
"END"
THIS LINE AND THE FOLLOWING TEXT IS PRINTED BY THIS PROGRAM
THE RESULTS WITH EFT ARE -CONFER REF[2]- :
K U(TE1) K U(TE2) RETA TIME
15 +1.003 845 001 42 +2.000 076 417 1"-1 .938
22 +1.001 211 286 52 +2.000 066 067 1"-2 1.121
36 +1.000 108 738 92 +2.000 020 495 1"-3 1.872
56 +1.000 045 271 171 +2.000 000 925 1"-4 3.493
WITH RELAXED ACCURACY CONDITIONS FOR T>3:
K U(TE1) K U(TE2) RETA TIME
15 +1.003 845 001 42 +2.000 076 417 1"-1 1.037
22 +1.001 211 286 50 +2.000 049 978 1"-2 1.154
36 +1.000 108 738 68 +2.000 023 330 1"-3 1.419
56 +1.000 045 271 98 +2.000 065 056 1"-4 2.008
1SECTION : 5.2.1.1.1.3.B (AUGUST 1974) PAGE 6
SOURCE TEXT(S):
0"CODE" 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" COEFFICIENT;
"BEGIN" "REAL" B,B1,B2,BB,E,BETA2,BETA3;
B:=H*SIGMAL; B1:=B*COS(PHIL); BB:=B*B;
"IF" ABS(B)<"-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)<"-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"; "COMMENT"
1SECTION : 5.2.1.1.1.3.B (AUGUST 1974) PAGE 7
;
"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" "NOT" 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,
"-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; "COMMENT"
1SECTION : 5.2.1.1.1.3.B (AUGUST 1974) PAGE 8
;
"IF" H*SIGMAL>1 "THEN"
"BEGIN" A:=ABS(DIAMETER/SIGMAL+"-14)/2; B:=2*ABS(SIN(PHIL));
BETAN:=("IF" A>B "THEN" 1/A "ELSE" 1/B)/A;
HSTAB:=ABS(BETAN/SIGMAL);
"IF" HSTAB<"-14*T "THEN" "GOTO" ENDOFEFT;
"IF" H>HSTAB "THEN" H:=HSTAB
"END";
HCR:=H2*H2/H1;
"IF" KL>2 "AND" ABS(H-HCR)<"-6*HCR "THEN"
H:="IF" H<HCR "THEN" HCR*(1-"-7) "ELSE" HCR*(1+"-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;
"EOP"
Click here to get the file