newnumal5p3.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 462.7 kB - File type text/plainFile contents
1SECTION : 5.2.1.1.2.1 (FEBRUARY 1979) PAGE 1 SECTION 5.2.1.1.2.1 CONTAINS FOUR PROCEDURES FOR INITIAL VALUE PROBLEMS FOR SECOND ORDER ORDINARY DIFFERENTIAL EQUATIONS. A. RK2 SOLVES AN IVP FOR A SINGLE SECOND ORDER ODE BY MEANS OF A 5-TH ORDER RUNGE-KUTTA METHOD. B. RK2N SOLVES AN IVP FOR A SYSTEM OF SECOND ORDER ODE'S BY MEANS OF A 5-TH ORDER RUNGE-KUTTA METHOD C. RK3 SOLVES AN IVP FOR A SINGLE SECOND ORDER ODE WITHOUT FIRST DERIVATIVE. RK3 IS BASED ON A 5-TH ORDER RUNGE-KUTTA METHOD. D. RK3N SOLVES AN IOVP FOR A SYSTEM OF SECOND ORDER ODE'S WITHOUT FIRST DERIVATIVE. RK3N IS BASED ON A 5-TH ORDER RUNGE-KUTTA METHOD. 1SECTION : 5.2.1.1.2.1.A (FEBRUARY 1979) PAGE 1 PROCEDURE : RK2. AUTHOR: J.A.ZONNEVELD. CONTRIBUTORS: M.BAKKER AND I.BRINK. INSTITUTE: MATHEMATICAL CENTRE. RECEIVED: 730715. BRIEF DESCRIPTION: RK2 INTEGRATES THE SCALAR INITIAL VALUE PROBLEM (D/DX) (D/DX) Y = F(X, Y, (D/DX)Y), A<= X <=B OR B <= X <= A, Y(A) AND (D/DX) Y(A) PRESCRIBED. KEYWORDS: INITIAL VALUE PROBLEM, SECOND ORDER DIFFERENTIAL EQUATION. 1SECTION : 5.2.1.1.2.1.A (FEBRUARY 1979) PAGE 2 CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "PROCEDURE" RK2(X, A, B, Y, YA, Z, ZA, FXYZ, E, D, FI); "VALUE" B, FI; "REAL" X, A, B, Y, YA, Z, ZA, FXYZ; "BOOLEAN" FI; "ARRAY" E, D; "CODE" 33012; THE MEANING OF THE FORMAL PARAMETERS IS: X: <VARIABLE>; THE INDEPENDENT VARIABLE; A: <ARITHMETIC EXPRESSION>; THE INITIAL VALUE OF X; B: <ARITHMETIC EXPRESSION>; THE END VALUE OF X, (B <= A IS ALLOWED); Y: <VARIABLE>; THE DEPENDENT VARIABLE; EXIT : THE VALUE OF Y(X) AT X = B; YA: <ARITHMETIC EXPRESSION>; ENTRY : THE INITIAL VALUE OF Y AT X = A, Z: <VARIABLE>; THE DERIVATIVE DY / DX; EXIT : THE VALUE OF Z(X) AT X = B; ZA: <ARITHMETIC EXPRESSION>; ENTRY : THE INITIAL VALUE OF (D/DX) Y AT X = A; FXYZ: <ARITHMETIC EXPRESSION>; THE RIGHT HAND SIDE OF THE DIFFERENTIAL EQUATION; FXYZ DEPENDS ON X, Y, Z, GIVING THE VALUE OF (D/DX) (D/DX) Y; E: <ARRAY IDENTIFIER>; "ARRAY" E[1 : 4]; E[1] AND E[3] ARE USED AS RELATIVE , E[2] AND E[4] ARE USED AS ABSOLUTE TOLERANCES FOR Y AND DY / DX, RESPECTIVELY; D: <ARRAY IDENTIFIER>; "ARRAY" D[1 : 5]; EXIT: ENTIER(D[1] + .5) = THE NUMBER OF STEPS SKIPPED, D[2] = THE LAST STEP LENGTH USED, D[3] = B, D[4] = Y(B), D[5] = (D/DX) Y, FOR X = B; FI: <BOOLEAN EXPRESSION>; IF FI = "TRUE" THEN THE INTEGRATION STARTS AT X=A WITH A TRIAL STEP B - A ; IF FI = "FALSE" THEN THE INTEGRATION IS CONTINUED WITH,AS INITIAL CONDITIONS, X = D[3], Y = D[4], Z = D[5], AND A, YA AND ZA ARE IGNORED. PROCEDURES USED: NONE. 1SECTION : 5.2.1.1.2.1.A (DECEMBER 1979) PAGE 3 METHOD AND PERFORMANCE : THE PROCEDURE, WHICH IS PROVIDED WITH STEPLENGTH AND ERROR CONTROL, IS BASED ON A 5-TH ORDER RUNGE-KUTTA METHOD. A COMPLETE DESCRIPTION IS GIVEN IN [1]. REFERENCES: [1]. J.A.ZONNEVELD. AUTOMATIC NUMERICAL INTEGRATION. MATH. CENTRE TRACT 8 (1970). EXAMPLE OF USE: THE VAN DER POL EQUATION (D/DX) (D/DX) Y = 10*(1-Y**2)*(DY/DX) - Y, X >= 0, Y = 2, DY/DX = 0 , X=0 CAN BE INTEGRATED BY THE PROCEDURE RK2; AT THE POINTS X = 9.32386578, 18.86305405, 28.40224162, 37.94142918 THE DERIVATIVE DY / DX VANISHES; THE PROGRAM WHICH SOLVES THE VAN DER POL EQUATION READS AS FOLLOWS (WITH E[I] = "-8, I = 1,...,4): "BEGIN" "COMMENT" VAN DER POL; "REAL" X,Y,Z,B; "BOOLEAN" FI; "ARRAY" E[1:4],D[1:5]; E[1]:=E[2]:=E[3]:=E[4]:="-8; "FOR" B:=9.32386578,18.86305405,28.40224162,37.94142918 "DO" "BEGIN" FI:= B<10; RK2(X,0.0,B,Y,2.0,Z,0.0,10*(1-Y**2)*Z-Y,E,D,FI); OUTPUT(61,"("//10B"("X=")"2D.10D,10B"("Y=")"+2D.10D , 10B"("DY/DX =")",+.5D"-D")",X,Y,Z) "END" "END" RESULTS: X=09.3238657800 Y=-02.0142853609 DY/DX=+.00000"00 X=18.8630540500 Y=+02.0142853609 DY/DX=-.00001"00 X=28.4022416200 Y=-02.0142853609 DY/DX=+.00001"00 X=37.9414291800 Y=+02.0142853608 DY/DX=-.00002"00 1SECTION : 5.2.1.1.2.1.A (DECEMBER 1979) PAGE 4 SOURCE TEXT(S): 0"CODE" 33012 ; "PROCEDURE" RK2(X, A, B, Y, YA, Z, ZA, FXYZ, E, D, FI); "VALUE" B, FI; "REAL" X, A, B, Y, YA, Z, ZA, FXYZ; "BOOLEAN" FI; "ARRAY" E, D; "BEGIN" "REAL" E1, E2, E3, E4, XL, YL, ZL, H, INT, HMIN, HL, ABSH, K0, K1, K2, K3, K4, K5, DISCRY, DISCRZ, TOLY, TOLZ, MU, MU1, FHY, FHZ; "BOOLEAN" LAST, FIRST, REJECT; "IF" FI "THEN" "BEGIN" D[3]:= A; D[4]:= YA; D[5]:= ZA "END"; D[1]:= 0; XL:= D[3]; YL:= D[4]; ZL:= D[5]; "IF" FI "THEN" D[2]:= B - D[3]; ABSH:= H:= ABS(D[2]); "IF" B - XL < 0 "THEN" H:= - H; INT:= ABS(B - XL); HMIN:= INT * E[1] + E[2]; HL:= INT * E[3] + E[4]; "IF" HL < HMIN "THEN" HMIN:= HL; E1:= E[1] / INT; E2:= E[2] / INT; E3:= E[3] / INT; E4:= E[4] / INT; FIRST:= "TRUE"; "IF" FI "THEN" "BEGIN" LAST:= "TRUE"; "GOTO" STEP "END"; TEST: ABSH:= ABS(H); "IF" ABSH < HMIN "THEN" "BEGIN" H:= "IF" H > 0 "THEN" HMIN "ELSE" - HMIN; ABSH:= HMIN "END"; "IF" H >= B - XL "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; Z:= ZL; K0:= FXYZ * H; X:= XL + H / 4.5; Y:= YL + (ZL * 18 + K0 * 2) / 81 * H; Z:= ZL + K0 / 4.5 ; K1:= FXYZ * H; X:= XL + H / 3; Y:= YL + (ZL * 6 + K0) / 18 * H; Z:= ZL + (K0 + K1 * 3) / 12; K2:= FXYZ * H; X:= XL + H * .5; Y:= YL + (ZL * 8 + K0 + K2) / 16 * H; Z:= ZL + (K0 + K2 * 3) / 8; K3:= FXYZ * H; X:= XL + H * .8; Y:= YL + (ZL * 100 + K0 * 12 + K3 * 28) / 125 * H; "COMMENT" 1SECTION : 5.2.1.1.2.1.A (AUGUST 1974) PAGE 5 ; Z:= ZL + (K0 * 53 - K1 * 135 + K2 * 126 + K3 * 56) / 125; K4:= FXYZ * H; X:= "IF" LAST "THEN" B "ELSE" XL + H; Y:= YL + (ZL * 336 + K0 * 21 + K2 * 92 + K4 * 55) / 336 * H; Z:= ZL + (K0 * 133 - K1 * 378 + K2 * 276 + K3 * 112 + K4 * 25) / 168; K5:= FXYZ * H; DISCRY:= ABS(( - K0 * 21 + K2 * 108 - K3 * 112 + K4 * 25) / 56 * H); DISCRZ:= ABS(K0 * 21 - K2 * 162 + K3 * 224 - K4 * 125 + K5 * 42) / 14; TOLY:= ABSH * (ABS(ZL) * E1 + E2); TOLZ:= ABS(K0) * E3 + ABSH * E4; REJECT:= DISCRY > TOLY "OR" DISCRZ > TOLZ; FHY:= DISCRY / TOLY; FHZ:= DISCRZ / TOLZ; "IF" FHZ > FHY "THEN" FHY:= FHZ; MU:= 1 / (1 + FHY) + .45; "IF" REJECT "THEN" "BEGIN" "IF" ABSH <= HMIN "THEN" "BEGIN" D[1]:= D[1] + 1; Y:= YL; Z:= ZL; FIRST:= "TRUE"; "GOTO" NEXT "END"; H:= MU * H; "GOTO" TEST "END"; "IF" FIRST "THEN" "BEGIN" FIRST:= "FALSE"; HL:= H; H:= MU * H; "GOTO" ACC "END"; FHY:= MU * H / HL + MU - MU1; HL:= H; H:= FHY * H; ACC: MU1:= MU; Y:= YL + (ZL * 56 + K0 * 7 + K2 * 36 - K4 * 15) / 56 * HL; Z:= ZL + ( - K0 * 63 + K1 * 189 - K2 * 36 - K3 * 112 + K4 * 50) / 28; K5:= FXYZ * HL; Y:= YL + (ZL * 336 + K0 * 35 + K2 * 108 + K4 * 25) / 336 * HL; Z:= ZL + (K0 * 35 + K2 * 162 + K4 * 125 + K5 * 14) / 336; NEXT: "IF" B ^= X "THEN" "BEGIN" XL:= X; YL:= Y; ZL:= Z; "GOTO" TEST "END"; "IF" "NOT"LAST "THEN" D[2]:= H; D[3]:= X; D[4]:= Y; D[5]:= Z "END" RK2; "EOP" 1SECTION : 5.2.1.1.2.1.B (FEBRUARY 1979) PAGE 1 PROCEDURE : RK2N. AUTHOR:J.A.ZONNEVELD. CONTRIBUTORS: M.BAKKER AND I.BRINK. INSTITUTE : MATHEMATICAL CENTRE. RECEIVED: 730715. BRIEF DESCRIPTION: RK2N INTEGRATES THE VECTOR INITIAL VALUE PROBLEM (D/DX) (D/DX) Y = F(X, Y, (D/DX) Y), A<= X <= B OR B <= X <= A, Y[J] (A) AND (D/DX) Y[J] (A) PRESCRIBED FOR J=1,....N. KEYWORDS : INITIAL VALUE PROBLEM, SECOND ORDER DIFFERENTIAL EQUATION. 1SECTION : 5.2.1.1.2.1.B (FEBRUARY 1979) PAGE 2 CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "PROCEDURE" RK2N(X,A,B,Y,YA,Z,ZA,FXYZJ,J,E,D,FI,N); "VALUE" B,FI,N; "INTEGER" J,N; "REAL" X,A,B,FXYZJ; "BOOLEAN" FI; "ARRAY" Y,YA,Z,ZA,E,D; "CODE" 33013; THE MEANING OF THE FORMAL PARAMETERS IS: X: <VARIABLE>; THE INDEPENDENT VARIABLE. UPON COMPLETION OF A CALL OF RK2N, IT IS EQUAL TO B; A: <ARITHMETIC EXPRESSION>; THE STARTING VALUE OF X; B: <ARITHMETIC EXPRESSION>; A VALUE PARAMETER,GIVING THE END VALUE OF X; Y: <ARRAY IDENTIFIER>; "ARRAY" Y[1:N]; THE VECTOR OF DEPENDENT VARIABLES; EXIT: THE VALUE OF Y[J] (B), (J = 1, .. ,N); YA: <ARRAY IDENTIFIER>; "ARRAY" YA[1:N]; ENTRY : THE STARTING VALUES OF Y[J],I.E. THE VALUES AT X=A; Z: <ARRAY IDENTIFIER>; "ARRAY" Z[1:N]; THE FIRST DERIVATIVES OF THE DEPENDENT VARIABLES; EXIT : THE VALUE OF (D/DX)Y[J](B) (J = 1, .. ,N); ZA: <ARRAY IDENTIFIER>; "ARRAY" ZA[1:N]; ENTRY : THE STARTING VALUES OF Z[J],I.E. THE VALUES AT X=A; FXYZJ:<ARITHMETIC EXPRESSION>; AN EXPRESSION DEPENDING ON X,J,Y[J],Z[J] (J=1,...,N), GIVING THE VALUE OF (D/DX)(D/DX)Y[J]; J: <VARIABLE>; A VARIABLE OF TYPE INTEGER,USED IN THE ACTUAL PARAMETER CORRESPONDING TO FXYZJ,TO DENOTE THE NUMBER OF THE EQUATION REQUIRED (JENSEN'S DEVICE); E: <ARRAY IDENTIFIER>; "ARRAY" E[1:4*N]; THE ELEMENT E[2*J-1] IS A RELATIVE AND E[2*J] IS AN ABSOLUTE TOLERANCE ASSOCIATED WITH Y[J]; E[2*(N+J)-1] IS A RELATIVE AND E[2*(N+J)] IS AN ABSOLUTE TOLERANCE ASSOCIATED WITH Z[J]; 1SECTION : 5.2.1.1.2.1.B (FEBRUARY 1979) PAGE 3 D: <ARRAY IDENTIFIER>; "ARRAY" D[1:2*N+3]; EXIT: ENTIER(D[1]+.5) IS THE NUMBER OF STEPS SKIPPED; D[2] IS THE LAST STEP LENGTH USED; D[3] IS EQUAL TO B; D[4],...,D[N+3] ARE EQUAL TO Y[1],...,Y[N] FOR X=B, D[N+4],...,D[2*N+3] ARE EQUAL TO THE DERIVATIVES Z[1],...,Z[N] FOR X=B; FI: <BOOLEAN EXPRESSION>; IF FI="TRUE" THEN THE INTEGRATION STARTS AT A,WITH A TRIAL STEP B-A;IF FI="FALSE" THEN THE INTEGRATION IS CONTINUED VIZ. WITH INITIAL CONDITIONS:X=D[3],Y[J]=D[J+3],Z[J]= D[N+3+J] AND STEP LENGTH H=D[2]*SIGN(B-D[3]), AND A, YA, ZA ARE IGNORED; N: <ARITHMETIC EXPRESSION>; THE NUMBER OF EQUATIONS. PROCEDURES USED: NONE. REQUIRED CENTRAL MEMORY: EIGHT ARRAYS OF ORDER N AND ONE OF ORDER 4 * N ARE USED. METHOD AND PERFORMANCE : RK2N INTEGRATES (D/DX)(D/DX)Y = F(X,Y,Z) FROM X TO B,WITH, EITHER (IF FI = "TRUE") X=A, Y[J]=YA[J], Z[J]=ZA[J], OR (IF FI="FALSE") X = D[3], Y[J]=D[J+3], Z[J]=D[N+J+3], J=1,...,N, USING A 5-TH ORDER RUNGE-KUTTA METHOD. UPON COMPLETION OF A CALL OF RK2N WE HAVE:X=D[3]=B, Y[J]=D[J+3] THE VALUE OF THE DEPENDENT VARIABLES FOR X=B, Z[J]=D[N+J+3], THE VALUE OF THE DERIVATIVES OF Y[J] AT X=B, J=1,...,N. RK2N USES AS ITS MINIMAL ABSOLUTE STEP LENGTH HMIN=MIN (E[2*J-1]*INT+E[2 *J]) WITH 1<=J<=2*N AND INT= ABS(B-("IF" FI "THEN" A "ELSE" D[3])). IF A STEP OF LENGTH ABS(H)<=HMIN IS REJECTED, A STEP SIGN(H)*HMIN IS SKIPPED. A STEP IS REJECTED IF THE ABSOLUTE VALUE OF THE COMPUTED DISCRETIZATION ERROR IS GREATER THAN ( ABS(Z[J]) * E[2 * J - 1] + E[2 * J] ) * ABS(H) / INT OR IF THAT TERM IS GREATER THEN (ABS(FXYZJ)*E[2*(J+N)-1 +E[2*(J+N)])ABS(H)/INT, FOR ANY VALUE OF J ,1<=J<=N (INT=ABS(B-A)). SEE REF[1]. 1SECTION : 5.2.1.1.2.1.B (DECEMBER 1975) PAGE 4 EXAMPLE OF USE: THE SECOND ORDER (VECTOR) DIFFERENTIAL EQUATION (D/DX)(D/DX)Y[1] = -5*(Y[1] + (D/DX)Y[2]) + Y[2], (D/DX)(D/DX)Y[2] = -5*(Y[2] + (D/DX)Y[1]) + Y[1], X>=0, Y[1] = (D/DX)Y[2] = 1, Y[2] = (D/DX)Y[1] = 0, X=0 WITH ANALYTIC SOLUTION Y[1] = -EXP(-X)*(EXP(-X)*(EXP(-X)*(EXP(-X)/3+.5)-1)-5/6), Y[2] = -EXP(-X)*(EXP(-X)*(EXP(-X)*(EXP(-X)/3-.5)+1)-5/6) CAN BE INTEGRATED BY RK2N FROM 0 TO 5 WITH 1,2,3,4 AS REFERENCE POINTS. THE PROGRAM READS AS FOLLOWS: "BEGIN" "REAL" B, X, EXPX; "INTEGER" K; "BOOLEAN" FI; "ARRAY" Y,YA,Z,ZA[0:2],E[1:8],D[0:7]; "FOR" K:=1,2,3,4,5,6,7,8 "DO" E[K]:="-7; YA[1]:=ZA[2]:=1; YA[2]:=ZA[1]:=0; B:=1; AA: FI:=B=1; RK2N(X,0.0,B,Y,YA,Z,ZA,-5*(Y[K]+Z[K])+("IF"K=1"THEN"Y[2]"ELSE" Y[1]),K,E,D,FI,2); "COMMENT" COMPUTATION OF THE EXACT VALUES OF Y AND DY/DX; EXPX:=EXP(-X); YA[1]:=-EXPX*(EXPX*(EXPX*(EXPX/3+.5)-1)-5/6); YA[2]:=-EXPX*(EXPX*(EXPX*(EXPX/3-.5)+1)-5/6); ZA[1]:=+EXPX*(EXPX*(EXPX*(EXPX/.75+1.5)-2)-5/6); ZA[2]:=+EXPX*(EXPX*(EXPX*(EXPX/.75-1.5)+2)-5/6); OUTPUT(61,"("/20B"("X=")"D.4D/, 10B"("Y[1]-YEXACT[1]=")"+.14D ,10B"("Y[2]-YEXACT[2]=")"+.14D4/, 10B"("Z[1]-ZEXACT[1]=")"+.14D ,10B"("Z[2]-ZEXACT[2]=")"+.14D 5/")",X,Y[1]-YA[1],Y[2]-YA[2],Z[1]-ZA[1],Z[2]-ZA[2]); B:=B+1; "IF" B<5 "THEN" "GO TO" AA "END" RESULTS: X=1.0000 Y[1]-YEXACT[1]=+.00000000002955 Y[2]-YEXACT[2]=+.0000000000567 Z[1]-ZEXACT[1]=-.00000000013770 Z[2]-ZEXACT[2]=-.0000000002422 X=2.0000 Y[1]-YEXACT[1]=-.00000000085294 Y[2]-YEXACT[2]=+.0000000001486 Z[1]-ZEXACT[1]=+.00000000378800 Z[2]-ZEXACT[2]=-.0000000006509 X=3.0000 Y[1]-YEXACT[1]=-.00000000162707 Y[2]-YEXACT[2]=-.0000000004796 Z[1]-ZEXACT[1]=+.00000000803265 Z[2]-ZEXACT[2]=+.0000000019380 X=4.0000 Y[1]-YEXACT[1]=-.00000000117993 Y[2]-YEXACT[2]=-.0000000008505 Z[1]-ZEXACT[1]=+.00000000633393 Z[2]-ZEXACT[2]=+.0000000039114 1SECTION : 5.2.1.1.2.1.B (AUGUST 1974) PAGE 5 SOURCE TEXT(S): 0"CODE" 33013 ; "PROCEDURE" RK2N(X, A, B, Y, YA, Z, ZA, FXYZJ, J, E, D, FI, N); "VALUE" B, FI, N; "INTEGER" J, N; "REAL" X, A, B, FXYZJ; "BOOLEAN" FI; "ARRAY" Y, YA, Z, ZA, E, D; "BEGIN" "INTEGER" JJ; "REAL" XL, H, INT, HMIN, HL, ABSH, FHM, DISCRY, DISCRZ, TOLY, TOLZ, MU, MU1, FHY, FHZ; "BOOLEAN" LAST, FIRST, REJECT; "ARRAY" YL, ZL, K0, K1, K2, K3, K4, K5[1:N], EE[1:4 * N]; "IF" FI "THEN" "BEGIN" D[3]:= A; "FOR" JJ:= 1 "STEP" 1 "UNTIL" N "DO" "BEGIN" D[JJ + 3]:= YA[JJ]; D[N + JJ + 3]:= ZA[JJ] "END" "END"; D[1]:= 0; XL:= D[3]; "FOR" JJ:= 1 "STEP" 1 "UNTIL" N "DO" "BEGIN" YL[JJ]:= D[JJ + 3]; ZL[JJ]:= D[N + JJ + 3] "END"; "IF" FI "THEN" D[2]:= B - D[3]; ABSH:= H:= ABS(D[2]); "IF" B - XL < 0 "THEN" H:= - H; INT:= ABS(B - XL); HMIN:= INT * E[1] + E[2]; "FOR" JJ:= 2 "STEP" 1 "UNTIL" 2 * N "DO" "BEGIN" HL:= INT * E[2 * JJ - 1] + E[2 * JJ]; "IF" HL < HMIN "THEN" HMIN:= HL "END"; "FOR" JJ:= 1 "STEP" 1 "UNTIL" 4 * N "DO" EE[JJ]:= E[JJ] / INT; FIRST:= "TRUE"; "IF" FI "THEN" "BEGIN" LAST:= "TRUE"; "GOTO" STEP "END"; TEST: ABSH:= ABS(H); "IF" ABSH < HMIN "THEN" "BEGIN" H:= "IF" H > 0 "THEN" HMIN "ELSE" - HMIN; ABSH:= ABS(H) "END"; "IF" H >= B - XL "EQV" H >= 0 "THEN" "BEGIN" D[2]:= H; LAST:= "TRUE"; H:= B - XL; ABSH:= ABS(H) "END" "ELSE" LAST:= "FALSE"; STEP: X:= XL; "FOR" JJ:= 1 "STEP" 1 "UNTIL" N "DO" "BEGIN" Y[JJ]:= YL[JJ]; Z[JJ]:= ZL[JJ] "END"; "FOR" J:= 1 "STEP" 1 "UNTIL" N "DO" K0[J]:= FXYZJ * H; X:= XL + H / 4.5; "FOR" JJ:= 1 "STEP" 1 "UNTIL" N "DO" "BEGIN" Y[JJ]:= YL[JJ] + (ZL[JJ] * 18 + K0[JJ] * 2) / 81 * H; Z[JJ]:= ZL[JJ] + K0[JJ] / 4.5; "END"; "COMMENT" 1SECTION : 5.2.1.1.2.1.B (AUGUST 1974) PAGE 6 ; "FOR" J:= 1 "STEP" 1 "UNTIL" N "DO" K1[J]:= FXYZJ * H; X:= XL + H / 3; "FOR" JJ:= 1 "STEP" 1 "UNTIL" N "DO" "BEGIN" Y[JJ]:= YL[JJ] + (ZL[JJ] * 6 + K0[JJ]) / 18 * H; Z[JJ]:= ZL[JJ] + (K0[JJ] + K1[JJ] * 3) / 12 "END"; "FOR" J:= 1 "STEP" 1 "UNTIL" N "DO" K2[J]:= FXYZJ * H; X:= XL + H * .5; "FOR" JJ:= 1 "STEP" 1 "UNTIL" N "DO" "BEGIN" Y[JJ]:= YL[JJ] + (ZL[JJ] * 8 + K0[JJ] + K2[JJ]) / 16 * H; Z[JJ]:= ZL[JJ] + (K0[JJ] + K2[JJ] * 3) / 8 "END"; "FOR" J:= 1 "STEP" 1 "UNTIL" N "DO" K3[J]:= FXYZJ * H; X:= XL + H * .8; "FOR" JJ:= 1 "STEP" 1 "UNTIL" N "DO" "BEGIN" Y[JJ]:= YL[JJ] + (ZL[JJ] * 100 + K0[JJ] * 12 + K3[JJ] * 28) / 125 * H; Z[JJ]:= ZL[JJ] + (K0[JJ] * 53 - K1[JJ] * 135 + K2[JJ] * 126 + K3[JJ] * 56) / 125 "END"; "FOR" J:= 1 "STEP" 1 "UNTIL" N "DO" K4[J]:= FXYZJ * H; X:= "IF" LAST "THEN" B "ELSE" XL + H; "FOR" JJ:= 1 "STEP" 1 "UNTIL" N "DO" "BEGIN" Y[JJ]:= YL[JJ] + (ZL[JJ] * 336 + K0[JJ] * 21 + K2[JJ] * 92 + K4[JJ] * 55) / 336 * H; Z[JJ]:= ZL[JJ] + (K0[JJ] * 133 - K1[JJ] * 378 + K2[JJ] * 276 + K3[JJ] * 112 + K4[JJ] * 25) / 168 "END"; "FOR" J:= 1 "STEP" 1 "UNTIL" N "DO" K5[J]:= FXYZJ * H; REJECT:= "FALSE"; FHM:= 0; "FOR" JJ:= 1 "STEP" 1 "UNTIL" N "DO" "BEGIN" DISCRY:= ABS(( - K0[JJ] * 21 + K2[JJ] * 108 - K3[JJ] * 112 + K4[JJ] * 25) / 56 * H); DISCRZ:= ABS(K0[JJ] * 21 - K2[JJ] * 162 + K3[JJ] * 224 - K4[JJ] * 125 + K5[JJ] * 42) / 14; TOLY:= ABSH * (ABS(ZL[JJ]) * EE[2 * JJ - 1] + EE[2 * JJ]); TOLZ:= ABS(K0[JJ]) * EE[2 * (JJ + N) - 1] + ABSH * EE[2 * (JJ + N)]; REJECT:= DISCRY > TOLY "OR" DISCRZ > TOLZ "OR" REJECT; FHY:= DISCRY / TOLY; FHZ:= DISCRZ / TOLZ; "IF" FHZ > FHY "THEN" FHY:= FHZ; "IF" FHY > FHM "THEN" FHM:= FHY "END"; "COMMENT" 1SECTION : 5.2.1.1.2.1.B (AUGUST 1974) PAGE 7 ; MU:= 1 / (1 + FHM) + .45; "IF" REJECT "THEN" "BEGIN" "IF" ABSH <= HMIN "THEN" "BEGIN" D[1]:= D[1] + 1; "FOR" JJ:= 1 "STEP" 1 "UNTIL" N "DO" "BEGIN" Y[JJ]:= YL[JJ]; Z[JJ]:= ZL[JJ] "END"; FIRST:= "TRUE"; "GOTO" NEXT "END"; H:= MU * H; "GOTO" TEST "END"; "IF" FIRST "THEN" "BEGIN" FIRST:= "FALSE"; HL:= H; H:= MU * H; "GOTO" ACC "END"; FHM:= MU * H / HL + MU - MU1; HL:= H; H:= FHM * H; ACC: MU1:= MU; "FOR" JJ:= 1 "STEP" 1 "UNTIL" N "DO" "BEGIN" Y[JJ]:= YL[JJ] + (ZL[JJ] * 56 + K0[JJ] * 7 + K2[JJ] * 36 - K4[JJ] * 15) / 56 * HL; Z[JJ]:= ZL[JJ] + ( - K0[JJ] * 63 + K1[JJ] * 189 - K2[JJ] * 36 - K3[JJ] * 112 + K4[JJ] * 50) / 28 "END"; "FOR" J:= 1 "STEP" 1 "UNTIL" N "DO" K5[J]:= FXYZJ * HL; "FOR" JJ:= 1 "STEP" 1 "UNTIL" N "DO" "BEGIN" Y[JJ]:= YL[JJ] + (ZL[JJ] * 336 + K0[JJ] * 35 + K2[JJ] * 108 + K4[JJ] * 25) / 336 * HL; Z[JJ]:= ZL[JJ] + (K0[JJ] * 35 + K2[JJ] * 162 + K4[JJ] * 125 + K5[JJ] * 14) / 336 "END"; NEXT: "IF" B ^= X "THEN" "BEGIN" XL:= X; "FOR" JJ:= 1 "STEP" 1 "UNTIL" N "DO" "BEGIN" YL[JJ]:= Y[JJ]; ZL[JJ]:= Z[JJ] "END"; "GOTO" TEST "END"; "IF" "NOT"LAST "THEN" D[2]:= H; D[3]:= X; "FOR" JJ:= 1 "STEP" 1 "UNTIL" N "DO" "BEGIN" D[JJ + 3]:= Y[JJ]; D[N + JJ + 3]:= Z[JJ] "END" "END" RK2N; "EOP" 1SECTION : 5.2.1.1.2.1.C (FEBRUARY 1979) PAGE 1 PROCEDURE : RK3 AUTHOR:J.A.ZONNEVELD. CONTRIBUTORS: M.BAKKER AND I.BRINK. INSTITUTE: MATHEMATICAL CENTRE. RECEIVED: 730715. BRIEF DESCRIPTION: RK3 INTEGRATES THE SCALAR INITIAL VALUE PROBLEM (D/DX) (D/DX) Y = F(X,Y) (WITHOUT THE DERIVATIVE (D/DX) Y IN F), A <= X <= B OR B <= X <= A, Y(A) AND (D/DX) Y(A) PRESCRIBED. KEYWORDS: INITIAL VALUE PROBLEM, SECOND ORDER DIFFERENTIAL EQUATION. 1SECTION : 5.2.1.1.2.1.C (DECEMBER 1975) PAGE 2 CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "PROCEDURE" RK3(X,A,B,Y,YA,Z,ZA,FXY,E,D,FI); "VALUE" B,FI; "REAL" X,A,B,Y,YA,Z,ZA,FXY; "BOOLEAN" FI; "ARRAY" E,D; "CODE" 33014; THE MEANING OF THE FORMAL PARAMETERS IS: X: <VARIABLE>; THE INDEPENDENT VARIABLE. UPON COMPLETION OF A CALL OF RK3 , IT IS EQUAL TO B; A: <ARITHMETIC EXPRESSION>; THE STARTING VALUE OF X; B: <ARITHMETIC EXPRESSION>; A VALUE PARAMETER, GIVING THE END VALUE OF X; B <= A IS ALLOWED; Y: <VARIABLE>; THE DEPENDENT VARIABLE; EXIT : THE VALUE OF Y(X) AT X = B; YA: <ARITHMETIC EXPRESSION>; ENTRY : THE VALUE OF Y AT X=A; Z: <VARIABLE>; THE DERIVATIVE DY/DX; EXIT : THE VALUE OF DY/DX AT X = B; ZA: <ARITHMETIC EXPRESSION>; ENTRY : THE VALUE OF DY/DX AT X=A; FXY: <ARITHMETIC EXPRESSION>; AN EXPRESSION,DEPENDING ON X AND Y ,GIVING THE VALUE OF (D/DX)(D/DX)Y; E: <ARRAY IDENTIFIER>; "ARRAY" E[1:4]; E[1] AND E[3] ARE USED AS RELATIVE TOLERANCES, E[2] AND E[4] ARE USED AS ABSOLUTE TOLERANCES FOR Y AND DY/DX, RESPECTIVELY; D: <ARRAY IDENTIFIER>; "ARRAY" D[1:5]; EXIT: ENTIER(D[1]+.5) IS THE NUMBER OF STEPS SKIPPED; D[2] IS THE LAST STEP LENGTH USED; D[3] IS EQUAL TO B; D[4] IS EQUAL TO Y(B); D[5] IS EQUAL TO DY/DX FOR X=B; FI: <BOOLEAN EXPRESSION>; IF FI="TRUE" THEN THE INTEGRATION STARTS AT X=A WITH A TRIAL STEP B-A;IF FI="FALSE" THEN THE INTEGRATION IS CONTINUED VIZ. WITH THE INITIAL CONDITIONS X=D[3], Y=D[4], Z=D[5] AND STEP LENGTH H=D[2]*SIGN(B-D[3]); A,YA,ZA ARE IGNORED. 1SECTION : 5.2.1.1.2.1.C (FEBRUARY 1979) PAGE 3 PROCEDURES USED : NONE. METHOD AND PERFORMANCE : RK3 INTEGRATES (D/DX)(D/DX)Y = F(X,Y) FROM X TO B,WITH IF FI="TRUE" THEN X=A, Y=YA,DY/DX=ZA ELSE X=D[3], Y=D[4], Z=D[5]. A 5-TH ORDER RUNGE-KUTTA METHOD IS USED. UPON COMPLETION OF A CALL OF RK3 WE HAVE X=D[3]=B, Y=D[4]=Y[B], Z=D[5], I.E. THE VALUE OF DY/DX FOR X=B. RK3 USES AS ITS MINIMAL ABSOLUTE STEP LENGTH HMIN=MIN (E[2*J-1]*INT+E[2*J]) WITH 1<=J<=2 AND INT= ABS(B-("IF" FI "THEN" A "ELSE" D[3])). IF A STEP OF LENGTH ABS(H)<=HMIN IS REJECTED ,A STEP SIGN(H)*HMIN IS SKIPPED. A STEP IS REJECTED IF THE ABSOLUTE VALUE OF THE LAST TERM TAKEN INTO ACCOUNT IS GREATER THEN (ABS(DY/DX)*E[1]+E[2])* ABS(H)/INT OR IF THAT TERM IS GREATER THEN (ABS(FXY)*E[3]+E[4])* ABS(H)/INT ( INT = ABS(B - A) ). SEE REF[1]. REFERENCES: [1]J.A.ZONNEVELD. AUTOMATIC NUMERICAL INTEGRATION. MATHEMATICAL CENTRE TRACT 8 (1970). EXAMPLE OF USE: "BEGIN" "COMMENT" SOLUTION OF Y"=X*Y,Y(0)=0,Y'(0)=1; "REAL" "PROCEDURE" YEXACT(X);"VALUE" X;"REAL" X; "BEGIN" "INTEGER" N;"REAL" X3,S,TERM; X3:=X**3;TERM:=X;S:=0; "FOR" N:=3,N+3 "WHILE" ABS(TERM)>"-14 "DO" "BEGIN" S:=S+TERM;TERM:=TERM*X3/N/(N+1) "END"; YEXACT:=S "END"; "REAL" X,B,Y,Z;"BOOLEAN" FI;"ARRAY" D,E[1:5]; E[1]:=E[3]:="-8;E[2]:=E[4]:="-12; "FOR" B:=.25,.50,.75,1.00 "DO" "BEGIN" FI:=B<.30; RK3(X,0.0,B,Y,0.0,Z,1.0,X*Y,E,D,FI); OUTPUT(61,"("10B"("Y-YEXACT=")".10D,5B"("X=")"Z.2D, 5B"("Y=")"2D.10D//")",Y-YEXACT(X),X,Y) "END" "END" 1SECTION : 5.2.1.1.2.1.C (AUGUST 1974) PAGE 4 DELIVERS: Y-YEXACT=0.0000000000 X= .25 Y=00.2503256420 Y-YEXACT=0.0000000000 X= .50 Y=00.5052238559 Y-YEXACT=0.0000000000 X= .75 Y=00.7766332813 Y-YEXACT=0.0000000000 X=1.00 Y=01.0853396481 SOURCE TEXT(S): 0"CODE" 33014 ; "PROCEDURE" RK3(X, A, B, Y, YA, Z, ZA, FXY, E, D, FI); "VALUE" B, FI; "REAL" X, A, B, Y, YA, Z, ZA, FXY; "BOOLEAN" FI; "ARRAY" E, D; "BEGIN" "REAL" E1, E2, E3, E4, XL, YL, ZL, H, INT, HMIN, HL, ABSH, K0, K1, K2, K3, K4, K5, DISCRY, DISCRZ, TOLY, TOLZ, MU, MU1, FHY, FHZ; "BOOLEAN" LAST, FIRST, REJECT; "IF" FI "THEN" "BEGIN" D[3]:= A; D[4]:= YA; D[5]:= ZA "END"; D[1]:= 0; XL:= D[3]; YL:= D[4]; ZL:= D[5]; "IF" FI "THEN" D[2]:= B - D[3]; ABSH:= H:= ABS(D[2]); "IF" B - XL < 0 "THEN" H:= - H; INT:= ABS(B - XL); HMIN:= INT * E[1] + E[2]; HL:= INT * E[3] + E[4]; "IF" HL < HMIN "THEN" HMIN:= HL; E1:= E[1] / INT; E2:= E[2] / INT; E3:= E[3] / INT; E4:= E[4] / INT; FIRST:= REJECT:= "TRUE"; "IF" FI "THEN" "BEGIN" LAST:= "TRUE"; "GOTO" STEP "END"; TEST: ABSH:= ABS(H); "IF" ABSH < HMIN "THEN" "BEGIN" H:= "IF" H > 0 "THEN" HMIN "ELSE" - HMIN; ABSH:= HMIN "END"; "IF" H >= B - XL "EQV" H >= 0 "THEN" "BEGIN" D[2]:= H; LAST:= "TRUE"; H:= B - XL; ABSH:= ABS(H) "END" "ELSE" LAST:= "FALSE"; "COMMENT" 1SECTION : 5.2.1.1.2.1.C (AUGUST 1974) PAGE 5 ; STEP: "IF" REJECT "THEN" "BEGIN" X:= XL; Y:= YL; K0:= FXY * H "END" "ELSE" K0:= K5 * H / HL; X:= XL + .276393202250021 * H; Y:= YL + (ZL * .2763932022 50021 + K0 * .038196601125011) * H; K1:= FXY * H; X:= XL + .72360 6797749979 * H; Y:= YL + (ZL * .723606797749979 + K1 * .26180 3398874989) * H; K2:= FXY * H; X:= XL + H * .5; Y:= YL + (ZL * .5 + K0 * .046875 + K1 * .079824155839840 - K2 * .001699155839840) * H; K4:= FXY * H; X:= "IF" LAST "THEN" B "ELSE" XL + H; Y:= YL + (ZL + K0 * .309016994374947 + K2 * .190983005625053) * H; K3:= FXY * H; Y:= YL + (ZL + K0 * .083333333333333 + K1 * .301502832395825 + K2 * .115163834270842) * H; K5:= FXY * H; DISCRY:= ABS(( - K0 * .5 + K1 * 1.809016994374947 + K2 * .690983005625053 - K4 * 2) * H); DISCRZ:= ABS((K0 - K3) * 2 - (K1 + K2) * 10 + K4 * 16 + K5 * 4); TOLY:= ABSH * (ABS(ZL) * E1 + E2); TOLZ:= ABS(K0) * E3 + ABSH * E4; REJECT:= DISCRY > TOLY "OR" DISCRZ > TOLZ; FHY:= DISCRY / TOLY; FHZ:= DISCRZ / TOLZ; "IF" FHZ > FHY "THEN" FHY:= FHZ; MU:= 1 / (1 + FHY) + .45; "IF" REJECT "THEN" "BEGIN" "IF" ABSH <= HMIN "THEN" "BEGIN" D[1]:= D[1] + 1; Y:= YL; Z:= ZL; FIRST:= "TRUE"; "GOTO" NEXT "END"; H:= MU * H; "GOTO" TEST "END"; "IF" FIRST "THEN" "BEGIN" FIRST:= "FALSE"; HL:= H; H:= MU * H; "GOTO" ACC "END"; FHY:= MU * H / HL + MU - MU1; HL:= H; H:= FHY * H; ACC: MU1:= MU; Z:= ZL + (K0 + K3) * .083333333333333 + (K1 + K2) * .416666666666667; NEXT: "IF" B ^= X "THEN" "BEGIN" XL:= X; YL:= Y; ZL:= Z; "GOTO" TEST "END"; "IF" "NOT"LAST "THEN" D[2]:= H; D[3]:= X; D[4]:= Y; D[5]:= Z "END" RK3; "EOP" 1SECTION : 5.2.1.1.2.1.D (FEBRUARY 1979) PAGE 1 PROCEDURE : RK3N. AUTHOR:J.A.ZONNEVELD. CONTRIBUTORS: M.BAKKER AND I.BRINK. INSTITUTE:MATHEMATICAL CENTRE. RECEIVED: 730715. BRIEF DESCRIPTION: RK3N INTEGRATES THE VECTOR INITIAL VALUE PROBLEM (D/DX) (D/DX) Y = F(X,Y), A <= X <= B OR B <= X <= A, Y[J] (A) AND (D/DX) Y[J] (A) PRESCRIBED. KEYWORDS: INITIAL VALUE PROBLEM, SECOND ORDER DIFFERENTIAL EQUATION. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "PROCEDURE" RK3N(X,A,B,Y,YA,Z,ZA,FXYJ,J,E,D,FI,N); "VALUE" B,FI,N; "INTEGER" J,N; "REAL" X,A,B,FXYJ; "BOOLEAN" FI; "ARRAY" Y,YA,Z,ZA,E,D; "CODE" 33015; 1SECTION : 5.2.1.1.2.1.D (DECEMBER 1975) PAGE 2 THE MEANING OF THE FORMAL PARAMETERS IS: X: <VARIABLE>; THE INDEPENDENT VARIABLE. UPON COMPLETION OF A CALL OF RK3N, IT IS EQUAL TO B; A: <ARITHMETIC EXPRESSION>; THE STARTING VALUE OF X; B: <ARITHMETIC EXPRESSION>; A VALUE PARAMETER,GIVING THE END VALUE OF X; B <= A IS ALLOWED. Y: <ARRAY IDENTIFIER>; "ARRAY" Y[1:N]; THE VECTOR OF DEPENDENT VARIABLES; EXIT : THE VALUE OF Y[J](X) AT X = B; YA: <ARRAY IDENTIFIER>; "ARRAY" YA[1:N]; ENTRY : THE STARTING VALUES OF Y[J],I.E. THE VALUES AT X=A; Z: <ARRAY IDENTIFIER>; "ARRAY" Z[1:N]; THE DERIVATIVES OF THE DEPENDENT VARIABLES, Z[J] = DY[J]/DX; EXIT : THE VALUE OF Z[J](X) AT X = B; ZA: <ARRAY IDENTIFIER>; "ARRAY" ZA[1:N]; ENTRY : THE STARTING VALUES OF Z[J],I.E. THE VALUES AT X=A; FXYJ: <ARITHMETIC EXPRESSION>; AN EXPRESSION DEPENDING ON X,Y[1],...,Y[N],J, GIVING THE VALUE OF (D/DX)(D/DX)Y[J]; J: <VARIABLE>; A VARIABLE OF TYPE INTEGER,USED IN THE ACTUAL PARAMETER CORRESPONDING TO FXYJ,TO DENOTE THE NUMBER OF THE EQUATION REQUIRED (JENSEN'S DEVICE); E: <ARRAY IDENTIFIER>; "ARRAY" E[1:4*N]; THE ELEMENT E[2*J-1] IS A RELATIVE AND E[2*J] IS AN ABSOLUTE TOLERANCE ASSOCIATED WITH Y[J]; E[2*(N+J)-1] IS A RELATIVE AND E[2*(N+J)] IS AN ABSOLUTE TOLERANCE ASSOCIATED WITH Z[J]; D: <ARRAY IDENTIFIER>; "ARRAY" D[1:2*N+3]; EXIT: ENTIER(D[1]+.5) IS THE NUMBER OF STEPS SKIPPED; D[2] IS THE LAST STEP LENGTH USED; D[3] IS EQUAL TO B; D[4],...,D[N+3] ARE EQUAL TO Y[1],...,Y[N] FOR X=B; D[N+4],...,D[2*N+3] ARE EQUAL TO THE DERIVATIVES Z[1],...,Z[N] FOR X=B; FI: <BOOLEAN EXPRESSION>; IF FI="TRUE" THEN THE INTEGRATION STARTS AT A ,WITH A TRIAL STEP B-A;IF FI="FALSE" THEN THE INTEGRATION IS CONTINUED VIZ. WITH THE INITIAL CONDITIONS:X=D[3],Y[J]=D[J+3],Z[J]=D[N+J+3], AND STEP LENGTH H=D[2]*SIGN(B-D[3]); A,YA,ZA ARE IGNORED; N: <ARITHMETIC EXPRESSION>; THE NUMBER OF EQUATIONS. 1SECTION : 5.2.1.1.2.1.D (FEBRUARY 1979) PAGE 3 PROCEDURES USED: NONE. REQUIRED CENTRAL MEMORY: EIGHT ARAYS OF ORDER N AND ONE OF ORDER 4 * N ARE USED. METHOD AND PERFORMANCE : RK3N INTEGRATES (D/DX)(D/DX)Y=F(X,Y) FROM X TO B,WITH,IF FI="TRUE" THEN X=A, Y[J]=YA[J], Z[J]=ZA[J].IF FI="FALSE" THEN X=D[3], Y[J]=D[J+3], Z[J]=D[N+3+J], USING A 5-TH ORDER RUNGE-KUTTA METHOD. UPON COMPLETION OF A CALL OF RK3N WE HAVE X=D[3]=B, Y[J]=D[J+3] THE VALUE OF THE DEPENDENT VARIABLES FOR X=B, Z[J]= D[N+3+J], THE VALUE OF THE DERIVATIVES OF Y[J] AT X=B. RK3N USES AS ITS MINIMAL ABSOLUTE STEP LENGTH: HMIN=MIN (E[2*J-1]*INT+E[2*J]) ,WITH 1<=J<=2*N AND INT= ABS(B-("IF" FI "THEN" A "ELSE" D[3])). IF A STEP OF LENGTH ABS(H)<=HMIN IS REJECTED,A STEP SIGN(H)*HMIN IS SKIPPED. A STEP IS REJECTED IF THE ABSOLUTE VALUE OF THE LAST TERM TAKEN INTO ACCOUNT IS GREATER THEN (ABS(Z[J])*E[2*J-1]+E[2*J])* ABS(H)/INT OR IF THAT TERM IS GREATER THEN (ABS(FXYJ)*E[2*(J+N)-1] +E[2*(J+N)])*ABS(H)/INT FOR ANY VALUE OF J, 1<=J<=N (INT=ABS(B-A)). SEE REF[1]. REFERENCES: [1]J.A.ZONNEVELD. AUTOMATIC NUMERICAL INTEGRATION. MATHEMATICAL CENTRE TRACT 8 (1970). EXAMPLE OF USE: THE SECOND ORDER (VECTOR) DIFFERENTIAL EQUATION (D/DX)(D/DX)Y[1] = +Y[2], (D/DX)(D/DX)Y[2] = -Y[1], X>=0, Y[1] = Y[2] = 1, (D/DX)Y[1] = (D/DX)Y[2] = 0, X = 0, WHOSE EXACT SOLUTION IS GIVEN BY Y[1]=COSH(X/SQRT(2))*COS(X/SQRT(2))+SINH(X/SQRT(2))*SIN(X/SQRT(2)) Y[2]=COSH(X/SQRT(2))*COS(X/SQRT(2))-SINH(X/SQRT(2))*SIN(X/SQRT(2)) CAN BE INTEGRATED BY RK3N BECAUSE THE SECOND DERIVATIVE IS NOT EXPRESSED IN THE FIRST. THE PROGRAM READS AS FOLLOWS: 1SECTION : 5.2.1.1.2.1.D (AUGUST 1974) PAGE 4 "BEGIN" "INTEGER" K,B; "REAL" X; "BOOLEAN" FI; "ARRAY" Y,YA,Z[1:2],E[1:8],D[0:7]; "INTEGER" "PROCEDURE" EVEN(N); "VALUE" N; "INTEGER" N; EVEN:= "IF" N//2 = N/2 "THEN" +1 "ELSE" -1; "PROCEDURE" EXACT(X,Y); "VALUE" X; "REAL" X; "ARRAY" Y; "BEGIN" "INTEGER" I,N; "REAL" X2,TERM; Y[1]:=Y[2]:=0; TERM:=1; X2:= X*X*.5; "FOR" N:=1, N+1 "WHILE" ABS(TERM)>"-14 "DO" "BEGIN" "FOR" I:=1,2 "DO" Y[I]:=Y[I] + TERM*EVEN((I+N-2)//2); TERM:= TERM*X2 /N/(N*2-1) "END" "END"; "FOR" K:=1,2,3,4,5,6,7,8 "DO" E[K]:="-7; FI:= "TRUE"; Y[1]:=Y[2]:=1; Z[1]:=Z[2]:=0; B:=0; AA: B:= B+1; RK3N(X,0.0,B,Y,Y,Z,Z,"IF"K=1"THEN"Y[2]"ELSE"-Y[1],K,E,D,FI,2); EXACT(X,YA); OUTPUT(61,"("//10B "("ABS(YEXACT[1]-Y[1])+ABS(YEXACT[2]-Y[2])=")".10D"(""00")" ")", ABS(Y[1]-YA[1])+ABS(YA[2]-Y[2]) ); FI:="FALSE" ; "IF" B<5 "THEN" "GO TO" AA "END" RESULTS: FOR X=1,2,3,4,5 THE FOLLOWING ERRORS ARE NOTICED (E[K]="-7, K=1,...,8): ABS(YEXACT[1]-Y[1])+ABS(YEXACT[2]-Y[2])=.0000000005"00 ABS(YEXACT[1]-Y[1])+ABS(YEXACT[2]-Y[2])=.0000000018"00 ABS(YEXACT[1]-Y[1])+ABS(YEXACT[2]-Y[2])=.0000000046"00 ABS(YEXACT[1]-Y[1])+ABS(YEXACT[2]-Y[2])=.0000000126"00 ABS(YEXACT[1]-Y[1])+ABS(YEXACT[2]-Y[2])=.0000000293"00 SOURCE TEXT(S): 0"CODE" 33015 ; "PROCEDURE" RK3N(X, A, B, Y, YA, Z, ZA, FXYJ, J, E, D, FI, N); "VALUE" B, FI, N; "INTEGER" J, N; "REAL" X, A, B, FXYJ; "BOOLEAN" FI; "ARRAY" Y, YA, Z, ZA, E, D; "BEGIN" "INTEGER" JJ; "REAL" XL, H, HMIN, INT, HL, ABSH, FHM, DISCRY, DISCRZ, TOLY, TOLZ, MU, MU1, FHY, FHZ; "BOOLEAN" LAST, FIRST, REJECT; "ARRAY" YL, ZL, K0, K1, K2, K3, K4, K5[1:N], EE[1:4 * N]; "IF" FI "THEN" "BEGIN" D[3]:= A; "FOR" JJ:= 1 "STEP" 1 "UNTIL" N "DO" "BEGIN" D[JJ + 3]:= YA[JJ]; D[N + JJ + 3]:= ZA[JJ] "END" "END"; "COMMENT" 1SECTION : 5.2.1.1.2.1.D (AUGUST 1974) PAGE 5 ; D[1]:= 0; XL:= D[3]; "FOR" JJ:= 1 "STEP" 1 "UNTIL" N "DO" "BEGIN" YL[JJ]:= D[JJ + 3]; ZL[JJ]:= D[N + JJ + 3] "END"; "IF" FI "THEN" D[2]:= B - D[3]; ABSH:= H:= ABS(D[2]); "IF" B - XL < 0 "THEN" H:= - H; INT:= ABS(B - XL); HMIN:= INT * E[1] + E[2]; "FOR" JJ:= 2 "STEP" 1 "UNTIL" 2 * N "DO" "BEGIN" HL:= INT * E[2 * JJ - 1] + E[2 * JJ]; "IF" HL < HMIN "THEN" HMIN:= HL "END"; "FOR" JJ:= 1 "STEP" 1 "UNTIL" 4 * N "DO" EE[JJ]:= E[JJ] / INT; FIRST:= REJECT:= "TRUE"; "IF" FI "THEN" "BEGIN" LAST:= "TRUE"; "GOTO" STEP "END"; TEST: ABSH:= ABS(H); "IF" ABSH < HMIN "THEN" "BEGIN" H:= "IF" H > 0 "THEN" HMIN "ELSE" - HMIN; ABSH:= HMIN "END"; "IF" H >= B - XL "EQV" H >= 0 "THEN" "BEGIN" D[2]:= H; LAST:= "TRUE"; H:= B - XL; ABSH:= ABS(H) "END" "ELSE" LAST:= "FALSE"; STEP: "IF" REJECT "THEN" "BEGIN" X:= XL; "FOR" JJ:= 1 "STEP" 1 "UNTIL" N "DO" Y[JJ]:= YL[JJ]; "FOR" J:= 1 "STEP" 1 "UNTIL" N "DO" K0[J]:= FXYJ * H "END" "ELSE" "BEGIN" FHY:= H / HL; "FOR" JJ:= 1 "STEP" 1 "UNTIL" N "DO" K0[JJ]:= K5[JJ] * FHY "END"; X:= XL + .27639 3202250021 * H; "FOR" JJ:= 1 "STEP" 1 "UNTIL" N "DO" Y[JJ]:= YL[JJ] + (ZL[JJ] * .276393202250021 + K0[JJ] * .038196601125011) * H; "FOR" J:= 1 "STEP" 1 "UNTIL" N "DO" K1[J]:= FXYJ * H; X:= XL + .723606797749979 * H; "FOR" JJ:= 1 "STEP" 1 "UNTIL" N "DO" Y[JJ]:= YL[JJ] + (ZL[JJ] * .723606797749979 + K1[JJ] * .261803398874989) * H; "FOR" J:= 1 "STEP" 1 "UNTIL" N "DO" K2[J]:= FXYJ * H; X:= XL + H * .5; "FOR" JJ:= 1 "STEP" 1 "UNTIL" N "DO" Y[JJ]:= YL[JJ] + (ZL[JJ] * .5 + K0[JJ] * .046875 + K1[JJ] * .079824155839840 - K2[JJ] * .00169 9155839840) * H; "FOR" J:= 1 "STEP" 1 "UNTIL" N "DO" K4[J]:= FXYJ * H; X:= "IF" LAST "THEN" B "ELSE" XL + H; "FOR" JJ:= 1 "STEP" 1 "UNTIL" N "DO" Y[JJ]:= YL[JJ] + (ZL[JJ] + K0[JJ] * .309016994374947 + K2[JJ] * .190983005625053) * H; "COMMENT" 1SECTION : 5.2.1.1.2.1.D (AUGUST 1974) PAGE 6 ; "FOR" J:= 1 "STEP" 1 "UNTIL" N "DO" K3[J]:= FXYJ * H; "FOR" JJ:= 1 "STEP" 1 "UNTIL" N "DO" Y[JJ]:= YL[JJ] + (ZL[JJ] + K0[JJ] * .083333333333333 + K1[JJ] * .30150 2832395825 + K2[JJ] * .115163834270842) * H; "FOR" J:= 1 "STEP" 1 "UNTIL" N "DO" K5[J]:= FXYJ * H; REJECT:= "FALSE"; FHM:= 0; "FOR" JJ:= 1 "STEP" 1 "UNTIL" N "DO" "BEGIN" DISCRY:= ABS(( - K0[JJ] * .5 + K1[JJ] * 1.809016994374947 + K2[JJ] * .690983005625053 - K4[JJ] * 2) * H); DISCRZ:= ABS((K0[JJ] - K3[JJ]) * 2 - (K1[JJ] + K2[JJ]) * 10 + K4[JJ] * 16 + K5[JJ] * 4); TOLY:= ABSH * (ABS(ZL[JJ]) * EE[2 * JJ - 1] + EE[2 * JJ]); TOLZ:= ABS(K0[JJ]) * EE[2 * (JJ + N) - 1] + ABSH * EE[2 * (JJ + N)]; REJECT:= DISCRY > TOLY "OR" DISCRZ > TOLZ "OR" REJECT; FHY:= DISCRY / TOLY; FHZ:= DISCRZ / TOLZ; "IF" FHZ > FHY "THEN" FHY:= FHZ; "IF" FHY > FHM "THEN" FHM:= FHY "END"; MU:= 1 / (1 + FHM) + .45; "IF" REJECT "THEN" "BEGIN" "IF" ABSH <= HMIN "THEN" "BEGIN" D[1]:= D[1] + 1; "FOR" JJ:= 1 "STEP" 1 "UNTIL" N "DO" "BEGIN" Y[JJ]:= YL[JJ]; Z[JJ]:= ZL[JJ] "END"; FIRST:= "TRUE"; "GOTO" NEXT "END"; H:= MU * H; "GOTO" TEST "END" REJ; "IF" FIRST "THEN" "BEGIN" FIRST:= "FALSE"; HL:= H; H:= MU * H; "GOTO" ACC "END"; FHY:= MU * H / HL + MU - MU1; HL:= H; H:= FHY * H; ACC: MU1:= MU; "FOR" JJ:= 1 "STEP" 1 "UNTIL" N "DO" Z[JJ]:= ZL[JJ] + (K0[JJ] + K3[JJ]) * .083333333333333 + (K1[JJ] + K2[JJ]) * .416666666666667; NEXT: "IF" B ^= X "THEN" "BEGIN" XL:= X; "FOR" JJ:= 1 "STEP" 1 "UNTIL" N "DO" "BEGIN" YL[JJ]:= Y[JJ]; ZL[JJ]:= Z[JJ] "END"; "GOTO" TEST "END"; "IF" "NOT"LAST "THEN" D[2]:= H; D[3]:= X; "FOR" JJ:= 1 "STEP" 1 "UNTIL" N "DO" "BEGIN" D[JJ + 3]:= Y[JJ]; D[N + JJ + 3]:= Z[JJ] "END" "END" RK3N; "EOP" 1SECTION : 5.2.1.1.3 (NOVEMBER 1976) PAGE 1 AUTHORS: P.A. BEENTJES, H.G.J. ROZENHART. INSTITUTE: MATHEMATICAL CENTRE. RECEIVED: 760201 BRIEF DESCRIPTION: ARKMAT SOLVES AN INITIAL VALUE PROBLEM, GIVEN AS A SYSTEM OF FIRST ORDER (NON-LINEAR) DIFFERENTIAL EQUATIONS BY MEANS OF A STABILIZED RUNGE KUTTA METHOD; IN PARTICULAR THIS PROCEDURE IS SUITABLE FOR THE INTEGRATION OF SYSTEMS WHERE THE DEPENDENT VARIABLE AND THE RIGHTHAND SIDE ARE STORED IN A RECTANGULAR ARRAY INSTEAD OF A VECTOR , I.E. DU / DT = F( T, U), WHERE U AND F ARE (N * M) MATRICES ( SEE METHOD AND PERFORMANCE). KEYWORDS: MATRIX DIFFERENTIAL EQUATIONS, INITIAL VALUE PROBLEMS, EXPLICIT ONE-STEP METHODS, STABILIZED RUNGE KUTTA METHODS. CALLING SEQUENCE: THE DECLARATION OF THE PROCEDURE IN THE CALLING PROGRAM READS: "PROCEDURE" ARKMAT(T, TE, M, N, U, DER, TYPE, ORDER, SPR, OUT); "VALUE" M, N, TYPE, ORDER; "INTEGER" M, N, TYPE, ORDER; "REAL" T, TE, SPR; "ARRAY" U; "PROCEDURE" DER, OUT; "CODE" 33066; 1SECTION : 5.2.1.1.3 (FEBRUARY 1979) PAGE 2 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>; ENTRY: THE FINAL VALUE OF T; M: <ARITHMETIC EXPRESSION>; NUMBER OF COLUMNS OF U; N: <ARITHMETIC EXPRESSION>; NUMBER OF ROWS OF U; U: <ARRAY IDENTIFIER>; "ARRAY" U[1:N,1: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; DER: <PROCEDURE IDENTIFIER>; THE HEADING OF THIS PROCEDURE READS: "PROCEDURE" DER(T, V, FTV); "VALUE" T; "REAL" T; "ARRAY" V, FTV; THIS PROCEDURE MUST BE GIVEN BY THE USER AND PERFORMS AN EVALUATION OF THE RIGHTHAND SIDE F( T, V) OF THE SYSTEM; UPON COMPLETION OF DER,THE RIGHTHAND SIDE SHOULD BE STORED IN FTV[1:N,1:M]; TYPE: <VARIABLE>; ENTRY: THE TYPE OF THE SYSTEM OF DIFFERENTIAL EQUATIONS TO BE SOLVED; THE USER SHOULD SUPPLY ONE OF THE FOLLOWING VALUES; 1: IF NO SPECIFICATION OF THE TYPE CAN BE MADE; 2: IF THE EIGENVALUES OF THE JACOBIAN MATRIX OF THE RIGHTHAND SIDE ARE NEGATIVE REAL; 3: IF THE EIGENVALUES OF THE JACOBIAN MATRIX OF THE RIGHTHAND SIDE ARE PURELY IMAGINARY; ORDER: <VARIABLE>; THE ORDER OF THE RUNGE KUTTA METHOD USED; ENTRY: FOR TYPE=2 THE USER MAY CHOOSE ORDER=1 OR ORDER=2; ORDER SHOULD BE 2 FOR THE OTHER TYPES; SPR: <ARITHMETIC EXPRESSION>; ENTRY: THE SPECTRAL RADIUS OF THE JACOBIAN MATRIX OF THE RIGHTHAND SIDE, WHEN THE SYSTEM IS WRITTEN IN ONE DIMENSIONAL FORM (I.E. VECTORFORM); THE INTEGRATION STEP WILL EQUAL CONSTANT/SPR (SEE DATA AND RESULTS); IF NECESSARY SPR CAN BE UPDATED (AFTER EACH STEP) BY MEANS OF THE 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[1:N,1:M] AND SPR. 1SECTION : 5.2.1.1.3 (FEBRUARY 1979) PAGE 3 DATA AND RESULTS: IF THE USER WANTS TO PERFORM THE INTEGRATION WITH A PRESCRIBED STEP H, HE HAS TO GIVE SPR THE VALUE CONSTANT/H, WHERE CONSTANT HAS THE FOLLOWING VALUES: CONSTANT= 4.3 IF TYPE=1 AND ORDER=2; CONSTANT= 156 IF TYPE=2 AND ORDER=1; CONSTANT= 64 IF TYPE=2 AND ORDER=2; CONSTANT= 8 IF TYPE=3 AND ORDER=2; PROCEDURES USED: ELMCOL = CP34023, DUPMAT = CP31035. REQUIRED CENTRAL MEMORY: TWO AUXILIARY ARRAYS OF ORDER N*M ARE DECLARED. METHOD AND PERFORMANCE: ARKMAT IS AN IMPLEMENTATION OF LOW ORDER STABILIZED RUNGE KUTTA METHODS (SEE REFERENCE[1]); THE INTEGRATION STEPSIZE USED WILL DEPEND ON: 1. THE TYPE OF SYSTEM TO BE SOLVED (I.E. HYPERBOLIC OR PARABOLIC); 2. THE SPECTRAL RADIUS OF THE JACOBIAN MATRIX OF THE SYSTEM; 3. THE INDICATED ORDER OF THE PARTICULAR RUNGE KUTTA METHOD; THE PROCEDURE ARKMAT IS ESPECIALLY INTENDED FOR SYSTEMS OF DIFFERENTIAL EQUATIONS ARISING FROM INITIAL BOUNDARY VALUE PROBLEMS IN TWO DIMENSIONS, E.G. WHEN THE METHOD OF LINES IS APPLIED TO THIS KIND OF PROBLEMS,THE RIGHTHAND SIDE OF THE RESULTING SYSTEM IS MUCH EASIER TO DESCRIBE IN MATRIX THAN IN VECTOR FORM; BECAUSE OF THIS FACT THE ARRAY OF DEPENDENT VARIABLES U IS A MATRIX, RATHER THAN A VECTOR. REFERENCE: [1]. P.J. VAN DER HOUWEN. STABILIZED RUNGE KUTTA METHOD WITH LIMITED STORAGE REQUIREMENTS. MATH. CENTR. REPORT TW 124/71. 1SECTION : 5.2.1.1.3 (NOVEMBER 1976) PAGE 4 EXAMPLE OF USE: GIVEN THE FOLLOWING SYSTEM OF EQUATIONS: DU / DT = V( T, X, Y), (1) DV / DT = D( DU / DX) / DX + D( DU / DY) / DY, ( ORIGINATING FROM THE INITIAL BOUNDARY VALUE PROBLEM D( DU / DT) / DT = D( DU / DX) / DX + D( DU / DY) / DY, ON THE DOMAIN 0 <= X <= PI , 0 <= Y <= 1 ), WITH THE FOLLOWING BOUNDARY CONDITIONS: U( T, 0, Y) = U( T, PI, Y) = U( T, X, 1) = 0, U( T, X, 0) = SIN( X ) * COS( SQRT( 1 + PI * PI / 4) * T), AND THE INITIAL VALUES: U( 0, X, Y) = SIN( X ) * COS( PI * Y / 2), V( 0, X, Y) = 0; BY APPLYING THE METHOD OF LINES TO PROBLEM (1), USING A TEN BY TEN GRID ON THE INDICATED DOMAIN, THE SYSTEM IS TRANSFORMED TO A MATRIX -DIFFERENTIAL EQUATION; THE SOLUTION OF THE LATTER PROBLEM AT T=1 IS COMPUTED BY THE FOLLOWING PROGRAM, USING A CONSTANT STEPSIZE .1; "BEGIN" "REAL" HPI,H1,H2,H1K,H2K,T,TE; "INTEGER" I,J,N,M,TYP,ORDE,TEL;"ARRAY" U[1:20,1:10]; "PROCEDURE" DERIV(T,U,DU); "VALUE" T; "REAL" T;"ARRAY" U,DU; "BEGIN" "FOR" I:=2 "STEP" 1 "UNTIL" N-1 "DO" "FOR" J:=2 "STEP" 1 "UNTIL" M-1 "DO" "BEGIN" DU[I,J]:=U[I+N,J]; DU[I+N,J]:=(U[I,J+1]-2*U[I,J]+U[I,J-1])/H1K+ (U[I+1,J]-2*U[I,J]+U[I-1,J])/H2K "END"; "FOR" J:=1,M "DO" "BEGIN" INIMAT(N+1,N+N,J,J,DU,0); "FOR" I:=1 "STEP" 1 "UNTIL" N "DO" DU[I,J]:=U[N+1,J] "END"; "FOR" I:=1,N "DO" "FOR" J:=2 "STEP" 1 "UNTIL" M-1 "DO" "BEGIN" DU[I,J]:=U[I+N,J]; "IF" I=1 "THEN" DU[N+1,J]:=(U[1,J+1]-2*U[1,J]+U[1,J-1])/H1K+ (2*U[2,J]-2*U[1,J])/H2K "ELSE" DU[2*N,J]:=0 "END" "END" DERIV; 1SECTION : 5.2.1.1.3 (NOVEMBER 1976) PAGE 5 "PROCEDURE" OUT; "BEGIN" TEL:=TEL+1; "IF" T=TE "THEN" "BEGIN" OUTPUT(61,"("//,3B,"("X")",7B,"("Y")",4B, "("U(1,X,Y)")",7B,"("U(1,X,Y)")",/,16B,"("COMPUTED")",7B, "("EXACT")",//")"); "FOR" I:= 1 "STEP" 1 "UNTIL" 10 "DO" OUTPUT(61,"("2(-D.3D2B),2(-D.6D6B),/")", (I-1)*H1,(I-1)*H2,U[I,I],SIN(H1*(I-1))*COS(HPI*H2*(I-1))* COS(T*SQRT(1+HPI*HPI))); OUTPUT(61,"("/,"("NUMBER OF INTEGRATION STEPS: ")" ,ZZZD")",TEL); OUTPUT(61,"("//,"(" TYPE IS:")",ZD,"(" ORDER IS:")", ZD")",TYP,ORDE); "END"; "END" OUT; "PROCEDURE" START; "BEGIN" "FOR" J:=1 "STEP" 1 "UNTIL" M "DO" U[N,J]:=SIN(H1*(J-1)); "FOR" I:=1 "STEP" 1 "UNTIL" N "DO" "BEGIN" "REAL" COS1; COS1:=COS(H2*HPI*(I-1)); "FOR" J:=1 "STEP" 1 "UNTIL" M "DO" U[I,J]:=U[N,J]*COS1 "END"; INIMAT(N+1,N+N,1,M,U,0) "END" START; HPI:=2*ARCTAN(1);H2:=1/9;H1:=(2*HPI)/9;N:=M:=10; H1K:=H1*H1;H2K:=H2*H2;TEL:=0; T:=0; TE:=1 ; START; TYP:=3; ORDE:=2; ARKMAT(T,TE,M,N+N,U,DERIV,TYP,ORDE,80.0,OUT) "END" THIS PROGRAM DELIVERS: X Y U(1,X,Y) U(1,X,Y) COMPUTED EXACT 0.000 0.000 0.000000 0.000000 0.349 0.111 -0.095201 -0.096735 0.698 0.222 -0.170723 -0.173474 1.047 0.333 -0.211983 -0.215398 1.396 0.444 -0.213228 -0.216663 1.745 0.556 -0.178920 -0.181802 2.094 0.667 -0.122388 -0.124360 2.443 0.778 -0.062138 -0.063139 2.793 0.889 -0.016787 -0.017057 3.142 1.000 0.000000 -0.000000 NUMBER OF INTEGRATION STEPS: 10 TYPE IS: 3 ORDER IS: 2 1SECTION : 5.2.1.1.3 (NOVEMBER 1976) PAGE 6 SOURCE TEXT(S): 0"CODE" 33066; "PROCEDURE" ARKMAT( T, TE, M, N, U, DER, TYPE, ORDER, SPR, OUT); "VALUE" M,N,TYPE,ORDER; "INTEGER" M,N,TYPE,ORDER; "REAL" T,TE,SPR; "ARRAY" U; "PROCEDURE" DER,OUT; "BEGIN" "INTEGER" SIG,L; "REAL" TAU; "ARRAY" LAMBDA[1:9],UH,DU[1:N,1:M]; "BOOLEAN" LAST; "PROCEDURE" ELMMAT(A,B,X); "VALUE" X; "ARRAY" A,B; "REAL" X; "FOR" L:=1 "STEP" 1 "UNTIL" M "DO" ELMCOL(1,N,L,L,A,B,X); "PROCEDURE" INITIALIZE; "BEGIN" "INTEGER" I;"REAL" LBD; "SWITCH" TYPEODE:=NOTSPECIFIED2,PARABOLIC1,PARABOLIC2,HYPERBOLIC2; "IF" TYPE^=2 "AND" TYPE^=3 "THEN" TYPE:=1; "IF" TYPE^=2 "THEN" ORDER:=2 "ELSE" "IF" ORDER^=2 "THEN" ORDER:=1; I:=1; "GOTO" TYPEODE["IF" TYPE=1 "THEN" 1 "ELSE" TYPE+ORDER-1]; NOTSPECIFIED2: "FOR" LBD:=1/9,1/8,1/7,1/6,1/5,1/4,1/3,1/2,4.3 "DO" "BEGIN" LAMBDA[I]:=LBD; I:=I+1 "END"; "GOTO" EXIT; PARABOLIC1: "FOR"LBD:=.1418519249"-2,.3404154076"-2,.0063118569 ,.01082794375,.01842733851,.03278507942, .0653627415,.1691078577,156 "DO" "BEGIN" LAMBDA[I]:=LBD; I:=I+1 "END"; "GOTO" EXIT; PARABOLIC2: "FOR" LBD:=.3534355908"-2,.8532600867"-2,.015956206 ,.02772229155,.04812587964,.08848689452, .1863578961,.5,64 "DO" "BEGIN" LAMBDA[I]:=LBD; I:=I+1 "END"; "GOTO" EXIT; HYPERBOLIC2: "FOR" LBD:=1/8,1/20,5/32,2/17,17/80,5/22,11/32,1/2, 8 "DO" "BEGIN" LAMBDA[I]:=LBD; I:=I+1 "END"; "GOTO" EXIT; "COMMENT" 1SECTION : 5.2.1.1.3 (NOVEMBER 1976) PAGE 7 ; EXIT: SIG:=SIGN(TE-T) "END" INITIALIZE; "PROCEDURE" DIFFERENCE SCHEME; "BEGIN" "INTEGER" I;"REAL" MLT; DER(T,U,DU); "FOR" I:=1 "STEP" 1 "UNTIL" 8 "DO" "BEGIN" MLT:=LAMBDA[I]*TAU; DUPMAT(1,N,1,M,UH,U); ELMMAT(UH,DU,MLT); DER(T+MLT,UH,DU) "END"; ELMMAT(U,DU,TAU); T:="IF" LAST "THEN" TE "ELSE" T+TAU; "END" DIFFERENCE SCHEME; INITIALIZE; LAST:="FALSE"; STEP: TAU:=("IF" SPR=0 "THEN" ABS(TE-T) "ELSE" ABS(LAMBDA[9]/SPR))*SIG; "IF" T+TAU >= TE "EQV" TAU>=0 "THEN" "BEGIN" TAU:=TE-T;LAST:="TRUE" "END"; DIFFERENCE SCHEME ; OUT; "IF" "NOT" LAST "THEN" "GOTO" STEP "END" ARKMAT; "EOP" 1SECTION : 5.2.1.2.1.2.1.1 (DECEMBER 1979) PAGE 1 AUTHOR: M. BAKKER. INSTITUTE: MATHEMATICAL CENTRE, AMSTERDAM. RECEIVED: 751231/ REVISED 791231. BRIEF DESCRIPTION: THIS SECTION CONTAINS THREE PROCEDURES FOR THE SOLUTION OF SECOND ORDER SELF-ADJOINT LINEAR TWO POINT BOUNDARY VALUE PROBLEMS; (1) FEM LAG SYM; THIS PROCEDURE SOLVES THE DIFFERENTIAL EQUATION - (P(X)*Y')' + R(X)*Y = F(X), A < X < B, WITH BOUNDARY CONDITIONS E[1]*Y(A) + E[2]*Y'(A) = E[3], E[4]*Y(B) + E[5]*Y'(B) = E[6]. (2) FEM LAG; THIS PROCEDURE SOLVES THE DIFFERENTIAL EQUATION - Y'' + R(X)*Y = F(X), A < X < B, WITH BOUNDARY CONDITIONS E[1]*Y(A) + E[2]*Y'(A) = E[3], E[4]*Y(B) + E[5]*Y'(B) = E[6]. (3) FEM LAG SPHER: THIS PROCEDURE SOLVES THE DIFFERENTIAL EQUATION WITH SPHERICAL COORDINATES - (X**NC*Y')'/X**NC + R(X)*Y = F(X), A < X < B, WITH BOUNDARY CONDITIONS E[1]*Y(A) + E[2]*Y'(A) = E[3], E[4]*Y(B) + E[5]*Y'(B) = E[6]. 1SECTION : 5.2.1.2.1.2.1.1 (DECEMBER 1979) PAGE 2 KEY WORDS AND PHRASES: SECOND ORDER DIFFERENTIAL EQUATIONS, TWO POINT BOUNDARY VALUE PROBLEMS, SELF-ADJOINT BOUNDARY VALUE PROBLEMS, RITZ-GALERKIN METHOD, SPHERICAL COORDINATES, GLOBAL METHODS. LANGUAGE: ALGOL 60. REFERENCES: [1] STRANG, G. AND G.J. FIX, AN ANALYSIS OF THE FINITE ELEMENT METHOD, PRENTICE-HALL, ENGLEWOOD CLIFFS, NEW JERSEY, 1973. [2] BAKKER, M., EDITOR, COLLOQUIUM ON DISCRETIZATION METHODS, CHAPTER 3 (DUTCH), MATHEMATISCH CENTRUM, MC-SYLLABUS, 1976. [3] HEMKER, P.W., GALERKIN'S METHOD AND LOBATTO POINTS, MATHEMATISCH CENTRUM, REPORT 24/75 (1975). [4] BABUSKA, I., NUMERICAL STABILITY IN PROBLEMS OF LINEAR ALGEBRA, S.I.A.M. J. NUM. ANAL., VOL.9, P. 53-77 (1972). 1SECTION : 5.2.1.2.1.2.1.1 (DECEMBER 1979) PAGE 3 SUBSECTION: FEM LAG SYM. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "PROCEDURE" FEM LAG SYM(X, Y, N, P, R, F, ORDER, E); "VALUE" N, ORDER; "INTEGER" N, ORDER; "ARRAY" X, Y, E; "REAL" "PROCEDURE" P, R, F; "CODE" 33300; THE MEANING OF THE FORMAL PARAMETERS IS: N: <ARITHMETIC EXPRESSION>; THE UPPER BOUND OF THE ARRAYS X AND Y; N > 1; X: <ARRAY IDENTIFIER>; "ARRAY" X[0:N]; ENTRY: A = X[0] < X[1] < ... < X[N] = B IS A PARTITION OF THE INTERVAL [A,B]; Y: <ARRAY IDENTIFIER>; "ARRAY" Y[0:N]; EXIT: Y[I] (I = 0, 1, ... , N) IS THE APPROXIMATE SOLUTION AT X[I] OF THE DIFFERENTIAL EQUATION (1) - (P(X)*Y')' + R(X)*Y = F(X), A < X < B, WITH BOUNDARY CONDITIONS E[1]*Y(A) + E[2]*Y'(A) = E[3], (2) E[4]*Y(B) + E[5]*Y'(B) = E[6]; P: <PROCEDURE IDENTIFIER>; THE HEADING OF P READS: "REAL" "PROCEDURE" P(X); "VALUE" X; "REAL" X; P(X) IS THE COEFFICIENT OF Y' IN (1); R: <PROCEDURE IDENTIFIER>; THE HEADING OF R READS: "REAL" "PROCEDURE" R(X); "VALUE" X; "REAL" X; R(X) IS THE COEFFICIENT OF Y IN (1); F: <PROCEDURE IDENTIFIER>; THE HEADING OF F READS: "REAL" "PROCEDURE" F(X); "VALUE" X; "REAL" X; F(X) IS THE RIGHT HAND SIDE OF (1); 1SECTION : 5.2.1.2.1.2.1.1 (DECEMBER 1979) PAGE 4 ORDER: <ARITHMETIC EXPRESSION>; ENTRY: ORDER DENOTES THE ORDER OF ACCURACY REQUIRED FOR THE APPROXIMATE SOLUTION OF (1)-(2); LET H = MAX(X[I] - X[I-1]); THEN ABS(Y[I] - Y(X[I])) <= C*H**ORDER, I = 0, ... , N; ORDER CAN BE CHOSEN EQUAL TO 2, 4 OR 6 ONLY; E: <ARRAY IDENTIFIER>; "ARRAY" E[1:6]; E[1], ... , E[6] DESCRIBE THE BOUNDARY CONDITIONS (2); E[1] AND E[4] ARE NOT ALLOWED TO VANISH BOTH. PROCEDURES USED: NONE. REQUIRED CENTRAL MEMORY: FOUR AUXILIARY ARRAYS OF N REALS ARE USED. RUNNING TIME: LET K = ORDER/2; THEN (A) K*N + 1 EVALUATIONS OF P(X), R(X) AND F(X) ARE NEEDED; (B) ABOUT 17*2**(K-1)*N MULTIPLICATIONS/DIVISIONS ARE NEEDED. DATA AND RESULTS: THE PROCEDURE FEM LAG SYM HAS SOME RESTRICTIONS IN ITS USE: (I) P(X) SHOULD BE POSITIVE ON THE CLOSED INTERVAL <X[J-1],X[J]>; (II) P(X), R(X) AND F(X) ARE REQUIRED TO BE SUFFICIENTLY SMOOTH ON <X[0],X[N]> EXCEPT AT THE GRID POINTS WHERE P(X) SHOULD BE AT LEAST CONTINUOUS; IN THAT CASE THE ORDER OF ACCURACY (2, 4, OR 6) IS PRESERVED; (III) R(X) SHOULD BE NONNEGATIVE ON <X[0],X[N]>; IF, HOWEVER, THE PROBLEM HAS PURE DIRICHLET BOUNDARY CONDITIONS (I.E. E[2] = E[5] = 0) THIS CONDITION CAN BE WEAKENED TO THE REQUIREMENT THAT R(X) > - P0*(PI/(X[N] - X[0]))**2, WHERE P0 IS THE MINIMUM OF P(X) ON <X[0],X[N]> AND PI HAS THE VALUE 3.14159...; HOWEVER, ONE SHOULD NOTE THAT THE PROBLEM MAY BE ILL-CONDITIONED WHEN R(X) IS QUITE NEAR THAT LOWER BOUND; FOR OTHER NEGATIVE VALUES OF R(X) THE EXISTENCE OF A SOLUTION REMAINS AN OPEN QUESTION; (IV) THE USER SHOULD NOT EXPECT GREATER ACCURACY THAN 12 DECIMALS DUE TO THE LOSS OF DIGITS DURING THE EVALUATION OF THE MATRIX AND THE VECTOR OF THE LINEAR SYSTEM TO BE SOLVED AND DURING ITS REDUCTION TO A TRIDIAGONAL SYSTEM; WHEN THE SOLUTION OF THE PROBLEM IS NOT TOO WILD, THIS 12-DIGIT ACCURACY CAN ALREADY BE OBTAINED WITH A MODERATE MESH SIZE (E.G. < 0.1), PROVIDED THAT A SIXTH ORDER METHOD IS USED. 1SECTION : 5.2.1.2.1.2.1.1 (DECEMBER 1979) PAGE 5 METHOD AND PERFORMANCE: PROBLEM (1)-(2) IS SOLVED BY MEANS OF GALERKIN'S METHOD WITH CONTINUOUS PIECEWISE POLYNOMIALS (SEE [1], [2]); THE SOLUTION IS APPROXIMATED BY A FUNCTION WHICH IS CONTINUOUS ON THE CLOSED INTERVAL <X[0],X[N]> AND A POLYNOMIAL OF DEGREE LESS THAN OR EQUAL TO K (K = ORDER//2) ON EACH SEGMENT <X[J-1],X[J]> (J = 1, ..., N); THIS PIECEWISE POLYNOMIAL IS ENTIRELY DETERMINED BY THE VALUES IT HAS AT THE KNOTS X[J] AND ON (K-1) INTERIOR KNOTS ON EACH SEGMENT <X[J-1],X[J]>; THESE VALUES ARE OBTAINED BY THE SOLUTION OF AN (ORDER + 1)-DIAGONAL LINEAR SYSTEM WITH A SPECIALLY STRUCTURED MATRIX (SEE [2]); THE ENTRIES OF THE MATRIX AND THE VECTOR ARE INNER PRODUCTS WHICH ARE APPROXIMATED BY PIECEWISE (K+1)-POINT LOBATTO QUADRATURE (SEE [3]); THE EVALUATION OF THE MATRIX AND THE VECTOR IS DONE SEGMENT BY SEGMENT: ON EACH SEGMENT THE CONTRIBUTIONS TO THE ENTRIES OF THE MATRIX AND THE VECTOR ARE COMPUTED AND EMBEDDED IN THE GLOBAL MATRIX AND VECTOR; SINCE THE FUNCTION VALUES ON THE INTERIOR POINTS OF EACH SEGMENT ARE NOT COUPLED WITH THE FUNCTION VALUES OUTSIDE THAT SEGMENT, THE RESULTING LINEAR SYSTEM CAN BE REDUCED TO A TRIDIAGONAL SYSTEM BY MEANS OF STATIC CONDENSATION (SEE [2]); THE FINAL TRIDIAGONAL SYSTEM, SINCE IT IS OF FINITE DIFFERENCE TYPE, IS SOLVED BY MEANS OF BABUSKA'S METHOD (SEE [4]). EXAMPLE OF USE: WE SOLVE THE BOUNDARY VALUE PROBLEM -(Y'*EXP(X))'+Y*COS(X)=EXP(X)*(SIN(X)-COS(X))+SIN(2*X)/2, 0 < X < PI = 3.14159265358979, Y(0) = Y(PI) = 0; FOR THE BOUNDARY CONDITIONS THIS MEANS THAT E[1] = E[4] = 1; E[2] = E[3] = E[5] = E[6] = 0; THE ANALYTIC SOLUTION IS Y(X) = SIN(X); WE APPROXIMATE THE SOLUTION ON A UNIFORM GRID, I.E. X[I] = I*PI/N, I = 0, ..., N; WE CHOOSE N=10,20 AND COMPUTE FOR ORDER = 2,4,6 THE MAXIMUM ERROR; THE PROGRAM READS AS FOLLOWS: 1SECTION : 5.2.1.2.1.2.1.1 (DECEMBER 1979) PAGE 6 "BEGIN" "INTEGER" N; "FOR" N:= 10, 20 "DO" "BEGIN" "INTEGER" I, ORDER; "REAL" PI; "ARRAY" X, Y[0:N], E[1:6]; "REAL" "PROCEDURE" R(X); "VALUE" X; "REAL" X; R:= COS(X); "REAL" "PROCEDURE" P(X); "VALUE" X; "REAL" X; P:= EXP(X); "REAL" "PROCEDURE" F(X); "VALUE" X; "REAL" X; F:= EXP(X)*(SIN(X)-COS(X)) + SIN(2*X)/2; E[1]:= E[4]:= 1; E[2]:= E[3]:= E[5]:= E[6]:= 0; PI:= 3.14159265358979; "FOR" I:= 0 "STEP" 1 "UNTIL" N "DO" X[I]:= PI*I/N; OUTPUT(61,"("//,6B"("N=")"ZD")",N); "FOR" ORDER:= 2, 4, 6 "DO" "BEGIN" "REAL" RHO, D; FEM LAG SYM(X, Y, N, P, R, F, ORDER, E); RHO:= 0; "FOR" I:= 0 "STEP" 1 "UNTIL" N "DO" "BEGIN" D:= ABS(Y[I] - SIN(X[I])); "IF" RHO < D "THEN" RHO:= D "END"; OUTPUT(61,"("/,16B"("ORDER=")"D,4B"("MAX.ERROR= ")", D.DD"+ZD")",ORDER,RHO) "END" "END" "END" RESULTS: N=10 ORDER=2 MAX. ERROR= 1.36" -2 ORDER=4 MAX. ERROR= 7.55" -5 ORDER=6 MAX. ERROR= 3.48" -8 N=20 ORDER=2 MAX. ERROR= 3.41" -3 ORDER=4 MAX. ERROR= 4.79" -6 ORDER=6 MAX. ERROR= 5.51"-10 ONE OBSERVES THAT THE MAXIMUM ERROR DECREASES BY ABOUT 2**(-ORDER) WHEN THE MESH SIZE IS HALVED. 1SECTION : 5.2.1.2.1.2.1.1 (DECEMBER 1979) PAGE 7 SUBSECTION: FEM LAG. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "PROCEDURE" FEM LAG(X, Y, N, R, F, ORDER, E); "VALUE" N, ORDER; "INTEGER" N, ORDER; "ARRAY" X, Y, E; "REAL" "PROCEDURE" R, F; "CODE" 33301; THE MEANING OF THE FORMAL PARAMETERS IS: N: <ARITHMETIC EXPRESSION>; THE UPPER BOUND OF THE ARRAYS X AND Y; N > 1; X: <ARRAY IDENTIFIER>; "ARRAY" X[0:N]; ENTRY: A = X[0] < X[1] < ... < X[N] = B IS A PARTITION OF THE SEGMENT [A,B]; Y: <ARRAY IDENTIFIER>; "ARRAY" Y[0:N]; EXIT: Y[I] (I = 0, 1, ... , N) IS THE APPROXIMATE SOLUTION AT X[I] OF THE DIFFERENTIAL EQUATION (3) - Y''+ R(X)*Y = F(X), A < X < B, WITH BOUNDARY CONDITIONS (4) E[1]*Y(A) + E[2]*Y'(A) = E[3], E[4]*Y(B) + E[5]*Y'(B) = E[6]; R: <PROCEDURE IDENTIFIER>; THE HEADING OF R READS: "REAL" "PROCEDURE" R(X); "VALUE" X; "REAL" X; R(X) IS THE COEFFICIENT OF Y IN (3); F: <PROCEDURE IDENTIFIER>; THE HEADING OF F READS: "REAL" "PROCEDURE" F(X); "VALUE" X; "REAL" X; F(X) IS THE RIGHT HAND SIDE OF (3); ORDER: <ARITHMETIC <EXPRESSION>; ENTRY: ORDER DENOTES THE ORDER OF ACCURACY REQUIRED FOR THE APPROXIMATE SOLUTION OF (3)-(4); LET H = MAX(X[I] - X[I-1]); THEN ABS(Y[I] - Y(X[I])) <= C*H**ORDER, I = 0, ... , N; ORDER CAN CAN BE CHOSEN EQUAL TO 2, 4 OR 6 ONLY; E: <ARRAY IDENTIFIER>; "ARRAY" E[1:6]; E[1], ... , E[6] DESCRIBE THE BOUNDARY CONDITIONS (4); E[1] AND E[4] ARE NOT ALLOWED TO VANISH BOTH. 1SECTION : 5.2.1.2.1.2.1.1 (DECEMBER 1979) PAGE 8 PROCEDURES USED: NONE. REQUIRED CENTRAL MEMORY: FOUR AUXILIARY ARRAYS OF N REALS ARE USED. RUNNING TIME: LET K = ORDER/2; THEN (A) K*N + 1 EVALUATIONS OF R(X) AND F(X) ARE NEEDED; (B) ABOUT 12*2**(K-1)*N MULTIPLICATIONS/DIVISIONS ARE NEEDED. DATA AND RESULTS: SEE PREVIOUS SUBSECTION. METHOD AND PERFORMANCE: SEE PREVIOUS SUBSECTION. EXAMPLE OF USE: WE SOLVE THE BOUNDARY VALUE PROBLEM - Y'' + Y*EXP(X) = SIN(X)*(1+EXP(X), 0 < X < PI = 3.14159265358979, Y(0) = Y(PI) = 0; FOR THE BOUNDARY CONDITIONS THIS MEANS THAT E[1] = E[4] = 1; E[2] = E[3] = E[5] = E[6] = 0; THE ANALYTIC SOLUTION IS Y(X) = SIN(X); WE APPROXIMATE THE SOLUTION ON A UNIFORM GRID, I.E. X[I] = I*PI/N, I = 0, ..., N; WE CHOOSE N=10,20 AND COMPUTE FOR ORDER = 2,4,6 THE MAXIMUM ERROR; THE PROGRAM READS AS FOLLOWS: 1SECTION : 5.2.1.2.1.2.1.1 (DECEMBER 1979) PAGE 9 "BEGIN" "INTEGER" N; "FOR" N:= 10, 20 "DO" "BEGIN" "INTEGER" I, ORDER; "REAL" PI; "ARRAY" X, Y[0:N], E[1:6]; "REAL" "PROCEDURE" R(X); "VALUE" X; "REAL" X; R:= EXP(X); "REAL" "PROCEDURE" F(X); "VALUE" X; "REAL" X; F:= SIN(X)*(1 + EXP(X)); E[1]:= E[4]:= 1; E[2]:= E[3]:= E[5]:= E[6]:= 0; PI:= 3.14159265358979; "FOR" I:= 0 "STEP" 1 "UNTIL" N "DO" X[I]:= PI*I/N; OUTPUT(61,"("//,6B"("N=")"ZD")",N); "FOR" ORDER:= 2, 4, 6 "DO" "BEGIN" "REAL" RHO, D; FEM LAG(X, Y, N, R, F, ORDER, E); RHO:= 0; "FOR" I:= 0 "STEP" 1 "UNTIL" N "DO" "BEGIN" D:= ABS(Y[I] - SIN(X[I])); "IF" RHO < D "THEN" RHO:= D "END"; OUTPUT(61,"("/,16B"("ORDER=")"D,4B"("MAX.ERROR= ")", D.DD"+ZD")",ORDER,RHO) "END" "END" "END" RESULTS: N=10 ORDER=2 MAX. ERROR= 1.60" -3 ORDER=4 MAX. ERROR= 1.55" -5 ORDER=6 MAX. ERROR= 7.28"-10 N=20 ORDER=2 MAX. ERROR= 4.01" -4 ORDER=4 MAX. ERROR= 9.80" -7 ORDER=6 MAX. ERROR= 9.38"-12 NOTICE THAT THE MAXIMUM ERROR DECREASES BY ABOUT 2**(-ORDER) WHEN THE MESH SIZE IS HALVED. 1SECTION : 5.2.1.2.1.2.1.1 (DECEMBER 1979) PAGE 10 SUBSECTION: FEM LAG SPHER. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "PROCEDURE" FEM LAG SPHER(X, Y, N, NC, R, F, ORDER, E); "VALUE" N, NC, ORDER; "INTEGER" N, NC, ORDER; "ARRAY" X, Y, E; "REAL" "PROCEDURE" R, F; "CODE" 33308; THE MEANING OF THE FORMAL PARAMETERS IS: N: <ARITHMETIC EXPRESSION>; THE UPPER BOUND OF THE ARRAYS X AND Y; N > 1; NC: <EXPRESSION>; IF NC = 0, CARTESIAN COORDINATES ARE USED; IF NC = 1, POLAR COORDINATES ARE USED; IF NC = 2, SPHERICAL COORDINATES ARE USED; X: <ARRAY IDENTIFIER>; "ARRAY" X[0:N]; ENTRY: A = X[0] < X[1] < ... < X[N] = B IS A PARTITION OF THE INTERVAL [A,B]; Y: <ARRAY IDENTIFIER>; "ARRAY" Y[0:N]; EXIT: Y[I] (I = 0, 1, ... , N) IS THE APPROXIMATE SOLUTION AT X[I] OF THE DIFFERENTIAL EQUATION (1) - (X**NC*Y')'/X**NC + R(X)*Y = F(X), A < X < B, WITH BOUNDARY CONDITIONS E[1]*Y(A) + E[2]*Y'(A) = E[3], (2) E[4]*Y(B) + E[5]*Y'(B) = E[6]; R: <PROCEDURE IDENTIFIER>; THE HEADING OF R READS: "REAL" "PROCEDURE" R(X); "VALUE" X; "REAL" X; R(X) IS THE COEFFICIENT OF Y IN (1); F: <PROCEDURE IDENTIFIER>; THE HEADING OF F READS: "REAL" "PROCEDURE" F(X); "VALUE" X; "REAL" X; F(X) IS THE RIGHT HAND SIDE OF (1); 1SECTION : 5.2.1.2.1.2.1.1 (DECEMBER 1979) PAGE 11 ORDER: <ARITHMETIC EXPRESSION>; ENTRY: ORDER DENOTES THE ORDER OF ACCURACY REQUIRED FOR THE APPROXIMATE SOLUTION OF (1)-(2); LET H = MAX(X[I] - X[I-1]); THEN ABS(Y[I] - Y(X[I])) <= C*H**ORDER, I = 0, ... , N; ORDER CAN BE CHOSEN EQUAL TO 2 OR 4 ONLY; E: <ARRAY IDENTIFIER>; "ARRAY" E[1:6]; E[1], ... , E[6] DESCRIBE THE BOUNDARY CONDITIONS (2); E[1] AND E[4] ARE NOT ALLOWED TO VANISH BOTH. PROCEDURES USED: NONE. REQUIRED CENTRAL MEMORY: FOUR AUXILIARY ARRAYS OF N REALS ARE USED. RUNNING TIME: LET K = ORDER/2; THEN (A) K*N EVALUATIONS OF R(X) AND F(X) ARE NEEDED; (B) IF NC > 0 AND ORDER=4, THEN N SQUARE ROOTS ARE EVALUATED; DATA AND RESULTS: THE PROCEDURE FEM LAG SPHER HAS SOME RESTRICTIONS IN ITS USE: R(X) AND F(X) ARE REQUIRED TO BE SUFFICIENTLY SMOOTH ON <X[0],X[N]> EXCEPT AT THE GRID POINTS; FURTHERMORE R(X) SHOULD BE NONNEGATIVE. METHOD AND PERFORMANCE: PROBLEM (1)-(2) IS SOLVED BY MEANS OF GALERKIN'S METHOD WITH CONTINUOUS PIECEWISE POLYNOMIALS (SEE [1], [2]); THE SOLUTION IS APPROXIMATED BY A FUNCTION WHICH IS CONTINUOUS ON THE CLOSED INTERVAL <X[0],X[N]> AND A POLYNOMIAL OF DEGREE LESS THAN OR EQUAL TO K (K = ORDER//2) ON EACH SEGMENT <X[J-1],X[J]> (J = 1, ..., N); THIS PIECEWISE POLYNOMIAL IS ENTIRELY DETERMINED BY THE VALUES IT HAS AT THE KNOTS X[J] AND ON (K-1) INTERIOR KNOTS ON EACH SEGMENT <X[J-1],X[J]>; THESE VALUES ARE OBTAINED BY THE SOLUTION OF AN (ORDER + 1)-DIAGONAL LINEAR SYSTEM WITH A SPECIALLY STRUCTURED MATRIX (SEE [2]); THE ENTRIES OF THE MATRIX AND THE VECTOR ARE INNER PRODUCTS WHICH ARE APPROXIMATED BY SOME PIECEWISE K-POINT GAUSSIAN QUADRATURE (SEE [4]); THE EVALUATION OF THE MATRIX AND THE VECTOR IS DONE SEGMENT BY SEGMENT: ON EACH SEGMENT THE CONTRIBUTIONS TO THE ENTRIES OF THE MATRIX AND THE VECTOR ARE COMPUTED AND EMBEDDED IN THE GLOBAL MATRIX AND VECTOR; 1SECTION : 5.2.1.2.1.2.1.1 (DECEMBER 1979) PAGE 12 SINCE THE FUNCTION VALUES ON THE INTERIOR POINTS OF EACH SEGMENT ARE NOT COUPLED WITH THE FUNCTION VALUES OUTSIDE THAT SEGMENT, THE RESULTING LINEAR SYSTEM CAN BE REDUCED TO A TRIDIAGONAL SYSTEM BY MEANS OF STATIC CONDENSATION (SEE [2]); THE FINAL TRIDIAGONAL SYSTEM, SINCE IT IS OF FINITE DIFFERENCE TYPE, IS SOLVED BY MEANS OF BABUSKA'S METHOD (SEE [3]). EXAMPLE OF USE: WE SOLVE THE BOUNDARY VALUE PROBLEM -(Y'*X**NC)'/X**NC + Y = 1 - X**4 + (12 + 4*NC)*X**2, 0 < X < 1; Y'(0) = Y(1) = 0; FOR THE BOUNDARY CONDITIONS THIS IMPLIES THAT E[2] = E[4] = 1; E[1] = E[3] = E[5] = E[6] = 0; THE ANALYTIC SOLUTION IS Y(X) = 1 - X**4; WE APPROXIMATE THE SOLUTION ON A UNIFORM GRID, I.E. X[I] = I/N, I = 0, ..., N; I = 0, ..., N; WE CHOOSE N=10,20 AND COMPUTE FOR ORDER = 2,4 THE MAXIMUM ERROR; THE PROGRAM READS AS FOLLOWS: "BEGIN" "INTEGER" N, NC; "FOR" N:= 10, 20 "DO" "FOR" NC:= 0, 1, 2 "DO" "BEGIN" "INTEGER" I, ORDER; "ARRAY" X, Y[0:N], E[1:6]; "REAL" "PROCEDURE" R(X); "VALUE" X; "REAL" X; R:= 1; "REAL" "PROCEDURE" F(X); "VALUE" X; "REAL" X; F:= (12 + 4*NC)*X**2 + 1 - X**4; E[2]:= E[4]:= 1; E[1]:= E[3]:= E[5]:= E[6]:= 0; "FOR" I:= 0 "STEP" 1 "UNTIL" N "DO" X[I]:= I/N; OUTPUT(61,"("//,6B"("N=")"ZZD,6B"("NC=")"ZD")",N,NC); "FOR" ORDER:= 2, 4 "DO" "BEGIN" "REAL" RHO, D; FEM LAG SPHER(X, Y, N, NC, R, F, ORDER, E); RHO:= 0; "FOR" I:= 0 "STEP" 1 "UNTIL" N "DO" "BEGIN" D:= ABS(Y[I] - 1 + X[I]**4); "IF" RHO < D "THEN" RHO:= D "END"; OUTPUT(61,"("/,16B"(" ORDER=")"ZD,4B"("MAX.ERROR= ")", D.DD"+ZD")",ORDER,RHO) "END" "END" "END" 1SECTION : 5.2.1.2.1.2.1.1 (DECEMBER 1979) PAGE 13 RESULTS: N= 10 NC= 0 ORDER= 2 MAX.ERROR= 4.37" -3 ORDER= 4 MAX.ERROR= 2.93" -6 N= 10 NC= 1 ORDER= 2 MAX.ERROR= 1.42" -2 ORDER= 4 MAX.ERROR= 5.49" -5 N= 10 NC= 2 ORDER= 2 MAX.ERROR= 2.46" -2 ORDER= 4 MAX.ERROR= 1.27" -4 N= 20 NC= 0 ORDER= 2 MAX.ERROR= 1.09" -3 ORDER= 4 MAX.ERROR= 1.83" -7 N= 20 NC= 1 ORDER= 2 MAX.ERROR= 3.53" -3 ORDER= 4 MAX.ERROR= 3.91" -6 N= 20 NC= 2 ORDER= 2 MAX.ERROR= 6.10" -3 ORDER= 4 MAX.ERROR= 9.26" -6 ONE OBSERVES THAT THE MAXIMUM ERROR DECREASES BY ABOUT 2**(-ORDER) WHEN THE MESH SIZE IS HALVED. 1SECTION : 5.2.1.2.1.2.1.1 (DECEMBER 1979) PAGE 14 SOURCE TEXT(S): 0"CODE" 33300; "PROCEDURE" FEM LAG SYM(X, Y, N, P, R, F, ORDER, E); "VALUE" N, ORDER; "INTEGER" N, ORDER; "REAL" "PROCEDURE" P, R, F; "ARRAY" X, Y, E; "BEGIN" "INTEGER" L, L1; "REAL" XL1, XL, H, A12, B1, B2, TAU1, TAU2, CH, TL, G, YL, PP, P1, P2, P3, P4, R1, R2, R3, R4, F1, F2, F3, F4, E1, E2, E3, E4, E5, E6; "ARRAY" T, SUB, CHI, GI[0:N-1]; "PROCEDURE" ELEMENT MAT VEC EVALUATION 1; "BEGIN" "REAL" H2; "IF" L=1 "THEN" "BEGIN" P2:= P(XL1); R2:= R(XL1); F2:= F(XL1) "END"; P1:= P2; P2:= P(XL); R1:= R2; R2:= R(XL); F1:= F2; F2:= F(XL); H2:= H/2; B1:= H2*F1; B2:= H2*F2; TAU1:= H2*R1; TAU2:= H2*R2; A12:= -0.5*(P1 + P2)/H "END" ELAN. M.V. EV.; "PROCEDURE" ELEMENT MAT VEC EVALUATION 2; "BEGIN" "REAL" X2, H6, H15, B3, TAU3, C12, C32, A13, A22, A23; "IF" L=1 "THEN" "BEGIN" P3:= P(XL1); R3:= R(XL1); F3:= F(XL1) "END"; X2:= (XL1 + XL)/2; H6:= H/6; H15:= H/1.5; P1:= P3; P2:= P(X2); P3:= P(XL); R1:= R3; R2:= R(X2); R3:= R(XL); F1:= F3; F2:= F(X2); F3:= F(XL); B1:= H6*F1; B2:= H15*F2; B3:= H6*F3; TAU1:= H6*R1; TAU2:= H15*R2; TAU3:= H6*R3; A12:= -(2*P1 + P3/1.5)/H; A13:= (0.5*(P1 + P3) - P2/1.5)/H; A22:= (P1 + P3)/H/0.375 + TAU2; A23:= -(P1/3 + P3)*2/H; "COMMENT" STATIC CONDENSATION; C12:= - A12/A22; C32:= - A23/A22; A12:= A13 + C32*A12; B1:= B1 + C12*B2; B2:= B3 + C32*B2; TAU1:= TAU1 + C12*TAU2; TAU2:= TAU3 + C32*TAU2 "END" ELEMENT MAT VEC EVALUATION 2; "PROCEDURE" ELEMENT MAT VEC EVALUATION 3; "BEGIN" "REAL" X2, X3, H12, H24, DET, C12, C13, C42, C43, A13, A14, A22, A23, A24, A33, A34, B3, B4, TAU3, TAU4; "IF" L=1 "THEN" "BEGIN" P4:= P(XL1); R4:= R(XL1); F4:= F(XL1) "END"; X2:= XL1 + 0.27639320225*H; X3:= XL - X2 + XL1; H12:= H/12; H24:= H/2.4; P1:= P4; P2:= P(X2); P3:= P(X3); P4:= P(XL); R1:= R4; R2:= R(X2); R3:= R(X3); R4:= R(XL); F1:= F4; F2:= F(X2); F3:= F(X3); F4:= F(XL); B1:= H12*F1; B2:= H24*F2; B3:= H24*F3; B4:= H12*F4; TAU1:= H12*R1; TAU2:= H24*R2; TAU3:= H24*R3; TAU4:= H12*R4; "COMMENT" 1SECTION : 5.2.1.2.1.2.1.1 (DECEMBER 1979) PAGE 15 ; A12:= -(+ 4.04508497187450*P1 + 0.57581917135425*P3 + 0.25751416197911*P4)/H; A13:= (+ 1.5450849718747*P1 - 1.5075141619791*P2 + 0.6741808286458*P4)/H; A14:= ((P2 + P3)/2.4 - (P1 + P4)/2)/H; A22:= (5.454237476562*P1 + P3/.48 +.79576252343762*P4)/H + TAU2; A23:= - (P1 + P4)/(H*0.48); A24:= (+ 0.67418082864575*P1 - 1.50751416197910*P3 + 1.54508497187470*P4)/H; A33:= (.7957625234376*P1 + P2/.48 + 5.454237476562*P4)/H + TAU3; A34:= -(+ 0.25751416197911*P1 + 0.57581917135418*P2 + 4.0450849718747*P4)/H; "COMMENT" STATIC CONDENSATION; DET:= A22*A33 - A23*A23; C12:= (A13*A23 - A12*A33)/DET; C13:= (A12*A23 - A13*A22)/DET; C42:= (A23*A34 - A24*A33)/DET; C43:= (A24*A23 - A34*A22)/DET; TAU1:= TAU1 + C12*TAU2 + C13*TAU3; TAU2:= TAU4 + C42*TAU2 + C43*TAU3; A12:= A14 + C42*A12 + C43*A13; B1:= B1 + C12*B2 + C13*B3; B2:= B4 + C42*B2 + C43*B3 "END" ELEMENT MAT VEC EVALUATION 3; "PROCEDURE" BOUNDARY CONDITIONS; "IF" L=1 "AND" E2 = 0 "THEN" "BEGIN" TAU1:= 1; B1:= E3/E1;B2:= B2 - A12*B1; TAU2:= TAU2 - A12; A12:= 0 "END" "ELSE" "IF" L=1 "AND" E2 ^= 0 "THEN" "BEGIN" "REAL" AUX; AUX:= P1/E2; TAU1:= TAU1 - AUX*E1 ; B1:= B1 - E3*AUX "END" "ELSE" "IF" L=N "AND" E5 = 0 "THEN" "BEGIN" TAU2:= 1; B2:= E6/E4; B1:= B1 - A12*B2; TAU1:= TAU1 - A12; A12:= 0 "END" "ELSE" "IF" L=N "AND" E5 ^= 0 "THEN" "BEGIN" "REAL" AUX; AUX:= P2/E5; TAU2:= TAU2 + AUX*E4; B2:= B2 + AUX*E6 "END" B.C.1; "PROCEDURE" FORWARD BABUSHKA; "IF" L=1 "THEN" "BEGIN" CHI[0]:= CH:= TL:= TAU1; T[0]:= TL; GI[0]:= G:= YL:= B1; Y[0]:= YL; SUB[0]:= A12; PP:= A12/(CH - A12); CH:= TAU2 - CH*PP; G:= B2 - G*PP; TL:= TAU2; YL:= B2 "END" "ELSE" "BEGIN" CHI[L1]:= CH:= CH + TAU1; GI[L1]:= G:= G + B1; "COMMENT" 1SECTION : 5.2.1.2.1.2.1.1 (DECEMBER 1979) PAGE 16 ; SUB[L1]:= A12; PP:= A12/(CH - A12); CH:= TAU2 - CH*PP; G:= B2 - G*PP; T[L1]:= TL + TAU1; TL:= TAU2; Y[L1]:= YL + B1; YL:= B2 "END" FORWARD BABUSHKA 1; "PROCEDURE" BACKWARD BABUSHKA; "BEGIN" PP:= YL; Y[N]:= G/CH; G:= PP; CH:= TL; L:= N; "FOR" L:= L - 1 "WHILE" L >= 0 "DO" "BEGIN" PP:= SUB[L]; PP:= PP/(CH - PP); TL:= T[L]; CH:= TL - CH*PP; YL:= Y[L]; G:= YL - G*PP; Y[L]:=(GI[L] + G - YL)/(CHI[L] + CH - TL) "END" "END" BACKWARD BABUSHKA; L:= 0; XL:= X[0]; E1:= E[1]; E2:= E[2]; E3:= E[3]; E4:= E[4]; E5:= E[5]; E6:= E[6]; "FOR" L:= L + 1 "WHILE" L <= N "DO" "BEGIN" L1:= L - 1; XL1:= XL; XL:= X[L]; H:= XL - XL1; "IF" ORDER = 2 "THEN" ELEMENT MAT VEC EVALUATION 1 "ELSE" "IF" ORDER = 4 "THEN" ELEMENT MAT VEC EVALUATION 2 "ELSE" ELEMENT MAT VEC EVALUATION 3; "IF" L=1 "OR" L=N "THEN" BOUNDARY CONDITIONS; FORWARD BABUSHKA "END"; BACKWARD BABUSHKA; "END" FEM LAG SYM; "EOP" 0"CODE" 33301; "PROCEDURE" FEM LAG(X, Y, N, R, F, ORDER, E); "VALUE" N, ORDER; "INTEGER" N, ORDER; "REAL" "PROCEDURE" R, F; "ARRAY" X, Y, E; "BEGIN" "INTEGER" L, L1; "REAL" XL1, XL, H, A12, B1, B2, TAU1, TAU2, CH, TL, G, YL, PP, E1, E2, E3, E4, E5, E6; "ARRAY" T, SUB, CHI, GI[0: N-1]; "PROCEDURE" ELEMENT MAT VEC EVALUATION 1; "BEGIN" "OWN" "REAL" F2, R2; "REAL" R1, F1, H2; "IF" L=1 "THEN" "BEGIN" F2:= F(XL1); R2:= R(XL1) "END"; A12:= - 1/H; H2:= H/2; R1:= R2; R2:= R(XL); F1:= F2; F2:= F(XL); B1:= H2*F1; B2:= H2*F2; TAU1:= H2*R1; TAU2:= H2*R2 "END" ELEMENT MAT VEC EVALUATION 1 1SECTION : 5.2.1.2.1.2.1.1 (DECEMBER 1979) PAGE 17 ; "PROCEDURE" ELEMENT MAT VEC EVALUATION 2; "BEGIN" "OWN" "REAL" R3, F3; "REAL" R1, R2, F1, F2, X2, H6, H15, B3, TAU3, C12, A13, A22, A23; "IF" L=1 "THEN" "BEGIN" R3:= R(XL1); F3:= F(XL1) "END"; X2:= (XL1 + XL)/2; H6:= H/6; H15:= H/1.5; R1:= R3; R2:= R(X2); R3:= R(XL); F1:= F3; F2:= F(X2); F3:= F(XL); B1:= H6*F1; B2:= H15*F2; B3:= H6*F3; TAU1:= H6*R1; TAU2:= H15*R2; TAU3:= R3*H6; A12:= A23:= -8/H/3; A13:= - A12/8; A22:= -2*A12 + TAU2; "COMMENT" STATIC CONDENSATION; C12:= - A12/A22; A12:= A13 + C12*A12; B2:= C12*B2; B1:= B1 + B2; B2:= B3 + B2; TAU2:= C12*TAU2; TAU1:= TAU1 + TAU2; TAU2:= TAU3 + TAU2 "END" ELEMENT MAT VEC EVALUATION2; "PROCEDURE" ELEMENT MAT VEC EVALUATION 3; "BEGIN" "OWN" "REAL" R4, F4; "REAL" R1, R2, R3, F1, F2, F3, X2, X3, H12, H24, DET, C12, C13, C42, C43, A13, A14, A22, A23, A24, A33, A34, B3, B4, TAU3, TAU4; "IF" L=1 "THEN" "BEGIN" R4:= R(XL1); F4:= F(XL1) "END"; X2:= XL1 + 0.27639320225*H; X3:= XL - X2 + XL1; R1:= R4; R2:= R(X2); R3:= R(X3); R4:= R(XL); F1:= F4; F2:= F(X2); F3:= F(X3); F4:= F(XL); H12:= H/12; H24:= H/2.4; B1:= F1*H12; B2:= F2*H24; B3:= F3*H24; B4:= F4*H12; TAU1:= R1*H12; TAU2:= R2*H24; TAU3:= R3*H24; TAU4:= R4*H12; A12:= A34:= -4.8784183052078/H; A13:= A24:= 0.7117516385412/H; A14:= -0.16666666666667/H; A23:= 25*A14; A22:= -2*A23 + TAU2; A33:= -2*A23 + TAU3; "COMMENT" STATIC CONDENSATION; DET:= A22*A33 - A23*A23; C12:= (A13*A23 - A12*A33)/DET; C13:= (A12*A23 - A13*A22)/DET; C42:= (A23*A34 - A24*A33)/DET; C43:= (A24*A23 - A34*A22)/DET; TAU1:= TAU1 + C12*TAU2 + C13*TAU3; TAU2:= TAU4 + C42*TAU2 + C43*TAU3; A12:= A14 + C42*A12 + C43*A13; B1:= B1 + C12*B2 + C13*B3; B2:= B4 + C42*B2 + C43*B3 "END" ELEMENT MAT VEC EVALUATION3 1SECTION : 5.2.1.2.1.2.1.1 (DECEMBER 1979) PAGE 18 ; "PROCEDURE" BOUNDARY CONDITIONS; "IF" L=1 "AND" E2 = 0 "THEN" "BEGIN" TAU1:= 1; B1:= E3/E1; B2:= B2 - A12*B1; TAU2:= TAU2 - A12; A12:= 0 "END" "ELSE" "IF" L=1 "AND" E2 ^= 0 "THEN" "BEGIN" TAU1:= TAU1 - E1/E2; B1:= B1 - E3/E2 "END" "ELSE" "IF" L=N "AND" E5 = 0 "THEN" "BEGIN" TAU2:= 1; B2:= E6/E4; B1:= B1 - A12*B2; TAU1:= TAU1 - A12; A12:= 0 "END" "ELSE" "IF" L=N "AND" E5 ^= 0 "THEN" "BEGIN" TAU2:= TAU2 + E4/E5; B2:= B2 + E6/E5 "END" BOUNDARY CONDITIONS; "PROCEDURE" FORWARD BABUSHKA; "IF" L=1 "THEN" "BEGIN" CHI[0]:= CH:= TL:= TAU1; T[0]:= TL; GI[0]:= G:= YL:= B1; Y[0]:= YL; SUB[0]:= A12; PP:= A12/(CH - A12); CH:= TAU2 - CH*PP; G:= B2 - G*PP; TL:= TAU2; YL:= B2 "END" "ELSE" "BEGIN" CHI[L1]:= CH:= CH + TAU1; GI[L1]:= G:= G + B1; SUB[L1]:= A12; PP:= A12/(CH - A12); CH:= TAU2 - CH*PP; G:= B2 - G*PP; T[L1]:= TL + TAU1; TL:= TAU2; Y[L1]:= YL + B1; YL:= B2 "END" FORWARD BABUSHKA 1; "PROCEDURE" BACKWARD BABUSHKA; "BEGIN" PP:= YL; Y[N]:= G/CH; G:= PP; CH:= TL; L:= N; "FOR" L:= L - 1 "WHILE" L >= 0 "DO" "BEGIN" PP:= SUB[L]; PP:= PP/(CH - PP); TL:= T[L]; CH:= TL - CH*PP; YL:= Y[L]; G:= YL - G*PP; Y[L]:=((GI[L] + G) - YL)/((CHI[L] + CH) - TL) "END" "END" BACKWARD BABUSHKA; L:= 0; XL:= X[0]; E1:= E[1]; E2:= E[2]; E3:= E[3]; E4:= E[4]; E5:= E[5]; E6:= E[6]; "FOR" L:= L + 1 "WHILE" L <= N "DO" "BEGIN" L1:= L - 1; XL1:= XL; XL:= X[L]; H:= XL - XL1; "IF" ORDER = 2 "THEN" ELEMENT MAT VEC EVALUATION 1 "ELSE" "IF" ORDER = 4 "THEN" ELEMENT MAT VEC EVALUATION 2 "ELSE" ELEMENT MAT VEC EVALUATION 3; "IF" L=1 "OR" L=N "THEN" BOUNDARY CONDITIONS; FORWARD BABUSHKA "END"; BACKWARD BABUSHKA; "END" FEM LAGR 1SECTION : 5.2.1.2.1.2.1.1 (DECEMBER 1979) PAGE 19 ; "EOP" "CODE" 33308; "PROCEDURE" FEM LAG SPHER(X, Y, N, NC, R, F, ORDER, E); "VALUE" N, NC, ORDER; "INTEGER" N, NC, ORDER; "REAL" "PROCEDURE" R, F; "ARRAY" X, Y, E; "BEGIN" "INTEGER" L, L1; "REAL" XL1, XL, H, A12, B1, B2, TAU1, TAU2, CH, TL, G, YL, PP, TAU3, B3, A13, A22, A23, C32, C12, E1, E2, E3, E4, E5, E6; "ARRAY" T, SUB, CHI, GI[0:N-1]; "PROCEDURE" ELEMENT MAT VEC EVALUATION 1; "BEGIN" "REAL" XM, VL, VR,WL, WR, PR, RM, FM, XL2, XLXR, XR2; "IF" NC = 0 "THEN" VL:= VR:= 0.5 "ELSE" "IF" NC = 1 "THEN" "BEGIN" VL:= (XL1*2 + XL)/6; VR:= (XL1 + XL*2)/6 "END" "ELSE" "BEGIN" XL2:= XL1*XL1/12; XLXR:=XL1*XL/6; XR2:=XL*XL/12; VL:= 3*XL2 + XLXR + XR2; VR:= 3*XR2 + XLXR + XL2 "END"; WL:= H*VL; WR:=H*VR; PR:= VR/(VL +VR); XM:= XL1 + H*PR; FM:= F(XM); RM:=R(XM); TAU1:= WL*RM; TAU2:=WR*RM; B1:= WL*FM; B2:= WR*FM; A12:= - (VL + VR)/H + H*(1 - PR)*PR*RM "END" ELEM. M.V. EV.; "PROCEDURE" ELEMENT MAT VEC EVALUATION 2; "BEGIN" "REAL" XLM, XRM, VLM, VRM, WLM, WRM, FLM, FRM, RLM, RRM, PL1, PL2, PL3, PR1, PR2, PR3, QL1, QL2, QL3, RLMPL1, RLMPL2, RLMPL3, RRMPR1, RRMPR2, RRMPR3, VLMQL1, VLMQL2, VLMQL3, VRMQR1, VRMQR2, VRMQR3, QR1, QR2,QR3; "IF" NC = 0 "THEN" "BEGIN" XLM:=XL1 + H*0.2113248654052; XRM:= XL1 + XL - XLM; VLM:= VRM:= 0.5; PL1:= PR3:= 0.45534180126148; PL3:= PR1:= -0.12200846792815; PL2:= PR2:= 1 - PL1 - PL3; QL1:= - 2.15470053837925; QL3:= -0.15470053837925; QL2:= - QL1 - QL3; QR1:= - QL3; QR3:= - QL1; QR2:= - QL2; "END" "ELSE" "IF" NC = 1 "THEN" "BEGIN" "REAL" A, A2, A3, A4, B, B2, B3, B4, P4H, P2, P3, P4, AUX1, AUX2; A:= XL1; A2:= A*A; A3:= A*A2; A4:= A*A3; B:= XL; B2:= B*B; B3:= B*B2; B4:= B*B3; P2:= 10*(A2 + 4*A*B + B2); P3:= 6*(A3 + 4*(A2*B + A*B2) + B3); P4:= SQRT(6*(A4 + 10*(A*B3 + A3*B) + 28*A2*B2 + B4)); P4H:= P4*H; XLM:= (P3 - P4H)/P2; XRM:= (P3 + P4H)/P2; AUX1:= (A + B)/4; AUX2:= H*(A2 + 7*A*B + B2)/6/P4; VLM:= AUX1 - AUX2; VRM:= AUX1 + AUX2; "COMMENT" 1SECTION : 5.2.1.2.1.2.1.1 (DECEMBER 1979) PAGE 20 ; "END" "ELSE" "BEGIN" "REAL" A, A2, A3, A4, A5, A6, A7, A8, B, B2, B3, B4, B5, B6, B7, B8, AB4, A2B3, A3B2, A4B, P4, P5, P8, P8H, AUX1, AUX2; A:= XL1; A2:= A*A; A3:= A*A2; A4:= A*A3; A5:= A*A4; A6:= A*A5; A7:= A*A6; A8:= A*A7; B:= XL; B2:= B*B; B3:= B*B2; B4:= B*B3; B5:= B*B4; B6:= B*B5; B7:= B*B6; B8:= B*B7; AB4:= A*B4; A2B3:= A2*B3; A3B2:= A3*B2; A4B:=A4*B; P4:= 15*(A4 + 4*(A3*B + A*B3) + 10*A2*B2 + B4); P5:= 10*(A5 + 4*(A4B + AB4) + 10*(A3B2 + A2B3) + B5); P8:= SQRT(10*(A8 + 10*(A7*B + A*B7) + 55*(A2*B6 + A6*B2) + 164*(A5*B3 +A3*B5) + 290*A4*B4 + B8)); AUX1:= (A2 +A*B + B2)/6; P8H:= P8*H; AUX2:= (H*(A5 + 7*(A4B + AB4) + 28*(A3B2 + A2B3) + B5))/4.8/P8; XLM:= (P5 - P8H)/P4; XRM:= (P5 + P8H)/P4; VLM:= AUX1 - AUX2; VRM:= AUX1 + AUX2 "END"; "IF" NC > 0 "THEN" "BEGIN" "REAL" AUX, PLM, PRM; PLM:= (XLM - XL1)/H; PRM:= (XRM - XL1)/H; AUX:= 2*PLM - 1; PL1:= AUX*(PLM - 1); PL3:= AUX*PLM; PL2:= 1 - PL1 - PL3; AUX:= 2*PRM - 1; PR1:= AUX*(PRM - 1); PR3:= AUX*PRM; PR2:= 1 - PR1 - PR3; AUX:= 4*PLM; QL1:= AUX - 3; QL3:= AUX - 1; QL2:= - QL1 - QL3; AUX:= 4*PRM; QR1:= AUX - 3; QR3:= AUX - 1; QR2:= - QR1 - QR3; "END"; WLM:= H*VLM; WRM:= H*VRM; VLM:= VLM/H; VRM:= VRM/H; FLM:= F(XLM)*WLM; FRM:= WRM*F(XRM); RLM:= R(XLM)*WLM; RRM:= WRM*R(XRM); TAU1:= PL1*RLM + PR1*RRM; TAU2:= PL2*RLM + PR2*RRM; TAU3:= PL3*RLM + PR3*RRM; B1:= PL1*FLM + PR1*FRM; B2:= PL2*FLM + PR2*FRM; B3:= PL3*FLM + PR3*FRM; VLMQL1:= QL1*VLM; VRMQR1:= QR1*VRM; VLMQL2:= QL2*VLM; VRMQR2:= QR2*VRM; VLMQL3:= QL3*VLM; VRMQR3:= QR3*VRM; RLMPL1:= RLM*PL1; RRMPR1:= RRM*PR1; RLMPL2:= RLM*PL2; RRMPR2:= RRM*PR2; RLMPL3:= RLM*PL3; RRMPR3:= RRM*PR3; "COMMENT" 1SECTION : 5.2.1.2.1.2.1.1 (DECEMBER 1979) PAGE 21 ; A12:= VLMQL1*QL2 + VRMQR1*QR2 + RLMPL1*PL2 + RRMPR1*PR2; A13:= VLMQL1*QL3 + VRMQR1*QR3 + RLMPL1*PL3 + RRMPR1*PR3; A22:= VLMQL2*QL2 + VRMQR2*QR2 + RLMPL2*PL2 + RRMPR2*PR2; A23:= VLMQL2*QL3 + VRMQR2*QR3 + RLMPL2*PL3 + RRMPR2*PR3; "COMMENT" STATIC CONDENSATION; C12:= - A12/A22; C32:= - A23/A22; A12:= A13 + C32*A12; B1:= B1 + C12*B2; B2:= B3 + C32*B2; TAU1:= TAU1 + C12*TAU2; TAU2:= TAU3 + C32*TAU2 "END" ELEMENT MAT VEC EVALUATION 2; "PROCEDURE" BOUNDARY CONDITIONS; "IF" L=1 "AND" E2 = 0 "THEN" "BEGIN" TAU1:= 1; B1:= E3/E1;B2:= B2 - A12*B1; TAU2:= TAU2 - A12; A12:= 0 "END" "ELSE" "IF" L=1 "AND" E2 ^= 0 "THEN" "BEGIN" "REAL" AUX; AUX:= ("IF" NC = 0 "THEN" 1 "ELSE" X[0]**NC)/E2; B1:= B1 - E3*AUX; TAU1:= TAU1 - E1*AUX "END" "ELSE" "IF" L=N "AND" E5 = 0 "THEN" "BEGIN" TAU2:= 1; B2:= E6/E4; B1:= B1 - A12*B2; TAU1:= TAU1 - A12; A12:= 0 "END" "ELSE" "IF" L=N "AND" E5 ^= 0 "THEN" "BEGIN" "REAL" AUX; AUX:= ("IF" NC = 0 "THEN" 1 "ELSE" X[N]**NC)/E5; TAU2:= TAU2 + AUX*E4; B2:= B2 + AUX*E6 "END" B.C.1; "PROCEDURE" FORWARD BABUSHKA; "IF" L=1 "THEN" "BEGIN" CHI[0]:= CH:= TL:= TAU1; T[0]:= TL; GI[0]:= G:= YL:= B1; Y[0]:= YL; SUB[0]:= A12; PP:= A12/(CH - A12); CH:= TAU2 - CH*PP; G:= B2 - G*PP; TL:= TAU2; YL:= B2 "END" "ELSE" "BEGIN" CHI[L1]:= CH:= CH + TAU1; GI[L1]:= G:= G + B1; SUB[L1]:= A12; PP:= A12/(CH - A12); CH:= TAU2 - CH*PP; G:= B2 - G*PP; T[L1]:= TL + TAU1; TL:= TAU2; Y[L1]:= YL + B1; YL:= B2 "END" FORWARD BABUSHKA 1SECTION : 5.2.1.2.1.2.1.1 (DECEMBER 1979) PAGE 22 ; "PROCEDURE" BACKWARD BABUSHKA; "BEGIN" PP:= YL; Y[N]:= G/CH; G:= PP; CH:= TL; L:= N; "FOR" L:= L - 1 "WHILE" L >= 0 "DO" "BEGIN" PP:= SUB[L]; PP:= PP/(CH - PP); TL:= T[L]; CH:= TL - CH*PP; YL:= Y[L]; G:= YL - G*PP; Y[L]:=(GI[L] + G - YL)/(CHI[L] + CH - TL) "END" "END" BACKWARD BABUSHKA; L:= 0; XL:= X[0]; E1:= E[1]; E2:= E[2]; E3:= E[3]; E4:= E[4]; E5:= E[5]; E6:= E[6]; "FOR" L:= L + 1 "WHILE" L <= N "DO" "BEGIN" L1:= L - 1; XL1:= XL; XL:= X[L]; H:= XL - XL1; "IF" ORDER = 2 "THEN" ELEMENT MAT VEC EVALUATION 1 "ELSE" ELEMENT MAT VEC EVALUATION 2; "IF" L=1 "OR" L=N "THEN" BOUNDARY CONDITIONS; FORWARD BABUSHKA "END"; BACKWARD BABUSHKA; "END" FEM LAG SPHER; "EOP" 1SECTION : 5.2.1.2.1.2.1.2 (JANUARY 1976) PAGE 1 AUTHOR: M. BAKKER. INSTITUTE: MATHEMATICAL CENTRE, AMSTERDAM. RECEIVED: 751231. BRIEF DESCRIPTION: THIS SECTION CONTAINS A PROCEDURE FOR THE SOLUTION OF SECOND ORDER SKEW-ADJOINT LINEAR TWO POINT BOUNDARY VALUE PROBLEMS; FEM LAG SKEW; THIS PROCEDURE SOLVES THE DIFFERENTIAL EQUATION - Y'' + Q(X)*Y' + R(X)*Y = F(X), A < X < B, WITH BOUNDARY CONDITIONS E[1]*Y(A) + E[2]*Y'(A) = E[3], E[4]*Y(B) + E[5]*Y'(B) = E[6]. KEY WORDS AND PHRASES: SECOND ORDER DIFFERENTIAL EQUATIONS, TWO POINT BOUNDARY VALUE PROBLEMS, SKEW-ADJOINT BOUNDARY VALUE PROBLEMS, GALERKIN'S METHOD, GLOBAL METHODS. LANGUAGE: ALGOL 60. REFERENCES: [1] STRANG, G. AND G.J. FIX, AN ANALYSIS OF THE FINITE ELEMENT METHOD, PRENTICE-HALL, ENGLEWOOD CLIFFS, NEW JERSEY, 1973. [2] BAKKER, M., EDITOR, COLLOQUIUM ON DISCRETIZATION METHODS, CHAPTER 3 (DUTCH), MATHEMATISCH CENTRUM, MC-SYLLABUS, 1976. [3] HEMKER, P.W., GALERKIN'S METHOD AND LOBATTO POINTS, MATHEMATISCH CENTRUM, REPORT 24/75 (1975). [4] BABUSKA, I., NUMERICAL STABILITY IN PROBLEMS OF LINEAR ALGEBRA, S.I.A.M. J. NUM. ANAL., VOL.9, P. 53-77 (1972). 1SECTION : 5.2.1.2.1.2.1.2 (JANUARY 1976) PAGE 2 SUBSECTION: FEM LAG SKEW. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "PROCEDURE" FEM LAG SKEW(X, Y, N, Q, R, F, ORDER, E); "VALUE" N, ORDER; "INTEGER" N, ORDER; "ARRAY" X, Y, E; "REAL" "PROCEDURE" Q, R, F; "CODE" 33302; THE MEANING OF THE FORMAL PARAMETERS IS: N: <ARITHMETIC EXPRESSION>; THE UPPER BOUND OF THE ARRAYS X AND Y; N > 1; X: <ARRAY IDENTIFIER>; "ARRAY" X[0:N]; ENTRY: A = X[0] < X[1] < ... < X[N] = B IS A PARTITION OF THE INTERVAL [A,B]; Y: <ARRAY IDENTIFIER>; "ARRAY" Y[0:N]; EXIT: Y[I] (I = 0, 1, ... , N) IS THE APPROXIMATE SOLUTION AT X[I] TO THE DIFFERENTIAL EQUATION (1) - Y'' + Q(X)*Y' + R(X)*Y = F(X), A < X < B, WITH BOUNDARY CONDITIONS E[1]*Y(A) + E[2]*Y'(A) = E[3], (2) E[4]*Y(B) + E[5]*Y'(B) = E[6]; Q: <PROCEDURE IDENTIFIER>; THE HEADING OF Q READS: "REAL" "PROCEDURE" Q(X); "VALUE" X; "REAL" X; Q(X) IS THE COEFFICIENT OF Y' IN (1); R: <PROCEDURE IDENTIFIER>; THE HEADING OF R READS: "REAL" "PROCEDURE" R(X); "VALUE" X; "REAL" X; R(X) IS THE COEFFICIENT OF Y IN (1); F: <PROCEDURE IDENTIFIER>; THE HEADING OF F READS: "REAL" "PROCEDURE" F(X); "VALUE" X; "REAL" X; F(X) IS THE RIGHT HAND SIDE OF (1); 1SECTION : 5.2.1.2.1.2.1.2 (JANUARY 1976) PAGE 3 ORDER: <ARITHMETIC EXPRESSION>; ENTRY: ORDER DENOTES THE ORDER OF ACCURACY REQUIRED FOR THE APPROXIMATE SOLUTION OF (1)-(2); LET H = MAX(X[I] - X[I-1]); THEN ABS(Y[I] - Y(X[I])) <= C*H**ORDER, I = 0, ... , N; ORDER CAN CAN BE CHOSEN EQUAL TO 2, 4 OR 6 ONLY; E: <ARRAY IDENTIFIER>; "ARRAY" E[1:6]; E[1], ... , E[6] DESCRIBE THE BOUNDARY CONDITIONS (2); E[1] AND E[4] ARE NOT ALLOWED TO VANISH BOTH. PROCEDURES USED: NONE. REQUIRED CENTRAL MEMORY: FOUR AUXILIARY ARRAYS OF N REALS ARE USED. RUNNING TIME: LET K = ORDER/2; THEN (A) K*N + 1 EVALUATIONS OF Q(X), R(X) AND F(X) ARE NEEDED; (B) ABOUT 17*2**(K-1)*N MULTIPLICATIONS/DIVISIONS ARE NEEDED. DATA AND RESULTS: THE PROCEDURE FEM LAG SKEW HAS SOME RESTRICTIONS IN ITS USE: (I) Q(X) IS NOT ALLOWED TO HAVE VERY LARGE VALUES IN SOME SENSE: THE PRODUCT Q(X)*(X[J] - X[J-1]) SHOULD NOT BE TOO LARGE ON THE CLOSED INTERVAL <X[J-1],X[J]>, OTHERWISE THE BOUNDARY VALUE PROBLEM MAY DEGENERATE TO A SINGULAR PERTURBATION OR BOUNDARY LAYER PROBLEM, FOR WHICH EITHER SPECIAL METHODS OR A SUITABLY CHOSEN GRID ARE NEEDED; (II) Q(X), R(X) AND F(X) ARE REQUIRED TO BE SUFFICIENTLY DIFFERENTIABLE ON THE DOMAIN OF THE BOUNDARY VALUE PROBLEM; THEY ARE, HOWEVER, THE DERIVATIVES ARE ALLOWED TO HAVE DISCONTINUITIES AT THE GRID POINTS, IN WHICH CASE THE ORDER OF ACCURACY (2, 4 OR 6) IS PRESERVED; (III) IF Q(X) AND R(X) SATISFY THE INEQUALITY R(X) >= Q'(X)/2, THE EXISTENCE OF A UNIQUE SOLUTION IS GUARANTEED, OTHERWISE THIS REMAINS AN OPEN QUESTION; (IV) THE USER SHOULD NOT EXPECT GREATER ACCURACY THAN 12 DECIMALS DUE TO THE LOSS OF DIGITS DURING THE EVALUATION OF THE MATRIX AND THE VECTOR OF THE LINEAR SYSTEM TO BE SOLVED AND DURING ITS REDUCTION TO A TRIDIAGONAL SYSTEM; WHEN THE SOLUTION OF THE PROBLEM IS NOT TOO WILD, THIS 12-DIGITS ACCURACY CAN BE OBTAINED WITH A MODERATE MESH SIZE (E.G. < 0.1) ALREADY, PROVIDED A SIXTH ORDER METHOD IS USED. 1SECTION : 5.2.1.2.1.2.1.2 (JANUARY 1976) PAGE 4 METHOD AND PERFORMANCE: PROBLEM (1)-(2) IS SOLVED BY MEANS OF GALERKIN'S METHOD WITH CONTINUOUS PIECEWISE POLYNOMIAL FUNCTIONS (SEE [1], [2]); THE SOLUTION IS APPROXIMATED BY A FUNCTION WHICH IS CONTINUOUS ON THE INTERVAL <X[0],X[N]> AND A POLYNOMIAL OF DEGREE LESS THAN OR EQUAL TO K (K = ORDER//2) ON EACH SEGMENT <X[J-1],X[J]> (J = 1, ..., N); THIS PIECEWISE POLYNOMIAL IS ENTIRELY DETERMINED BY THE VALUES IT HAS AT THE KNOTS X[J] AND ON (K-1) INTERIOR KNOTS ON EACH SEGMENT <X[J-1],X[J]>; THESE VALUES ARE OBTAINED BY THE SOLUTION OF AN (ORDER + 1)-DIAGONAL LINEAR SYSTEM WITH A SPECIALLY STRUCTURED MATRIX (SEE [2]); THE ENTRIES OF THE MATRIX AND THE VECTOR ARE INNER PRODUCTS WHICH ARE APPROXIMATED BY PIECEWISE (K+1)-POINT LOBATTO QUADRATURE (SEE [3]); THE EVALUATION OF THE MATRIX AND THE VECTOR IS DONE SEGMENT BY SEGMENT: ON EACH SEGMENT THE CONTRIBUTIONS TO THE ENTRIES OF THE MATRIX AND THE VECTOR ARE COMPUTED AND EMBEDDED IN THE GLOBAL MATRIX AND VECTOR; SINCE THE FUNCTION VALUES ON THE INTERIOR POINTS OF EACH SEGMENT ARE NOT COUPLED WITH THE FUNCTION VALUES OUTSIDE THAT SEGMENT, THE RESULTING LINEAR SYSTEM CAN BE REDUCED TO A TRIDIAGONAL SYSTEM BY MEANS OF STATIC CONDENSATION (SEE [2]); SINCE THE FINAL TRIDIAGONAL SYSTEM IS OF FINITE DIFFERENCE TYPE, IT IS SOLVED BY MEANS OF BABUSKA'S METHOD (SEE [4]). EXAMPLE OF USE: WE SOLVE THE BOUNDARY VALUE PROBLEM - Y'' + Y'*COS(X) + Y*EXP(X) = SIN(X)*(1 + EXP(X)) + COS(X)**2, 0 < X < PI = 3.14159265358979, Y(0) = Y(PI) = 0; FOR THE BOUNDARY CONDITIONS THIS MEANS THAT E[1] = E[4] = 1; E[2] = E[3] = E[5] = E[6] = 0; THE ANALYTIC SOLUTION IS Y(X) = SIN(X); WE APPROXIMATE THE SOLUTION ON A UNIFORM GRID, I.E. X[I] = I*PI/N, I = 0, ..., N; WE CHOOSE N=10,20 AND COMPUTE FOR ORDER = 2,4,6 THE MAXIMUM ERROR; THE PROGRAM READS AS FOLLOWS: 1SECTION : 5.2.1.2.1.2.1.2 (JANUARY 1976) PAGE 5 "BEGIN" "INTEGER" N; "FOR" N:= 10, 20 "DO" "BEGIN" "INTEGER" I, ORDER; "REAL" PI; "ARRAY" X, Y[0:N], E[1:6]; "REAL" "PROCEDURE" Q(X); "VALUE" X; "REAL" X; Q:= COS(X); "REAL" "PROCEDURE" R(X); "VALUE" X; "REAL" X; R:= EXP(X); "REAL" "PROCEDURE" F(X); "VALUE" X; "REAL" X; F:= SIN(X)*(1 + EXP(X)) + COS(X)**2; E[1]:= E[4]:= 1; E[2]:= E[3]:= E[5]:= E[6]:= 0; PI:= 3.14159265358979; "FOR" I:= 0 "STEP" 1 "UNTIL" N "DO" X[I]:= PI*I/N; OUTPUT(61,"("//,6B"("N=")"ZD")",N); "FOR" ORDER:= 2, 4, 6 "DO" "BEGIN" "REAL" RHO, D; FEM LAG SKEW(X, Y, N, Q, R, F, ORDER, E); RHO:= 0; "FOR" I:= 0 "STEP" 1 "UNTIL" N "DO" "BEGIN" D:= ABS(Y[I] - SIN(X[I])); "IF" RHO < D "THEN" RHO:= D "END"; OUTPUT(61,"("/,16B"("ORDER=")"D,4B"("MAX.ERROR= ")", D.DD"+ZD")",ORDER,RHO) "END" "END" "END" RESULTS: N=10 ORDER=2 MAX. ERROR= 2.95" -3 ORDER=4 MAX. ERROR= 2.56" -5 ORDER=6 MAX. ERROR= 4.26" -8 N=20 ORDER=2 MAX. ERROR= 7.55" -4 ORDER=4 MAX. ERROR= 1.68" -6 ORDER=6 MAX. ERROR= 6.76"-10 NOTICE THAT THE MAXIMUM ERROR DECREASES BY ABOUT 2**(-ORDER) WHEN THE MESH SIZE IS HALVED. 1SECTION : 5.2.1.2.1.2.1.2 (JANUARY 1976) PAGE 6 SOURCE TEXT(S): 0"CODE" 33302; "PROCEDURE" FEM LAG SKEW(X, Y, N, Q, R, F, ORDER, E); "VALUE" N, ORDER; "INTEGER" N, ORDER; "REAL" "PROCEDURE" Q, R, F; "ARRAY" X, Y, E; "BEGIN" "INTEGER" L, L1; "REAL" XL1, XL, H, A12, A21, B1, B2, TAU1, TAU2, CH, TL, G, YL, PP, E1, E2, E3, E4, E5, E6; "ARRAY" T, SUPER, SUB, CHI, GI[0:N-1]; "PROCEDURE" ELEMENT MAT VEC EVALUATION 1; "BEGIN" "OWN" "REAL" Q2, R2, F2; "REAL" Q1, R1, F1, H2, S12; "IF" L=1 "THEN" "BEGIN" Q2:= Q(XL1); R2:= R(XL1); F2:= F(XL1) "END"; H2:= H/2; S12:= - 1/H; Q1:= Q2; Q2:= Q(XL); R1:= R2; R2:= R(XL); F1:= F2; F2:= F(XL); B1:= H2*F1; B2:= H2*F2; TAU1:= H2*R1; TAU2:= H2*R2; A12:= S12 + Q1/2; A21:= S12 - Q2/2 "END" ELEMENT MAT VEC EV.; "PROCEDURE" ELEMENT MAT VEC EVALUATION 2; "BEGIN" "OWN" "REAL" Q3, R3, F3; "REAL" Q1, Q2, R1, R2, F1, F2, S12, S13, S22, X2, H6, H15, C12, C32, A13, A31, A22, A23, A32, B3, TAU3; "IF" L=1 "THEN" "BEGIN" Q3:= Q(XL1); R3:= R(XL1); F3:= F(XL1) "END"; X2:= (XL1 + XL)/2; H6:= H/6; H15:= H/1.5; Q1:= Q3; Q2:= Q(X2); Q3:= Q(XL); R1:= R3; R2:= R(X2); R3:= R(XL); F1:= F3; F2:= F(X2); F3:= F(XL); B1:= H6*F1; B2:= H15*F2; B3:= H6*F3; TAU1:= H6*R1; TAU2:= H15*R2; TAU3:= H6*R3; S12:= - 1/H/0.375; S13:= - S12/8; S22:= - 2*S12; A12:= S12 + Q1/1.5; A13:= S13 - Q1/6; A21:= S12 - Q2/1.5; A23:= S12 + Q2/1.5; A22:= S22 + TAU2; A31:= S13 + Q3/6; A32:= S12 - Q3/1.5; "COMMENT" STATIC CONDENSATION; C12:= - A12/A22; C32:= - A32/A22; A12:= A13 + C12*A23; A21:= A31 + C32*A21; B1:= B1 + C12*B2; B2:= B3 + C32*B2; TAU1:= TAU1 + C12*TAU2; TAU2:= TAU3 + C32*TAU2 "END" ELEMENT MAT VEC EVALUATION 2 1SECTION : 5.2.1.2.1.2.1.2 (JANUARY 1976) PAGE 7 ; "PROCEDURE" ELEMENT MAT VEC EVALUATION 3; "BEGIN" "OWN" "REAL" Q4, R4, F4; "REAL" Q1, Q2, Q3, R1, R2, R3, F1, F2, F3, S12, S13, S14, S22, S23, X2, X3, H12, H24, DET, C12, C13, C42, C43, A13, A14, A22, A23, A24, A31, A32, A33, A34, A41, A42, A43, B3, B4, TAU3, TAU4; "IF" L=1 "THEN" "BEGIN" Q4:= Q(XL1); R4:= R(XL1); F4:= F(XL1) "END"; X2:= XL1 + 0.27639320225*H; X3:= XL - X2 + XL1; H12:= H/12; H24:= H/2.4; Q1:= Q4; Q2:= Q(X2); Q3:= Q(X3); Q4:= Q(XL); R1:= R4; R2:= R(X2); R3:= R(X3); R4:= R(XL); F1:= F4; F2:= F(X2); F3:= F(X3); F4:= F(XL); S12:= -4.8784183052080/H; S13:= 0.7117516385414/H; S14:= -.16666666666667/H; S23:= 25*S14; S22:= -2*S23; B1:= H12*F1; B2:= H24*F2; B3:= H24*F3; B4:= H12*F4; TAU1:= H12*R1; TAU2:= H24*R2; TAU3:= H24*R3; TAU4:= H12*R4; A12:= S12 + 0.67418082864578*Q1; A13:= S13 - 0.25751416197912*Q1; A14:= S14 + Q1/12; A21:= S12 - 0.67418082864578*Q2; A22:= S22 + TAU2; A23:= S23 + 0.93169499062490*Q2; A24:= S13 - 0.25751416197912*Q2; A31:= S13 + 0.25751416197912*Q3; A32:= S23 - 0.93169499062490*Q3; A33:= S22 + TAU3; A34:= S12 + 0.67418082864578*Q3; A41:= S14 - Q4/12; A42:= S13 + 0.25751416197912*Q4; A43:= S12 - 0.67418082864578*Q4; "COMMENT" STATIC CONDENSATION; DET:= A22*A33 - A23*A32; C12:= (A13*A32 - A12*A33)/DET; C13:= (A12*A23 - A13*A22)/DET; C42:= (A32*A43 - A42*A33)/DET; C43:= (A42*A23 - A43*A22)/DET; TAU1:= TAU1 + C12*TAU2 + C13*TAU3 ; TAU2:= TAU4 + C42*TAU2 + C43*TAU3; A12:= A14 + C12*A24 + C13*A34; A21:= A41 + C42*A21 + C43*A31; B1:= B1 + C12*B2 + C13*B3; B2:= B4 + C42*B2 + C43*B3 "END" ELEMENT MAT VEC EVALUATION 3 1SECTION : 5.2.1.2.1.2.1.2 (JANUARY 1976) PAGE 8 ; "PROCEDURE" BOUNDARY CONDITIONS; "IF" L=1 "AND" E2 = 0 "THEN" "BEGIN" TAU1:= 1; B1:= E3/E1; A12:= 0 "END" "ELSE" "IF" L=1 "AND" E2 ^= 0 "THEN" "BEGIN" TAU1:= TAU1 - E1/E2; B1:= B1 - E3/E2 "END" "ELSE" "IF" L=N "AND" E5 = 0 "THEN" "BEGIN" TAU2:= 1; A21:= 0; B2:= E6/E4; "END" "ELSE" "IF" L=N "AND" E5 ^= 0 "THEN" "BEGIN" TAU2:= TAU2 + E4/E5; B2:= B2 + E6/E5 "END" B.C.1; "PROCEDURE" FORWARD BABUSKA; "IF" L=1 "THEN" "BEGIN" CHI[0]:= CH:= TL:= TAU1; T[0]:= TL; GI[0]:= G:= YL:= B1; Y[0]:= YL; SUB[0]:= A21; SUPER[0]:= A12; PP:= A21/(CH - A12); CH:= TAU2 - CH*PP; G:= B2 - G*PP; TL:= TAU2; YL:= B2 "END" "ELSE" "BEGIN" CHI[L1]:= CH:= CH + TAU1; GI[L1]:= G:= G + B1; SUB[L1]:= A21; SUPER[L1]:= A12; PP:= A21/(CH - A12); CH:= TAU2 - CH*PP; G:= B2 - G*PP; T[L1]:= TL + TAU1; TL:= TAU2; Y[L1]:= YL + B1; YL:= B2 "END" FORWARD BABUSKA; "PROCEDURE" BACKWARD BABUSKA; "BEGIN"PP:= YL; Y[N]:= G/CH; G:= PP; CH:= TL; L:= N; "FOR" L:= L - 1 "WHILE" L >= 0 "DO" "BEGIN" PP:= SUPER[L]/(CH - SUB[L]); TL:= T[L]; CH:= TL - CH*PP; YL:= Y[L]; G:= YL - G*PP; Y[L]:=(GI[L] + G - YL)/(CHI[L] + CH - TL) ; "END" "END" BACKWARD BABUSKA; L:= 0; XL:= X[0]; E1:= E[1]; E2:= E[2]; E3:= E[3]; E4:= E[4]; E5:= E[5]; E6:= E[6]; "COMMENT" ELEMENTWISE ASSEMBLAGE OF MATRIX AND VECTOR COMBINED WITH FORWARD BABUSKA SUBSTITUTION; "FOR" L:= L + 1 "WHILE" L <= N "DO" "BEGIN" XL1:= XL; L1:= L - 1; XL:= X[L]; H:= XL - XL1; "IF" ORDER = 2 "THEN" ELEMENT MAT VEC EVALUATION 1 "ELSE" "IF" ORDER = 4 "THEN" ELEMENT MAT VEC EVALUATION 2 "ELSE" ELEMENT MAT VEC EVALUATION 3; "IF" L=1 "OR" L=N "THEN" BOUNDARY CONDITIONS; FORWARD BABUSKA "END"; BACKWARD BABUSKA; "END" FEM LAGR; "EOP" 1SECTION : 5.2.1.2.1.2.2.1 (JANUARY 1976) PAGE 1 AUTHOR: M. BAKKER. INSTITUTE: MATHEMATICAL CENTRE, AMSTERDAM. RECEIVED: 751231. BRIEF DESCRIPTION: THIS SECTION CONTAINS A PROCEDURE FOR THE SOLUTION OF FOURTH ORDER SELF-ADJOINT LINEAR TWO POINT BOUNDARY VALUE PROBLEMS; FEM HERM SYM; THIS PROCEDURE SOLVES THE DIFFERENTIAL EQUATION (P(X)*Y'')'' - (Q(X)*Y')' + R(X)*Y = F(X), A < X < B, WITH BOUNDARY CONDITIONS Y(A) = E[1], Y'(A) = E[2], Y(B) = E[3], Y'(B) = E[4]. KEY WORDS AND PHRASES: FOURTH ORDER DIFFERENTIAL EQUATIONS, TWO POINT BOUNDARY VALUE PROBLEMS, SELF-ADJOINT BOUNDARY VALUE PROBLEMS, GALERKIN'S METHOD, DIRICHLET BOUNDARY CONDITIONS, GLOBAL METHODS. LANGUAGE: ALGOL 60. REFERENCES: [1] STRANG, G. AND G.J. FIX, AN ANALYSIS OF THE FINITE ELEMENT METHOD, PRENTICE-HALL, ENGLE WOOD CLIFFS, NEW JERSEY, 1973. [2] BAKKER, M., EDITOR, COLLOQUIUM ON DISCRETIZATION METHODS, CHAPTER 3 (DUTCH), MATHEMATISCH CENTRUM, MC-SYLLABUS, 1976. [3] HEMKER, P.W., GALERKIN'S METHOD AND LOBATTO POINTS, MATHEMATISCH CENTRUM, REPORT 24/75 (1975). 1SECTION : 5.2.1.2.1.2.2.1 (JANUARY 1976) PAGE 2 CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "PROCEDURE" FEM HERM SYM(X, Y, N, P, Q, R, F, ORDER, E); "VALUE" N, ORDER; "INTEGER" N, ORDER; "ARRAY" X, Y, E; "REAL" "PROCEDURE" P, Q, R, F; "CODE" 33303; THE MEANING OF THE FORMAL PARAMETERS IS: N: <ARITHMETIC EXPRESSION>; THE UPPER BOUND OF THE ARRAY X; N > 1; X: <ARRAY IDENTIFIER>; "ARRAY" X[0:N]; ENTRY: A = X[0] < X[1] < ... < X[N] = B IS A PARTITION OF THE INTERVAL [A,B]; Y: <ARRAY IDENTIFIER>; "ARRAY" Y[1:2*N-2]; EXIT: Y[2*I-1] IS AN APPROXIMATION TO Y(X[I]), Y[2*I] IS AN APPROXIMATION TO Y'(X[I]), WHERE Y(X) IS THE SOLUTION OF THE DIFFERENTIAL EQUATION (1) (P(X)*Y'')'' - (Q(X)*Y')' + R(X)*Y = F(X) , A< X < B, WITH BOUNDARY CONDITIONS Y(A) = E[1], Y'(A) = E[2], (2) Y(B) = E[3], Y'(B) = E[4]; P: <PROCEDURE IDENTIFIER>; THE HEADING OF P READS: "REAL" "PROCEDURE" P(X); "VALUE" X; "REAL" X; P(X) IS THE COEFFICIENT OF Y'' IN (1); P(X) SHOULD BE STRICTLY POSITIVE; Q: <PROCEDURE IDENTIFIER>; THE HEADING OF Q READS: "REAL" "PROCEDURE" Q(X); "VALUE" X; "REAL" X; Q(X) IS THE COEFFICIENT OF Y' IN (1); Q(X) SHOULD BE NONNEGATIVE; R: <PROCEDURE IDENTIFIER>; THE HEADING OF R READS: "REAL" "PROCEDURE" R(X); "VALUE" X; "REAL" X; R(X) IS THE COEFFICIENT OF Y IN (1); R(X) SHOULD BE NONNEGATIVE; 1SECTION : 5.2.1.2.1.2.2.1 (JANUARY 1976) PAGE 3 F: <PROCEDURE IDENTIFIER>; THE HEADING OF F READS: "REAL" "PROCEDURE" F(X); "VALUE" X; "REAL" X; F(X) IS THE RIGHT HAND SIDE OF (1); ORDER: <ARITHMETIC EXPRESSION>; ENTRY: ORDER DENOTES THE ORDER OF ACCURACY REQUIRED FOR THE APPROXIMATE SOLUTION OF (1)-(2); LET H = MAX(X[I] - X[I-1]); THEN ABS(Y[2*I-1]-Y(X[I])) <= C1 * H**ORDER, ABS(Y[2*I]-Y'(X[I]) <= C2 * H**ORDER, I = 1,...,N-1; ORDER CAN ONLY BE CHOSEN EQUAL TO 4, 6, 8; E: <ARRAY IDENTIFIER>; "ARRAY" E[1:4]; E[1], ... , E[4] DESCRIBE THE BOUNDARY CONDITIONS (2). PROCEDURES USED: CHLDECSOLBND = CP 34333 REQUIRED CENTRAL MEMORY: ONE AUXILIARY ARRAY OF 8*(N-1) REALS IS USED. RUNNING TIME: LET K = ORDER/2; THEN (A) K*N + 1 EVALUATIONS OF P(X), Q(X), R(X) AND F(X) ARE NEEDED; (B) ABOUT (ORDER-3)*50*N MULTIPLICATIONS/DIVISIONS ARE NEEDED; (C) ONE CALL OF CHLDECSOLBND IS DONE. DATA AND RESULTS: THE PROCEDURE FEM HERM SYM HAS SOME RESTRICTIONS: (I) P(X) SHOULD BE POSITIVE ON THE CLOSED INTERVAL <X[0],X[N]> AND Q(X) AND R(X) SHOULD BE NONNEGATIVE THERE; (II) P(X), Q(X), R(X) AND F(X) ARE REQUIRED TO BE SUFFICIENTLY SMOOTH ON THE INTERVAL <X[0],X[N]> EXCEPT AT THE KNOTS, WHERE DISCONTINUITIES OF THE DERIVATIVES ARE ALLOWED; IN THAT CASE THE ORDER OF ACCURACY IS PRESERVED; (III) THE USER SHOULD NOT EXPECT HIGHER ACCURACY THAN 12 DECIMALS DUE TO THE LOSS OF DIGITS DURING THE EVALUATION OF THE MATRIX AND VECTOR AND DURING THE REDUCTION TO A PENTADIAGONAL SYSTEM; THIS ACCURACY CAN BE REACHED VERY EASILY WHEN AN EIGTH ORDER METHOD IS USED 1SECTION : 5.2.1.2.1.2.2.1 (JANUARY 1976) PAGE 4 METHOD AND PERFORMANCE: PROBLEM (1)-(2) IS SOLVED BY MEANS OF GALERKIN'S METHOD WITH CONTINUOUSLY DIFFERENTIABLE PIECEWISE POLYNOMIAL FUNCTIONS (SEE [1], [2]) : THE SOLUTION IS APPROXIMATED BY A FUNCTION WHICH IS CONTINUOUSLY DIFFERENTIABLE ON THE CLOSED INTERVAL <X[0],X[N]> AND A POLYNOMIAL OF DEGREE LESS THAN OR EQUAL TO K (K = 1 + ORDER//2) ON EACH CLOSED SEGMENT <X[J-1],X[J]> (J = 1, ..., N); THIS FUNCTION IS ENTIRELY DETERMINED BY THE VALUES OF THE ZEROETH AND FIRST DERIVATIVE AT THE KNOTS X[J] AND BY THE VALUES IT HAS AT (K-3) INTERIOR KNOTS ON EACH CLOSED SEGMENT <X[J-1],X[J]>; THE VALUES OF THE FUNCTION AND ITS DERIVATIVE AT THE KNOTS ARE OBTAINED BY THE SOLUTION OF AN (ORDER + 1)-DIAGONAL LINEAR SYSTEM OF (K-1)*N - 2 UNKNOWNS; THE ENTRIES OF THE MATRIX AND THE VECTOR ARE INNER PRODUCTS WHICH ARE APPROXIMATED BY PIECEWISE K-POINT LOBATTO QUADRATURE (SEE [3]); THE EVALUATION OF THE MATRIX AND VECTOR IS PERFORMED SEGMENT BY SEGMENT; IF K > 3 THE RESULTING LINEAR SYSTEM CAN BE REDUCED TO A PENTADIAGONAL SYSTEM BY MEANS OF STATIC CONDENSATION; THIS IS POSSIBLE BECAUSE THE FUNCTION VALUES AT THE INTERIOR KNOTS ON EACH SEGMENT <X[J-1],X[J]> DO NOT DEPEND ON FUNCTION VALUES OUTSIDE THAT SEGMENT; THE FINAL PENTADIAGONAL SYSTEM, SINCE THE MATRIX IS POSITIVE DEFINITE AND SYMMETRIC, IS SOLVED BY MEANS OF CHOLESKY'S DECOMPOSITION METHOD (SEE SECTION 3.1.2.1.1.2.1.3). EXAMPLE OF USE: WE SOLVE THE BOUNDARY VALUE PROBLEM WE SOLVE THE BOUNDARY VALUE PROBLEM Y'''' - (Y'*COS(X))' + Y*EXP(X) = SIN(X)*(1 + EXP(X) + COS(X)*2), 0 < X < PI; Y(0) = Y(PI) = 0; Y'(0) = 1; Y'(PI) = -1; PI = 3.14159265358979; THE ANALYTIC SOLUTION IS Y(X) = SIN(X); WE APPROXIMATE THE SOLUTION ON A UNIFORM GRID, I.E. X[I] = I*PI/N, I = 0, ..., N; WE CHOOSE N = 5, 10 AND WE COMPUTE THE MAXIMUM DEVIATIONS FROM Y(X[I]) AND Y'(X[I]) FOR ORDER = 4, 6, 8; THE PROGRAM READS AS FOLLOWS: 1SECTION : 5.2.1.2.1.2.2.1 (JANUARY 1976) PAGE 5 "BEGIN" "INTEGER" N; "FOR" N:= 5, 10 "DO" "BEGIN" "INTEGER" I, ORDER; "REAL" PI; "ARRAY" X[0:N], Y[1:2*N-2], E[1:4]; "REAL" "PROCEDURE" P(X); "VALUE" X; "REAL" X; P:= 1; "REAL" "PROCEDURE" Q(X); "VALUE" X; "REAL" X; Q:= COS(X); "REAL" "PROCEDURE" R(X); "VALUE" X; "REAL" X; R:= EXP(X); "REAL" "PROCEDURE" F(X); "VALUE" X; "REAL" X; F:= SIN(X)*(1 + EXP(X)+ 2*COS(X)); E[1]:= E[3]:= 0; E[2]:= 1; E[4]:= - 1; PI:= 3.14159265358979; "FOR" I:= 0 "STEP" 1 "UNTIL" N "DO" X[I]:= PI*I/N; OUTPUT(61,"("//,6B"("N=")"ZD")",N); "FOR" ORDER:= 4, 6, 8 "DO" "BEGIN" "REAL" RHO1, RHO2, D1, D2; FEM HERM SYM(X, Y, N, P, Q, R, F, ORDER, E); RHO1:= RHO2:= 0; "FOR" I:= 1 "STEP" 1 "UNTIL" N - 1 "DO" "BEGIN" D1:= ABS(Y[2*I-1] - SIN(X[I])); "IF" RHO1 < D1 "THEN" RHO1:= D1; D2:= ABS(Y[2*I] - COS(X[I])); "IF" RHO2 < D2 "THEN" RHO2:= D2 "END"; OUTPUT(61,"("/,16B"("ORDER=")"D,/, 24B"("MAX ABS(Y[2*I-1]-Y(X[I])) = ")",D.3D"+ZD, /,24B"("MAX ABS(Y[2*I]-Y'(X[I])) = ")",D.3D"+ZD")", ORDER,RHO1,RHO2) "END" "END" "END" 1SECTION : 5.2.1.2.1.2.2.1 (JANUARY 1976) PAGE 6 RESULTS: N= 5 ORDER=4 MAX ABS(Y[2*I-1]-Y(X[I])) = 4.822" -4 MAX ABS(Y[2*I]-Y'(X[I])) = 4.548" -4 ORDER=6 MAX ABS(Y[2*I-1]-Y(X[I])) = 5.651" -6 MAX ABS(Y[2*I]-Y'(X[I])) = 2.035" -6 ORDER=8 MAX ABS(Y[2*I-1]-Y(X[I])) = 2.264" -8 MAX ABS(Y[2*I]-Y'(X[I])) = 1.600" -8 N=10 ORDER=4 MAX ABS(Y[2*I-1]-Y(X[I])) = 2.657" -5 MAX ABS(Y[2*I]-Y'(X[I])) = 2.870" -5 ORDER=6 MAX ABS(Y[2*I-1]-Y(X[I])) = 8.398" -8 MAX ABS(Y[2*I]-Y'(X[I])) = 3.572" -8 ORDER=8 MAX ABS(Y[2*I-1]-Y(X[I])) = 7.981"-11 MAX ABS(Y[2*I]-Y'(X[I])) = 6.796"-11 NOTICE THAT THE MAXIMUM ERROR IS DIVIDED BY 2**ORDER, WHEN THE MESH SIZE IS HALVED. 1SECTION : 5.2.1.2.1.2.2.1 (JANUARY 1976) PAGE 7 SOURCE TEXT(S): 0"CODE" 33303; "PROCEDURE" FEM HERM SYM(X, Y, N, P, Q, R, F, ORDER, E); "VALUE" N, ORDER; "INTEGER" N, ORDER; "ARRAY" X, Y, E; "REAL" "PROCEDURE" P, Q, R, F; "BEGIN" "INTEGER" L, N2, V, W; "ARRAY" A[1:8*(N - 1)], EM[2:3]; "REAL" A11, A12, A13, A14, A22, A23, A24, A33, A34, A44, YA, YB, ZA, ZB, B1, B2, B3, B4, D1, D2, E1, R1, R2, XL1, XL; "PROCEDURE" ELEMENTMATVECEVALUATION; "IF"ORDER=4"THEN" "BEGIN" "REAL" X2, H, H2, H3, P1, P2, Q1, Q2, R1, R2, F1, F2, B11, B12, B13, B14, B22, B23, B24, B33, B34, B44, S11, S12, S13, S14, S22, S23, S24, S33, S34, S44, M11, M12, M13, M14, M22, M23, M24, M33, M34, M44; "OWN" "REAL"P3, Q3, R3, F3; H:= XL - XL1; H2:= H*H; H3:= H*H2; X2:= (XL1 + XL)/2; "IF"L=1"THEN" "BEGIN"P3:= P(XL1); Q3:= Q(XL1); R3:= R(XL1); F3:= F(XL1) "END"; "COMMENT" ELEMENT BENDING MATRIX; P1:= P3; P2:= P(X2); P3:= P(XL); B11:= 6*(P1 + P3); B12:= 4*P1 + 2*P3; B13:= - B11; B14:= B11 - B12; B22:= (4*P1 + P2 + P3)/1.5; B23:= - B12; B24:= B12 - B22; B33:= B11; B34:= - B14; B44:= B14 - B24; "COMMENT" ELEMENT STIFFNESS MATRIX; Q1:= Q3; Q2:= Q(X2); Q3:= Q(XL); S11:= 1.5*Q2; S12:= Q2/4; S13:= - S11; S14:= S12; S24:= Q2/24; S22:= Q1/6 + S24; S23:= - S12; S33:= S11; S34:= - S12; S44:= S24 + Q3/6; "COMMENT" ELEMENT MASS MATRIX; R1:= R3; R2:= R(X2); R3:= R(XL); M11:= (R1 + R2)/6; M12:= R2/24; M13:= R2/6; M14:= - M12; M22:= R2/96; M23:= - M14; M24:= - M22; M33:= (R2 + R3)/6; M34:= M14; M44:= M22; "COMMENT" ELEMENT LOAD VECTOR; F1:= F3; F2:= F(X2); F3:= F(XL); B1:= H*(F1 + 2*F2)/6; B3:= H*(F3 + 2*F2)/6; B2:= H2*F2/12; B4:= - B2; "COMMENT" 1SECTION : 5.2.1.2.1.2.2.1 (JANUARY 1976) PAGE 8 ; A11:= B11/H3 + S11/H + M11*H; A12:= B12/H2 + S12 + M12*H2; A13:= B13/H3 + S13/H + M13*H; A14:= B14/H2 + S14 + M14*H2; A22:= B22/H + S22*H + M22*H3; A23:= B23/H2 + S23 + M23*H2; A24:= B24/H + S24*H + M24*H3; A34:= B34/H2 + S34 + M34*H2; A33:= B33/H3 + S33/H + M33*H; A44:= B44/H + S44*H + M44*H3 "END" "ELSE" "IF"ORDER=6"THEN" "BEGIN" "OWN" "REAL"P4, Q4, R4, F4; "REAL"H, H2, H3, X2, X3, P1, P2, P3, Q1, Q2, Q3, R1, R2, R3, F1, F2, F3, B11, B12, B13, B14, B15, B22, B23, B24, B25, B33, B34, B35, B44, B45, B55, S11, S12, S13, S14, S15, S22, S23, S24, S25, S33, S34, S35, S44, S45, S55, M11, M12, M13, M14, M15, M22, M23, M24, M25, M33, M34, M35, M44, M45, M55, A15, A25, A35, A45, A55, C1, C2, C3, C4, B5; "IF"L=1"THEN" "BEGIN"P4:= P(XL1); Q4:= Q(XL1); R4:= R(XL1); F4:= F(XL1) "END"; H:= XL - XL1; H2:= H*H; H3:= H*H2; X2:= 0.27639320225*H + XL1; X3:= XL1 + XL - X2; "COMMENT" ELEMENT BENDING MATRIX; P1:= P4; P2:= P(X2); P3:= P(X3); P4:= P(XL); B11:= + 4.0333333333333"+1*P1 + 1.1124913866738"-1*P2 + 1.4422084194664"+1*P3 + 8.3333333333333"+0*P4; B12:= + 1.4666666666667"+1*P1 - 3.3191425091659"-1*P2 + 2.7985809175818"+0*P3 + 1.6666666666667"+0*P4; B13:= + 1.8333333333333"+1*(P1+P4) + 1.2666666666667"+0*(P2+P3); B15:= - (B11 + B13); B14:= - (B12 + B13 + B15/2); B22:= + 5.3333333333333"+0*P1 + 9.9027346441674"-1*P2 + 5.4305986891624"-1*P3 + 3.3333333333333"-1*P4; B23:= + 6.6666666666667"+0*P1 - 3.7791278464167"+0*P2 + 2.4579451308295"-1*P3 + 3.6666666666667"+0*P4; B25:= - (B12 + B23); B24:= - (B22 + B23 + B25/2); B33:= + 8.3333333333333"+0*P1 + 1.4422084194666"+1*P2 + 1.1124913866726"-1*P3 + 4.0333333333333"+1*P4; B35:= - (B13 + B33); B34:= - (B23 + B33 + B35/2); B45:= - (B14 + B34); B44:= - (B24 + B34 + B45/2); B55:= - (B15 + B35); "COMMENT" 1SECTION : 5.2.1.2.1.2.2.1 (JANUARY 1976) PAGE 9 ; "COMMENT" ELEMENT STIFFNESS MATRIX; Q1:= Q4; Q2:= Q(X2); Q3:= Q(X3); Q4:= Q(XL); S11:= + 2.8844168389330"+0*Q2 + 2.2249827733448"-2*Q3; S12:= + 2.5671051872498"-1*Q2 + 3.2894812749994"-3*Q3; S13:= + 2.5333333333333"-1*(Q2+Q3); S14:= - 3.7453559925005"-2*Q2 - 2.2546440074988"-2*Q3; S15:= - (S13 + S11); S22:= + 8.3333333333333"-2*Q1 + 2.2847006554164"-2*Q2 + 4.8632677916445"-4*Q3; S23:= + 2.2546440075002"-2*Q2 + 3.7453559924873"-2*Q3; S24:= - 3.3333333333333"-3*(Q2+Q3); S25:= - (S12 + S23); S33:= + 2.2249827733471"-2*Q2 + 2.8844168389330"+0*Q3; S34:= - 3.2894812750127"-3*Q2 - 2.5671051872496"-1*Q3; S35:= - (S13 + S33); S44:= + 4.8632677916788"-4*Q2 + 2.2847006554161"-2*Q3 + 8.3333333333338"-2*Q4; S45:= - (S14 + S34); S55:= - (S15 + S35); "COMMENT" ELEMENT MASS MATRIX; R1:= R4; R2:= R(X2); R3:= R(X3); R4:= R(XL); M11:= + 8.3333333333333"-2*R1 + 1.0129076086083"-1*R2 + 7.3759058058380"-3*R3; M12:= + 1.3296181273333"-2*R2 + 1.3704853933353"-3*R3; M13:= - 2.7333333333333"-2*(R2+R3); M14:= + 5.0786893258335"-3*R2 + 3.5879773408333"-3*R3; M15:= + 1.3147987115999"-1*R2 - 3.5479871159991"-2*R3; M22:= + 1.7453559925000"-3*R2 + 2.5464400750059"-4*R3; M23:= - 3.5879773408336"-3*R2 - 5.0786893258385"-3*R3; M24:= + 6.6666666666667"-4*(R2+R3); M25:= + 1.7259029213333"-2*R2 - 6.5923625466719"-3*R3; M33:= + 7.3759058058380"-3*R2 + 1.0129076086083"-1*R3 + 8.3333333333333"-2*R4; M34:= - 1.3704853933333"-3*R2 - 1.3296181273333"-2*R3; M35:= - 3.5479871159992"-2*R2 + 1.3147987115999"-1*R3; M44:= + 2.5464400750008"-4*R2 + 1.7453559924997"-3*R3; M45:= + 6.5923625466656"-3*R2 - 1.7259029213330"-2*R3; M55:= + .17066666666667"+0*(R2+R3); "COMMENT" 1SECTION : 5.2.1.2.1.2.2.1 (JANUARY 1976) PAGE 10 ; "COMMENT" ELEMENT LOAD VECTOR; F1:= F4; F2:= F(X2); F3:= F(X3); F4:= F(XL); B1:= + 8.3333333333333"-2*F1 + 2.0543729868749"-1*F2 - 5.5437298687489"-2*F3; B2:= + 2.6967233145832"-2*F2 - 1.0300566479175"-2*F3; B3:= - 5.5437298687489"-2*F2 + 2.0543729868749"-1*F3 + 8.3333333333333"-2*F4; B4:= + 1.0300566479165"-2*F2 - 2.6967233145830"-2*F3; B5:= + 2.6666666666667"-1*(F2+F3); A11:= H2*(H2*M11 + S11) + B11; A12:= H2*(H2*M12 + S12) + B12; A13:= H2*(H2*M13 + S13) + B13; A14:= H2*(H2*M14 + S14) + B14; A15:= H2*(H2*M15 + S15) + B15; A22:= H2*(H2*M22 + S22) + B22; A23:= H2*(H2*M23 + S23) + B23; A24:= H2*(H2*M24 + S24) + B24; A25:= H2*(H2*M25 + S25) + B25; A33:= H2*(H2*M33 + S33) + B33; A34:= H2*(H2*M34 + S34) + B34; A35:= H2*(H2*M35 + S35) + B35; A44:= H2*(H2*M44 + S44) + B44; A45:= H2*(H2*M45 + S45) + B45; A55:= H2*(H2*M55 + S55) + B55; "COMMENT" STATIC CONDENSATION; C1:= A15/A55; C2:= A25/A55; C3:= A35/A55; C4:= A45/A55; B1:= (B1 - C1*B5)*H; B2:= (B2 - C2*B5)*H2; B3:= (B3 - C3*B5)*H; B4:= (B4 - C4*B5)*H2; A11:= (A11 - C1*A15)/H3; A12:= (A12 - C1*A25)/H2; A13:= (A13 - C1*A35)/H3; A14:= (A14 - C1*A45)/H2; A22:= (A22 - C2*A25)/H; A23:= (A23 - C2*A35)/H2; A24:= (A24 - C2*A45)/H; A33:= (A33 - C3*A35)/H3; A34:= (A34 - C3*A45)/H2; A44:= (A44 - C4*A45)/H; "END" "ELSE" "BEGIN" "OWN" "REAL"P5, Q5, R5, F5; "REAL" X2, X3, X4, H, H2, H3, P1, P2, P3, P4, Q1, Q2, Q3, Q4, R1, R2, R3, R4, F1, F2, F3, F4, B11, B12, B13, B14, B15, B16, B22, B23, B24, B25, B26, B33, B34, B35, B36, B44, B45, B46, B55, B56, B66, S11, S12, S13, S14, S15, S16, S22, S23, S24, S25, S26, S33, S34, S35, S36, S44, S45, S46, S55, S56, S66, M11, M12, M13, M14, M15, M16, M22, M23, M24, M25, M26, M33, M34, M35, M36, M44, M45, M46, M55, M56, M66, C15, C16, C25, C26, C35, C36, C45, C46, B5, B6, A15, A16, A25, A26, A35, A36, A45, A46, A55, A56, A66, DET; "IF"L=1"THEN" "BEGIN"P5:= P(XL1); Q5:= Q(XL1); R5:= R(XL1); F5:= F(XL1) "END"; H:= XL - XL1; H2:= H*H; H3:= H*H2; X2:= XL1 + H*.172673164646; X3:= XL1 + H/2; X4:= XL1 + XL - X2; "COMMENT" 1SECTION : 5.2.1.2.1.2.2.1 (JANUARY 1976) PAGE 11 ; "COMMENT" ELEMENT BENDING MATRIX; P1:= P5; P2:= P(X2); P3:= P(X3); P4:= P(X4); P5:= P(XL); B11:= + 105.8*P1 + 9.8*P5 + 7.3593121303513"-2*P2 + 2.2755555555556"+1*P3 + 7.0565656088553"+0*P4; B12:= + 27.6*P1 + 1.4*P5 - 3.41554824811"-1*P2 + 2.8444444444444"+0*P3 + 1.0113960946522"+0*P4; B13:= - 32.2*(P1 + P5) - 7.2063492063505"-1*(P2 + P4) + 2.2755555555556"+1*P3; B14:= + 4.6*P1 + 8.4*P5 + 1.0328641222944"-1*P2 - 2.8444444444444"+0*P3 - 3.3445562534992"+0*P4; B15:= - (B11 + B13); B16:= - (B12 + B13 + B14 + B15/2); B22:= + 7.2*P1 + 0.2*P5 + 1.5851984028581"+0*P2 + 3.5555555555556"-1*P3 + 1.4496032730059"-1*P4; B23:= - 8.4*P1 - 4.6*P5 + 3.3445562534992"+0*P2 + 2.8444444444444"+0*P3 - 1.0328641222944"-1*P4; B24:= + 1.2*(P1 + P5) - 4.7936507936508"-1*(P2 + P4) - 3.5555555555556"-1*P3; B25:= - (B12 + B23); B26:= - (B22 + B23 + B24 + B25/2); B33:= + 7.0565656088553"+0*P2 + 2.2755555555556"+1*P3 + 7.3593121303513"-2*P4 + 105.8*P5 + 9.8*P1; B34:= - 1.4*P1 - 27.6*P5 - 1.0113960946522"+0*P2 - 2.8444444444444"+0*P3 + 3.4155482481100"-1*P4; B35:= - (B13 + B33); B36:= - (B23 + B33 + B34 + B35/2); B44:= +7.2*P5 + P1/5 + 1.4496032730059"-1*P2 + 3.5555555555556"-1*P3 + 1.5851984028581"+0*P4; B45:= - (B14 + B34); B46:= - (B24 + B34 + B44 + B45/2); B55:= - (B15 + B35); B56:= - (B16 + B36); B66:= - (B26 + B36 + B46 + B56/2); "COMMENT" ELEMENT STIFFNESS MATRIX; Q1:= Q5; Q2:= Q(X2); Q3:= Q(X3); Q4:= Q(X4); Q5:= Q(XL); S11:= + 3.0242424037951"+0*Q2 + 3.1539909130065"-2*Q4; S12:= + 1.2575525581744"-1*Q2 + 4.1767169716742"-3*Q4; S13:= - 3.0884353741496"-1*(Q2+Q4); S14:= + 4.0899041243062"-2*Q2 + 1.2842455355577"-2*Q4; S15:= - (S13 + S11); S16:= + 5.9254861177068"-1*Q2 + 6.0512612719116"-2*Q4; S22:= + 5.2292052865422"-3*Q2 + 5.5310763862796"-4*Q4 + Q1/20; S23:= - 1.2842455355577"-2*Q2 - 4.0899041243062"-2*Q4; S24:= + 1.7006802721088"-3*(Q2+Q4); S25:= - (S12 + S23); S26:= + 2.4639593097426"-2*Q2 + 8.0134681270641"-3*Q4; S33:= + 3.1539909130065"-2*Q2 + 3.0242424037951"+0*Q4; S34:= - 4.1767169716742"-3*Q2 - 1.2575525581744"-1*Q4; S35:= - (S13 + S33); S36:= - 6.0512612719116"-2*Q2 - 5.9254861177068"-1*Q4; S44:= + 5.5310763862796"-4*Q2 + 5.2292052865422"-3*Q4 + Q5/20; S45:= - (S14 + S34); S46:= + 8.0134681270641"-3*Q2 + 2.4639593097426"-2*Q4; S55:= - (S15 + S35); S56:= -(S16 + S36); S66:= + 1.1609977324263"-1*(Q2+Q4) + 3.5555555555556"-1*Q3; "COMMENT" 1SECTION : 5.2.1.2.1.2.2.1 (JANUARY 1976) PAGE 12 ; "COMMENT" ELEMENT MASS MATRIX; R1:= R5; R2:= R(X2); R3:= R(X3); R4:= R(X4); R5:= R(XL); M11:= + 9.7107020727310"-2*R2 + 1.5810259199180"-3*R4 + R1/20; M12:= + 8.2354889460254"-3*R2 + 2.1932154960071"-4*R4; M13:= + 1.2390670553936"-2*(R2+R4); M14:= - 1.7188466249968"-3*R2 - 1.0508326752939"-3*R4; M15:= + 5.3089789712119"-2*R2 + 6.7741558661060"-3*R4; M16:= - 1.7377712856076"-2*R2 + 2.2173630018466"-3*R4; M22:= + 6.9843846173145"-4*R2 + 3.0424512029349"-5*R4; M23:= + 1.0508326752947"-3*R2 + 1.7188466249936"-3*R4; M24:= - 1.4577259475206"-4*(R2+R4); M25:= + 4.5024589679127"-3*R2 + 9.3971790283374"-4*R4; M26:= - 1.4737756452780"-3*R2 + 3.0759488725998"-4*R4; M33:= + 1.5810259199209"-3*R2 + 9.7107020727290"-2*R4 + R5/20; M34:= - 2.1932154960131"-4*R2 - 8.2354889460254"-3*R4; M35:= + 6.7741558661123"-3*R2 + 5.3089789712112"-2*R4; M36:= - 2.2173630018492"-3*R2 + 1.7377712856071"-2*R4; M44:= + 3.0424512029457"-5*R2 + 6.9843846173158"-4*R4; M45:= - 9.3971790283542"-4*R2 - 4.5024589679131"-3*R4; M46:= + 3.0759488726060"-4*R2 - 1.4737756452778"-3*R4; M55:= + 2.9024943310657"-2*(R2+R4) + 3.5555555555556"-1*R3; M56:= + 9.5006428402050"-3*(R4-R2); M66:= + 3.1098153547125"-3*(R2+R4); "COMMENT" ELEMENT LOAD VECTOR; F1:= F5; F2:= F(X2); F3:= F(X3); F4:= F(X4); F5:= F(XL); B1:= + 1.6258748099336"-1*F2 + 2.0745852339969"-2*F4 + F1/20; B2:= + 1.3788780589233"-2*F2 + 2.8778860774335"-3*F4; B3:= + 2.0745852339969"-2*F2 + 1.6258748099336"-1*F4 + F5/20; B4:= - 2.8778860774335"-3*F2 - 1.3788780589233"-2*F4; B5:= + (F2 + F4)/11.25 + 3.5555555555556"-1*F3; B6:= + 2.9095718698132"-2*(F4-F2); A11:= H2*(H2*M11 + S11) + B11; A12:= H2*(H2*M12 + S12) + B12; A13:= H2*(H2*M13 + S13) + B13; A14:= H2*(H2*M14 + S14) + B14; A15:= H2*(H2*M15 + S15) + B15; A16:= H2*(H2*M16 + S16) + B16; A22:= H2*(H2*M22 + S22) + B22; A23:= H2*(H2*M23 + S23) + B23; A24:= H2*(H2*M24 + S24) + B24; A25:= H2*(H2*M25 + S25) + B25; A26:= H2*(H2*M26 + S26) + B26; A33:= H2*(H2*M33 + S33) + B33; A34:= H2*(H2*M34 + S34) + B34; A35:= H2*(H2*M35 + S35) + B35; A36:= H2*(H2*M36 + S36) + B36; A44:= H2*(H2*M44 + S44) + B44; A45:= H2*(H2*M45 + S45) + B45; A46:= H2*(H2*M46 + S46) + B46; A55:= H2*(H2*M55 + S55) + B55; A56:= H2*(H2*M56 + S56) + B56; A66:= H2*(H2*M66 + S66) + B66; "COMMENT" 1SECTION : 5.2.1.2.1.2.2.1 (JANUARY 1976) PAGE 13 ; "COMMENT" STATIC CONDENSATION; DET:= - A55*A66 + A56*A56; C15:= (A15*A66 - A16*A56)/DET; C16:= (A16*A55 - A15*A56)/DET; C25:= (A25*A66 - A26*A56)/DET; C26:= (A26*A55 - A25*A56)/DET; C35:= (A35*A66 - A36*A56)/DET; C36:= (A36*A55 - A35*A56)/DET; C45:= (A45*A66 - A46*A56)/DET; C46:= (A46*A55 - A45*A56)/DET; A11:= (A11 + C15*A15 + C16*A16)/H3; A12:= (A12 + C15*A25 + C16*A26)/H2; A13:= (A13 + C15*A35 + C16*A36)/H3; A14:= (A14 + C15*A45 + C16*A46)/H2; A22:= (A22 + C25*A25 + C26*A26)/H; A23:= (A23 + C25*A35 + C26*A36)/H2; A24:= (A24 + C25*A45 + C26*A46)/H; A33:= (A33 + C35*A35 + C36*A36)/H3; A34:= (A34 + C35*A45 + C36*A46)/H2; A44:= (A44 + C45*A45 + C46*A46)/H; B1:= (B1 + C15*B5 + C16*B6)*H; B2:= (B2 + C25*B5 + C26*B6)*H2; B3:= (B3 + C35*B5 + C36*B6)*H; B4:= (B4 + C45*B5 + C46*B6)*H2; "END"EL.MATVECEVAL.; L:= 1; W:= V:= 0; N2:= N + N - 2; XL1:= X[0]; XL:= X[1]; YA:= E[1]; ZA:= E[2]; YB:= E[3]; ZB:= E[4]; ELEMENTMATVECEVALUATION; EM[2]:= "-12; R1:= B3 - A13*YA - A23*ZA; D1:= A33; D2:= A44; R2:= B4 - A14*YA - A24*ZA; E1:= A34; "FOR"L:= L + 1"WHILE"L<N"DO" "BEGIN" XL1:= XL; XL:= X[L]; ELEMENTMATVECEVALUATION; A[W + 1]:= D1 + A11; A[W + 4]:= E1 + A12; A[W + 7]:= A13; A[W + 10]:= A14; A[W + 5]:= D2 + A22; A[W + 8]:= A23; A[W + 11]:= A24; A[W + 14]:= 0; Y[V + 1]:= R1 + B1; Y[V + 2]:= R2 + B2; R1:= B3; R2:= B4; V:= V + 2; W:= W + 8; D1:= A33; D2:= A44; E1:= A34 "END"; L:= N; XL1:= XL; XL:= X[L]; ELEMENTMATVECEVALUATION; Y[N2 - 1]:= R1 + B1 - A13*YB - A14*ZB; Y[N2]:= R2 + B2 - A23*YB - A24*ZB; A[W + 1]:= D1 + A11; A[W + 4]:= E1 + A12; A[W + 5]:= D2 + A22; CHLDECSOLBND(A, N2, 3, EM, Y) "END" FEMHERM; "EOP" 1SECTION : 5.2.1.2.1.3 (DECEMBER 1979) PAGE 1 AUTHOR: M. BAKKER. INSTITUTE: MATHEMATICAL CENTRE, AMSTERDAM. RECEIVED: 791231. BRIEF DESCRIPTION: THE PROCEDURE NONLIN FEMLAGSKEW SOLVES A NONLINEAR TWO POINT BOUNDARY VALUE PROBLEM WITH SPHERICAL COORDINATES. IT SOLVES THE DIFFERENTIAL EQUATION (X**NC*Y')'/X**NC = F(X, Y, Y'), A < X < B, WITH BOUNDARY CONDITIONS E[1]*Y(A) + E[2]*Y'(A) = E[3], E[4]*Y(B) + E[5]*Y'(B) = E[6]. KEY WORDS AND PHRASES: SECOND ORDER DIFFERENTIAL EQUATIONS, TWO POINT BOUNDARY VALUE PROBLEMS, BOUNDARY VALUE PROBLEMS, RITZ-GALERKIN METHOD, SPHERICAL COORDINATES, GLOBAL METHODS. REFERENCES: [1] STRANG, G. AND G.J. FIX, AN ANALYSIS OF THE FINITE ELEMENT METHOD, PRENTICE-HALL, ENGLEWOOD CLIFFS, NEW JERSEY, 1973. [2] BAKKER, M., EDITOR, COLLOQUIUM ON DISCRETIZATION METHODS, CHAPTER 3 (DUTCH), MATHEMATISCH CENTRUM, MC-SYLLABUS 27, 1976. [3] BABUSKA, I., NUMERICAL STABILITY IN PROBLEMS OF LINEAR ALGEBRA, S.I.A.M. J. NUM. ANAL., VOL.9, P. 53-77 (1972). [4] BAKKER, M., GALERKIN METHODS IN SPHERICAL REGIONS, TO APPEAR. 1SECTION : 5.2.1.2.1.3 (DECEMBER 1979) PAGE 2 SUBSECTION: NONLIN FEM LAG SKEW. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "PROCEDURE" NONLIN FEM LAG SKEW(X, Y, N, F, FY, FZ, NC, E); "INTEGER" N, NC; "REAL" "PROCEDURE" F, FY, FZ; "ARRAY" X, Y, E; "CODE" 33314; THE MEANING OF THE FORMAL PARAMETERS IS: N: <ARITHMETIC EXPRESSION>; THE UPPER BOUND OF THE ARRAYS X AND Y; N > 1; NC: <EXPRESSION>; IF NC = 0, CARTESIAN COORDINATES ARE USED; IF NC = 1, POLAR COORDINATES ARE USED; IF NC = 2, SPHERICAL COORDINATES ARE USED; X: <ARRAY IDENTIFIER>; "ARRAY" X[0:N]; ENTRY: A = X[0] < X[1] < ... < X[N] = B IS A PARTITION OF THE SEGMENT [A,B]; Y: <ARRAY IDENTIFIER>; "ARRAY" Y[0:N]; ENTRY: Y[I] (I = 0, 1, ... , N) IS AN INITIAL APPROXIMATE SOLUTION AT X[I] OF THE DIFFERENTIAL EQUATION (3) (Y'*X**NC)'/X**NC = F(X,Y,Y') , A < X < B, WITH BOUNDARY CONDITIONS (4) E[1]*Y(A) + E[2]*Y'(A) = E[3], E[4]*Y(B) + E[5]*Y'(B) = E[6]; EXIT: Y[I] (I = 0, 1, ... , N) IS THE GALERKIN SOLUTION AT X[I] OF THE (3)-(4); F: <PROCEDURE IDENTIFIER>; THE HEADING OF F READS: "REAL" "PROCEDURE" F(X,Y,Z); "VALUE" X,Y,Z; "REAL" X,Y,Z; F(X,Y,Z) IS THE RIGHT HAND SIDE OF (3); 1SECTION : 5.2.1.2.1.3 (DECEMBER 1979) PAGE 3 FY: <PROCEDURE IDENTIFIER>; THE HEADING OF FY READS: "REAL" "PROCEDURE" FY(X,Y,Z); "VALUE" X,Y,Z; "REAL" X,Y,Z; FY(X,Y,Z) IS THE DERIVATIVE OF F WITH RESPECT TO Y; FZ: <PROCEDURE IDENTIFIER>; THE HEADING OF FZ READS: "REAL" "PROCEDURE" FZ(X,Y,Z); "VALUE" X,Y,Z; "REAL" X,Y,Z; FZ(X,Y,Z) IS THE DERIVATIVE OF F WITH RESPECT TO Z; E: <ARRAY IDENTIFIER>; "ARRAY" E[1:6]; E[1], ... , E[6] DESCRIBE THE BOUNDARY CONDITIONS (4); E[1] AND E[4] ARE NOT ALLOWED TO VANISH BOTH. PROCEDURES USED: DUPVEC CP 31030. REQUIRED CENTRAL MEMORY: FIVE AUXILIARY ARRAYS OF N REALS ARE USED. RUNNING TIME: LET IT BE THE NUMBER OF NEWTON ITERATIONS; THEN IT*N EVALUATIONS OF F, FY, FZ ARE NEEDED; DATA AND RESULTS: THE FUNCTIONS F, FY AND FZ ARE REQUIRED TO BE SUFFICIENTLY SMOOTH IN THEIR VARIABLES ON THE INTERIOR OF EVERY SEGMENT <X[I],X[I+1]> (I = 0, ..., N - 1); 1SECTION : 5.2.1.2.1.3 (DECEMBER 1979) PAGE 4 METHOD AND PERFORMANCE: LET Y[0](X) BE SOME INITIAL APPROXIMATION OF Y(X); THEN THE NONLINEAR PROBLEM IS SOLVED BY SUCCESIVELY SOLVING - (D[K]'*X**NC)'/X**NC + FY(X,Y[K](X),Y[K]'(X))*D[K](X) + FZ(X,Y[K](X),Y[K]'(X))*D[K]'(X) = (Y[K]'*X**NC)'/X**NC - F(X,Y[K],Y[K]'(X)), X[0] < X < X[N], E[1]*D[K](X[0]) + E[2]*D[K]'(X[0]) = 0; E[4]*D[K](X[N]) + E[5]*D[K]'(X[N]) = 0; WITH GALERKIN'S METHOD (SEE PREVIOUS SECTION) AND PUTTING Y[K+1](X) = Y[K](X) + D[K](X), K = 0,1,... THIS IS THE SO-CALLED NEWTON-KANTOROWITCH METHOD; EXAMPLE OF USE: WE SOLVE THE BOUNDARY VALUE PROBLEM (Y'*X**2)'/X**2 = EXP(Y)+EXP(Y')-EXP(1-X**2)-EXP(2*X)-6; 0 < X < 1, Y'(0) = Y(1) = 0; FOR THE BOUNDARY CONDITIONS THIS MEANS THAT E[2] = E[4] = 1; E[1] = E[3] = E[5] = E[6] = 0; THE ANALYTIC SOLUTION IS Y(X) = 1 - X**2; WE APPROXIMATE THE SOLUTION ON A UNIFORM GRID, I.E. X[I] = I/N, I = 0, ..., N; WE CHOOSE N=10,20 AND COMPUTE THE MAXIMUM ERROR; THE PROGRAM READS AS FOLLOWS: 1SECTION : 5.2.1.2.1.3 (DECEMBER 1979) PAGE 5 "BEGIN" "INTEGER" N, NC; "FOR" NC:= 0,1,2 "DO" "FOR" N:= 25, 50 "DO" "BEGIN" "INTEGER" I;"ARRAY" X, Y[0:N], E[1:6]; "REAL" RHO, D; "REAL" "PROCEDURE" F(X,Y,Z); "VALUE" X,Y,Z; "REAL" X,Y,Z; F:= EXP(Y)+EXP(Z)-EXP(1-X**2)-EXP(-2*X)-2-2*NC; "REAL" "PROCEDURE" FY(X,Y,Z); "VALUE" X,Y,Z; "REAL" X,Y,Z; FY:= EXP(Y); "REAL" "PROCEDURE" FZ(X,Y,Z); "VALUE" X,Y,Z; "REAL" X,Y,Z; FZ:= EXP(Z); E[2]:= E[4]:= 1; E[1]:= E[3]:= E[5]:= E[6]:= 0; "FOR" I:= 0 "STEP" 1 "UNTIL" N "DO" "BEGIN" X[I]:= I/N; Y[I]: = 0 "END"; OUTPUT(61,"("//,4B"("N = ")"ZD,4B"("NC = ")"ZD")",N,NC); NONLIN FEM LAG SKEW(X, Y, N, F, FY, FZ, NC, E); RHO:= 0; "FOR" I:= 0 "STEP" 1 "UNTIL" N "DO" "BEGIN" D:= ABS(Y[I] - 1 + X[I]**2); "IF" RHO < D "THEN" RHO:= D "END"; OUTPUT(61,"("24B"("MAX.ERROR= ")",D.DD"+ZD")",RHO) "END" "END" RESULTS: N = 25 NC = 0 MAX.ERROR= 2.47" -4 N = 50 NC = 0 MAX.ERROR= 6.19" -5 N = 25 NC = 1 MAX.ERROR= 1.41" -3 N = 50 NC = 1 MAX.ERROR= 3.99" -4 N = 25 NC = 2 MAX.ERROR= 2.44" -3 N = 50 NC = 2 MAX.ERROR= 7.02" -4 ONE OBSERVES THAT THE MAXIMUM ERROR DECREASES BY ABOUT 0.25 WHEN THE MESH SIZE IS HALVED. 1SECTION : 5.2.1.2.1.3 (DECEMBER 1979) PAGE 6 SOURCE TEXT(S): 0"CODE" 33314; "PROCEDURE" NONLIN FEM LAG SKEW(X, Y, N, F, FY, FZ, NC, E); "INTEGER" N, NC; "REAL" "PROCEDURE" F, FY, FZ; "ARRAY" X, Y, E; "BEGIN" "INTEGER" L, L1, IT; "REAL" XL1, XL, H, A12, A21, B1, B2, TAU1, TAU2, CH, TL, G, YL, PP, PLM, PRM, PL1, PL3, PL1PL2, PL1PL3, PL2PL2, PL2PL3, PR1PR2, PR1PR3, PR2PR3, PL1QL2, PL1QL3, PL2QL1, PL2QL2, PL2QL3, PL3QL1, PL3QL2, PR1QR2, PR1QR3, PR2QR1, PR2QR2, PR2QR3, PR3QR1, PR3QR2, H2RM, ZL1, ZL, E1, E2, E3, E4, E5, E6, EPS, RHO; "ARRAY" T, SUPER, SUB, CHI, GI[0:N-1], Z[0:N]; "PROCEDURE" ELEMENT MAT VEC EVALUATION 1; "BEGIN" "REAL" XM,VL,VR,WL,WR,PR,QM,RM,FM,XL12,XL1XL,XL2,ZM,ZACCM; "IF" NC = 0 "THEN" VL:= VR:= 0.5 "ELSE" "IF" NC = 1 "THEN" "BEGIN" VL:= (XL1*2 + XL)/6; VR:= (XL1 + XL*2)/6 "END" "ELSE" "BEGIN" XL12:= XL1*XL1/12; XL1XL:=XL1*XL/6; XL2:=XL*XL/12; VL:= 3*XL12 + XL1XL + XL2; VR:= 3*XL2 + XL1XL + XL12 "END"; WL:= H*VL; WR:=H*VR; PR:= VR/(VL +VR); XM:= XL1 + H*PR; ZM:= PR*ZL + (1 - PR)*ZL1; ZACCM:= (ZL - ZL1)/H ; QM:= FZ(XM,ZM,ZACCM); RM:= FY(XM, ZM, ZACCM); FM:= F(XM,ZM,ZACCM); TAU1:= WL*RM; TAU2:=WR*RM; B1:= WL*FM - ZACCM*(VL +VR); B2:= WR*FM + ZACCM*(VL + VR); A12:= - (VL + VR)/H + VL*QM + (1 - PR)*PR*RM*(WL + WR); A21:= - (VL + VR)/H - VR*QM + (1 - PR)*PR*RM*(WL + WR); "END" ELEM. M.V. EV.; "COMMENT" 1SECTION : 5.2.1.2.1.3 (DECEMBER 1979) PAGE 7 ; "PROCEDURE" BOUNDARY CONDITIONS; "IF" L=1 "AND" E2 = 0 "THEN" "BEGIN" TAU1:= 1; B1:= A12:= 0 "END" "ELSE" "IF" L=1 "AND" E2 ^= 0 "THEN" "BEGIN" TAU1:= TAU1 - E1/E2 "END" "ELSE" "IF" L=N "AND" E5 = 0 "THEN" "BEGIN" TAU2:= 1; B2:= A21:= 0 "END" "ELSE" "IF" L=N "AND" E5 ^= 0 "THEN" "BEGIN" TAU2:= TAU2 + E4/E5 "END" B.C.1; "PROCEDURE" FORWARD BABUSKA; "IF" L=1 "THEN" "BEGIN" CHI[0]:= CH:= TL:= TAU1; T[0]:= TL; GI[0]:= G:= YL:= B1; Y[0]:= YL; SUB[0]:= A21; SUPER[0]:= A12; PP:= A21/(CH - A12); CH:= TAU2 - CH*PP; G:= B2 - G*PP; TL:= TAU2; YL:= B2 "END" "ELSE" "BEGIN" CHI[L1]:= CH:= CH + TAU1; GI[L1]:= G:= G + B1; SUB[L1]:= A21; SUPER[L1]:= A12; PP:= A21/(CH - A12); CH:= TAU2 - CH*PP; G:= B2 - G*PP; T[L1]:= TL + TAU1; TL:= TAU2; Y[L1]:= YL + B1; YL:= B2 "END" FORWARD BABUSKA; "PROCEDURE" BACKWARD BABUSKA; "BEGIN"PP:= YL; Y[N]:= G/CH; G:= PP; CH:= TL; L:= N; "FOR" L:= L - 1 "WHILE" L >= 0 "DO" "BEGIN" PP:= SUPER[L]/(CH - SUB[L]); TL:= T[L]; CH:= TL - CH*PP; YL:= Y[L]; G:= YL - G*PP; Y[L]:=(GI[L] + G - YL)/(CHI[L] + CH - TL) ; "END" "END" BACKWARD BABUSKA; "COMMENT" 1SECTION : 5.2.1.2.1.3 (DECEMBER 1979) PAGE 8 ; DUPVEC(0,N,0,Z,Y); E1:= E[1]; E2:= E[2]; E3:= E[3]; E4:= E[4]; E5:= E[5]; E6:= E[6]; "FOR" IT:= 1, IT + 1 "WHILE" EPS > RHO "DO" "BEGIN" L:= 0;XL:= X[0]; ZL:= Z[0]; "FOR" L:= L + 1 "WHILE" L <= N "DO" "BEGIN" XL1:= XL; L1:= L - 1; XL:= X[L]; H:= XL - XL1; ZL1:= ZL; ZL:= Z[L]; ELEMENT MAT VEC EVALUATION 1; "IF" L=1 "OR" L=N "THEN" BOUNDARY CONDITIONS; FORWARD BABUSKA "END"; BACKWARD BABUSKA; EPS:= 0; RHO:= 1; "FOR" L:= 0 "STEP" 1 "UNTIL" N "DO" "BEGIN" RHO:= RHO + ABS(Z[L]); EPS:= EPS + ABS(Y[L]); Z[L]:= Z[L] - Y[L] "END"; RHO:= "-14*RHO "END"; DUPVEC(0,N,0,Y,Z) "END" NONLIN FEM LAG SKEW; "EOP" 1SECTION : 5.2.1.2.2.1.2 (DECEMBER 1979) PAGE 1 AUTHORS: T.M.T.COOLEN AND R.PLOEGER. INSTITUTE: MATHEMATICAL CENTRE, AMSTERDAM. RECEIVED: 740301. BRIEF DESCRIPTION: THIS SECTION CONTAINS TWO PROCEDURES : RICHARDSON SOLVES A SYSTEM OF LINEAR EQUATIONS WITH A COEFFICIENT MATRIX HAVING POSITIVE REAL EIGENVALUES BY MEANS OF A NON- STATIONARY SECOND ORDER ITERATIVE METHOD: RICHARDSON'S METHOD. SINCE RICHARDSON'S METHOD IS PARTICULARLY SUITABLE FOR SOLVING A SYSTEM OF LINEAR EQUATIONS THAT IS OBTAINED BY DISCRETIZING A TWO-DIMENSIONAL ELLIPTIC BOUNDARY VALUE PROBLEM, THE PROCEDURE RICHARDSON IS PROGRAMMED IN SUCH A WAY THAT THE SOLUTION VECTOR IS GIVEN AS A TWO-DIMENSIONAL ARRAY U[J,L], LJ<=J<=UJ, LL<=L<=UL. THE COEFFICIENT MATRIX IS NOT STORED, BUT EACH ROW CORRESPONDING TO A PAIR (J,L) IS GENERATED WHEN NEEDED. RICHARSON CAN ALSO BE USED TO DETERMINE THE EIGENVALUE OF THE COEFFICIENT MATRIX CORRESPONDING TO THE DOMINANT EIGENFUNCTION. ELIMINATION, USED IN CONNECTION WITH THE PROCEDURE RICHARDSON, (THIS SECTION) SOLVES A SYSTEM OF LINEAR EQUATIONS WITH A COEFFICIENT MATRIX HAVING POSITIVE REAL EIGENVALUES BY MEANS OF A NON-STATIONARY SECOND ORDER ITERATIVE METHOD, WHICH IS AN ACCELERATION OF RICHARDSON'S METHOD. IN GENERAL, ELIMINATION CANNOT BE USED BY ITSELF IN A SENSIBLE WAY. SINCE RICHARDSON'S METHOD AND ITS ACCELERATION ARE PARTICULARLY SUITABLE FOR SOLVING A SYSTEM OF LINEAR EQUATIONS THAT IS OBTAINED BY DISCRETIZING A TWO-DIMENSIONAL ELLIPTIC BOUNDARY VALUE PROBLEM, THE PROCEDURES RICHARDSON AND ELIMINATION ARE PROGRAMMED IN SUCH A WAY THAT THE SOLUTION VECTOR IS GIVEN AS A TWO-DIMENSIONAL ARRAY U[J,L], LJ<=J<=UJ, LL<=L<=UL. THE COEFFICIENT MATRIX IS NOT STORED, BUT EACH ROW CORRESPONDING TO A PAIR(J,L) IS GENERATED WHEN NEEDED. KEYWORDS: DIFFERENTIAL EQUATION, TWO-DIMENSIONAL BOUNDARY VALUE PROBLEM, SYSTEM OF LINEAR EQUATIONS, COEFFICIENT MATRIX HAVING POSITIVE REAL EIGENVALUES, NON-STATIONARY SECOND ORDER ITERATIVE METHOD, RICHARDSON'S METHOD. ACCELERATION OF RICHARDSON'S METHOD. 1SECTION : 5.2.1.2.2.1.2 (DECEMBER 1979) PAGE 2 SUBSECTION : RICHARDSON. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "PROCEDURE" RICHARDSON(U,LJ,UJ,LL,UL,INAP,RESIDUAL,A,B,N,DISCR,K, RATECONV,DOMEIGVAL,OUT); "VALUE" LJ,UJ,LL,UL,A,B; "INTEGER" N,K,LJ,UJ,LL,UL; "REAL" A,B,RATECONV,DOMEIGVAL; "BOOLEAN" INAP; "ARRAY" U,DISCR; "PROCEDURE" RESIDUAL, OUT; "CODE" 33170; THE MEANING OF THE FORMAL PARAMETERS IS: U: <ARRAY IDENTIFIER>; "ARRAY" U[LJ:UJ,LL:UL]; AFTER EACH ITERATION THE APPROXIMATE SOLUTION CALCULATED BY THE PROCEDURE RICHARDSON IS STORED INTO U. ENTRY: IF INAP IS CHOSEN TO BE "TRUE" THEN AN INITIAL APPROXIMATION OF THE SOLUTION, OTHERWISE ARBITRARY; EXIT: THE FINAL APPROXIMATION OF THE SOLUTION; LJ,UJ: <ARITHMETIC EXPRESSION>; LOWER AND UPPER BOUND FOR THE FIRST SUBSCRIPT OF U; LL,UL: <ARITHMETIC EXPRESSION>; LOWER AND UPPER BOUND FOR THE SECOND SUBSCRIPT OF U; INAP: <BOOLEAN EXPRESSION>; IF THE USER WISHES TO INTRODUCE AN INITIAL APPROXIMATION INAP="TRUE" SHOULD BE CHOSEN; THE CHOICE INAP="FALSE" HAS THE EFFECT THAT ALL COMPONENTS OF U ARE SET EQUAL TO 1 BEFORE THE FIRST ITERATION IS PERFORMED; RESIDUAL: <PROCEDURE IDENTIFIER>; THE HEADING OF THIS PROCEDURE READS : "PROCEDURE" RESIDUAL(U); "ARRAY" U; SUPPOSE THAT THE SYSTEM OF EQUATIONS AT HAND IS AU= F; FOR ANY ENTRY U THE PROCEDURE RESIDUAL SHOULD CALCULATE THE RESIDUAL AU - F IN EACH POINT J,L, WHERE LJ<=J<=UJ, LL<=L<=UL, AND SUBSTITUTE THESE VALUES IN THE ARRAY U; A,B: <ARITHMETIC EXPRESSION>; IF ONE WISHES TO FIND THE SOLUTION OF THE BOUNDARY VALUE PROBLEM, IN A AND B THE USER SHOULD GIVE A LOWER AND UPPER BOUND FOR THE EIGENVALUES FOR WHICH THE CORRESPONDING EIGENFUNCTIONS IN THE EIGENFUNCTION EXPANSION OF THE RESIDU AL AU - F, WITH U = THE INITIAL APPROXIMATION, SHOULD BE REDUCED; IF THE DOMINANT EIGENVALUE IS TO BE FOUND, ONE SHOULD CHOOSE A GREATER THAN THIS EIGENVALUE (SEE METHOD AND PERFORMANCE); 1SECTION : 5.2.1.2.2.1.2 (DECEMBER 1979) PAGE 3 N: <ARITHMETIC EXPRESSION>; N GIVES THE TOTAL NUMBER OF ITERATIONS TO BE PERFORMED; THE VALUE OF N SHOULD EITHER BE GIVEN, OR MADE DEPENDENT OF SOME JENSEN PARAMETER; E.G. K AND RATECONV CAN SERVE FOR THIS PURPOSE; DISCR: <ARRAY IDENTIFIER>; "ARRAY" DISCR[1:2]; AFTER EACH ITERATION THE PROCEDURE RICHARDSON DELIVERS IN DISCR[1] THE EUCLIDEAN NORM OF THE RESIDUAL, AND IN DISCR[2] THE MAXIMUM NORM OF THE RESIDUAL; K: <VARIABLE> K COUNTS THE NUMBER OF ITERATIONS RICHARDSON IS PERFORMING; IT CAN SERVE AS A JENSEN PARAMETER FOR N AND OUT; RATECONV: <VARIABLE>; AFTER EACH ITERATION THE AVERAGE RATE OF CONVERGENCE IS ASSIGNED TO RATECONV; DOMEIGVAL: <VARIABLE>; AFTER EACH ITERATION THE VALUE OF THE DOMINANT EIGENVALUE, IF PRESENT, IS ASSIGNED TO DOMEIGVAL; IF THERE IS NO DOMINANT EIGENVALUE, THE VALUE OF DOMEIGVAL IS MEANINGLESS, WHICH MANIFESTS ITSELF BY SHOWING NO CONVERGENCE TO A FIXED VALUE; OUT: <PROCEDURE IDENTIFIER>; THE HEADING OF THIS PROCEDURE, TO BE WRITTEN BY THE USER, READS : "PROCEDURE" OUT(K); "VALUE" K; "INTEGER"K; BY THIS PROCEDURE ONE HAS ACCESS TO THE FOLLOWING QUANTITIES: FOR 0<=K<=N THE K-TH ITERAND IN U,THE EUCLIDEAN AND MAXIMUM NORM OF THE K-TH RESIDUAL IN DISCR[1] AND DISCR[2], RESPECTIVELY; FOR 0<K<=N ALSO THE AVERAGE RATE OF CONVERGENCE AND THE APPROXIMATION TO THE DOMINANT EIGENVALUE, BOTH WITH RESPECT TO THE K-TH ITERAND U, IN RATECONV AND DOMEIGVAL, RESPECTIVELY; MOREOVER, OUT CAN BE USED TO LET N BE DEPENDENT ON THE ACCURACY REACHED IN APPROXIMATING THE DOMINANT EIGENVALUE. DATA AND RESULTS: SEE REF[1],[2]. PROCEDURES USED: NONE. REQUIRED CENTRAL MEMORY: APPROXIMATELY 3*(UJ - LJ + 1) * (UL - LL + 1) WORDS. 1SECTION : 5.2.1.2.2.1.2 (DECEMBER 1979) PAGE 4 LANGUAGE: ALGOL 60. METHOD AND PERFORMANCE: SUPPOSE THE SYSTEM OF EQUATIONS TO BE SOLVED READS AU = F, WHERE A IS A MATRIX HAVING POSITIVE REAL EIGENVALUES. DENOTING THE K-TH ITERATE BY U(K), U(K) BEING THE VECTOR U(K)[J,L], LJ<=J<=UJ, LL<=L<=UL, THE SO-CALLED RESIDUAL WITH RESPECT TO THE K-TH ITERATE IS DEFINED BY R(K) = AU(K) - F. A SECOND ORDER NON-STATIONARY ITERATIVE METHOD IS GIVEN BY U(K+1) = BETA K * U(K) + (1 - BETA K) * U(K-1) - OMEGA K * R(K), OR, EQUIVALENTLY, IF U IS THE (UNKNOWN) EXACT SOLUTION OF AU = F, U(K) - U = PK(A) (U(0) - U), WHERE PK DENOTES A POLYNOMIAL OF DEGREE K. RICHARDSON'S METHOD CONSISTS OF CHOOSING THIS POLYNOMIAL IN SUCH A WAY THAT AMONGST ALL POLYNOMIALS PK(X) OF DEGREE K WITH PK(0)= 1 IT HAS MINIMAL MAXIMUM NORM OVER THE INTERVAL [C,D], WHERE C > 0 SHOULD BE CHOSEN TO BE A LOWER BOUND, AND D AN UPPER BOUND FOR THE EIGENVALUES OF A. APPLICATION OF THIS POLYNOMIAL TO THE INITIAL ERROR U(0) - U HAS THE EFFECT THAT EACH COMPONENT OF THE INITIAL ERROR IN ITS EIGEN- FUNCTION EXPANSION IS REDUCED BY A FACTOR LESS OR EQUAL TO THE NORM OF THE POLYNOMIAL. THE POLYNOMIALS PK(X) = CK((A+B-2*X)/(A-B)) / CK((A+B)/(A-B)) WHERE CK(Y) DENOTES THE K-TH CHEBYSHEV POLYNOMIAL, HAVE THE DESIRED PROPERTIES. THUS, THE VALUES OF THE PARAMETERS BETA K AND OMEGA K MAY BE DETERMINED FROM THE RECURRENCE RELATIONS FOR CHEBESHEV POLYNOMIALS. IN COMPUTATION U(K) - U IS NOT AVAILABLE, SO ONE USES R(K) AS A MEASURE FOR THE ERROR. THE ELEMENTS OF THE MATRIX A ARE NOT STORED, BUT GENERATED WHEN NEEDED. MORE PRECISELY, THIS MEANS THAT THE (UJ-LJ+1) * (UL-LL+1) COMPONENTS OF AU(K) - F ARE CALCULATED FOR EACH PAIR (J,L) LJ<J<UJ, LL<L<UL. THE USER SHOULD INTRODUCE THE EQUATION TO BE SOLVED IN THIS MANNER BY MEANS OF THE PROCEDURE RESIDUAL. CLEARLY, THE METHOD IS PARTICULARLY SUITABLE FOR SPARSE MATRICES, FOR EXAMPLE MATRICES THAT ARE OBTAINED BY DISCRETIZING ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS. THE SHARPER THE BOUNDS C AND D FOR THE EIGENVALUES 0F A ARE, THE BETTER APPROXIMATE SOLUTION ONE GETS FOR A GIVEN VALUE OF K, SINCE THE ASYMPTOTIC RATE OF CONVERGENCE (K TO INFINITY) IS 2 * SQRT(C/D). NOW LET ALPHA1 BE THE SMALLEST EIGENVALUE OF A. IF ONE CHOOSES C > ALPHA1, THEN, STARTING WITH ANY INITIAL APPROXIMATION, FOR A SUFFICIENTLY LARGE NUMBER OF ITERATIONS THE PROCEDURE RICHARDSON WILL DELIVER AN APPROXIMATE VALUE FOR THIS EIGENVALUE. 1SECTION : 5.2.1.2.2.1.2 (OCTOBER 1974) PAGE 5 LET US EXPLAIN THIS FACT FOR THE CASE ALPHA1 < C < ALPHA2, WHERE ALPHA2 IS THE SECOND SMALLEST EIGENVALUE OF A. THE POLYNOMIAL PK(X) HAS SMALL MAXIMUM VALUE OVER THE INTERVAL [C,D] (WHICH, OF COURSE, DEPENDS ON K), BUT BECOMES LARGE FOR X < A. SO, IF ONE APPLIES PK(A) TO AN EIGENFUNCTION OF A, THIS EIGENFUNCTION WILL ONLY BE REDUCED CONSIDERABLY IF IT CORRESPONDS TO AN EIGENVALUE > C. CONSEQUENTLY, THE EIGENFUNCTION CORRESPONDING TO ALPHA1 WILL BECOME DOMINANT IN THE EIGENFUNCTION EXPANSION OF PK(A) (U(0) - U) FOR SUFFICIENTLY LARGE K. SEE REF[1],[2] FOR DETAILS. REFERENCES: [1].T.M.T.COOLEN, P.W.HEMKER, P.J.VAN DER HOUWEN AND E.SLAGT. ALGOL 60 PROCEDURES FOR INITIAL AND BOUNDARY VALUE PROBLEMS (DUTCH). MC-SYLLABUS 20, MATHEMATICAL CENTRE, 1973, AMSTERDAM. [2].P.J.VAN DER HOUWEN. FINITE DIFFERENCE METHODS FOR SOLVING PARTIAL DIFFERENTIAL EQUATIONS. MATHEMATICAL CENTRE TRACT NO. 20, 1968. EXAMPLE OF USE: THE APPROXIMATE SOLUTION OF THE BOUNDARY VALUE PROBLEM - ((D/DX)**2 + (D/DY)**2) U(X,Y) = -2*(X*X+Y*Y), O<X,Y<PI, U(X,0) = 0, U(X,PI) = PI*PI*X*X, 0 < X < PI, U(0,Y) = 0, U(PI,Y) = PI*PI*X*X, 0 < Y < PI, WHICH HAS THE ANALYTICAL SOLUTION X*X*Y*Y, MAY BE OBTAINED BY THE FOLLOWING PROGRAM: "BEGIN" "COMMENT" DIRICHLET PROBLEM FOR LAPLACE'S EQUATION; "PROCEDURE" RESIDUAL(U); "ARRAY" U; "BEGIN" "INTEGER" UJMIN1,ULMIN1,LJPLUS1; "REAL" U2; "REAL" "ARRAY" U1[LJ:UJ]; UJMIN1:= UJ - 1; ULMIN1 := UL - 1; LJPLUS1:= LJ + 1; "FOR" J:= LJ "STEP" 1 "UNTIL" UJ "DO" "BEGIN" U1[J]:= U[J,LL]; U[J,LL]:= 0; "END"; 1SECTION : 5.2.1.2.2.1.2 (DECEMBER 1979) PAGE 6 "FOR" L:= LL + 1 "STEP" 1 "UNTIL" ULMIN1 "DO" "BEGIN" U1[LJ]:= U[LJ,L]; U[LJ,L]:= 0; "FOR" J:= LJPLUS1"STEP" 1 "UNTIL" UJMIN1 "DO" "BEGIN" U2:= U[J,L]; U[J,L]:=(4 * U2 - U1[J-1] - U1[J] - U[J+1,L] - U[J,L+1]) - F(J*H,L*H)*H2; U1[J]:= U2 "END"; U[UJ,L]:= 0; "END"; "FOR" J:= LJ "STEP" 1 "UNTIL" UJ "DO" U[J,UL]:= 0 "END" RESIDUAL; "REAL" "PROCEDURE" F(X,Y); "VALUE" X,Y; "REAL" X,Y; F:= -2*(X*X + Y*Y); "REAL" "PROCEDURE" ANALSOL(X,Y); "VALUE" X,Y; "REAL" X,Y; ANALSOL:= X*X*Y*Y; "PROCEDURE" INITAPPR(U,J,L,G); "INTEGER" J,L; "ARRAY" U; "REAL" G; "FOR" J:= LJ "STEP" 1 "UNTIL" UJ "DO" "FOR" L:= LL "STEP" 1 "UNTIL" UL "DO" U[J,L]:= "IF" J=LJ "OR" J=UJ "OR" L=LL "OR" L=UL "THEN"G "ELSE" 1; "PROCEDURE"OUT1(K); "VALUE" K; "INTEGER" K; "IF" K = N "THEN" OUTPUT(61,"("//"(" K DISCR[1] DISCR[2] RATECONV")",//,+ZDB,3(+.7D"+ZDB)")",K,DISCR[1],DISCR[2],RATECONV); "INTEGER" J,L,LJ,UJ,LL,UL,N,K; "REAL" H,PI,D1,D2,H2,DOMEIGVAL,RATECONV,A,B; "REAL" "ARRAY" DISCR[1:2]; OUTPUT(61,"("/"("GIVE LJ,UJ,LL,UL,N,A,B")"/")"); ININTEGER(70,LJ); ININTEGER(70,UJ); ININTEGER(70,LL); ININTEGER(70,UL); ININTEGER(70,N); INREAL(70,A); INREAL(70,B); "BEGIN" "REAL" "ARRAY" U[LJ:UJ,LL:UL]; PI:=3.1415 92653 58979; H:= PI/(UJ - LJ); H2:= H * H; INITAPPR(U,J,L,ANALSOL(J*H,L*H)); RICHARDSON(U,LJ,UJ,LL,UL,"TRUE",RESIDUAL,A,B,N,DISCR,K, RATECONV ,DOMEIGVAL,OUT1); "END" "END" IT DELIVERS WITH LJ = 0, UJ = 11, LL = 0, UL = 11, N = 50, A = .163, B = 7.83 THE FOLLOWING RESULTS: K DISCR[1] DISCR[2] RATECONV +50 +.1401828" -3 +.4666866" -4 +.2921718" +0 . 1SECTION : 5.2.1.2.2.1.2 (DECEMBER 1979) PAGE 7 SUBSECTION : ELIMINATION. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "PROCEDURE" ELIMINATION(U,LJ,UJ,LL,UL,RESIDUAL,A,B,N,DISCR,K, RATECONV,DOMEIGVAL,OUT); "VALUE" LJ,UJ,LL,UL,A,B; "INTEGER" N,K,LJ,UJ,LL,UL; "REAL" A,B,RATECONV,DOMEIGVAL; "ARRAY" U,DISCR; "PROCEDURE" RESIDUAL, OUT; "CODE" 33171; THE MEANING OF THE FORMAL PARAMETERS IS: U: <ARRAY IDENTIFIER>; "ARRAY" U[LJ:UJ,LL:UL]; AFTER EACH ITERATION THE APPROXIMATE SOLUTION CALCULATED BY THE PROCEDURE ELIMINATION IS STORED INTO U; ENTRY: AN INITIAL APPROXIMATION OF THE SOLUTION, WHICH IS OBTAINED BY USE OF RICHARDSON; EXIT: THE FINAL APPROXIMATION OF THE SOLUTION; LJ,UJ: <ARITHMETIC EXPRESSION>; LOWER AND UPPER BOUND FOR THE FIRST SUBSCRIPT OF U; LL,UL: <ARITHMETIC EXPRESSION>; LOWER AND UPPER BOUND FOR THE SECOND SUBSCRIPT OF U; RESIDUAL: <PROCEDURE IDENTIFIER>; THE HEADING OF THIS PROCEDURE READS : "PROCEDURE" RESIDUAL(U); "ARRAY" U; SUPPOSE THAT THE SYSTEM OF EQUATIONS AT HAND IS AU= F; FOR ANY ENTRY U THE PROCEDURE RESIDUAL SHOULD CALCULATE THE SO-CALLED RESIDUAL AU - F IN EACH POINT J,L, WHERE LJ<=J<=UJ, LL<=L<=UL, AND SUBSTITUTE THESE VALUES IN THE ARRAY U; A,B: <ARITHMETIC EXPRESSION>; A AND B SHOULD HAVE THE SAME VALUES AS IN THE PRECEDING CALL OF RICHARDSON (SEE DESCRIPTION OF RICHARDSON); N: <VARIABLE>; THE NUMBER OF ITERATIONS THE PROCEDURE ELIMINATION NEEDS TO ELIMINATE THE EIGENFUNCTION BELONGING TO THE DOMINANT EIGENVALUE, IS ASSIGNED TO N; DISCR: <ARRAY IDENTIFIER>; "ARRAY" DISCR[1:2]; AFTER EACH ITERATION THE PROCEDURE ELIMINATION DELIVERS IN DISCR[1] THE EUCLIDEAN NORM OF THE RESIDUAL, AND IN DISCR[2] THE MAXIMUM NORM OF THE RESIDUAL; K: <VARIABLE> K COUNTS THE NUMBER OF ITERATIONS ELIMINATION IS PERFORMING IT CAN SERVE AS A JENSEN PARAMETER FOR OUT; RATECONV: <VARIABLE>; AFTER EACH ITERATION THE AVERAGE RATE OF CONVERGENCE IS ASSIGNED TO RATECONV; 1SECTION : 5.2.1.2.2.1.2 (DECEMBER 1979) PAGE 8 DOMEIGVAL: <ARITHMETIC EXPRESSION>; BEFORE A CALL OF ELIMINATION THE VALUE OF THE EIGENVALUE FOR WHICH THE CORRESPONDING EIGENFUNCTION HAS TO BE ELIMINATED, SHOULD BE ASSIGNED TO DOMEIGVAL; IF AFTER APPLICATION OF ELIMINATION THERE IS A NEW DOMINANT EIGEN- FUNCTION, THEN DOMEIGVAL WILL BE EQUAL TO THE CORRESPOND- ING EIGENVALUE; OTHERWISE, THE VALUE OF DOMEIGVAL BECOMES MEANINGLESS; OUT: <PROCEDURE IDENTIFIER>; THE HEADING OF THIS PROCEDURE, TO BE WRITTEN BY THE USER, READS : "PROCEDURE" OUT(K); "VALUE" K; "INTEGER"K; BY THIS PROCEDURE ONE HAS ACCESS TO THE FOLLOWING QUANTITIES: FOR 0<=K<=N THE K-TH ITERAND IN U,THE EUCLIDEAN AND MAXIMUM NORM OF THE K-TH RESIDUAL IN DISCR[1] AND DISCR[2], RESPECTIVELY; FOR 0<K<=N ALSO THE AVERAGE RATE OF CONVERGENCE WITH RESPECT TO THE K-TH ITERAND U, IN RATECONV; FOR K = N, POSSIBLY THE DOMINANT EIGENVALUE OF THE COEFFICIENT MATRIX OF THE EQUATION AU= F, IN DOMEIGVAL. DATA AND RESULTS: SEE REF[1],[2]. PROCEDURES USED: RICHARDSON = CP33170, TAN = CP35120, TANH = CP35113, ARCCOS = CP35122, ZEROIN = CP34150. REQUIRED CENTRAL MEMORY: APPROXIMATELY 3*(UJ - LJ + 1) * (UL - LL + 1) WORDS. 1SECTION : 5.2.1.2.2.1.2 (DECEMBER 1979) PAGE 9 METHOD AND PERFORMANCE: SEE THIS HEADING IN THE DESCRIPTION OF THE PROCEDURE RICHARDSON. SOME ADDITIONAL REMARKS WILL BE MADE HERE. IN ORDER TO USE ELIMINATION THE INITIAL APPROXIMATION OF THE SOLUTION OF AU = F IS FIRST TREATED BY MEANS OF RICHARDSON'S METHOD, WHERE C IS CHOSEN GREATER THAN THE SMALLEST EIGENVALUE. AFTER APPLICATION OF RICHARDSON, THE EIGENFUNCTION CORRESPONDING TO THIS EIGENVALUE HAS BECOME DOMINANT IN THE QUANTITY PK(A) (U(0) - U), WITH PK(X) = CK((C+D-2*X)/(C-D)) / CK((C+D)/(C-D)), WHEREAS THE CONTRIBUTION OF THE OTHER EIGENFUNCTIONS TO THE ERROR U(K) - U AND TO R(K) HAS BEEN REDUCED CONSIDERABLY. CONSEQUENTLY THE ERROR U(K) - U HAS VERY SMALL COMPONENTS IN THE SUBSPACE SPANNED BY ALL EIGENVECTORS BUT THE "FIRST", IN WHICH DIRECTION IT HAS A VERY LARGE COMPONENT. THE CONTRIBUTION OF THE "FIRST" EIGENFUNCTION TO R(K) IS NOW "ELIMINATED" BY APPLICATION OF A POLYNOMIAL OPERATOR E(A) SUCH THAT E(X) HAS A ZERO IN THE FIRST EIGENVALUE. THE POLYNOMIAL IS CHOSEN IN SUCH A WAY THAT A MAXIMAL RATE OF CON- VERGENCE WITH RESPECT TO THE INITIAL APPROXIMATION USED IN RICHARDSON IS OBTAINED. FOR DETAILS SEE REF[1],[2]. REFERENCES: [1].T.M.T.COOLEN, P.W.HEMKER, P.J.VAN DER HOUWEN AND E.SLAGT. ALGOL 60 PROCEDURES FOR INITIAL AND BOUNDARY VALUE PROBLEMS (DUTCH). MC-SYLLABUS 20, MATHEMATICAL CENTRE, 1976, AMSTERDAM. [2].P.J.VAN DER HOUWEN. FINITE DIFFERENCE METHODS FOR SOLVING PARTIAL DIFFERENTIAL EQUATIONS. MATHEMATICAL CENTRE TRACT NO. 20, 1968. EXAMPLE OF USE: THE APPROXIMATE SOLUTION OF THE BOUNDARY VALUE PROBLEM - ((D/DX)**2 + (D/DY)**2) U(X,Y) = -2*(X*X+Y*Y), O<X,Y<PI, U(X,0) = 0, U(X,PI) = PI*PI*X*X, 0 < X < PI, U(0,Y) = 0, U(PI,Y) = PI*PI*X*X, 0 < Y < PI, WHICH HAS THE ANALYTICAL SOLUTION X*X*Y*Y, MAY BE OBTAINED BY THE FOLLOWING PROGRAM: 1SECTION : 5.2.1.2.2.1.2 (OCTOBER 1974) PAGE 10 "BEGIN" "COMMENT" DIRICHLET PROBLEM FOR LAPLACE'S EQUATION; "PROCEDURE" RESIDUAL(U); "ARRAY" U; "BEGIN" "INTEGER" UJMIN1,ULMIN1,LJPLUS1; "REAL" U2; "REAL" "ARRAY" U1[LJ:UJ]; UJMIN1:= UJ - 1; ULMIN1 := UL - 1; LJPLUS1:= LJ + 1; "FOR" J:= LJ "STEP" 1 "UNTIL" UJ "DO" "BEGIN" U1[J]:= U[J,LL]; U[J,LL]:= 0; "END"; "FOR" L:= LL + 1 "STEP" 1 "UNTIL" ULMIN1 "DO" "BEGIN" U1[LJ]:= U[LJ,L]; U[LJ,L]:= 0; "FOR" J:= LJPLUS1"STEP" 1 "UNTIL" UJMIN1 "DO" "BEGIN" U2:= U[J,L]; U[J,L]:=(4 * U2 - U1[J-1] - U1[J] - U[J+1,L] - U[J,L+1]) - F(J*H,L*H)*H2; U1[J]:= U2 "END"; U[UJ,L]:= 0; "END"; "FOR" J:= LJ "STEP" 1 "UNTIL" UJ "DO" U[J,UL]:= 0 "END" RESIDUAL; "REAL" "PROCEDURE" F(X,Y); "VALUE" X,Y; "REAL" X,Y; F:= -2*(X*X + Y*Y); "REAL" "PROCEDURE" ANALSOL(X,Y); "VALUE" X,Y; "REAL" X,Y; ANALSOL:= X*X*Y*Y; "PROCEDURE" INITAPPR(U,J,L,G); "INTEGER" J,L; "ARRAY" U; "REAL" G; "FOR" J:= LJ "STEP" 1 "UNTIL" UJ "DO" "FOR" L:= LL "STEP" 1 "UNTIL" UL "DO" U[J,L]:= "IF" J=LJ "OR" J=UJ "OR" L=LL "OR" L=UL "THEN"G "ELSE" 1; "PROCEDURE"OUT3(K); "VALUE" K; "INTEGER" K; "IF" K=P "THEN" OUTPUT(61,"("//,+ZDB,3(+.7D"+ZDB)")",K,DISCR[1], DISCR[2],RATECONV); "PROCEDURE"OUT1(K); "VALUE" K; "INTEGER" K; "IF" K=N "THEN" OUTPUT(61,"("//"(" K DISCR[1] DISCR[2]")", "(" RATECONV")",//,+ZDB,3(+.7D"+ZDB)")", K,DISCR[1],DISCR[2],RATECONV); "PROCEDURE" OUT2(K); "VALUE" K; "INTEGER" K; "BEGIN" "IF" K = 0 "THEN" D1:= D2:= 1 "ELSE" "BEGIN" D2:= D1; D1:= DOMEIGVAL; N:= "IF" ABS((D1 - D2)/D2) < 10.0**(-Q) "THEN" K "ELSE" NN; OUT1(K) "END" "END" OUT2; 1SECTION : 5.2.1.2.2.1.2 (OCTOBER 1974) PAGE 11 "INTEGER" J,L,LJ,UJ,LL,UL,NN,N,P,K,Q; "REAL" H,PI,D1,D2,H2,RATECONVR,RATECONVE,DOMEIGVAL,RATECONV,A,B,VAR; "REAL" "ARRAY" DISCR[1:2]; OUTPUT(61,"("/"("GIVE LJ,UJ,LL,UL,N,Q,A,B")"/")"); ININTEGER(70,LJ); ININTEGER(70,UJ); ININTEGER(70,LL); ININTEGER(70,UL); ININTEGER(70, N); ININTEGER(70, Q); INREAL(70, A); INREAL(70, B); "BEGIN" "REAL" "ARRAY" U[LJ:UJ,LL:UL]; PI:=3.1415 92653 58979; H:= PI/(UJ - LJ); H2:= H * H; INITAPPR(U,J,L,ANALSOL(J*H,L*H)); NN:= N; RICHARDSON(U,LJ,UJ,LL,UL,"TRUE",RESIDUAL,A,B,N,DISCR,K, RATECONV ,DOMEIGVAL,OUT2); RATECONVR:= RATECONV; OUTPUT(61,"("//+.7D"+ZD4B"("DOMINANT EIGENVALUE")"")",DOMEIGVAL); ELIMINATION(U,LJ,UJ,LL,UL,RESIDUAL,A ,B,P,DISCR,K, RATECONV ,DOMEIGVAL,OUT3); RATECONVE:= RATECONV; NN:= N + P; OUTPUT(61,"("//+Z2D13B"("TOTAL NUMBER OF ITERATIONS")" ")",NN); OUTPUT(61,"("/+.7D"+ZD4B"("RATE OF CONVERGENCE WITH RESPECT TO")", /17B"("THE ZEROTH ITERAND OF RICHARDSON")"")", (N * RATECONVR + P * RATECONVE)/NN); "END" "END" IT DELIVERS WITH LJ = 0, UJ = 11, LL = 0, UL = 11, N = 50, Q = 4, A = .326, B = 7.83 THE FOLLOWING RESULTS: K DISCR[1] DISCR[2] RATECONV +45 +.4998463" -1 +.8903863" -2 +.2009943" +0 +.1620445" +0 DOMINANT EIGENVALUE +7 +.3563865" -5 +.6714375" -6 +.1360086" +1 +52 TOTAL NUMBER OF ITERATIONS +.3570259" +0 RATE OF CONVERGENCE WITH RESPECT TO THE ZEROTH ITERAND OF RICHARDSON 1SECTION : 5.2.1.2.2.1.2 (OCTOBER 1974) PAGE 12 SOURCE TEXT(S): 0"CODE"33170; "PROCEDURE" RICHARDSON(U,LJ,UJ,LL,UL,INAP,RESIDUAL,A,B,N,DISCR,K, RATECONV,DOMEIGVAL,OUT); "VALUE" LJ,UJ,LL,UL,A,B; "INTEGER" N,K,LJ,UJ,LL,UL; "REAL" A,B,RATECONV,DOMEIGVAL; "BOOLEAN" INAP; "ARRAY" U,DISCR; "PROCEDURE" RESIDUAL,OUT; "BEGIN" "INTEGER" J,L; "REAL" X,Y,Z,Y0,C,D,ALFA,OMEGA,OMEGA0, EIGMAX,EIGEUCL,EUCLRES,MAXRES,RCMAX,RCEUCL,MAXRES0,EUCLRES0; "ARRAY" V,RES[LJ:UJ,LL:UL]; "PROCEDURE" CALPAR; "COMMENT" CALPAR CALCULATES THE PARAMETERS ALFA AND OMEGA FOR EACH ITERATION; "BEGIN" ALFA:= Z/(Z - ALFA); OMEGA:= 1/(X - OMEGA * Y) "END" CALPAR; "PROCEDURE" ITERATION; "COMMENT" FIRST THE ITERATION FORMULA IS CONSTRUCTED; "BEGIN" "REAL" AUXV,AUXU,AUXRES,EUCLUV,MAXUV; EUCLUV:= EUCLRES:= MAXUV:= MAXRES:= 0; "FOR" J:= LJ "STEP" 1 "UNTIL" UJ "DO" "FOR" L:= LL "STEP" 1 "UNTIL" UL "DO" RES[J,L]:= V[J,L]; RESIDUAL(RES); "FOR" J:= LJ "STEP" 1 "UNTIL" UJ "DO" "FOR" L:= LL "STEP" 1 "UNTIL" UL "DO" "BEGIN" AUXV:= U[J,L]; AUXU:= V[J,L]; AUXRES:= RES[J,L]; AUXV:= ALFA * AUXU - OMEGA * AUXRES + (1 - ALFA) * AUXV; V[J,L]:= AUXV; U[J,L]:= AUXU; "COMMENT" THE NORMS OF THE K-TH RESIDUAL AND THE DIFFERENCE BETWEEN THE (K+1)-TH AND K-TH ITERAND ARE CALCULATED; AUXU:= ABS(AUXU - AUXV); AUXRES:= ABS(AUXRES); MAXUV:= "IF" MAXUV < AUXU "THEN" AUXU "ELSE" MAXUV; MAXRES:= "IF" MAXRES < AUXRES "THEN" AUXRES "ELSE" MAXRES; EUCLUV:= EUCLUV + AUXU * AUXU; EUCLRES:= EUCLRES + AUXRES * AUXRES; "END"; EUCLUV:= SQRT(EUCLUV); EUCLRES:= SQRT(EUCLRES); DISCR[1]:= EUCLRES; DISCR[2]:= MAXRES; "COMMENT" DOMEIGVAL IS EVALUATED; MAXUV:= MAXRES/MAXUV; EUCLUV:= EUCLRES/EUCLUV; EIGMAX:= MAXUV * (C - MAXUV)/(.25 * D - MAXUV); EIGEUCL:= EUCLUV * (C - EUCLUV)/(.25 * D - EUCLUV); DOMEIGVAL:= .5 * (EIGMAX + EIGEUCL); "COMMENT" FINALLY THE RATE OF CONVERGENCE IS CALCULATED; RCEUCL:= -LN(EUCLRES/EUCLRES0)/K; RCMAX:= -LN(MAXRES/MAXRES0)/K; RATECONV:= .5 * (RCEUCL + RCMAX) "END" ITERATION; "COMMENT" 1SECTION : 5.2.1.2.2.1.2 (OCTOBER 1974) PAGE 13 ; "COMMENT" THE CONSTANTS FOR STARTING CALPAR ARE CALCULATED; ALFA:= 2; OMEGA:= 4/(B + A); Y0:= (B + A)/(B - A); X:= .5 * (B + A); Y:= (B - A) * (B - A)/16; Z:= 4 * Y0 * Y0; "COMMENT" THE CONSTANTS NEEDED FOR DOMEIGVAL ARE CALCULATED; C:= A * B; C:= SQRT(C); D:= SQRT(A) + SQRT(B); D:= D * D; "COMMENT" THE INITIAL APPROXIMATION IS PUT INTO ARRAY U; "IF" ^INAP "THEN" "BEGIN" "FOR" J:= LJ "STEP" 1 "UNTIL" UJ "DO" "FOR" L:= LL "STEP" 1 "UNTIL" UL "DO" U[J,L]:= 1 "END"; "COMMENT" THE ZEROTH ITERATION IS NOW PERFORMED; K:= 0; "FOR" J:= LJ "STEP" 1 "UNTIL" UJ "DO" "FOR" L:= LL "STEP" 1 "UNTIL" UL "DO" RES[J,L]:= U[J,L]; RESIDUAL(RES); OMEGA0:= 2/(B+A); "BEGIN" "REAL" AUXRES0; MAXRES0:= EUCLRES0:= 0; "FOR" J:= LJ "STEP" 1 "UNTIL" UJ "DO" "FOR" L:= LL "STEP" 1 "UNTIL" UL "DO" "BEGIN" AUXRES0:= RES[J,L]; V[J,L]:= U[J,L] - OMEGA0 * AUXRES0; AUXRES0:= ABS(AUXRES0); MAXRES0:= "IF" MAXRES0 < AUXRES0 "THEN" AUXRES0 "ELSE" MAXRES0; EUCLRES0:= EUCLRES0 + AUXRES0 * AUXRES0 "END"; EUCLRES0:= SQRT(EUCLRES0) "END"; DISCR[1]:= EUCLRES0; DISCR[2]:= MAXRES0; OUT(K); "IF" K >= N "THEN" "GOTO" FINALLY; NEXT STEP: K:= K + 1; CALPAR; ITERATION; OUT(K); "IF" K < N "THEN" "GOTO" NEXT STEP; FINALLY: "END" RICHARDSON 1SECTION : 5.2.1.2.2.1.2 (OCTOBER 1974) PAGE 14 ; "EOP" "CODE"33171; "PROCEDURE" ELIMINATION(U,LJ,UJ,LL,UL,RESIDUAL,A,B,N,DISCR,K, RATECONV,DOMEIGVAL,OUT); "VALUE" LJ,UJ,LL,UL,A,B; "INTEGER" LJ,UJ,LL,UL,N,K; "REAL" A,B,RATECONV,DOMEIGVAL; "ARRAY" U,DISCR; "PROCEDURE" RESIDUAL,OUT; "BEGIN" "REAL" PI,AUXCOS,C,D; "REAL" "PROCEDURE" OPTPOL(X); "VALUE" X; "REAL" X; "BEGIN" "REAL" W,Y; W:= (B * COS(.5*PI/X) + DOMEIGVAL) / (B - DOMEIGVAL); "IF" W < -1 "THEN" W:= -1; "IF" ABS(W) <= 1 "THEN" "BEGIN" Y:= ARCCOS(W); OPTPOL:= 2 * SQRT(A/B) + TAN(X*Y) * (Y - B*PI*SIN(.5*PI/X)*.5 / (X * (B-DOMEIGVAL) * SQRT(ABS(1-W*W)))) "END" "ELSE" "BEGIN" Y:= LN(W + SQRT(ABS(W*W-1))); OPTPOL:= 2 * SQRT(A/B) - TANH(X*Y) * (Y + B*PI*SIN(.5*PI/X)* .5/(X*(B-DOMEIGVAL)*SQRT(ABS(W*W-1)))) "END" "END" OPTPOL; PI:= 3.1415 92653 58979; C:= 1; "IF" OPTPOL(C) < 0 "THEN" "BEGIN" D:= .5 * PI * SQRT(ABS(B/DOMEIGVAL)); M: D:= D + D; "IF" ZEROIN(C,D,OPTPOL(C),C*"-3) "THEN" N:= ENTIER(C+.5) "ELSE" "GOTO" M; "END" "ELSE" N:= 1; AUXCOS:= COS(.5*PI/N); RICHARDSON(U,LJ,UJ,LL,UL,"TRUE",RESIDUAL, (2*DOMEIGVAL + B*(AUXCOS-1))/(AUXCOS+1),B,N,DISCR,K,RATECONV, DOMEIGVAL,OUT) "END" ELIMINATION; "EOP" 1SECTION : 5.2.1.3.1 (FEBRUARY 1979) PAGE 1 AUTHOR : B. VAN DOMSELAAR. INSTITUTE: MATHEMATICAL CENTRE, AMSTERDAM. RECEIVED: 750601. BRIEF DESCRIPTION: PEIDE ESTIMATES UNKNOWN VARIABLES IN A SYSTEM OF FIRST ORDER DIFFERENTIAL EQUATIONS; THE UNKNOWN VARIABLES MAY APPEAR NONLINEAR BOTH IN THE DIFFERENTIAL EQUATIONS AND ITS INITIAL VALUES; A SET OF OBSERVED VALUES OF SOME COMPONENTS OF THE SOLUTION OF THE DIFFERENTIAL EQUATIONS MUST BE GIVEN; KEYWORDS: PARAMETER ESTIMATION, DIFFERENTIAL EQUATIONS, INITIAL VALUE PROBLEM, DATA FITTING. CALLING SEQUENCE: THE HEADING OF THIS PROCEDURE IS: "PROCEDURE" PEIDE(N, M, NOBS, NBP, PAR, RV, BP, JTJINV, IN, OUT, DERIV, JAC DFDY, JACDFDP, CALL YSTART, DATA, MONITOR); "VALUE" N,M,NOBS; "INTEGER" N,M,NOBS,NBP; "ARRAY" PAR,RV,JTJINV,IN,OUT; "INTEGER" "ARRAY" BP; "PROCEDURE" CALL YSTART,DATA,MONITOR; "BOOLEAN" "PROCEDURE" DERIV,JAC DFDY,JAC DFDP; "CODE" 34444; THE MEANING OF THE FORMAL PARAMETERS IS: N: <ARITHMETIC EXPRESSION>; THE NUMBER OF DIFFERENTIAL EQUATIONS; M: <ARITHMETIC EXPRESSION>; THE NUMBER OF UNKNOWN VARIABLES; NOBS: <ARITHMETIC EXPRESSION>; THE NUMBER OF OBSERVATIONS; NOBS SHOULD SATISFY NOBS>=M; NBP: <VARIABLE>; ENTRY: THE NUMBER OF BREAK-POINTS; IF NO BREAK-POINTS ARE USED THEN SET NBP=0; EXIT: WITH NORMAL TERMINATION OF THE PROCESS NBP=0; OTHERWISE, IF THE PROCESS HAS BEEN BROKEN OFF (SEE OUT[1]), THE VALUE OF NBP IS THE NUMBER OF BREAK- POINTS USED BEFORE THE PROCESS BROKE OFF; 1SECTION : 5.2.1.3.1 (OCTOBER 1975) PAGE 2 PAR: <ARRAY IDENTIFIER>; "ARRAY" PAR[1 : M+NBP]; ENTRY: PAR[1:M] SHOULD CONTAIN AN INITIAL APPROXIMATION TO THE REQUIRED PARAMETER VECTOR; EXIT: PAR[1:M] CONTAINS THE CALCULATED PARAMETER VECTOR; IF OUT[1]>0 AND NBP>0 THEN PAR[M+1:M+NBP] CONTAINS THE VALUES OF THE NEWLY INTRODUCED PARAMETERS BEFORE THE PROCESS BROKE OFF; RV: <ARRAY IDENTIFIER>; "ARRAY" RV[1 : NOBS+NBP]; EXIT: RV[1:NOBS] CONTAINS THE RESIDUAL VECTOR AT THE CALCULATED MINIMUM; IF OUT[1]>0 AND NBP>0 THEN RV[NOBS+1:NOBS+NBP] CONTAINS THE ADDITIONAL CONTINUITY REQUIREMENTS AT THE BREAK-POINTS BEFORE THE PROCESS BROKE OFF; BP: <ARRAY IDENTIFIER>; "INTEGER" "ARRAY" BP[0 : NBP]; ENTRY: BP[I], I=1,...,NBP, SHOULD CORRESPOND TO THE INDEX OF THAT TIME OF OBSERVATION WHICH WILL BE USED AS A BREAK-POINT (1<=BP[I]<=NOBS); THE BREAK-POINTS HAVE TO BE ORDERED SUCH THAT BP[I]<=BP[J] IF I<=J; EXIT: WITH NORMAL TERMINATION OF THE PROCESS BP[1:NBP] CONTAINS NO INFORMATION; OTHERWISE, IF OUT[1]>0 AND NBP>0 THEN BP[I], I=1,...,NBP, CONTAINS THE INDEX OF THAT TIME OF OBSERVATION WHICH WAS USED AS A BREAK-POINT BEFORE THE PROCESS BROKE OFF; JTJINV: <ARRAY IDENTIFIER>; "ARRAY" JTJINV[1 : M, 1 : M]; EXIT: THE INVERSE OF THE MATRIX J' * J WHERE J DENOTES THE MATRIX OF PARTIAL DERIVATIVES DRV[I] / DPAR[K] (I=1,...,NOBS ; K=1,...,M) AND J' DENOTES THE TRANSPOSE OF J; THIS MATRIX CAN BE USED IF ADDITIONAL INFORMATION ABOUT THE RESULT IS REQUIRED; E.G. STATISTICAL DATA SUCH AS THE COVARIANCE MATRIX, CORRELATION MATRIX AND CONFIDENCE INTERVALS CAN EASILY BE CALCULATED FROM JTJINV AND OUT[2]; 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]: THE RATIO: THE MINIMAL STEPLENGTH FOR THE INTEGRATION OF THE DIFFERENTIAL EQUATIONS DIVIDED BY THE DISTANCE BETWEEN TWO NEIGHBOURING OBSERVATIONS; MOSTLY, A SUITABLE VALUE IS "-4; IN[2]: THE RELATIVE LOCAL ERROR BOUND FOR THE INTEGRATION PROCESS; THIS VALUE SHOULD SATISFY IN[2]<=IN[3]; THIS PARAMETER CONTROLS THE ACCURACY OF THE NUMERICAL INTEGRATION; MOSTLY, A SUITABLE VALUE IS IN[3]/100; 1SECTION : 5.2.1.3.1 (OCTOBER 1975) PAGE 3 IN[3], IN[4]: THE RELATIVE AND THE ABSOLUTE TOLERANCE FOR THE DIFFERENCE BETWEEN THE EUCLIDEAN NORM OF THE ULTIMATE AND PENULTIMATE RESIDUAL VECTOR RESPECTIVELY; 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 IN ACCORDANCE WITH THE RELATIVE, RESP. ABSOLUTE ERRORS IN THE OBSERVATIONS; 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 TIMES THAT THE INTEGRATION OF THE DIFFERENTIAL EQUATIONS IS PERFORMED; IN[6]: A STARTING VALUE USED FOR THE RELATION BETWEEN THE GRADIENT AND THE GAUSS-NEWTON DIRECTION (SEE [1]); 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; IF OUT[1]>0 THEN THE PROCESS HAS BEEN BROKEN OFF AND THIS MAY OCCUR BECAUSE OF THE FOLLOWING REASONS: OUT[1]=1: THE NUMBER OF INTEGRATIONS PERFORMED EXCEEDED THE NUMBER GIVEN IN IN[5]; OUT[1]=2: THE DIFFERENTIAL EQUATIONS ARE VERY NONLINEAR; DURING AN INTEGRATION THE VALUE OF IN[1] WAS DECREASED BY A FACTOR 10000 AND IT IS ADVISED TO DECREASE IN[1], ALTHOUGH THIS WILL INCREASE COMPUTING TIME; OUT[1]=3: A CALL OF DERIV DELIVERED THE VALUE FALSE; OUT[1]=4: A CALL OF JAC DFDY DELIVERED THE VALUE FALSE; OUT[1]=5: A CALL OF JAC DFDP DELIVERED THE VALUE FALSE; OUT[1]=6: 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; 1SECTION : 5.2.1.3.1 (OCTOBER 1975) PAGE 4 OUT[3]: THE EUCLIDEAN NORM OF THE RESIDUAL VECTOR CALCULATED WITH THE INITIAL VALUES OF THE UNKNOWN VARIABLES; OUT[4]: THE NUMBER OF INTEGRATIONS PERFORMED, NEEDED TO OBTAIN THE CALCULATED RESULT; IF OUT[4]=1 AND OUT[1]>0 THEN THE MATRIX JTJINV CAN NOT BE USED; OUT[5]: THE MAXIMUM NUMBER OF TIMES THAT THE REQUESTED LOCAL ERROR BOUND WAS EXCEEDED IN ONE INTEGRATION; IF IT IS A LARGE NUMBER, IT MAY BE BETTER TO DECREASE THE VALUE OF IN[1]; OUT[6]: THE IMPROVEMENT OF THE EUCLIDEAN NORM OF THE RESIDUAL VECTOR IN THE LAST ITERATION STEP OF THE PROCESS OF MARQUARDT; OUT[7]: THE CONDITION NUMBER OF J' * J , I.E. THE RATIO OF ITS LARGEST TO SMALLEST EIGENVALUES; DERIV: <PROCEDURE IDENTIFIER>; THIS PROCEDURE DEFINES THE RIGHT HAND SIDE OF THE DIFFERENTIAL EQUATIONS; THE HEADING OF THIS PROCEDURE SHOULD BE: "BOOLEAN" "PROCEDURE" DERIV(PAR, Y, T, DF); "VALUE" T; "REAL" T; "ARRAY" PAR,Y,DF; ENTRY: PAR,Y,T; PAR[1:M] CONTAINS THE CURRENT VALUES OF THE UNKNOWNS AND SHOULD NOT BE ALTERED; Y[1:N] CONTAINS THE SOLUTIONS OF THE DIFFERENTIAL EQUATIONS AT TIME T AND SHOULD NOT BE ALTERED; EXIT: "ARRAY" DF[1 : N]; AN ARRAY ELEMENT DF[I] SHOULD CONTAIN THE RIGHT HAND SIDE OF THE I-TH DIFFERENTIAL EQUATION; AFTER A SUCCESSFUL CALL OF DERIV, THE BOOLEAN PROCEDURE SHOULD DELIVER THE VALUE TRUE; HOWEVER, IF DERIV DELIVERS THE VALUE FALSE, THEN THE PROCESS IS TERMINATED (SEE OUT[1]); HENCE, PROPER PROGRAMMING OF DERIV MAKES IT POSSIBLE TO AVOID CALCULATION OF THE RIGHT HAND SIDE WITH VALUES OF THE UNKNOWN VARIABLES WHICH CAUSE OVERFLOW IN THE COMPUTATION; JAC DFDY: <PROCEDURE IDENTIFIER>; THE HEADING OF THIS PROCEDURE SHOULD BE: "BOOLEAN" "PROCEDURE" JAC DFDY(PAR, Y, T, FY); "VALUE" T; "REAL" T; "ARRAY" PAR,Y,FY; ENTRY: PAR,Y,T; SEE DERIV; EXIT: "ARRAY" FY[1 : N,1 : N]; AN ARRAY ELEMENT FY[I,J] SHOULD CONTAIN THE PARTIAL DERIVATIVE OF THE RIGHT HAND SIDE OF THE I-TH DIFFERENTIAL EQUATION WITH RESPECT TO Y[J], I.E. DF[I]/DY[J]; THE BOOLEAN VALUE SHOULD BE ASSIGNED TO THIS PROCEDURE IN THE SAME WAY AS IT IS DONE FOR THE VALUE OF DERIV; JAC DFDP: <PROCEDURE IDENTIFIER>; THE HEADING OF THIS PROCEDURE SHOULD BE: "BOOLEAN" "PROCEDURE" JAC DFDP(PAR, Y, T, FP); "VALUE" T; "REAL" T; "ARRAY" PAR,Y,FP; 1SECTION : 5.2.1.3.1 (FEBRUARY 1979) PAGE 5 ENTRY: PAR,Y,T; SEE DERIV; EXIT: "ARRAY" FP[1 : N,1 : M]; AN ARRAY ELEMENT FP[I,J] SHOULD CONTAIN THE PARTIAL DERIVATIVE OF THE RIGHT HAND SIDE OF THE I-TH DIFFERENTIAL EQUATION WITH RESPECT TO PAR[J], I.E. DF[I]/DPAR[J]; THE BOOLEAN VALUE SHOULD BE ASSIGNED TO THIS PROCEDURE IN THE SAME WAY AS IT IS DONE FOR THE VALUE OF DERIV; CALL YSTART: <PROCEDURE IDENTIFIER>; THIS PROCEDURE DEFINES THE INITIAL VALUES OF THE INITIAL VALUE PROBLEM; THE HEADING OF THIS PROCEDURE SHOULD BE: "BOOLEAN" "PROCEDURE" CALL YSTART(PAR, Y, YMAX); "ARRAY" PAR,Y,YMAX; ENTRY: PAR; PAR[1:M] CONTAINS THE CURRENT VALUES OF THE UNKNOWN VARIABLES AND SHOULD NOT BE ALTERED; EXIT: Y,YMAX; Y[1:N] SHOULD CONTAIN THE INITIAL VALUES OF THE CORRESPONDING DIFFERENTIAL EQUATIONS; THE INITIAL VALUES MAY BE FUNCTIONS OF THE UNKNOWN VARIABLES PAR; IN THAT CASE, THE INITIAL VALUES OF DY/DPAR ALSO HAVE TO BE SUPPLIED; NOTE THAT DY[I]/DPAR[J] CORRESPONDS WITH Y[5*N+J*N+I] (I=1,...,N , J=1,...,M); YMAX[I], I=1,...,N, SHOULD CONTAIN A ROUGH ESTIMATE TO THE MAXIMAL ABSOLUTE VALUE OF Y[I] OVER THE INTEGRATION INTERVAL; DATA: <PROCEDURE IDENTIFIER>; THIS PROCEDURE TAKES THE DATA TO FIT INTO THE PROCEDURE PEIDE; THE HEADING OF THIS PROCEDURE SHOULD BE: "PROCEDURE" DATA(NOBS, TOBS, OBS, COBS); "VALUE" NOBS; "INTEGER" NOBS; "ARRAY" TOBS,OBS; "INTEGER" "ARRAY" COBS; ENTRY: NOBS; NOBS HAS THE SAME MEANING AS IN PEIDE; EXIT: "ARRAY" TOBS[0 : NOBS]; THE ARRAY ELEMENT TOBS[0] SHOULD CONTAIN THE TIME, CORRESPONDING TO THE INITIAL VALUES OF Y GIVEN IN THE PROCEDURE CALL YSTART; AN ARRAY ELEMENT TOBS[I], 1<=I<=NOBS, SHOULD CONTAIN THE I-TH TIME OF OBSERVATION; THE OBSERVATIONS HAVE TO BE ORDERED SUCH THAT TOBS[I]<=TOBS[J] IF I<=J; "INTEGER" "ARRAY" COBS[1:NOBS]; AN ARRAY ELEMENT COBS[I] SHOULD CONTAIN THE COMPONENT OF Y OBSERVED AT TIME TOBS[I]; NOTE THAT 1<=COBS[I]<=N; "ARRAY" OBS[1:NOBS]; AN ARRAY ELEMENT OBS[I] SHOULD CONTAIN THE OBSERVED VALUE OF THE COMPONENT COBS[I] OF Y AT THE TIME TOBS[I]; 1SECTION : 5.2.1.3.1 (FEBRUARY 1979) PAGE 6 MONITOR: <PROCEDURE IDENTIFIER>; THIS PROCEDURE CAN BE USED TO OBTAIN INFORMATION ABOUT THE COURSE OF THE ITERATION PROCESS; IF NO INTERMEDIATE RESULTS ARE DESIRED, A DUMMY PROCEDURE SATISFIES; THE HEADING OF THIS PROCEDURE SHOULD BE: "PROCEDURE" MONITOR(POST,NCOL,NROW,PAR,RV,WEIGHT,NIS); "VALUE" POST,NCOL,NROW,WEIGHT,NIS; "INTEGER" POST,NCOL,NROW,WEIGHT,NIS; "ARRAY" PAR,RV; INSIDE PEIDE, THE PROCEDURE MONITOR IS CALLED AT TWO DIFFERENT PLACES AND THIS IS DENOTED BY THE VALUE OF POST: POST=1: MONITOR IS CALLED AFTER AN INTEGRATION OF THE DIFFERENTIAL EQUATIONS; AT THIS PLACE ARE AVAILABLE: THE CURRENT VALUES OF THE UNKNOWN VARIABLES PAR[1:NCOL], WHERE NCOL=M+NBP, THE CALCULATED RESIDUAL VECTOR RV[1:NROW], WHERE NROW=NOBS+NBP, AND THE VALUE OF NIS, WHICH IS THE NUMBER OF INTEGRATION STEPS PERFORMED DURING THE SOLUTION OF THE LAST INITIAL VALUE PROBLEM; POST=2: MONITOR IS CALLED BEFORE A MINIMIZATION OF THE EUCLIDEAN NORM OF THE RESIDUAL VECTOR WITH THE PROCEDURE MARQUARDT (SEE SECTION 5.1.3.1.3) IS STARTED; AVAILABLE ARE THE CURRENT VALUES OF PAR[1:NCOL] AND THE VALUE OF THE WEIGHT, WITH WHICH THE CONTINUITY REQUIREMENTS AT THE BREAK- POINTS ARE ADDED TO THE ORIGINAL LEAST SQUARES PROBLEM. DATA AND RESULTS: SEE REF[1]. PROCEDURES USED: INIVEC = CP31010, INIMAT = CP31011, MULVEC = CP31020, MULROW = CP31021, DUPVEC = CP31030, DUPMAT = CP31035, VECVEC = CP34010, MATVEC = CP34011, ELMVEC = CP34020, SOL = CP34051, DEC = CP34300, MARQUARDT = CP34440. 1SECTION : 5.2.1.3.1 (FEBRUARY 1979) PAGE 7 REQUIRED CENTRAL MEMORY : IN THE BODY OF PEIDE (3 + NBP) * NOBS + N * (13 + N + 7 * M + 7 * NBP) ARRAY ELEMENTS ARE DECLARED. METHOD AND PERFORMANCE: PEIDE ESTIMATES UNKNOWN VARIABLES IN THE SYSTEM OF DIFFERENTIAL EQUATIONS DY/DT (T, PAR) = F (T, Y, PAR), BY USING A SET OF OBSERVED VALUES OF Y; THE UNKNOWN VARIABLES PAR ARE OBTAINED IN THE LEAST SQUARES SENSE; AN ELEMENT OF THE RESIDUAL VECTOR IS DEFINED BY THE CALCULATED VALUE OF Y MINUS ITS OBSERVED VALUE; THE EUCLIDEAN NORM OF THE RESIDUAL VECTOR IS MINIMIZED BY THE ITERATION PROCESS OF MARQUARDT; THE DIFFERENTIAL EQUATIONS ARE SOLVED BY THE INTEGRATION PROCESS OF GEAR; A MULTIPLE SHOOTING TECHNIQUE HAS BEEN IMPLEMENTED TO IMPROVE BAD STARTING VALUES OF THE UNKNOWNS; IF THIS TECHNIQUE IS USED, ONE HAS TO GIVE SOME BREAK-POINTS, I.E. TIMES OF OBSERVATIONS WHERE A NEW INITIAL VALUE PROBLEM SHOULD BE STARTED; THE NEW INITIAL VALUES OF Y BECOME EXTRA UNKNOWN VARIABLES AND THE CONTINUITY REQUIREMENTS AT THE BREAK-POINTS ARE ADDED WITH SOME WEIGHTING FACTOR TO THE LEAST SQUARES PROBLEM; FOR DETAILS SEE REF[1]. REFERENCES: [1]: B. VAN DOMSELAAR, NONLINEAR PARAMETER ESTIMATION IN INITIAL VALUE PROBLEMS, MATH. CENTRE, AMSTERDAM (TO APPEAR). EXAMPLE OF USE: THE PARAMETERS PAR[1:3] IN THE DIFFERENTIAL EQUATIONS DY[1]/DT = - (1 - Y[2]) * Y[1] + EXP(PAR[2]) * Y[2], DY[2]/DT = EXP(PAR[1]) * ((1 - Y[2]) * Y[1] - (EXP(PAR[2])+ +EXP(PAR[3])) * Y[2]), WITH 23 OBSERVATIONS OF Y[2], MAY BE OBTAINED BY THE FOLLOWING PROGRAM, THAT CONSISTS OF 1: A CODE PROCEDURE WHICH TAKES CARE OF THE OUTPUT OF THE EXAMPLE PROGRAM. IT ALSO INTERPRETS THE NUMERICAL DATA THAT CAN BE USED TO OBTAIN STATISTICAL RESULTS; 2: THE USERS PROGRAM IN WHICH THE PROBLEM EXAMPLE IS DEFINED. 1SECTION : 5.2.1.3.1 (OCTOBER 1975) PAGE 8 "CODE" 34445; "PROCEDURE" COMMUNICATION(POST,FA,N,M,NOBS,NBP,PAR,RES,BP,JTJINV, IN,OUT,WEIGHT,NIS); "VALUE" POST,FA,N,M,NOBS,NBP,WEIGHT,NIS; "INTEGER" POST,N,M,NOBS,NBP,WEIGHT,NIS; "REAL" FA; "ARRAY" PAR,RES,JTJINV,IN,OUT; "INTEGER""ARRAY" BP; "BEGIN" "INTEGER" I,J; "REAL" C; "ARRAY" CONF[1:M]; "IF" POST=5 "THEN" "BEGIN" OUTPUT(61,"("*,/,10B,"("THE FIRST RESIDUAL VECTOR")",//,16B, "("I")",4B,"("RES[I]")",/")"); "FOR" I:=1 "STEP" 1 "UNTIL" NOBS "DO" OUTPUT(61,"("15B,ZD,2B,+.4D"+ZD,/")",I,RES[I]); "END" "ELSE" "IF" POST=3 "THEN" "BEGIN" OUTPUT(61,"("*,/, "("THE EUCLIDEAN NORM OF THE RESIDUAL VECTOR:")", .7D"+ZD,2/,5B,"("CALCULATED PARAMETERS")",/")", SQRT(VECVEC(1,NOBS,0,RES,RES))); "FOR" I:=1 "STEP" 1 "UNTIL" M "DO" OUTPUT(61,"("9B,+.7D"+ZD,/")",PAR[I]); OUTPUT(61,"("/, "("NUMBER OF INTEGRATION STEPS PERFORMED: ")",ZZD,//")",NIS); "END" "ELSE" "IF" POST=4 "THEN" "BEGIN" "IF" NBP=0 "THEN" OUTPUT(61,"("*,//,5B, "("THE MINIMIZATION IS STARTED WITHOUT BREAK-POINTS")"")") "ELSE" "BEGIN" OUTPUT(61,"("*,5/,20B, "("THE MINIMIZATION IS STARTED WITH W E I G H T =")",ZD, 3/")",WEIGHT); OUTPUT(61,"("/,5B, "("THE EXTRA PARAMETERS ARE THE OBSERVATIONS:")"")"); "FOR" I:=1 "STEP" 1 "UNTIL" NBP "DO" OUTPUT(61,"("8B,ZD,2B")",BP[I]); "END"; OUTPUT(61,"("6/,10B, "("STARTING VALUES OF THE PARAMETERS")",/")"); "FOR" I:=1 "STEP" 1 "UNTIL" M "DO" OUTPUT(61,"("20B,+.7D"+ZD,/")",PAR[I]); OUTPUT(61,"("//, "("REL. TOLERANCE FOR THE EUCL. NORM OF THE RES. VECTOR:")" ,B,.7D"+ZD,/, "("ABS. TOLERANCE FOR THE EUCL. NORM OF THE RES. VECTOR:")" ,B,.7D"+ZD,/,"("RELATIVE STARTING VALUE OF LAMBDA")",19B, "(":")",B,.7D"+ZD")",IN[3],IN[4],IN[6]) "END" "ELSE" "IF" POST=1 "THEN" "BEGIN" OUTPUT(61,"("10B,"("STARTING VALUES OF THE PARAMETERS")",/")"); "FOR" I:=1 "STEP" 1 "UNTIL" M "DO" OUTPUT(61,"("20B,+.7D"+ZD,/")",PAR[I]); "COMMENT" 1SECTION : 5.2.1.3.1 (OCTOBER 1975) PAGE 9 ; OUTPUT(61,"("2/,"("NUMBER OF EQUATIONS")",3B,"(":")",ZD,/, "("NUMBER OF OBSERVATIONS:")",ZD,2/, "("MACHINE PRECISION")",30B,"(":")",+.D"+ZD,/, "("RELATIVE LOCAL ERROR BOUND FOR INTEGRATION")",5B,"(":")",+.D"+ZD,/, "("RELATIVE TOLERANCE FOR RESIDUE")",17B,"(":")",+.2D"+ZD,/, "("ABSOLUTE TOLERANCE FOR RESIDUE")",17B,"(":")",+.2D"+ZD,/, "("MAXIMUM NUMBER OF INTEGRATIONS TO PERFORM")",6B,"(":")",ZZD,/, "("RELATIVE STARTING VALUE OF LAMBDA")",14B,"(":")",+.2D"+ZD,/, "("RELATIVE MINIMAL STEPLENGTH")",20B,"(":")",+.2D"+ZD,/")", N,NOBS,IN[0],IN[2],IN[3],IN[4],IN[5],IN[6],IN[1]); "IF" NBP=0 "THEN" OUTPUT(61,"("//, "("THERE ARE NO BREAK-POINTS")"")") "ELSE" "BEGIN" OUTPUT(61,"("//, "("BREAK-POINTS ARE THE OBSERVATIONS :")"")"); "FOR" I:=1 "STEP" 1 "UNTIL" NBP "DO" OUTPUT(61,"("ZZD,B")",BP[I]) "END"; OUTPUT(61,"("//, "("THE ALPHA-POINT OF THE F-DISTIBUTION :")", ZD.DD")",FA); "END" "ELSE" "IF" POST=2 "THEN" "BEGIN" OUTPUT(61,"("*")"); "IF" OUT[1]=0 "THEN" OUTPUT(61,"("2/, "("NORMAL TERMINATION OF THE PROCESS")"")") "ELSE" "IF" OUT[1]=1 "THEN" OUTPUT(61,"("2/, "("NUMBER OF INTEGRATIONS ALLOWED WAS EXCEEDED")"")") "ELSE" "IF" OUT[1]=2 "THEN" OUTPUT(61,"("2/, "("MINIMAL STEPLENGTH WAS DECREASED FOUR TIMES")"")") "ELSE" "IF" OUT[1]=3 "THEN" OUTPUT(61,"("2/, "("A CALL OF DERIV DELIVERED FALSE")"")") "ELSE" "IF" OUT[1]=4 "THEN" OUTPUT(61,"("2/, "("A CALL OF JAC DFDY DELIVERED FALSE ")"")") "ELSE" "IF" OUT[1]=5 "THEN" OUTPUT(61,"("2/, "("A CALL OF JAC DFDP DELIVERED FALSE ")"")") "ELSE" "IF" OUT[1]=6 "THEN" OUTPUT(61,"("2/, "("PRECISION ASKED FOR MAY NOT BE ATTAINED")"")"); "IF" NBP=0 "THEN" OUTPUT(61,"("2/, "("LAST INTEGRATION WAS PERFORMED WITHOUT BREAK-POINTS")"")") "ELSE" "BEGIN" OUTPUT(61,"("2/, "("THE PROCESS STOPPED WITH BREAK-POINTS: ")"")"); "FOR" I:=1 "STEP" 1 "UNTIL" NBP "DO" OUTPUT(61,"("ZZD,B")",BP[I]) "END"; OUTPUT(61,"("4/, "("EUCL. NORM OF THE LAST RESIDUAL VECTOR :")",.7D"+ZD,/, "("EUCL. NORM OF THE FIRST RESIDUAL VECTOR:")",.7D"+ZD,/, "("NUMBER OF INTEGRATIONS PERFORMED")",7B,"(":")",ZZD,/, "("LAST IMPROVEMENT OF THE EUCLIDEAN NORM :")",.7D"+ZD,/, "("CONDITON NUMBER OF J'*J")",15B,"(":")",.7D"+ZD,/, "("LOCAL ERROR BOUND WAS EXCEEDED (MAXIM.):")",ZZD,7/")", OUT[2],OUT[3],OUT[4],OUT[6],OUT[7],OUT[5]); "COMMENT" 1SECTION : 5.2.1.3.1 (OCTOBER 1975) PAGE 10 ; "COMMENT" STATISTICS FOR THE PARAMETERS; OUTPUT(61,"("//,B,"("PARAMETERS")",12B,"("CONFIDENCE INTERVAL")", /")"); "FOR" I:=1 "STEP" 1 "UNTIL" M "DO" "BEGIN" CONF[I]:=SQRT(M*FA*JTJINV[I,I]/(NOBS-M))*OUT[2]; OUTPUT(61,"("+.7D"+ZD,12B,+.7D"+ZD,/")",PAR[I],CONF[I]); "END"; C:="IF" NOBS=M "THEN" 0 "ELSE" OUT[2]*OUT[2]/(NOBS-M); OUTPUT(61,"("5/,"("CORRELATION MATRIX")",11B,"("COVARIANCE MATRIX")", /")"); "FOR" I:=1 "STEP" 1 "UNTIL" M "DO" "BEGIN" "FOR" J:=1 "STEP" 1 "UNTIL" M "DO" "BEGIN" "IF" I=J "THEN" OUTPUT(61,"("29B")"); "IF" I>J "THEN" OUTPUT(61,"("+.7D"+ZD,B")", JTJINV[I,J]/SQRT(JTJINV[I,I]*JTJINV[J,J])) "ELSE" OUTPUT(61,"("+.7D"+ZD,B")",JTJINV[I,J]*C) "END"; OUTPUT(61,"("/")"); "END"; OUTPUT(61,"("*")"); OUTPUT(61,"("3/,10B,"("THE LAST RESIDUAL VECTOR")",//,15B, "("I")",4B,"("RES[I]")",/")"); "FOR" I:=1 "STEP" 1 "UNTIL" NOBS "DO" OUTPUT(61,"("14B,ZD,2B,+.4D"+ZD,/")",I,RES[I]) "END" "END" COMMUNICATION; "EOP" THE USER PROGRAM READS: "BEGIN" "INTEGER" I,M,N,NOBS,NBP; "REAL" TIME,FA; "ARRAY" PAR[1:6],RES[1:26],JTJINV[1:3,1:3],IN[0:6],OUT[1:7]; "INTEGER" "ARRAY" BP[0:3]; "PROCEDURE" COMMUNICATION(POST,FA,N,M,NOBS,NBP,PAR,RES,BP,JTJINV, IN,OUT,WEIGHT,NIS); "VALUE" POST,FA,N,M,NOBS,NBP,WEIGHT,NIS; "INTEGER" POST,N,M,NOBS,NBP,WEIGHT,NIS; "REAL" FA; "ARRAY" PAR,RES,JTJINV,IN,OUT; "INTEGER""ARRAY" BP; "CODE" 34445; "BOOLEAN" "PROCEDURE" JAC DFDP(PAR,Y,X,FP); "REAL" X; "ARRAY" PAR,Y,FP; "BEGIN" "REAL" Y2; Y2:=Y[2]; FP[1,1]:=FP[1,3]:=0; FP[1,2]:=Y2*EXP(PAR[2]); FP[2,1]:=EXP(PAR[1])*(Y[1]*(1-Y2)-(EXP(PAR[2])+EXP(PAR[3]))*Y2); FP[2,2]:=-EXP(PAR[1]+PAR[2])*Y2; FP[2,3]:=-EXP(PAR[1]+PAR[3])*Y2; JAC DFDP:="TRUE" "END" JAC DFDP 1SECTION : 5.2.1.3.1 (OCTOBER 1975) PAGE 11 ; "PROCEDURE" DATA(NOBS,TOBS,OBS,COBS); "VALUE" NOBS; "INTEGER" NOBS; "ARRAY" TOBS,OBS; "INTEGER" "ARRAY" COBS; "BEGIN" "INTEGER" I; TOBS[0]:=0; OUTPUT(61,"("*,4/,4B,"("THE OBSERVATIONS WERE:")", //,B,"("I")",3B,"("TOBS[I]")",3B,"("COBS[I]")",3B, "("OBS[I]")",/")"); "FOR" I:=1 "STEP" 1 "UNTIL" NOBS "DO" "BEGIN" INREAL(70, TOBS[I]); ININTEGER(70, COBS[I]); INREAL(70, OBS[I]); OUTPUT(61,"("ZD,3B,ZD.4D,6B,D,6B,.4D,/")",I,TOBS[I],COBS[I], OBS[I]) "END" "END" DATA; "PROCEDURE" CALL YSTART(PAR,Y,YMAX); "ARRAY" PAR,Y,YMAX; "BEGIN" Y[1]:=YMAX[1]:=YMAX[2]:=1; Y[2]:=0 "END" CALL YSTART; "BOOLEAN" "PROCEDURE" DERIV(PAR,Y,X,DF); "REAL" X; "ARRAY" PAR,Y,DF; "BEGIN" "REAL" Y2; Y2:=Y[2]; DF[1]:=-(1-Y2)*Y[1]+EXP(PAR[2])*Y2; DF[2]:=EXP(PAR[1])*((1-Y2)*Y[1]-(EXP(PAR[2])+EXP(PAR[3]))*Y2); DERIV:="TRUE" "END" DERIV; "BOOLEAN" "PROCEDURE" JAC DFDY(PAR,Y,X,FY); "REAL" X; "ARRAY" PAR,Y,FY; "BEGIN" FY[1,1]:=-1+Y[2]; FY[1,2]:=EXP(PAR[2])+Y[1]; FY[2,1]:=EXP(PAR[1])*(1-Y[2]); FY[2,2]:=-EXP(PAR[1])*(EXP(PAR[2])+EXP(PAR[3])+Y[1]); JAC DFDY:="TRUE" "END" JAC DFDY; "PROCEDURE" MONITOR(POST,NCOL,NROW,PAR,RES,WEIGHT,NIS); "VALUE" POST,NCOL,NROW,WEIGHT,NIS; "INTEGER" POST,NCOL,NROW,WEIGHT,NIS; "ARRAY" PAR,RES;; OUTPUT(61,"("2/,30B,"("E S C E P - PROBLEM")",3/")"); M:= 3; N:=2; NOBS:=23; NBP:=3; PAR[1]:=LN(1600); PAR[2]:=LN(.8); PAR[3]:=LN(1.2); IN[0]:="-14; IN[3]:="-4; IN[4]:="-4; IN[5]:=50; IN[6]:="-2; IN[1]:="-4; IN[2]:="-5; BP[1]:=17; BP[2]:=19; BP[3]:=21; "COMMENT" 1SECTION : 5.2.1.3.1 (OCTOBER 1975) PAGE 12 ; FA:=4.94; "COMMENT" FA DENOTES THE ALPHA-POINT OF THE FISHER-DISTRIBUTION; COMMUNICATION(1,FA,N,M,NOBS,NBP,PAR,RES,BP,JTJINV,IN,OUT,0,0); TIME:=CLOCK; PEIDE(N,M,NOBS,NBP,PAR,RES,BP,JTJINV,IN,OUT,DERIV,JAC DFDY,JAC DFDP, CALL YSTART,DATA,MONITOR); TIME:=CLOCK-TIME; COMMUNICATION(2,FA,N,M,NOBS,NBP,PAR,RES,BP,JTJINV,IN,OUT,0,0); OUTPUT(61,"("3/,5B, "("THE CALCULATION IN PEIDE CONSUMED")",B,ZZD.DD,2B, "("SECONDS")",*")",TIME) "END" THIS PROGRAM DELIVERS: E S C E P - PROBLEM STARTING VALUES OF THE PARAMETERS +.7377759" +1 -.2231436" +0 +.1823216" +0 NUMBER OF EQUATIONS : 2 NUMBER OF OBSERVATIONS:23 MACHINE PRECISION :+.1"-13 RELATIVE LOCAL ERROR BOUND FOR INTEGRATION :+.1" -4 RELATIVE TOLERANCE FOR RESIDUE :+.10" -3 ABSOLUTE TOLERANCE FOR RESIDUE :+.10" -3 MAXIMUM NUMBER OF INTEGRATIONS TO PERFORM : 50 RELATIVE STARTING VALUE OF LAMBDA :+.10" -1 RELATIVE MINIMAL STEPLENGTH :+.10" -3 BREAK-POINTS ARE THE OBSERVATIONS : 17 19 21 THE ALPHA-POINT OF THE F-DISTIBUTION : 4.94 THE OBSERVATIONS WERE: 1SECTION : 5.2.1.3.1 (OCTOBER 1975) PAGE 13 I TOBS[I] COBS[I] OBS[I] 1 0.0002 2 .1648 2 0.0004 2 .2753 3 0.0006 2 .3493 4 0.0008 2 .3990 5 0.0010 2 .4322 6 0.0012 2 .4545 7 0.0014 2 .4695 8 0.0016 2 .4795 9 0.0018 2 .4862 10 0.0020 2 .4907 11 0.0200 2 .4999 12 0.0400 2 .4998 13 0.0600 2 .4998 14 0.0800 2 .4998 15 0.1000 2 .4998 16 1.0000 2 .4986 17 2.0000 2 .4973 18 5.0000 2 .4936 19 10.0000 2 .4872 20 15.0000 2 .4808 21 20.0000 2 .4743 22 25.0000 2 .4677 23 30.0000 2 .4610 NORMAL TERMINATION OF THE PROCESS LAST INTEGRATION WAS PERFORMED WITHOUT BREAK-POINTS EUCL. NORM OF THE LAST RESIDUAL VECTOR :.1430776" -3 EUCL. NORM OF THE FIRST RESIDUAL VECTOR:.1331071" +1 NUMBER OF INTEGRATIONS PERFORMED : 12 LAST IMPROVEMENT OF THE EUCLIDEAN NORM :.2223694" -4 CONDITON NUMBER OF J'*J :.2582882" +3 LOCAL ERROR BOUND WAS EXCEEDED (MAXIM.): 37 1SECTION : 5.2.1.3.1 (OCTOBER 1975) PAGE 14 PARAMETERS CONFIDENCE INTERVAL +.6907670" +1 +.3209313" -3 -.1003941" -1 +.1687774" -3 -.4605292" +1 +.1942501" -2 CORRELATION MATRIX COVARIANCE MATRIX +.6949857" -8 +.1407628" -8 -.9129848" -8 +.3851320" +0 +.1922119" -8 -.1414245" -7 -.2170393" +0 -.6392889" +0 +.2546094" -6 THE LAST RESIDUAL VECTOR I RES[I] 1 +.1748" -5 2 -.2905" -4 3 +.2814" -4 4 -.3879" -4 5 +.3069" -4 6 +.3101" -4 7 -.2019" -4 8 -.3887" -5 9 +.1052" -4 10 +.1391" -4 11 -.5109" -4 12 +.2384" -4 13 -.1156" -5 14 -.2616" -4 15 -.5116" -4 16 +.2244" -4 17 +.6794" -4 18 -.1418" -4 19 +.2087" -4 20 -.1980" -4 21 -.3476" -4 22 -.2245" -4 23 +.1886" -4 THE CALCULATION IN PEIDE CONSUMED 108.57 SECONDS 1SECTION : 5.2.1.3.1 (OCTOBER 1975) PAGE 15 SOURCE TEXT(S): 0"CODE" 34444; "PROCEDURE" PEIDE(N,M,NOBS,NBP,PAR,RES,BP,JTJINV,IN,OUT,DERIV,JAC DFDY, JAC DFDP, CALL YSTART,DATA,MONITOR); "VALUE" N,M,NOBS; "INTEGER" N,M,NOBS,NBP; "ARRAY" PAR,RES,JTJINV,IN,OUT; "INTEGER" "ARRAY" BP; "PROCEDURE" CALL YSTART,DATA,MONITOR; "BOOLEAN" "PROCEDURE" DERIV,JAC DFDY,JACDFDP; "BEGIN" "INTEGER" I,J,EXTRA,WEIGHT,NCOL,NROW,AWAY,NPAR,II,JJ,MAX, NFE,NIS; "REAL" EPS,EPS1,XEND,C,X,T,HMIN,HMAX,RES1,IN3,IN4,FAC3,FAC4; "ARRAY" AUX[1:3],OBS[1:NOBS],SAVE[-38:6*N],TOBS[0:NOBS], YP[1:NBP+NOBS,1:NBP+M],YMAX[1:N],Y[1:6*N*(NBP+M+1)],FY[1:N,1:N], FP[1:N,1:M+NBP]; "INTEGER" "ARRAY" COBS[1:NOBS]; "BOOLEAN" FIRST,SEC,CLEAN; "REAL" "PROCEDURE" INTERPOL(STARTINDEX,JUMP,K,TOBSDIF); "VALUE" STARTINDEX,JUMP,K,TOBSDIF; "INTEGER" STARTINDEX,JUMP,K; "REAL" TOBSDIF; "BEGIN" "INTEGER" I; "REAL" S,R; S:=Y[STARTINDEX]; R:=TOBSDIF; "FOR" I:=1 "STEP" 1 "UNTIL" K "DO" "BEGIN" STARTINDEX:=STARTINDEX+JUMP; S:=S+Y[STARTINDEX]*R; R:=R*TOBSDIF "END"; INTERPOL:=S "END" INTERPOL; "PROCEDURE" JAC DYDP(NROW,NCOL,PAR,RES,JAC,LOCFUNCT); "VALUE" NROW,NCOL; "INTEGER" NROW,NCOL; "ARRAY" PAR,RES,JAC; "PROCEDURE" LOCFUNCT; "BEGIN" DUPMAT(1,NROW,1,NCOL,JAC,YP) "END" JACOBIAN 1SECTION : 5.2.1.3.1 (OCTOBER 1975) PAGE 16 ; "BOOLEAN" "PROCEDURE" FUNCT(NROW,NCOL,PAR,RES); "VALUE" NROW,NCOL; "INTEGER" NROW,NCOL; "ARRAY" PAR,RES; "BEGIN" "INTEGER" L,K,KNEW,FAILS,SAME,KPOLD,N6,NNPAR,J5N, COBSII; "REAL" XOLD,HOLD,A0,TOLUP,TOL,TOLDWN,TOLCONV,H,CH,CHNEW, ERROR,DFI,TOBSDIF; "BOOLEAN" EVALUATE,EVALUATED,DECOMPOSE,CONV; "ARRAY" A[0:5],DELTA,LAST DELTA,DF,Y0[1:N],JACOB[1:N,1:N]; "INTEGER" "ARRAY" P[1:N]; "REAL" "PROCEDURE" NORM2(AI); "REAL" AI; "BEGIN" "REAL" S,A; S:= "-100; "FOR" I:= 1 "STEP" 1 "UNTIL" N "DO" "BEGIN" A:= AI/YMAX[I]; S:= S + A * A "END"; NORM2:= S "END" NORM2; "PROCEDURE" RESET; "BEGIN" "IF" CH < HMIN/HOLD "THEN" CH:= HMIN/HOLD "ELSE" "IF" CH > HMAX/HOLD "THEN" CH:= HMAX/HOLD; X:= XOLD; H:= HOLD * CH; C:= 1; "FOR" J:= 0 "STEP" N "UNTIL" K*N "DO" "BEGIN" "FOR" I:= 1 "STEP" 1 "UNTIL" N "DO" Y[J+I]:= SAVE[J+I] * C; C:= C * CH "END"; DECOMPOSE:="TRUE" "END" RESET; "PROCEDURE" ORDER; "BEGIN" C:= EPS * EPS; J:= (K-1) * (K + 8)/2 - 38; "FOR" I:= 0 "STEP" 1 "UNTIL" K "DO" A[I]:= SAVE[I+J]; J:= J + K + 1; TOLUP := C * SAVE[J]; TOL := C * SAVE[J + 1]; TOLDWN := C * SAVE[J + 2]; TOLCONV:= EPS/(2 * N * (K + 2)); A0:= A[0]; DECOMPOSE:= "TRUE"; "END" ORDER; "PROCEDURE" EVALUATE JACOBIAN; "BEGIN" EVALUATE:= "FALSE"; DECOMPOSE:= EVALUATED:= "TRUE"; "IF" "NOT" JAC DFDY(PAR,Y,X,FY) "THEN" "BEGIN" SAVE[-3]:=4; "GOTO" RETURN "END"; "END" EVALUATE JACOBIAN 1SECTION : 5.2.1.3.1 (OCTOBER 1975) PAGE 17 ; "PROCEDURE" DECOMPOSE JACOBIAN; "BEGIN" DECOMPOSE:= "FALSE"; C:= -A0 * H; "FOR" J:= 1 "STEP" 1 "UNTIL" N "DO" "BEGIN" "FOR" I:= 1 "STEP" 1 "UNTIL" N "DO" JACOB[I,J]:= FY[I,J] * C; JACOB[J,J]:= JACOB[J,J] + 1 "END"; DEC(JACOB,N,AUX,P) "END" DECOMPOSE JACOBIAN; "PROCEDURE" CALCULATE STEP AND ORDER; "BEGIN" "REAL" A1,A2,A3; A1:= "IF" K <= 1 "THEN" 0 "ELSE" 0.75 * (TOLDWN/NORM2(Y[K*N+I])) ** (0.5/K); A2:= 0.80 * (TOL/ERROR) ** (0.5/(K + 1)); A3:= "IF" K >= 5 "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" SEC "THEN" "BEGIN" SEC:="FALSE"; "GOTO" RETURN "END"; NPAR:=M; EXTRA:=NIS:=0; II:=1; JJ:="IF" NBP=0 "THEN" 0 "ELSE" 1; N6:=N*6; INIVEC(-3,-1,SAVE,0); INIVEC(N6+1,(6+M)*N,Y,0); INIMAT(1,NOBS+NBP,1,M+NBP,YP,0); T:=TOBS[1]; X:=TOBS[0]; CALL YSTART(PAR,Y,YMAX); HMAX:=TOBS[1]-TOBS[0]; HMIN:=HMAX*IN[1]; EVALUATE JACOBIAN; NNPAR:=N*NPAR; NEW START: K:= 1; KPOLD:=0; SAME:= 2; ORDER; "IF" "NOT" DERIV(PAR,Y,X,DF) "THEN" "BEGIN" SAVE[-3]:=3; "GOTO" RETURN "END"; H:=SQRT(2 * EPS/SQRT(NORM2 (MATVEC(1,N,I,FY,DF)))); "IF" H > HMAX "THEN" H:= HMAX "ELSE" "IF" H < HMIN "THEN" H:= HMIN; XOLD:= X; HOLD:= H; CH:= 1; "FOR" I:= 1 "STEP" 1 "UNTIL" N "DO" "BEGIN" SAVE[I]:=Y[I]; SAVE[N+I]:=Y[N+I]:=DF[I]*H "END"; FAILS:= 0; "COMMENT" 1SECTION : 5.2.1.3.1 (OCTOBER 1975) PAGE 18 ; "FOR" L:= 0 "WHILE" X < XEND "DO" "BEGIN" "IF" X + H <= XEND "THEN" X:= X + H "ELSE" "BEGIN" H:= XEND-X; X:= XEND; CH:= H/HOLD; C:= 1; "FOR" J:= N "STEP" N "UNTIL" K*N "DO" "BEGIN" C:= C* CH; "FOR" I:= J+1 "STEP" 1 "UNTIL" J+N "DO" Y[I]:= Y[I] * C "END"; SAME:= "IF" SAME<3 "THEN" 3 "ELSE" SAME+1; "END"; "COMMENT" PREDICTION; "FOR" L:= 1 "STEP" 1 "UNTIL" N "DO" "BEGIN" "FOR" I:= L "STEP" N "UNTIL" (K-1)*N+L "DO" "FOR" J:= (K-1)*N+L "STEP" -N "UNTIL" I "DO" Y[J]:= Y[J] + Y[J+N]; DELTA[L]:= 0 "END"; EVALUATED:= "FALSE"; "COMMENT" CORRECTION AND ESTIMATION LOCAL ERROR; "FOR" L:= 1,2,3 "DO" "BEGIN" "IF" "NOT" DERIV(PAR,Y,X,DF) "THEN" "BEGIN" SAVE[-3]:=3; "GOTO" RETURN "END"; "FOR" I:= 1 "STEP" 1 "UNTIL" N "DO" DF[I]:= DF[I] * H - Y[N+I]; "IF" EVALUATE "THEN" EVALUATE JACOBIAN; "IF" DECOMPOSE "THEN" DECOMPOSE JACOBIAN; SOL(JACOB,N,P,DF); CONV:= "TRUE"; "FOR" I:= 1 "STEP" 1 "UNTIL" N "DO" "BEGIN" DFI:= DF[I]; Y[ I]:= Y[ I] + A0 * DFI; Y[N+I]:= Y[N+I] + DFI; DELTA[I]:= DELTA[I] + DFI; CONV:= CONV "AND" ABS(DFI) < TOLCONV * YMAX[I] "END"; "IF" CONV "THEN" "BEGIN" ERROR:= NORM2(DELTA[I]); "GOTO" CONVERGENCE "END" "END"; "COMMENT" ACCEPTANCE OR REJECTION; "IF" "NOT" CONV "THEN" "BEGIN" "IF" "NOT" EVALUATED "THEN" EVALUATE:= "TRUE" "ELSE" "BEGIN" CH:=CH/4; "IF" H<4*HMIN "THEN" "BEGIN" SAVE[-1]:= SAVE[-1]+10; HMIN:=HMIN/10; "COMMENT" 1SECTION : 5.2.1.3.1 (OCTOBER 1975) PAGE 19 ; "IF" SAVE[-1]>40 "THEN" "GOTO" RETURN "END" "END"; RESET "END" "ELSE" CONVERGENCE: "IF" ERROR > TOL "THEN" "BEGIN" FAILS:= FAILS + 1; "IF" H > 1.1 * HMIN "THEN" "BEGIN" "IF" FAILS > 2 "THEN" "BEGIN" RESET; "GOTO" NEW START "END" "ELSE" "BEGIN" CALCULATE STEP AND ORDER; "IF" KNEW ^= K "THEN" "BEGIN" K:= KNEW; ORDER "END"; CH:= CH * CHNEW; RESET "END" "END" "ELSE" "BEGIN" "IF" K = 1 "THEN" "BEGIN" "COMMENT" VIOLATE EPS CRITERION; SAVE[-2]:= SAVE[-2] + 1; SAME:= 4; "GOTO" ERROR TEST OK "END"; K:=1; RESET; ORDER; SAME:= 2 "END" "END" "ELSE" ERROR TEST OK: "BEGIN" FAILS:= 0; "FOR" I:= 1 "STEP" 1 "UNTIL" N "DO" "BEGIN" C:= DELTA[I]; "FOR" L:= 2 "STEP" 1 "UNTIL" K "DO" Y[L*N+I]:= Y[L*N+I] + A[L] * C; "IF" ABS(Y[I]) > YMAX[I] "THEN" YMAX[I]:= ABS(Y[I]) "END"; SAME:= SAME-1; "IF" SAME= 1 "THEN" DUPVEC(1,N,0,LAST DELTA,DELTA) "ELSE" "IF" SAME= 0 "THEN" "BEGIN" CALCULATE STEP AND ORDER; "IF" CHNEW > 1.1 "THEN" "BEGIN" "IF" K ^= KNEW "THEN" "BEGIN" "IF" KNEW > K "THEN" MULVEC(KNEW*N+1,KNEW*N+N,-KNEW*N,Y,DELTA, A[K]/KNEW); K:= KNEW; ORDER "END"; SAME:= K+1; "IF" CHNEW * H > HMAX "THEN" CHNEW:= HMAX/H; "COMMENT" 1SECTION : 5.2.1.3.1 (OCTOBER 1975) PAGE 20 ; H:= H * CHNEW; C:= 1; "FOR" J:= N "STEP" N "UNTIL" K*N "DO" "BEGIN" C:= C * CHNEW; MULVEC(J+1,J+N,0,Y,Y,C) "END"; DECOMPOSE:="TRUE" "END" "ELSE" SAME:= 10 "END" OF A SINGLE INTEGRATION STEP OF Y; NIS:=NIS+1; "COMMENT" START OF A INTEGRATION STEP OF YP; "IF" CLEAN "THEN" "BEGIN" HOLD:=H; XOLD:=X; KPOLD:=K; CH:=1; DUPVEC(1,K*N+N,0,SAVE,Y) "END" "ELSE" "BEGIN" "IF" H^=HOLD "THEN" "BEGIN" CH:=H/HOLD; C:=1; "FOR" J:=N6+NNPAR "STEP" NNPAR "UNTIL" KPOLD*NNPAR+N6 "DO" "BEGIN" C:=C*CH; "FOR" I:=J+1 "STEP" 1 "UNTIL" J+NNPAR "DO" Y[I]:=Y[I]*C "END"; HOLD:=H "END"; "IF" K>KPOLD "THEN" INIVEC(N6+K*NNPAR+1,N6+K*NNPAR+NNPAR,Y,0); XOLD:= X; KPOLD:= K; CH:= 1; DUPVEC(1,K*N+N,0,SAVE,Y); EVALUATE JACOBIAN; DECOMPOSE JACOBIAN; "IF" "NOT" JAC DFDP(PAR,Y,X,FP) "THEN" "BEGIN" SAVE[-3]:=5; "GOTO" RETURN "END"; "IF" NPAR>M "THEN" INIMAT(1,N,M+1,NPAR,FP,0); "COMMENT" PREDICTION; "FOR" L:=0 "STEP" 1 "UNTIL" K-1 "DO" "FOR" J:=K-1 "STEP" -1 "UNTIL" L "DO" ELMVEC(J*NNPAR+N6+1,J*NNPAR+N6+NNPAR,NNPAR,Y,Y,1); "COMMENT" CORRECTION; "FOR" J:=1 "STEP" 1 "UNTIL" NPAR "DO" "BEGIN" J5N:=(J+5)*N; DUPVEC(1,N,J5N,Y0,Y); "FOR" I:=1 "STEP" 1 "UNTIL" N "DO" DF[I]:= H*(FP[I,J]+MATVEC(1,N,I,FY,Y0)) -Y[NNPAR+J5N+I]; SOL(JACOB,N,P,DF); "FOR" L:=0 "STEP" 1 "UNTIL" K "DO" "BEGIN" I:=L*NNPAR+J5N; ELMVEC(I+1,I+N,-I,Y,DF,A[L]) "END" "END" "END"; "COMMENT" 1SECTION : 5.2.1.3.1 (OCTOBER 1975) PAGE 21 ; "FOR" L:=0 "WHILE" X>=T "DO" "BEGIN" "COMMENT" CALCULATION OF A ROW OF THE JACOBIAN MATRIX AND AN ELEMENT OF THE RESIDUAL VECTOR; TOBSDIF:=(TOBS[II]-X)/H; COBSII:=COBS[II]; RES[II]:=INTERPOL(COBSII,N,K,TOBSDIF)-OBS[II]; "IF" "NOT" CLEAN "THEN" "BEGIN" "FOR" I:=1 "STEP" 1 "UNTIL" NPAR "DO" YP[II,I]:=INTERPOL(COBSII+(I+5)*N,NNPAR,K, TOBSDIF); "COMMENT" INTRODUCING OF BREAK-POINTS; "IF" BP[JJ]^=II "THEN" "ELSE" "IF" FIRST "AND" ABS(RES[II])<EPS1 "THEN" "BEGIN" NBP:=NBP-1; "COMMENT" DUPVEC(BP) ; "FOR" I:= JJ "STEP" 1 "UNTIL" NBP "DO" BP[I]:= BP[I + 1]; BP[NBP+1]:=0 "END" "ELSE" "BEGIN" EXTRA:=EXTRA+1; "IF" FIRST "THEN" PAR[M+JJ]:=OBS[II]; "COMMENT" INTRODUCING A JACOBIAN ROW AND A RESIDUAL VECTOR ELEMENT FOR CONTINUITY REQUIREMENTS; YP[NOBS+JJ,M+JJ]:=-WEIGHT; MULROW(1,NPAR,NOBS+JJ,II,YP,YP,WEIGHT); RES[NOBS+JJ]:=WEIGHT*(RES[II]+OBS[II]- PAR[M+JJ]) "END" "END"; "IF" II=NOBS "THEN" "GOTO" RETURN "ELSE" "BEGIN" T:=TOBS[II+1]; "IF" BP[JJ]=II "AND" JJ<NBP "THEN" JJ:=JJ+1; HMAX:=T-TOBS[II]; HMIN:=HMAX*IN[1]; II:=II+1 "END"; "END"; "COMMENT" BREAK-POINTS INTRODUCE NEW INITIAL VALUES FOR Y AND YP; "IF" EXTRA>0 "THEN" "BEGIN" "FOR" I:=1 "STEP" 1 "UNTIL" N "DO" "BEGIN" Y[I]:=INTERPOL(I,N,K,TOBSDIF); "FOR" J:=1 "STEP" 1 "UNTIL" NPAR "DO" Y[I+(J+5)*N]:=INTERPOL(I+(J+5)*N,NNPAR,K, TOBSDIF) "END"; "FOR" L:=1 "STEP" 1 "UNTIL" EXTRA "DO" "BEGIN" COBSII:=COBS[BP[NPAR-M+L]]; Y[COBSII]:=PAR[NPAR+L]; "FOR" I:=1 "STEP" 1 "UNTIL" NPAR+EXTRA "DO" Y[COBSII+(5+I)*N]:=0; "COMMENT" 1SECTION : 5.2.1.3.1 (OCTOBER 1975) PAGE 22 ; INIVEC(1+NNPAR+(L+5)*N,NNPAR+(L+6)*N,Y,0); Y[COBSII+(5+NPAR+L)*N]:=1 "END"; NPAR:=NPAR+EXTRA; EXTRA:=0; X:=TOBS[II-1]; EVALUATE JACOBIAN; NNPAR:=N*NPAR; "GOTO" NEW START "END" "END" "END" STEP; RETURN: "IF" SAVE[-2]>MAX "THEN" MAX:=SAVE[-2]; FUNCT:=SAVE[-1]<=40 "AND" SAVE[-3]=0; "IF" "NOT" FIRST "THEN" MONITOR(1,NCOL,NROW,PAR,RES,WEIGHT,NIS) "END" FUNCT; I:= -39; "FOR" C:= 1,1,9,4,0,2/3,1,1/3,36,20.25,1,6/11, 1,6/11,1/11,84.028,53.778,0.25,.48,1,.7,.2,.02, 156.25, 108.51, .027778, 120/274, 1, 225/274, 85/274, 15/274, 1/274, 0, 187.69, .0047361 "DO" "BEGIN" I:= I + 1; SAVE[I]:= C "END"; DATA(NOBS,TOBS,OBS,COBS); WEIGHT:=1; FIRST:=SEC:="FALSE"; CLEAN:=NBP>0; AUX[2]:="-12; EPS:=IN[2]; EPS1:="10; XEND:=TOBS[NOBS]; OUT[1]:=0; BP[0]:=MAX:=0; "COMMENT" SMOOTH INTEGRATION WITHOUT BREAK-POINTS; "IF" "NOT" FUNCT(NOBS,M,PAR,RES) "THEN" "GOTO" ESCAPE; RES1:=SQRT(VECVEC(1,NOBS,0,RES,RES)); NFE:=1; "IF" IN[5]=1 "THEN" "BEGIN" OUT[1]:=1; "GOTO" ESCAPE "END"; "IF" CLEAN "THEN" "BEGIN" FIRST:="TRUE"; CLEAN:="FALSE"; FAC3:=SQRT(SQRT(IN[3]/RES1)); FAC4:=SQRT(SQRT(IN[4]/RES1)); EPS1:=RES1*FAC4; "IF" "NOT" FUNCT(NOBS,M,PAR,RES) "THEN" "GOTO" ESCAPE; FIRST:="FALSE" "END" "ELSE" NFE:=0; NCOL:=M+NBP; NROW:=NOBS+NBP; SEC:="TRUE"; IN3:=IN[3]; IN4:=IN[4]; IN[3]:=RES1; "BEGIN" "REAL" W; "ARRAY" AID[1:NCOL,1:NCOL]; WEIGHT:=AWAY:=0; OUT[4]:=OUT[5]:=W:=0; "COMMENT" 1SECTION : 5.2.1.3.1 (OCTOBER 1975) PAGE 23 ; "FOR" WEIGHT:=(SQRT(WEIGHT)+1)**2 "WHILE" WEIGHT^=16 "AND" NBP>0 "DO" "BEGIN" "IF" AWAY=0 "AND" W^=0 "THEN" "BEGIN" "COMMENT" IF NO BREAK-POINTS WERE OMITTED THEN ONE FUNCTION EVALUATION IS SAVED; W:=WEIGHT/W; "FOR" I:=NOBS+1 "STEP" 1 "UNTIL" NROW "DO" "BEGIN" "FOR" J:=1 "STEP" 1 "UNTIL" NCOL "DO" YP[I,J]:=W*YP[I,J]; RES[I]:=W*RES[I] "END"; SEC:="TRUE"; NFE:=NFE-1 "END"; IN[3]:=IN[3]*FAC3*WEIGHT; IN[4]:=EPS1; MONITOR(2,NCOL,NROW,PAR,RES,WEIGHT,NIS); MARQUARDT(NROW,NCOL,PAR,RES,AID,FUNCT,JAC DYDP,IN,OUT); "IF" OUT[1]>0 "THEN" "GOTO" ESCAPE; "COMMENT" THE RELATIVE STARTING VALUE OF LAMBDA IS ADJUSTED TO THE LAST VALUE OF LAMBDA USED; AWAY:=OUT[4]-OUT[5]-1; IN[6]:=IN[6] * 5**AWAY * 2**(AWAY-OUT[5]); NFE:=NFE+OUT[4]; W:=WEIGHT; EPS1:=(SQRT(WEIGHT)+1)**2*IN[4]*FAC4; AWAY:=0; "COMMENT" USELESS BREAK-POINTS ARE OMITTED; J:= 0; "FOR" J:= J + 1 "WHILE" J "LE" NBP "DO" "BEGIN" "IF" ABS(OBS[BP[J]]+RES[BP[J]]-PAR[J+M])<EPS1 "THEN" "BEGIN" NBP:=NBP-1; "COMMENT" DUPVEC (BP) ; "FOR" I:= J "STEP" 1 "UNTIL" NBP "DO" BP[I]:= BP[I + 1]; DUPVEC(J+M,NBP+M,1,PAR,PAR); J:=J-1; AWAY:=AWAY+1; BP[NBP+1]:=0 "END" "END"; NCOL:=NCOL-AWAY; NROW:=NROW-AWAY "END"; IN[3]:=IN3; IN[4]:=IN4; NBP:=0; WEIGHT:=1; MONITOR(2,M,NOBS,PAR,RES,WEIGHT,NIS); MARQUARDT(NOBS,M,PAR,RES,JTJINV,FUNCT,JAC DYDP,IN,OUT); NFE:=OUT[4]+NFE "END"; ESCAPE: "IF" OUT[1]=3 "THEN" OUT[1]:=2 "ELSE" "IF" OUT[1]=4 "THEN" OUT[1]:=6; "IF" SAVE[-3]^=0 "THEN" OUT[1]:=SAVE[-3]; OUT[3]:=RES1; OUT[4]:=NFE; OUT[5]:=MAX "END" PEIDE; "EOP" 1SECTION : 6.1 (JANUARY 1976) PAGE 1 AUTHOR: D.T.WINTER. INSTITUTE: MATHEMATICAL CENTRE. RECEIVED: 751208. BRIEF DESCRIPTION: THIS SECTION CONTAINS TWO PROCEDURES: 1) PI: DELIVERS THE VALUE OF PI; 2) E: DELIVERS THE VALUE OF E. KEYWORDS: MATHEMATICAL CONSTANTS PI E SUBSECTION: PI CALLING SEQUENCE: THE HEADING OF THE PROCEDURE IS: "REAL" "PROCEDURE" PI; "CODE" 30006; PI:= THE CONSTANT PI IN 48 BITS PRECISION. LANGUAGE: COMPASS SUBSECTION: E CALLING SEQUENCE: THE HEADING OF THE PROCEDURE IS: "REAL" "PROCEDURE" E; "CODE" 30007; E:= THE CONSTANT E IN 48 BITS PRECISION. LANGUAGE: COMPASS 1SECTION : 6.1 (JANUARY 1976) PAGE 2 SOURCE TEXTS: 0 THE SOURCE TEXTS GIVEN HERE ARE NOT THE ACTUAL SOURCE TEXTS, AS THESE PROCEDURES ARE WRITTEN IN COMPASS. EVEN, THE TEXTS GIVEN HERE DO NOT GIVE THE SAME RESULTS ON THE CDC CYBER SYSTEM, SINCE THE ALGOL-60 COMPILER CANNOT READ THE CONSTANTS IN 48 BIT PRECISION. 0"CODE" 30006; "REAL" "PROCEDURE" PI; PI:= 3.14159265358979; "EOP" 0"CODE" 30007; "REAL" "PROCEDURE" E; E:= 2.71828182845905; "EOP" 1SECTION : 6.2 (JANUARY 1979) PAGE 1 AUTHOR: D.T.WINTER. INSTITUTE: MATHEMATICAL CENTRE,AMSTERDAM. RECEIVED: 751208. BRIEF DESCRIPTION: THIS SECTION CONTAINS SEVEN PROCEDURES: A) MBASE: DELIVERS THE BASE OF THE ARITHMETIC OF THE COMPUTER; B) ARREB: DELIVERS THE ARITHMETIC ERROR BOUND OF THE COMPUTER; C) DWARF: DELIVERS THE SMALLEST (IN ABSOLUTE VALUE) REPRESENTABLE REAL NUMBER; D) GIANT: DELIVERS THE LARGEST REPRESENTABLE REAL NUMBER; E) INTCAP: DELIVERS THE INTEGER CAPACITY; F) OVERFLOW: TESTS WHETHER A VALUE IS AN OVERFLOW VALUE; G) UNDERFLOW: TESTS WHETHER A VALUE IS AN UNDERFLOW VALUE; FOR A DETAILED DESCRIPTION SEE METHOD AND PERFORMANCE. KEYWORDS: ARITHMETIC CONSTANTS MACHINE CONSTANTS OVERFLOW UNDERFLOW SUBSECTION: MBASE CALLING SEQUENCE: THE HEADING OF THE PROCEDURE IS: "INTEGER" "PROCEDURE" MBASE; "CODE" 30001; MBASE:= 2, THE BASE OF THE ARITHMETIC OF THE CYBER. LANGUAGE: COMPASS SUBSECTION: ARREB CALLING SEQUENCE: THE HEADING OF THE PROCEDURE IS: "REAL" "PROCEDURE" ARREB; "CODE" 30002; ARREB:= 2 ** (-47), THE ARITHMETIC RELATIVE ERROR BOUND. LANGUAGE: COMPASS 1SECTION : 6.2 (DECEMBER 1979) PAGE 2 SUBSECTION: DWARF CALLING SEQUENCE: THE HEADING OF THE PROCEDURE IS: "REAL" "PROCEDURE" DWARF; "CODE" 30003; DWARF:= THE SMALLEST (IN ABSOLUTE VALUE) REPRESENTABLE REAL NUMBER. LANGUAGE: COMPASS SUBSECTION: GIANT CALLING SEQUENCE: THE HEADING OF THE PROCEDURE IS: "REAL" "PROCEDURE" GIANT; "CODE" 30004; GIANT:= THE LARGEST REPRESENTABLE REAL NUMBER. LANGUAGE: COMPASS SUBSECTION: INTCAP CALLING SEQUENCE: THE HEADING OF THE PROCEDURE IS: "INTEGER" "PROCEDURE" INTCAP; "CODE" 30005; INTCAP:= THE INTEGER CAPACITY. LANGUAGE: COMPASS SUBSECTION: OVERFLOW CALLING SEQUENCE: THE HEADING OF THE PROCEDURE IS: "BOOLEAN" "PROCEDURE" OVERFLOW(X); "VALUE" X; "REAL" X; "CODE" 30008; THE MEANING OF THE FORMAL PARAMETER IS: X: <REAL VARIABLE>; CONTAINS THE VALUE TO BE TESTED. OVERFLOW DELIVERS "TRUE" IF X CONTAINS AN OVERFLOW VALUE, AND "FALSE" OTHERWISE. LANGUAGE: COMPASS 1SECTION : 6.2 (DECEMBER 1979) PAGE 3 SUBSECTION: UNDERFLOW CALLING SEQUENCE: THE HEADING OF THE PROCEDURE IS: "BOOLEAN" "PROCEDURE" UNDERFLOW(X); "VALUE" X; "REAL" X; "CODE" 30009; THE MEANING OF THE FORMAL PARAMETER IS: X: <REAL VARIABLE>; CONTAINS THE VALUE TO BE TESTED. UNDERFLOW DELIVERS "TRUE" IF X CONTAINS AN UNDERFLOW VALUE, AND "FALSE" OTHERWISE. LANGUAGE: COMPASS METHOD AND PERFORMANCE: THE PROCEDURES DELIVER THE FOLLOWING VALUES, THAT ARE ESSENTIALLY MACHINE DEPENDENT: 1) MBASE: 2; 2) ARREB: 2**(-47); 3) DWARF: 2**48*2**(-1022); 4) GIANT: (2**48-1)*2**1022; 5) INTCAP: 2**48-2. FOR MBASE, DWARF AND GIANT THE VALUES ARE CLEAR, WE EXPLAIN THE OTHERS HERE: ARREB: THIS IS THE SMALLEST POSITIVE NUMBER SO THAT 1+ARREB^=1; INTCAP: THIS IS THE LARGEST POSITIVE NUMBER SO THAT THE FOLLOWING BOOLEAN EXPRESSION DELIVERS "TRUE" FOR EVERY INTEGER I: "IF" I<0 "OR" I>INTCAP "THEN" "TRUE" "ELSE" I-1^=I; THE CORRECT VALUE IS NOT 2**48-1, AS IN THE CYBER ARITHMETIC I=J IF I=2**48 AND J=2**48-1. WARNING: DWARF IS NOT VERY USEFUL WHEN TRAPPING UNDERFLOW VALUES: ABS(X) >= DWARF NEARLY ALWAYS DELIVERS TRUE EVEN IF ABS(X) IS SMALLER THEN DWARF DUE TO THE ARITHMETIC. ONE SHOULD USE: ABS(X) > DWARF (AND ONE TRAPS NON-UNDERFLOW VALUES TOO) OR THE PROCEDURE UNDERFLOW. NOTE: AS THE ALGOL 60 ERRORMESSAGE "ARITHMETIC OVERFLOW" IS NOT ISSUED AT THE MOMENT THE OVERFLOW VALUE IS CREATED BUT WHEN SUCH A VALUE IS USED, THE PROCEDURE OVERFLOW IS WELL-DEFINED. 1SECTION : 6.2 (DECEMBER 1979) PAGE 4 EXAMPLE OF USE: HERE WE GIVE AN EXAMPLE OF USE OF THE PROCEDURES OVERFLOW AND UNDERFLOW: "BEGIN" "REAL" X, Y; Y:= 0; X:= 1 / Y; "IF" OVERFLOW(X) "THEN" OUTPUT(61, "(""("OVERFLOW")", /")"); X:= DWARF; Y:= 2.0; "IF" "NOT" UNDERFLOW(X) "THEN" OUTPUT(61, "(""("NO UNDERFLOW WITH DWARF")", /")"); X:= X / Y; "IF" X ^= 0 "THEN" OUTPUT(61, "(""("DWARF / 2 ^= 0")", /")"); "IF" UNDERFLOW(X) "THEN" OUTPUT(61, "(""("DWARF / 2 IS UNDERFLOW")", /")"); "IF" X * Y = 0 "THEN" OUTPUT(61, "(""("BECAUSE (DWARF / 2) * 2 = 0")", /")") "END" RESULTS: OVERFLOW NO UNDERFLOW WITH DWARF DWARF / 2 ^= 0 DWARF / 2 IS UNDERFLOW BECAUSE (DWARF / 2) * 2 = 0 1SECTION : 6.2 (JANUARY 1976) PAGE 5 SOURCE TEXTS: THESE ARE NOT THE ACTUAL SOURCE TEXTS, AS THESE PROCEDURES ARE WRITTEN IN COMPASS, MOREOVER, THE RESULTS NEED NOT BE THAT OF THE ACTUAL PROCEDURES. THE SOURCE TEXTS OF OVERFLOW AND UNDERFLOW ARE NOT GIVEN HERE, AS THESE EVEN CANNOT BE SIMULATED IN ALGOL-60. "CODE" 30001; "INTEGER" "PROCEDURE" MBASE; MBASE:= 2; "EOP" "CODE" 30002; "REAL" "PROCEDURE" ARREB; ARREB:= 2**(-47); "EOP" "CODE" 30003; "REAL" "PROCEDURE" DWARF; DWARF:= 2**48*2**(-1022); "EOP" "CODE" 30004; "REAL" "PROCEDURE" GIANT; GIANT:= (2**48-1)*2**1022; "EOP" "CODE" 30005; "INTEGER" "PROCEDURE" INTCAP; INTCAP:= 2**48-2; "EOP" 1SECTION : 6.4.1 (DECEMBER 1979) PAGE 1 AUTHOR: P.W.HEMKER. CONTRIBUTOR: F.GROEN. INSTITUTE: MATHEMATICAL CENTRE, AMSTERDAM. RECEIVED: 740620. REVISED: 781101 BY N.M.TEMME AND R.MONTIJN. BRIEF DESCRIPTION: THIS SECTION CONTAINS THREE PROCEDURES: TAN, ARCSIN, ARCCOS. TAN COMPUTES THE TANGENT FOR A REAL ARGUMENT X. ARCSIN COMPUTES THE ARCSINE FOR A REAL ARGUMENT X. ARCCOS COMPUTES THE ARCCOSINE FOR A REAL ARGUMENT X. KEYWORDS: TANGENT, ARCSINE, ARCCOSINE. 1SECTION : 6.4.1 (DECEMBER 1979) PAGE 2 SUBSECTION: TAN. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "REAL" "PROCEDURE" TAN(X); "VALUE" X; "REAL" X; "CODE" 35120; TAN : DELIVERS THE TANGENT OF THE ARGUMENT X. THE MEANING OF THE FORMAL PARAMETER IS: X: <ARITHMETIC EXPRESSION>; ENTRY: THE (REAL) ARGUMENT OF TAN(X). PROCEDURES USED : OVERFLOW = CP 30008, GIANT = CP 30004. METHOD AND PERFORMANCE : THE FORMULA TAN(X) = SIN(X) / COS(X) IS USED. IF COS(X) = 0 THEN THE VALUE OF GIANT (SEE SECTION 6.2) IS DELIVERED. EXAMPLE OF USE: "BEGIN" OUTPUT(61,"("/"("ARCTAN(TAN(1))= ")",+D.14D")",ARCTAN(TAN(1))); OUTPUT(61,"("/"("ARCTAN(TAN(0))= ")",+D.14D")",ARCTAN(TAN(0))); OUTPUT(61,"("/"("TAN(ARCTAN(0))= ")",+D.14D")",TAN(ARCTAN(0))); OUTPUT(61,"("/"("TAN(ARCTAN(1))= ")",+D.14D")",TAN(ARCTAN(1))); "END" DELIVERS : ARCTAN(TAN(1))= +1.00000000000000 ARCTAN(TAN(0))= +0.00000000000000 TAN(ARCTAN(0))= +0.00000000000000 TAN(ARCTAN(1))= +1.00000000000000 1SECTION : 6.4.1 (DECEMBER 1979) PAGE 3 SUBSECTION : ARCSIN. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "REAL" "PROCEDURE" ARCSIN(X); "VALUE" X; "REAL" X; "CODE" 35121; ARCSIN : DELIVERS THE ARCSINE OF THE ARGUMENT X. THE MEANING OF THE FORMAL PARAMETER IS: X: <ARITHMETIC EXPRESSION>; ENTRY: THE (REAL) ARGUMENT OF ARCSIN(X), ABS(X)<=1. PROCEDURES USED : NONE. METHOD AND PERFORMANCE : FOR ABS(X) < 0.8 WE USE THE FORMULA : ARCSIN(X) = ARCTAN( X / SQRT ( 1 - X * X )). FOR 0.8 <= ABS(X) < 1 WE USE THE FORMULA : ARCSIN(X) = SIGN(X) * ( PI/2 - ARCTAN( SQRT( 1/( X * X) - 1))). FOR ABS(X) = 1 THE VALUE SIGN(X) * PI/2 IS DELIVERED. THE VALUES ARE COMPUTED WITH A RELATIVE PRECISION OF ABOUT "-13. EXAMPLE OF USE : "BEGIN" OUTPUT(61,"("/"("ARCSIN(SIN(1))= ")",+D.14D")",ARCSIN(SIN(1))); OUTPUT(61,"("/"("ARCSIN(SIN(0))= ")",+D.14D")",ARCSIN(SIN(0))); OUTPUT(61,"("/"("SIN(ARCSIN(0))= ")",+D.14D")",SIN(ARCSIN(0))); OUTPUT(61,"("/"("SIN(ARCSIN(1))= ")",+D.14D")",SIN(ARCSIN(1))); "END" DELIVERS : ARCSIN(SIN(1))= +0.99999999999990 ARCSIN(SIN(0))= +0.00000000000000 SIN(ARCSIN(0))= +0.00000000000000 SIN(ARCSIN(1))= +1.00000000000000 1SECTION : 6.4.1 (DECEMBER 1979) PAGE 4 SUBSECTION: ARCCOS. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "REAL" "PROCEDURE" ARCCOS(X); "VALUE" X; "REAL" X; "CODE" 35122; ARCCOS : DELIVERS THE ARCCOSINE OF THE ARGUMENT X. THE MEANING OF THE FORMAL PARAMETER IS: X: <ARITHMETIC EXPRESSION>; ENTRY: THE (REAL) ARGUMENT OF ARCCOS(X), ABS(X)<=1. PROCEDURES USED: NONE. METHOD AND PERFORMANCE: FOR 0 < X < 1 WE USE THE FORMULA: ARCCOS(X) = 2 * ARCTAN( SQRT( (1 - X) / (1 + X))). FOR -1 < X <= 0 WE USE THE FORMULA: ARCCOS(X) = PI - ARCCOS(-X). FOR X = 1 THE VALUE 0 IS DELIVERED. FOR X = -1 THE VALUE PI IS DELIVERED. THE VALUES ARE COMPUTED WITH A RELATIVE PRECISION OF "-13. EXAMPLE OF USE: "BEGIN" OUTPUT(61,"("/"("ARCCOS(COS(1))= ")",+D.14D")",ARCCOS(COS(1))); OUTPUT(61,"("/"("ARCCOS(COS(0))= ")",+D.14D")",ARCCOS(COS(0))); OUTPUT(61,"("/"("COS(ARCCOS(0))= ")",+D.14D")",COS(ARCCOS(0))); OUTPUT(61,"("/"("COS(ARCCOS(1))= ")",+D.14D")",COS(ARCCOS(1))); "END" DELIVERS : ARCCOS(COS(1))= +1.00000000000000 ARCCOS(COS(0))= +0.00000000000000 COS(ARCCOS(0))= +0.00000000000001 COS(ARCCOS(1))= +1.00000000000000 1SECTION : 6.4.1 (DECEMBER 1979) PAGE 5 SOURCE TEXTS: 0"CODE" 35120; "REAL" "PROCEDURE" TAN(X); "VALUE" X; "REAL" X; "BEGIN" "REAL" U; U:= SIN(X)/COS(X); TAN:= "IF" OVERFLOW(U) "THEN" GIANT "ELSE" U "END" TAN; "EOP" "CODE" 35121; "REAL" "PROCEDURE" ARCSIN(X); "VALUE" X; "REAL" X; "BEGIN" "REAL" U; U:= ABS(X); ARCSIN:= "IF" U<0.8 "THEN" ARCTAN(X/SQRT(1-X*X)) "ELSE" SIGN(X) * ( "IF" U=1 "THEN" 1.57079632679489 "ELSE" ( 1.57079632679489 - ARCTAN(SQRT(1/(X*X)-1)))) "END" ARCSIN; "EOP" "CODE" 35122; "REAL" "PROCEDURE" ARCCOS(X); "VALUE" X; "REAL" X; "BEGIN" "REAL" U,V; U:= ABS(X); V:= (1-U)/(1+U); V:= "IF" V =0 "THEN" 0 "ELSE" "IF" U+1=1 "THEN" 1.57079632679489 "ELSE" 2*ARCTAN(SQRT(V)); ARCCOS:= "IF" X>0 "THEN" V "ELSE" 3.14159265358979 - V "END" ARCCOS; "EOP" 1SECTION : 6.4.2 (DECEMBER 1979) PAGE 1 AUTHOR: P.W.HEMKER. CONTRIBUTOR: F.GROEN. INSTITUTE: MATHEMATICAL CENTRE, AMSTERDAM. RECEIVED: 730921. REVISED: 781101 BY N.M.TEMME AND R.MONTIJN. BRIEF DESCRIPTION: THIS SECTION CONTAINS SIX PROCEDURES FOR THE COMPUTATION OF HYPERBOLIC FUNCTIONS. SINH COMPUTES FOR A REAL ARGUMENT X THE VALUE OF SINH(X). COSH COMPUTES FOR A REAL ARGUMENT X THE VALUE OF COSH(X). TANH COMPUTES FOR A REAL ARGUMENT X THE VALUE OF TANH(X). ARCSINH COMPUTES FOR A REAL ARGUMENT X THE VALUE OF ARCSINH(X). ARCCOSH COMPUTES FOR A REAL ARGUMENT X THE VALUE OF ARCCOSH(X). ARCTANH COMPUTES FOR A REAL ARGUMENT X THE VALUE OF ARCTANH(X). KEYWORDS: HYPERBOLIC SINE, HYPERBOLIC COSINE, HYPERBOLIC TANGENT, HYPERBOLIC ARCSINE, HYPERBOLIC ARCCOSINE, HYPERBOLIC ARCTANGENT. 1SECTION : 6.4.2 (DECEMBER 1979) PAGE 2 SUBSECTION : SINH. CALLING SEQUENCE : THE HEADING OF THE PROCEDURE READS : "REAL" "PROCEDURE" SINH(X); "VALUE" X; "REAL" X; "CODE" 35111; SINH : DELIVERS THE HYPERBOLIC SINE OF THE ARGUMENT X. THE MEANING OF THE FORMAL PARAMETER IS : X: <ARITHMETIC EXPRESSION>; ENTRY: THE (REAL) ARGUMENT OF SINH(X). PROCEDURES USED : OVERFLOW = CP 30009, GIANT = CP 30004. METHOD AND PERFORMANCE : IF ABS(X) < 0.1 THEN SINH(X) IS CALCULATED BY MEANS OF AN ECONOMIZED TAYLOR SERIES. IF 0.1 <= ABS(X) < 0.3 WE USE THE FORMULA : SINH(X) = 3 * SINH ( X/3 ) + 4 * SINH ( X/3 ) ** 3 IF 0.3 <= ABS(X) < 17.5 THEN WE USE THE FORMULA : SINH(X) = 0.5 * ( EXP(X) - EXP(-X) ). IF X >= 17.5 THEN WE TAKE SINH(X) = SIGN(X) * EXP( X-LN(2) ). IN THE CASE OF OVERFLOW (I.E., ABS(X) > 741.6 (APPROXIMATELY)) THEN THE VALUE SINH = SIGN(X) * GIANT ( SEE SUBSECTION 6.2) IS DELIVERED. THE VALUES ARE COMPUTED WITH A RELATIVE PRECISION OF ABOUT "-13. EXAMPLE OF USE : SEE EXAMPLE OF USE OF THE PROCEDURE COSH (THIS SECTION). 1SECTION : 6.4.2 (DECEMBER 1979) PAGE 3 SUBSECTION : COSH. CALLING SEQUENCE : THE HEADING OF THE PROCEDURE READS : "REAL" "PROCEDURE" COSH(X); "VALUE" X; "REAL" X; "CODE" 35112; COSH : DELIVERS THE HYPERBOLIC COSINE OF THE ARGUMENT X. THE MEANING OF THE FORMAL PARAMETER IS : X: <ARITHMETIC EXPRESSION>; ENTRY: THE (REAL) ARGUMENT OF COSH(X). PROCEDURES USED : SINH = CP 35111. METHOD AND PERFORMANCE : IF ABS(X) < 17.5 THE FORMULA COSH(X) = 0.5 * ( EXP(X) + EXP(-X) ) IS USED ELSE COSH(X) = SINH(ABS(X)). THE VALUES ARE COMPUTED WITH A RELATIVE PRECISION OF ABOUT "-13. EXAMPLE OF USE : THE FOLLOWING PROGRAM TESTS FOR X = -20, -2, -1, 0.1, 0.3 THE RELATION : SINH(2 * X) - 2 * SINH(X) * COSH(X) = 0. "BEGIN""REAL" X; "FOR" X := -20, -2, -1, 0.1, 0.3 "DO" OUTPUT(61,"("/,+2ZD.2D,3B,+D.D"+3D")",X,SINH(2 * X) - 2 * SINH(X) * COSH(X) ); "END" OUTPUT : -20.00 +6.1"+003 -2.00 -1.1"-013 -1.00 -1.4"-014 +0.10 +0.0"+000 +0.30 +0.0"+000 1SECTION : 6.4.2 (DECEMBER 1979) PAGE 4 SUBSECTION : TANH. CALLING SEQUENCE : THE HEADING OF THE PROCEDURE READS : "REAL" "PROCEDURE" TANH(X); "VALUE" X; "REAL" X; "CODE" 35113; TANH : DELIVERS THE HYPERBOLIC TANGENT OF TH ARGUMENT X. THE MEANING OF THE FORMAL PARAMETER IS : X: <ARITHMETIC EXPRESSION>; ENTRY: THE (REAL) ARGUMENT OF TANH(X). PROCEDURES USED : SINH = CP 35111. METHOD AND PERFORMANCE : IF ABS(X) < 0.005 THE TANH(X) IS CALCULATED BY A TRUNCATED POWER SERIES (TAYLOR'S FORMULA). IF 0.005 <= ABS(X) < 0.3 WE USE THE FORMULA : TANH(X) = SINH(X) / COSH(X). IF 0.3 <= ABS(X) <= 17.5 WE USE THE FORMULA : TANH(X) = ( 1 - EXP( -2 * X ) ) / ( 1 + EXP( -2 * X ) ). IF ABS(X) > 17.5 THE VALUE SIGN(X) IS DELIVERED. THE VALUES ARE COMPUTED WITH A RELATIVE PRECISION OF ABOUT "-13. EXAMPLE OF USE : THE FOLLOWING PROGRAM CHECKS FOR X = -100, -10, 0, 2, 5 THE RELATION : 1 - TANH(X) ** 2 - 1 / COSH(X) ** 2 = 0. "BEGIN" "REAL" X ; "FOR" X := -100, -10, 0, 2, 5 "DO" OUTPUT(61,"("/,+2ZD,3B,+D.D"+3D")",X,1-TANH(X)**2-1/COSH(X)**2); "END" RESULTS : -100 -5.5"-087 -10 +1.2"-014 +0 +0.0"+000 +2 +9.8"-015 +5 -3.4"-015 1SECTION : 6.4.2 (DECEMBER 1979) PAGE 5 SUBSECTION : ARCSINH. CALLING SEQUENCE : THE HEADING OF THE PROCEDURE READS : "REAL" "PROCEDURE" ARCSINH(X); "VALUE" X; "REAL" X; "CODE" 35114; ARCSINH : DELIVERS THE INVERSE HYPERBOLIC SINE OF THE ARGUMENT X. THE MEANING OF THE FORMAL PARAMETER IS : X: <ARITHMETIC EXPRESSION>; ENTRY: THE (REAL) ARGUMENT OF ARCSINH(X). PROCEDURES USED : LOG ONE PLUS X = CP 35130. METHOD AND PERFORMANCE : IF ABS(X) <= "10 WE USE THE PROCEDURE LOG ONE PLUS X (SEE SECTION 6.4.3.) BY WRITING : ARCSINH(X) = LN ( X + SQRT ( X * X + 1 ) ) = LN(1+X+X**2/(1+SQRT(1+X**2))). IF ABS(X) > "10 WE USE THE FORMULA : ARCSINH(X) = SIGN(X) * ( LN(2) + LN ( ABS(X) ) ). THE VALUES ARE COMPUTED WITH A RELATIVE PRECISION OF ABOUT "-13. EXAMPLE OF USE : "BEGIN" OUTPUT(61,"("/,D.14D")",ARCSINH(SINH(0.01))); OUTPUT(61,"("/,D.14D")",ARCSINH(SINH(0.05))); OUTPUT(61,"("/,D.14D")",SINH(ARCSINH(0.05))); OUTPUT(61,"("/,D.14D")",SINH(ARCSINH(0.01))); "END" DELIVERS : +0.01000000000000 +0.05000000000000 +0.05000000000000 +0.01000000000000 1SECTION : 6.4.2 (DECEMBER 1979) PAGE 6 SUBSECTION : ARCCOSH. CALLING SEQUENCE : THE HEADING OF THE PROCEDURE READS : "REAL" "PROCEDURE" ARCCOSH(X); "VALUE" X; "REAL" X; "CODE" 35115; ARCCOSH : DELIVERS THE INVERSE HYPERBOLIC COSINE OF THE ARGUMENT X. THE MEANING OF THE FORMAL PARAMETER IS : X: <ARITHMETIC EXPRESSION>; ENTRY: THE (REAL) ARGUMENT OF ARCCOSH(X), X >= 1. PROCEDURES USED : NONE. METHOD AND PERFORMANCE : IF X = 1 THE VALUE 0 IS DELIVERED. IF 1 < X <= "10 WE USE THE FORMULA : ARCCOSH(X) = LN ( X + SQRT ( X * X - 1 ) ). IF X > "10 WE USE THE FORMULA : ARCCOSH(X) = LN(2) + LN ( X ). THE VALUES ARE COMPUTED WITH A RELATIVE PRECISION OF ABOUT "-13. IF X IS CLOSE TO 1, SAY X = 1+Y, Y>0, AND Y IS KNOWN IN GOOD RELATIVE PRECISION, THEN IT IS ADVISED TO USE THE PROCEDURE LOG ONE PLUS X (SEE SUBSECTION 6.4.3) BY WRITING ARCCOSH(X) = LN( 1 + Y + SQRT( Y*(Y+2) ) ). EXAMPLE : X = EXP(T), T > 0, T IS SMALL. THEN Y = EXP(T)-1 IS AVAILABLE IN GOOD RELATIVE ACCURACY, Y = 2*EXP(T/2)*SINH(T/2). EXAMPLE OF USE : "BEGIN" OUTPUT(61,"("/,D.14D")",ARCCOSH(COSH(0.01))); OUTPUT(61,"("/,D.14D")",ARCCOSH(COSH(0.05))); OUTPUT(61,"("/,D.14D")",COSH(ARCCOSH(1.01))); OUTPUT(61,"("/,D.14D")",COSH(ARCCOSH(1.05))); "END" DELIVERS : +0.00999999999958 +0.04999999999999 +1.01000000000000 +1.05000000000000 1SECTION : 6.4.2 (DECEMBER 1979) PAGE 7 SUBSECTION : ARCTANH. CALLING SEQUENCE : THE HEADING OF THE PROCEDURE READS : "REAL" "PROCEDURE" ARCTANH(X); "VALUE" X; "REAL" X; "CODE" 35116; ARCTANH: DELIVERS THE INVERSE HYPERBOLIC TANGENT OF THE ARGUMENT X. THE MEANING OF THE FORMAL PARAMETER IS : X: <ARITHMETIC EXPRESSION>; ENTRY: THE (REAL) ARGUMENT OF ARCTANH(X). PROCEDURES USED : LOG ONE PLUS X = CP 35130, GIANT = CP 30004. METHOD AND PERFORMANCE : IF ABS(X) < 1 WE USE THE PROCEDURE LOG ONE PLUS X (SEE SECTION 6.4.3) BY WRITING ARCTANH(X) = 0.5 * LN(( 1 + X )/( 1 - X ))= 0.5 * LN(1+2*X/(1-X)). IF ABS(X) = 1 THE VALUE IS SIGN(X) * GIANT (SEE SECTION 6.2). THE VALUES ARE COMPUTED WITH A RELATIVE PRECISION OF ABOUT "-13. EXAMPLE OF USE : "BEGIN" OUTPUT(61,"("/,D.14D")",ARCTANH(TANH(0.01))); OUTPUT(61,"("/,D.14D")",ARCTANH(TANH(0.05))); OUTPUT(61,"("/,D.14D")",TANH(ARCTANH(0.05))); OUTPUT(61,"("/,D.14D")",TANH(ARCTANH(0.01))); "END" DELIVERS : +0.01000000000000 +0.05000000000000 +0.05000000000000 +0.01000000000000 1SECTION : 6.4.2 (DECEMBER 1979) PAGE 8 SOURCE TEXTS : 0"CODE" 35111; "REAL" "PROCEDURE" SINH(X); "VALUE" X; "REAL" X; "BEGIN" "REAL" AX,Y; AX:= ABS(X); "IF" AX < 0.3 "THEN" "BEGIN" Y:= "IF" AX < 0.1 "THEN" X*X "ELSE" X*X/9; X:= ((( 0.0001984540 * Y + 0.0083333331783 )* Y + 0.16666666666675)* Y + 1.0 )* X ; SINH:= "IF" AX < 0.1 "THEN" X "ELSE" X * ( 1.0 + 0.14814814814815 * X * X ) "END" "ELSE" "IF" AX < 17.5 "THEN" "BEGIN" AX:= EXP( AX ); SINH:= SIGN(X) * .5 * ( AX -1/AX ) "END" "ELSE" "IF" AX > 742.36063037970 "THEN" "BEGIN" SINH:= SIGN(X)*GIANT "END" "ELSE" SINH:= SIGN(X)*EXP(AX- .69314 71805 59945) "END" SINH; "EOP" "CODE" 35112; "REAL" "PROCEDURE" COSH(X); "VALUE" X; "REAL" X; "IF" ABS(X) < 17.5 "THEN" "BEGIN" X:= EXP(X); COSH:= 0.5 * ( X + 1/X ) "END" "ELSE" "BEGIN" COSH:= SINH(ABS(X)) "END" COSH; "EOP" "CODE" 35113; "REAL" "PROCEDURE" TANH(X); "VALUE" X; "REAL" X; "BEGIN" "REAL"AX; AX:= ABS(X); "IF" AX < 0.005 "THEN" "BEGIN" "REAL" Y; Y:= X*X; TANH:= X * ( 1 - Y * (.33333333333333 - Y * (.13333333333333 - Y * .05396825396825 ))) "END" "ELSE" "IF" AX < 0.3 "THEN" "BEGIN" "REAL" SH; SH:= SINH(X); TANH:= SH/SQRT(1+SH*SH) "END" "ELSE" "IF" AX > 17.5 "THEN" TANH:= SIGN(X) "ELSE" "BEGIN" AX:= EXP(-2*AX); TANH:= SIGN(X)*(1-AX)/(1+AX) "END" "END" 1SECTION : 6.4.2 (DECEMBER 1979) PAGE 9 ; "EOP" "CODE" 35114; "REAL" "PROCEDURE" ARCSINH(X); "VALUE" X; "REAL" X; "IF" ABS(X) > "10 "THEN" ARCSINH:= SIGN(X)*(0.69314 71805 5995+ LN(ABS(X))) "ELSE" "BEGIN" "REAL" Y; Y:= X*X; ARCSINH:= SIGN(X)*LOG ONE PLUS X(ABS(X)+Y/(1+SQRT(1+Y))) "END" ARCSINH; "EOP" 0"CODE" 35115; "REAL" "PROCEDURE" ARCCOSH(X); "VALUE" X; "REAL" X; ARCCOSH:= "IF" X <= 1 "THEN" 0 "ELSE" "IF" X > "10 "THEN" 0.69314718055995 + LN(X) "ELSE" LN(X+SQRT((X-1)*(X+1))); "EOP" "CODE" 35116; "REAL" "PROCEDURE" ARCTANH(X); "VALUE" X; "REAL" X; "IF" ABS(X) >= 1 "THEN" "BEGIN" ARCTANH:= SIGN(X)*GIANT "END" "ELSE" "BEGIN" "REAL" AX; AX:= ABS(X); ARCTANH:= SIGN(X)*.5*LOG ONE PLUS X(2*AX/(1-AX)) "END" ARCTANH; "EOP" 1SECTION : 6.4.3 (DECEMBER 1978) PAGE 1 AUTHOR : N.M. TEMME. CONTRIBUTOR : R. MONTIJN. INSTITUTE : MATHEMATICAL CENTRE. RECEIVED : 780801. BRIEF DESCRIPTION : THIS SECTION CONTAINS THE PROCEDURE LOG ONE PLUS X FOR THE COMPUTATION OF LN(1+X) FOR X > -1. KEYWORDS : LOGARITHMIC FUNCTION. CALLING SEQUENCE : THE HEADING OF THE PROCEDURE READS : "REAL" "PROCEDURE" LOG ONE PLUS X(X); "VALUE" X; "REAL" X; "CODE" 35130; LOG ONE PLUS X : DELIVERS THE VALUE OF LN(1+X); THE MEANING OF THE FORMAL PARAMETER IS : X: <ARITHMETIC EXPRESSION>; ENTRY : THE ARGUMENT OF LN(1+X), X > -1. PROCEDURES USED : NONE. RUNNING TIME : THE ALGORITHM NEEDS 9 MULTIPLICATIONS. METHOD AND PERFORMANCE : FOR X < -0.2928 OR X > 0.4142 THE PROCEDURE USES THE STANDARD FUNCTION LN, FOR -0.2928 <= X <= 0.4142 A POLYNOMIAL APPROXIMATION IS USED. WE USE AN APPROXIMATION BASED ON THE BEST APPROXIMATON FOR THE INTERVAL 1/SQRT(2)-1 <= X <= SQRT(2)-1, OF WHICH THE COEFFICIENTS ARE GIVEN IN HART (1968); CF. P. 111, INDEX 2665. THE PROCEDURE LOG ONE PLUS X COMPUTES LN(1+X) WITH RELATIVE ACCURACY COMPARABLE WITH THE MACHINE ACCURACY. 1SECTION : 6.4.3 (DECEMBER 1978) PAGE 2 AS IS WELL KNOWN, FOR SMALL ABS(X) RELATIVE ACCURACY IS LOST WHEN COMPUTING LN(1+X) BY USING THE STANDARD FUNCTION LN. THE PROCEDURE IS USED IN THE PROCEDURES ARCSINH AND ARCTANH, SECTION 6.4.2. REFERENCES : HART, J.F. CS. (1968), COMPUTER APPROXIMATIONS, WILEY, NEW YORK. EXAMPLE OF USE : WE COMPUTE LN(EXP(X)) FOR SMALL POSITIVE X. IN ORDER TO PRESERVE RELATIVE ACCURACY WE WRITE LN ( EXP(X) ) = LN ( 1+ EXP(X)-1 ) = LN ( 1+ 2* EXP(X/2)* SINH(X/2) ). THE FOLOWING PROGRAM "BEGIN" "REAL" X,Y; "FOR" X:= "-1, "-10, "-50, "-100, "-250 "DO" "BEGIN" Y:= LOG ONE PLUS X( 2*EXP(X/2)*SINH(X/2) ); OUTPUT(61,"("N,/")",Y) "END" "END" PRINTS THE FOLOWING RESULTS : +1.0000000000000"-001 +1.0000000000000"-010 +1.0000000000000"-050 +1.0000000000000"-100 +1.0000000000000"-250 SOURCE TEXT : "CODE" 35130; "REAL" "PROCEDURE" LOG ONE PLUS X(X); "VALUE" X; "REAL" X; "COMMENT" COMPUTES LN(1+X) FOR X > -1; "IF" X = 0 "THEN" LOG ONE PLUS X:= 0 "ELSE" "IF" X < -0.2928 "OR" X > 0.4142 "THEN" LOG ONE PLUS X:= LN(1+X) "ELSE" "BEGIN" "REAL" Y,Z; Z:= X/(X+2); Y:= Z*Z; LOG ONE PLUS X:= Z*(2+ Y* ( .66666 66666 63366 + Y* ( .40000 00012 06045 + Y* ( .28571 40915 90488 + Y* ( .22223 82333 2791 + Y* ( .18111 36267 967 + Y* .16948 21248 8)))))) "END" LOG ONE PLUS X; "EOP" 1SECTION : 6.5.1 (DECEMBER 1979) PAGE 1 AUTHOR(S) : H.FIOLET, N.TEMME. INSTITUTE : MATHEMATICAL CENTRE. RECEIVED: 740628. BRIEF DESCRIPTION : THIS SECTION CONTAINS FOUR PROCEDURES : A. EI CALCULATES THE EXPONENTIAL INTEGRAL DEFINED AS FOLLOWS (SEE ALSO REF[1] , EQ. (5.1.1)) : EI(X) = INTEGRAL (EXP(T)/T DT) FROM T=-INFINITY TO T=X , WHERE THE INTEGRAL IS TO BE INTERPRETED AS THE CAUCHY PRINCIPAL VALUE. ALSO THE RELATED FUNCTION E1(X), DEFINED BY THE INTEGRAL (EXP(-T)/T DT) FROM T= X TO T= INFINITY, FOR POSITIVE X (REF[1], EQ.(5.1.2)) CAN EASILY BE OBTAINED BY THE RELATION E1(X) = - EI(-X). FOR X=0 THE INTEGRAL IS UNDEFINED AND THE PROCEDURE WILL CAUSE OVERFLOW. B. EIALPHA CALCULATES A SEQUENCE OF INTEGRALS OF THE FORM INTEGRAL( EXP(-X*T)*T**I DT ) FROM T=1 TO T= INFINITY, WHERE X IS POSITIVE AND I = 0,...,N. (SEE ALSO REF[1], EQ. (5.1.5)). C. ENX COMPUTES A SEQUENCE OF INTEGRALS E(N,X), N=N1, N1+1,...,N2, WHERE X>0 AND N1, N2 ARE POSITIVE INTEGERS WITH N2>=N1; E(N,X) IS DEFINED AS FOLLOWS: E(N,X)= THE INTEGRAL FROM 1 TO INFINITY OF EXP(-X * T)/ T**N DT; (SEE ALSO REF[1], EQ.(5.1.4)); D. NONEXPENX COMPUTES A SEQUENCE OF INTEGRALS EXP(X)*E(N,X), N=N1, N1+1,...,N2, WHERE X>0 AND N1, N2 ARE POSITIVE INTEGERS WITH N2>=N1; E(N,X) IS DEFINED UNDER C). KEYWORDS : EXPONENTIAL INTEGRAL, SPECIAL FUNCTIONS. 1SECTION : 6.5.1 (SEPTEMBER 1974) PAGE 2 SUBSECTION : EI. CALLING SEQUENCE : THE HEADING OF THE PROCEDURE READS: "REAL" "PROCEDURE" EI(X); "VALUE" X;"REAL" X; "CODE" 35080; EI: DELIVERS THE VALUE OF THE EXPONENTIAL INTEGRAL; THE MEANING OF THE FORMAL PARAMETER IS : X: <ARITHMETIC EXPRESSION>; THE ARGUMENT OF THE INTEGRAL. PROCEDURES USED : CHEPOLSUM = CP31046 , POL = CP31040 , JFRAC = CP35083 . LANGUAGE : ALGOL 60. METHOD AND PERFORMANCE : THE INTEGRAL IS CALCULATED BY MEANS OF THE RATIONAL CHEBYSHEV APPROXIMATIONS GIVEN IN REFERENCES [1] AND [2]. ONLY RATIOS OF POLYNOMIALS WITH EQUAL DEGREE L ARE CONSIDERED. BELOW,THE DIFFERENT INTERVALS ARE LISTED, TOGETHER WITH THE CORRESPONDING DEGREE L AND THE NUMBER OF CORRECT DIGITS OF THE APPROXIMATIONS : [-INFINITY,-4] 6 15.1 [-4,-1] 7 16.9 [-1, 0] 5 18.5 [ 0, 6] 7 15.2 [ 6,12] 7 15.1 [12,24] 7 15.0 [24,+INFINITY] 7 15.9 . VARIOUS TESTS SHOWED A RELATIVE ACCURACY OF AT LEAST "-13, EXEPT IN THE NEIGHBOURHOOD OF X=.37250 , THE ZERO OF THE INTEGRAL, WHERE ONLY AN ABSOLUTE ACCURACY OF .3"-13 IS REACHED . IN SOME OF THE INTERVALS , THE RATIONAL FUNCTIONS ARE EXPRESSED EITHER AS RATIOS OF FINITE SUMS OF CHEBYSHEV POLYNOMIALS OR AS J-FRACTIONS, SINCE THE ORIGINAL FORMS ARE POORLY CONDITIONED. REFERENCES : SEE REFERENCES [1], [2] AND [3] OF THE PROCEDURE NONEXPENX (THIS SECTION). 1SECTION : 6.5.1 (SEPTEMBER 1974) PAGE 3 EXAMPLE OF USE : "BEGIN" "COMMENT" THE COMPUTATION OF E1(.5); OUTPUT(61,"("N")",-EI(-.5)) "END" DELIVERS : +5.5977359477616"-001 . SUBSECTION : EIALPHA. CALLING SEQUENCE : THE HEADING OF THE PROCEDURE READS : "PROCEDURE" EIALPHA(X,N,ALPHA); "VALUE" N,X;"INTEGER" N;"REAL" X;"ARRAY" ALPHA; "CODE" 35081; THE MEANING OF THE FORMAL PARAMETERS IS : X: <ARITHMETIC EXPRESSION>; THE REAL X OCCURING IN THE INTEGRAND. N: <ARITHMETIC EXPRESSION>; UPPER BOUND FOR THE INTEGER I OCCURING IN THE INTEGRAND; ALPHA: <ARRAY IDENTIFIER>; "ARRAY" ALPHA[0:N]; THE VALUE OF THE INTEGRAL(EXP(-X*T)*T**I DT) FROM T=1 TO T=INFINITY IS STORED IN ALPHA[I]. PROCEDURES USED : NONE. RUNNING TIME : CIRCA ( 6 + N * .8 ) * "-4 SEC. LANGUAGE : ALGOL 60. METHOD AND PERFORMANCE : THE INTEGRAL IS CALCULATED BY MEANS OF THE RECURSION FORMULA A[N]:=A[0] + N * A[N-1] / X, WITH A[0]:= EXP(-X)/X. FOR X CLOSE TO ZERO, EIALPHA MIGHT CAUSE OVERFLOW, SINCE THE VALUE OF THE INTEGRAL IS INFINITE FOR X=0. THE PROCEDURE IS NOT PROTECTED AGAINST THIS TYPE OF OVERFLOW. THE MINIMAL VALUE FOR THE ARGUMENT X DEPENDS ON THE PARAMETER N : N=20 X CIRCA "-14 N=15 X CIRCA "-18 N=10 X CIRCA "-28 N= 5 X CIRCA "-53 THE RECURSION FORMULA IS STABLE AND VARIOUS TESTS EXECUTED ON THE CD CYBER 7228 SHOWED A RELATIVE ACCURACY OF AT LEAST .2"-12. 1SECTION : 6.5.1 (SEPTEMBER 1974) PAGE 4 EXAMPLE OF USE : "BEGIN" "INTEGER" K;"REAL" "ARRAY" A[0:5]; EIALPHA(.25,5,A); "FOR" K:=0 "STEP" 1 "UNTIL" 5 "DO" OUTPUT(61,"("DBBB,N,/")",K,A[K]); "END" DELIVERS : 0 +3.1152031322856"+000 1 +1.5576015661428"+001 2 +1.2772332842371"+002 3 +1.5357951442168"+003 4 +2.4575837510601"+004 5 +4.9151986541516"+005 . REFERENCES: SEE REFERENCE [1] OF THE PROCEDURE NONEXPENX(THIS SECTION). SUBSECTION: ENX. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS : "PROCEDURE" ENX(X, N1, N2, A); "VALUE" X, N1, N2; "REAL" X; "INTEGER" N1, N2; "ARRAY" A; "CODE" 35086; THE MEANING OF THE FORMAL PARAMETERS IS : X : <ARITHMETIC EXPRESSION>; ENTRY: THE (REAL) POSITIVE X OCCURING IN THE INTEGRAND; N1, N2: <ARITHMETIC EXPRESSION>; ENTRY: LOWER AND UPPER BOUND, RESPECTIVELY, OF THE INTEGER N OCCURING IN THE INTEGRAND; A: <ARRAY IDENTIFIER>; "ARRAY" A[N1:N2]; EXIT: THE VALUE OF THE INTEGRAL(EXP(-X * T)/T**I DT) FROM T=1 TO T= INFINITY IS STORED IN A[I]. PROCEDURES USED: EI = CP35080, NONEXPENX = CP35087. RUNNING TIME: DEPENDS STRONGLY ON THE VALUES OF X, N1, AND N2, WITH A MAXIMUM OF ROUGHLY ( 5 + .1 * NUMBER OF NECESSARY ITERATIONS ) MSEC. LANGUAGE: ALGOL 60. METHOD AND PERFORMANCE: SEE METHOD AND PERFORMANCE OF THE PROCEDURE NONEXPENX(THIS SECTION) 1SECTION : 6.5.1 (SEPTEMBER 1974) PAGE 5 SUBSECTION: NONEXPENX. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS : "PROCEDURE" NONEXPENX(X, N1, N2, A); "VALUE" X, N1, N2; "REAL" X; "INTEGER" N1, N2; "ARRAY" A; "CODE" 35087; THE MEANING OF THE FORMAL PARAMETERS IS : X: <ARITHMETIC EXPRESSION>; ENTRY: THE (REAL) POSITIVE X OCCURING IN THE INTEGRAND; N1, N2: <ARITHMETIC EXPRESSION>; ENTRY: LOWER AND UPPER BOUND, RESPECTIVELY, OF THE INTEGER I OCCURING IN THE INTEGRAND; A: <ARRAY IDENTIFIER>; "ARRAY" A[N1:N2]; EXIT: THE VALUE OF EXP(X) * INTEGRAL(EXP(-X*T)/T**I DT) FROM T=1 TO T=INFINITY IS STORED IN A[I]. PROCEDURES USED: ENX = CP35086. RUNNING TIME: DEPENDS STRONGLY ON THE VALUES OF X, N1, AND N2, WITH A MAXIMUM OF ROUGHLY ( 5 + .1 * NUMBER OF NECESSARY ITERATIONS) MSEC. LANGUAGE: ALGOL 60. METHOD AND PERFORMANCE: THE SEQUENCE OF INTEGRALS IS GENERATED BY MEANS OF THE RECURRENCE RELATION: E(N+1,X) = (EXP(-X) - X * E(N,X))/N. FOR REASONS OF STABILITY THE RECURSION STARTS WITH E(N0,X), WHERE N0=ENTIER(X+.5), (SEE ALSO REF[5]). THE INTEGRALS ARE THEN COMPUTED BY BACKWARD RECURRENCE IF N<N0 AND BY FORWARD RECURRENCE IF N>N0. TO OBTAIN THE STARTING VALUES E(N0,X) OF THE RECURSION THE FOLLOWING CASES ARE DISTINGUISHED: A) N0 = 1: THE PROCEDURE EI IS USED (THIS SECTION); B) N0<=10: A TAYLOR EXPANSION ABOUT X=N0 IS USED, WHICH MADE IT NECESSARY TO STORE THE VALUES OF E(N,N) IN THE PROCEDURE FOR N= 2, 3,...,10; C) N0 >10: THE FOLLOWING CONTINUED FRACTION IS USED: EXP(X)*E(N,X) = 1/(X+N/(1+1/(X+(N+1)/(1+...)))), (SEE ALSO REF[4], EQ.(2.3)); THE CASES A) AND B) ARE TREATED IN ENX, WHILE NONEXPENX EVALUATES THE CONTINUED FRACTION IN CASE C). ENX CALLS FOR NONEXPENX IN CASE C). NONEXPENX CALLS FOR ENX IN THE CASES A) AND B). VARIOUS TESTS SHOWED A RELATIVE ACCURACY OF AT LEAST 5"-14. 1SECTION : 6.5.1 (SEPTEMBER 1974) PAGE 6 REFERENCES: [1].M.ABRAMOWITZ AND I.A.STEGUN. HANDBOOK OF MATHEMATICAL FUNCTIONS. DOVER PUBLICATIONS, INC. NEW YORK (1965). [2] W.J.CODY AND H.C.THACHER, JR. RATIONAL CHEBYSHEV APPROXIMATIONS FOR THE EXPONENTIAL INTEGRAL E1(X). MATH. COMP. 22 (JULY 1968), 641-649. [3] W.J.CODY AND H.C.THACHER, JR. CHEBYSHEV APPROXIMATIONS FOR THE EXPONENTIAL INTEGRAL EI(X). MATH. COMP. 23 (APRIL 1969), 289-303. [4].W.GAUTSCHI. EXPONENTIAL INTEGRALS. CACM, DECEMBER 1973, P.761-763. [5].W.GAUTSCHI. RECURSIVE COMPUTATION OF CERTAIN INTEGRALS. JACM, VOL.8, 1961, P.21-40. EXAMPLE OF USE: IN THE FOLLOWING PROGRAM WE COMPUTE THE VALUES OF E(40,1.1), E(41,1.1), E(42,1.1) AND EXP(X)*E(1,50.1). "BEGIN" "INTEGER" I; "REAL" "ARRAY" A[40:42], B[1:1]; ENX(1.1, 40, 42, A); "FOR" I:= 40, 41, 42 "DO" OUTPUT(61,"("4B,"("E(")",DD,"(",1.1)= ")",N/")",I,A[I]); NONEXPENX(50.1, 1, 1, B); OUTPUT(61,"("/,4B,"("EXP(50.1)*E(1,50.1)= ")",N")",B[1]); "END" THIS PROGRAM DELIVERS: E(40,1.1)= +8.2952134128634"-003 E(41,1.1)= +8.0936587235982"-003 E(42,1.1)= +7.9016599781006"-003 EXP(50.1)*E(1,50.1)= +1.9576696324723"-002 1SECTION : 6.5.1 (SEPTEMBER 1974) PAGE 7 SOURCE TEXT(S): 0"CODE" 35080; "REAL" "PROCEDURE" EI(X);"VALUE" X;"REAL" X; "BEGIN" "REAL" "ARRAY" P,Q[0:7]; "IF" X>24 "THEN" "BEGIN" P[0]:= +1.00000000000058 ;Q[1]:= 1.99999999924131 ; P[1]:=X-3.00000016782085 ;Q[2]:=-2.99996432944446 ; P[2]:=X-5.00140345515924 ;Q[3]:=-7.90404992298926 ; P[3]:=X-7.49289167792884 ;Q[4]:=-4.31325836146628 ; P[4]:=X-3.08336269051763"+1;Q[5]:= 2.95999399486831"+2; P[5]:=X-1.39381360364405 ;Q[6]:=-6.74704580465832 ; P[6]:=X+8.91263822573708 ;Q[7]:= 1.04745362652468"+3; P[7]:=X-5.31686623494482"+1; EI:=EXP(X)*(1+JFRAC(7,Q,P)/X)/X "END" "ELSE" "IF" X>12 "THEN" "BEGIN" P[0]:= +9.99994296074708"-1;Q[1]:= 1.00083867402639 ; P[1]:=X-1.95022321289660 ;Q[2]:=-3.43942266899870 ; P[2]:=X+1.75656315469614 ;Q[3]:= 2.89516727925135"+1; P[3]:=X+1.79601688769252"+1;Q[4]:= 7.60761148007735"+2; P[4]:=X-3.23467330305403"+1;Q[5]:= 2.57776384238440"+1; P[5]:=X-8.28561994140641 ;Q[6]:= 5.72837193837324"+1; P[6]:=X-1.86545454883399"+1;Q[7]:= 6.95000655887434"+1; P[7]:=X-3.48334653602853 ; EI:=EXP(X)*JFRAC(7,Q,P)/X "END" "ELSE" "IF" X>6 "THEN" "BEGIN" P[0]:= +1.00443109228078 ;Q[1]:= 5.27468851962908"-1; P[1]:=X-4.32531132878135"+1;Q[2]:= 2.73624119889328"+3; P[2]:=X+6.01217990830080"+1;Q[3]:= 1.43256738121938"+1; P[3]:=X-3.31842531997221"+1;Q[4]:= 1.00367439516726"+3; P[4]:=X+2.50762811293560"+1;Q[5]:=-6.25041161671876 ; P[5]:=X+9.30816385662165 ;Q[6]:= 3.00892648372915"+2; P[6]:=X-2.19010233854880"+1;Q[7]:= 3.93707701852715 ; P[7]:=X-2.18086381520724 ; EI:=EXP(X)*JFRAC(7,Q,P)/X "END" "ELSE" "IF" X>0 "THEN" "BEGIN" "REAL" T,R,X0,XMX0; P[0]:=-1.95773036904548"+8;Q[0]:=-8.26271498626055"+7; P[1]:= 3.89280421311201"+6;Q[1]:= 8.91925767575612"+7; P[2]:=-2.21744627758845"+7;Q[2]:=-2.49033375740540"+7; P[3]:=-1.19623669349247"+5;Q[3]:= 4.28559624611749"+6; P[4]:=-2.49301393458648"+5;Q[4]:=-4.83547436162164"+5; P[5]:=-4.21001615357070"+3;Q[5]:= 3.57300298058508"+4; P[6]:=-5.49142265521085"+2;Q[6]:=-1.60708926587221"+3; P[7]:=-8.66937339951070 ;Q[7]:= 3.41718750000000"+1; X0:=.372507410781367; T:=X/3-1; R:=CHEPOLSUM(7,T,P)/CHEPOLSUM(7,T,Q); XMX0:=(X-409576229586/1099511627776)-.767177250199394"-12; "COMMENT" 1SECTION : 6.5.1 (SEPTEMBER 1974) PAGE 8 ; "IF" ABS(XMX0)>.037 "THEN" T:=LN(X/X0) "ELSE" "BEGIN" "REAL" Z,Z2; P[0]:= .837207933976075"+1;Q[0]:= .418603966988037"+1; P[1]:=-.652268740837103"+1;Q[1]:=-.465669026080814"+1; P[2]:= .569955700306720 ;Q[2]:= .1"+1; Z:=XMX0/(X+X0);Z2:=Z*Z; T:=Z*POL(2,Z2,P)/POL(2,Z2,Q) "END"; EI:=T+XMX0*R "END" "ELSE" "IF" X>-1 "THEN" "BEGIN" "REAL" Y; P[0]:=-4.41785471728217"+4;Q[0]:= 7.65373323337614"+4; P[1]:= 5.77217247139444"+4;Q[1]:= 3.25971881290275"+4; P[2]:= 9.93831388962037"+3;Q[2]:= 6.10610794245759"+3; P[3]:= 1.84211088668000"+3;Q[3]:= 6.35419418378382"+2; P[4]:= 1.01093806161906"+2;Q[4]:= 3.72298352833327"+1; P[5]:= 5.03416184097568 ;Q[5]:= 1; Y:=-X; EI:=LN(Y)-POL(5,Y,P)/POL(5,Y,Q) "END" "ELSE" "IF" X>-4 "THEN" "BEGIN" "REAL" Y; P[0]:= 8.67745954838444"-8;Q[0]:= 1; P[1]:= 9.99995519301390"-1;Q[1]:= 1.28481935379157"+1; P[2]:= 1.18483105554946"+1;Q[2]:= 5.64433569561803"+1; P[3]:= 4.55930644253390"+1;Q[3]:= 1.06645183769914"+2; P[4]:= 6.99279451291003"+1;Q[4]:= 8.97311097125290"+1; P[5]:= 4.25202034768841"+1;Q[5]:= 3.14971849170441"+1; P[6]:= 8.83671808803844 ;Q[6]:= 3.79559003762122 ; P[7]:= 4.01377664940665"-1;Q[7]:= 9.08804569188869"-2; Y:=-1/X; EI:=-EXP(X)*POL(7,Y,P)/POL(7,Y,Q) "END" "ELSE" "BEGIN" "REAL" Y; P[0]:=-9.99999999998447"-1;Q[0]:= 1; P[1]:=-2.66271060431811"+1;Q[1]:= 2.86271060422192"+1; P[2]:=-2.41055827097015"+2;Q[2]:= 2.92310039388533"+2; P[3]:=-8.95927957772937"+2;Q[3]:= 1.33278537748257"+3; P[4]:=-1.29885688746484"+3;Q[4]:= 2.77761949509163"+3; P[5]:=-5.45374158883133"+2;Q[5]:= 2.40401713225909"+3; P[6]:=-5.66575206533869 ;Q[6]:= 6.31657483280800"+2; Y:=-1/X; EI:=-EXP(X)*Y*(1+Y*POL(6,Y,P)/POL(6,Y,Q)) "END" "END" EI 1SECTION : 6.5.1 (SEPTEMBER 1974) PAGE 9 ; "EOP" "CODE" 35081; "PROCEDURE" EIALPHA(X,N,ALPHA); "VALUE" X,N;"REAL" X;"INTEGER" N;"ARRAY" ALPHA; "BEGIN" "REAL" A,B,C;"INTEGER" K; C:=1/X;A:=EXP(-X); B:=ALPHA[0]:=A*C; "FOR" K:=1 "STEP" 1 "UNTIL" N "DO" ALPHA[K]:=B:=(A+K*B)*C "END" EIALPHA; "EOP" 0"CODE" 35086; "PROCEDURE" ENX(X, N1, N2, A); "VALUE" X, N1, N2; "REAL" X; "INTEGER" N1, N2; "ARRAY" A; "IF" X<= 1.5 "THEN" "BEGIN" "REAL" W, E; "INTEGER" I; W:= -EI(-X); "IF" N1=1 "THEN" A[1]:=W; "IF" N2>1 "THEN" E:= EXP(-X); "FOR" I:=2 "STEP" 1 "UNTIL" N2 "DO" "BEGIN" W:= (E - X * W)/(I - 1); "IF" I>= N1 "THEN" A[I]:=W "END" "END" "ELSE" "BEGIN" "INTEGER" I, N; "REAL" W, E, AN; N:=ENTIER(X+.5); "IF" N<=10 "THEN" "BEGIN" "REAL" F, W1, T, H; "REAL" "ARRAY" P[2:19]; P[ 2]:=.37534261820491"-1; P[11]:=.135335283236613 ; P[ 3]:=.89306465560228"-2; P[12]:=.497870683678639"-1; P[ 4]:=.24233983686581"-2; P[13]:=.183156388887342"-1; P[ 5]:=.70576069342458"-3; P[14]:=.673794699908547"-2; P[ 6]:=.21480277819013"-3; P[15]:=.247875217666636"-2; P[ 7]:=.67375807781018"-4; P[16]:=.911881965554516"-3; P[ 8]:=.21600730159975"-4; P[17]:=.335462627902512"-3; P[ 9]:=.70411579854292"-5; P[18]:=.123409804086680"-3; P[10]:=.23253026570282"-5; P[19]:=.453999297624848"-4; "COMMENT" 1SECTION : 6.5.1 (SEPTEMBER 1974) PAGE 10 ; F:= W:= P[N]; E:= P[N+9]; W1:= T:= 1; H:= X-N; "FOR" I:=N-1, I-1 "WHILE" ABS(W1)>"-15 * W "DO" "BEGIN" F:= (E - I * F)/N; T:= -H * T / (N-I); W1:= T * F; W:= W + W1 "END" "END" "ELSE" "BEGIN" "ARRAY" B[N:N]; NONEXPENX(X, N, N, B); W:= B[N] * EXP(-X) "END"; "IF" N1=N2 & N1=N "THEN" A[N]:=W "ELSE" "BEGIN" E:= EXP(-X); AN:=W; "IF" N<=N2 & N>=N1 "THEN" A[N]:=W; "FOR" I:= N-1 "STEP" -1 "UNTIL" N1 "DO" "BEGIN" W:= (E - I * W)/X; "IF" I<= N2 "THEN" A[I]:= W "END"; W:=AN; "FOR" I:=N+1 "STEP" 1 "UNTIL" N2 "DO" "BEGIN" W:= (E - X * W)/(I - 1); "IF" I>=N1 "THEN" A[I]:=W "END" "END" "END" ENX 1SECTION : 6.5.1 (SEPTEMBER 1974) PAGE 11 ; "EOP" 0"CODE" 35087; "PROCEDURE" NONEXPENX(X, N1, N2, A); "VALUE" X, N1, N2; "REAL" X; "INTEGER" N1, N2; "ARRAY" A; "BEGIN" "INTEGER" I, N; "REAL" W, AN; N:= "IF" X<=1.5 "THEN" 1 "ELSE" ENTIER(X+.5); "IF" N<=10 "THEN" "BEGIN" "ARRAY" B[N:N]; ENX(X, N, N, B); W:= B[N] * EXP(X) "END" "ELSE" "BEGIN" "INTEGER" K, K1; "REAL" UE, VE, WE, WE1, UO, VO, WO, WO1, R, S; UE:=1; VE:= WE:= 1/(X+N); WE1:=0; UO:=1; VO:= -N/(X * (X + N + 1)); WO1:= 1/X; WO:= VO + WO1; W:= (WE + WO)/2; K1:=1; "FOR" K:=K1 "WHILE" WO-WE>"-15 * W & WE>WE1 & WO<WO1 "DO" "BEGIN" WE1:= WE; WO1:=WO; R:= N+K; S:= R + X + K; UE:= 1/(1-K*(R-1)*UE/((S-2)*S)); UO:= 1/(1-K* R *UO/( S * S-1)); VE:= VE * (UE-1); VO:= VO * (UO-1); WE:= WE + VE; WO:= WO + VO; W:= (WE + WO)/2; K1:= K1 + 1 "END" "END"; AN:=W; "IF" N<=N2 & N>=N1 "THEN" A[N]:=W; "FOR" I:= N-1 "STEP" -1 "UNTIL" N1 "DO" "BEGIN" W:= (1 - I * W)/X; "IF" I<= N2 "THEN" A[I]:=W "END"; W:=AN; "FOR" I:= N+1 "STEP" 1 "UNTIL" N2 "DO" "BEGIN" W:= (1 - X * W)/(I - 1); "IF" I>=N1 "THEN" A[I]:=W "END" "END" EXPENX; "EOP" 1SECTION : 6.5.2 (MARCH 1977) PAGE 1 AUTHOR(S): H.FIOLET, N.TEMME. INSTITUTE: MATHEMATICAL CENTRE. RECEIVED: 740317. BRIEF DESCRIPTION: THIS SECTION CONTAINS TWO PROCEDURES: THE PROCEDURE SINCOSINT CALCULATES THE SINE INTEGRAL SI(X) AND THE COSINE INTEGRAL CI(X) DEFINED BY SI(X) = INTEGRAL FROM 0 TO X OF SIN(T)/T DT AND CI(X) = GAMMA + LN(ABS(X)) + INTEGRAL FROM 0 TO X OF (COS(T)-1)/T DT, WHERE GAMMA DENOTES EULER'S CONSTANT (SEE [1] EQ. 5.2.1 AND 5.2.2); THE AUXILIARY PROCEDURE SINCOSFG CALCULATES F(X) AND G(X) DEFINED BY F(X) = CI(X) * SIN(X) - (SI(X) - PI / 2) * COS(X) AND G(X) =-CI(X) * COS(X) - (SI(X) - PI / 2) * SIN(X); FOR X=0 THE VALUES OF CI(X), F(X) AND G(X) ARE UNDEFINED; THE FOLLOWING RELATIONS CONCERNING NEGATIVE X ARE VALID: SI(-X) = -SI(X), CI(-X) = CI(X), F(-X) = -F(X), G(-X) = G(X). KEYWORDS: SINE INTEGRAL, COSINE INTEGRAL. SUBSECTION: SINCOSINT. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS : "PROCEDURE" SINCOSINT(X,SI,CI); "VALUE" X; "REAL" X, SI, CI; "CODE" 35084; THE MEANING OF THE FORMAL PARAMETERS IS : X : <ARITHMETIC EXPRESSION>; ENTRY: THE (REAL) ARGUMENT OF SI(X) AND CI(X); SI: <VARIABLE>; EXIT: THE VALUE OF SI(X); CI: <VARIABLE>; EXIT: THE VALUE OF CI(X). 1SECTION : 6.5.2 (SEPTEMBER 1974) PAGE 2 PROCEDURES USED: SINCOSFG = CP35385, CHEPOLSUM = CP31046. RUNNING TIME: "IF" ABS(X) <= 4 "THEN" ABOUT 3.8 MSEC "ELSE" ABOUT 7.5 MSEC . LANGUAGE: ALGOL 60. METHOD AND PERFORMANCE: SEE METHOD AND PERFORMANCE OF THE PROCEDURE SINCOSFG (THIS SECTION). SUBSECTION: SINCOSFG. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS : "PROCEDURE" SINCOSFG(X,F,G); "VALUE" X; "REAL" X, F, G; "CODE" 35085; THE MEANING OF THE FORMAL PARAMETERS IS : X: <ARITHMETIC EXPRESSION>; ENTRY: THE (REAL) ARGUMENT OF F(X) AND G(X); F: <VARIABLE>; EXIT: THE VALUE OF F(X); G: <VARIABLE>; EXIT: THE VALUE OF G(X). PROCEDURES USED: SINCOSINT = CP35084, CHEPOLSUM = CP31046. RUNNING TIME: "IF" ABS(X) <= 4 "THEN" ABOUT 4.7 MSEC "ELSE" ABOUT 6.5 MSEC . LANGUAGE: ALGOL 60. 1SECTION : 6.5.2 (MARCH 1977) PAGE 3 METHOD AND PERFORMANCE: IF ABS(X) <= 4 THE SINE AND COSINE INTEGRALS ARE REPRESENTED BY TRUNCATED CHEBYSHEV SERIES. ON THIS INTERVAL THE FUNCTIONS F AND G ARE CALCULATED BY MEANS OF THE EQUATIONS GIVEN IN THE BRIEF DESCRIPTION. IF ABS(X) > 4 THE FUNCTIONS F AND G ARE REPRESENTED BY TRUNCATED CHEBYSHEV SERIES. IN THIS CASE THE SINE AND COSINE INTEGRALS ARE COMPUTED BY MEANS OF THE FOLLOWING RELATIONS: SI(X) = PI / 2 - F(X) * COS(X) - G(X) * SIN(X) AND CI(X) = F(X) * SIN(X) - G(X) * COS(X). THE FUNCTION VALUES ARE COMPUTED WITH A RELATIVE PRECISION OF ABOUT "-13. WHEN USING THE PROCEDURE SINCOSINT FOR LARGE VALUES OF X , THE RELATIVE ACCURACY MAINLY DEPENDS ON THE ACCURACY OF THE FUNCTIONS SIN(X) AND COS(X). REFERENCES: [1].M.ABRAMOWITZ AND I.STEGUN (EDS.),1964. HANDBOOK OF MATHEMATICAL FUNCTIONS WITH FORMULAS, GRAPHS AND MATHEMATICAL TABLES. APPL. MATH. SER. 55, U.S.GOVT. PRINTING OFFICE,WASHINGTON, D.C. [2].R.BULIRSCH. NUMERICAL CALCULATION OF THE SINE, COSINE AND FRESNEL INTEGRALS HANDBOOK SERIES SPECIAL FUNCTIONS. NUM. MATH. 9, 1967, PP380-385. EXAMPLE OF USE: IN THE FOLLOWING PROGRAM WE COMPUTE THE VALUES OF SI(X), CI(X), F(X) AND G(X) FOR X = 1; "BEGIN" "REAL" SI, CI, F, G; SINCOSINT(1, SI, CI); SINCOSFG(1, F, G); OUTPUT(61,"("4B,"("SI(1)= ")",N,2B,"("CI(1)= ")",N/")",SI,CI); OUTPUT(61,"("4B,"(" F(1)= ")",N,2B,"(" G(1)= ")",N ")", F, G); "END" THIS PROGRAM DELIVERS: SI(1)= +9.46083070367166"-001 CI(1)= +3.37403922900972"-001 F(1)= +6.21449624235829"-001 G(1)= +3.43377961556442"-001 1SECTION : 6.5.2 (MARCH 1977) PAGE 4 SOURCE TEXT(S): 0"CODE" 35084; "PROCEDURE" SINCOSINT(X,SI,CI); "VALUE" X; "REAL" X,SI,CI; "BEGIN" "REAL" ABSX,Z,F,G; ABSX:= ABS(X); "IF" ABSX <= 4 "THEN" "BEGIN" "REAL" "ARRAY" A[0:10]; "REAL" Z2; A[0] :=+2.7368706803630"+00; A[1]:=-1.1106314107894"+00; A[2] :=+1.4176562194666"-01; A[3]:=-1.0252652579174"-02; A[4] :=+4.6494615619880"-04; A[5]:=-1.4361730896642"-05; A[6] :=+3.2093684948229"-07; A[7]:=-5.4251990770162"-09; A[8] :=+7.1776288639895"-11; A[9]:=-7.6335493723482"-13; A[10]:=+6.6679958346983"-15; Z:= X / 4; Z2:= Z * Z; G:= Z2 +Z2 - 1; SI:= Z * CHEPOLSUM(10,G,A); A[0] :=+2.9659601400727"+00; A[1]:=-9.4297198341830"-01; A[2] :=+8.6110342738169"-02; A[3]:=-4.7776084547139"-03; A[4] :=+1.7529161205146"-04; A[5]:=-4.5448727803752"-06; A[6] :=+8.7515839180060"-08; A[7]:=-1.2998699938109"-09; A[8] :=+1.5338974898831"-11; A[9]:=-1.4724256070277"-13; A[10]:=+1.1721420798429"-15; CI:= .577215664901533 + LN(ABSX) - Z2 * CHEPOLSUM(10,G,A) "END" "ELSE" "BEGIN" "REAL" CX,SX; SINCOSFG(X,F,G); CX:= COS(X); SX:= SIN(X); SI:= 1.570796326794897; "IF" X<0 "THEN" SI:= -SI; SI:= SI - F * CX - G * SX; CI:= F * SX - G * CX "END" "END" SINCOSINT 1SECTION : 6.5.2 (MARCH 1977) PAGE 5 ; "EOP" 0"CODE" 35085; "PROCEDURE" SINCOSFG(X,F,G); "VALUE" X; "REAL" X,F,G; "BEGIN" "REAL" ABSX,SI,CI; ABSX:= ABS(X); "IF" ABSX <= 4 "THEN" "BEGIN" "REAL" CX,SX; SINCOSINT(X,SI,CI); CX:= COS(X); SX:= SIN(X); SI:= SI - 1.570796326794897; F:= CI * SX - SI * CX; G:=-CI * CX - SI * SX "END" "ELSE" "BEGIN" "REAL" "ARRAY" A[0:23]; A[0] :=+9.6578828035185"-01; A[1] :=-4.3060837778597"-02; A[2] :=-7.3143711748104"-03; A[3] :=+1.4705235789868"-03; A[4] :=-9.8657685732702"-05; A[5] :=-2.2743202204655"-05; A[6] :=+9.8240257322526"-06; A[7] :=-1.8973430148713"-06; A[8] :=+1.0063435941558"-07; A[9] :=+8.0819364822241"-08; A[10]:=-3.8976282875288"-08; A[11]:=+1.0335650325497"-08; A[12]:=-1.4104344875897"-09; A[13]:=-2.5232078399683"-10; A[14]:=+2.5699831325961"-10; A[15]:=-1.0597889253948"-10; A[16]:=+2.8970031570214"-11; A[17]:=-4.1023142563083"-12; A[18]:=-1.0437693730018"-12; A[19]:=+1.0994184520547"-12; A[20]:=-5.2214239401679"-13; A[21]:=+1.7469920787829"-13; A[22]:=-3.8470012979279"-14; F:= CHEPOLSUM(22, 8/ABSX-1, A) / X; A[0] :=+2.2801220638241"-01; A[1] :=-2.6869727411097"-02; A[2] :=-3.5107157280958"-03; A[3] :=+1.2398008635186"-03; A[4] :=-1.5672945116862"-04; A[5] :=-1.0664141798094"-05; A[6] :=+1.1170629343574"-05; A[7] :=-3.1754011655614"-06; A[8] :=+4.4317473520398"-07; A[9] :=+5.5108696874463"-08; A[10]:=-5.9243078711743"-08; A[11]:=+2.2102573381555"-08; A[12]:=-5.0256827540623"-09; A[13]:=+3.1519168259424"-10; A[14]:=+3.6306990848979"-10; A[15]:=-2.2974764234591"-10; A[16]:=+8.5530309424048"-11; A[17]:=-2.1183067724443"-11; A[18]:=+1.7133662645092"-12; A[19]:=+1.7238877517248"-12; A[20]:=-1.2930281366811"-12; A[21]:=+5.7472339223731"-13; A[22]:=-1.8415468268314"-13; A[23]:=+3.5937256571434"-14; G:= 4 * CHEPOLSUM(23, 8/ABSX-1, A) / ABSX /ABSX "END" "END" SINCOSFG; "EOP" 1SECTION : 6.6 (SEPTEMBER 1974) PAGE 1 AUTHOR(S) : D. T. WINTER,N.M.TEMME. INSTITUTE: MATHEMATICAL CENTRE RECEIVED: 730727 BRIEF DESCRIPTION: THIS SECTION CONTAINS THE FOLLOWING PROCEDURES: RECIP GAMMA: THIS PROCEDURE CALCULATES THE RECIPROCAL OF THE GAMMA FUNCTION FOR ARGUMENTS IN THE RANGE [.5,1.5]; MOREOVER ODD AND EVEN PARTS ARE DELIVERED; GAMMA: THIS PROCEDURE CALCULATES THE GAMMA FUNCTION; LOG GAMMA: THIS PROCEDURE CALCULATES THE NATURAL LOGARITHM OF THE GAMMA FUNCTION FOR POSITIVE ARGUMENTS. INCOMGAM : COMPUTES THE INCOMPLETE GAMMA FUNCTIONS CORRESPONDING TO THE DEFINITIONS 6.5.2 AND 6.5.3 IN REFERENCE [1]. THE COMPUTATIONS ARE BASED ON PADE-APPROXIMATIONS. LET B(X,P,Q) = INTEGRAL FROM 0 TO X OF T**(P-1)*(1-T)**(Q-1)*DT, P>0, Q>0, 0<=X<=1; B IS CALLED THE INCOMPLETE BETA FUNCTION. LET I(X,P,Q) = B(X,P,Q)/B(1,P,Q); I IS CALLED THE INCOMPLETE BETA FUNCTION RATIO. INCBETA : COMPUTES I(X,P,Q); 0<=X<=1, P>0, Q>0; IBPPLUSN: COMPUTES I(X,P+N,Q) FOR N=0(1)NMAX, 0<=X<=1, P>0, Q>0; IBQPLUSN: COMPUTES I(X,P,Q+N) FOR N=0(1)NMAX, 0<=X<=1, P>0, Q>0. THE REMAINING FOUR PROCEDURES ARE AUXILIARY PROCEDURES FOR INCBETA, IBPPLUSN AND IBQPLUSN. KEYWORDS: GAMMA-FUNCTION, INCOMPLETE GAMMA-FUNCTION, PADE-APPROXIMATION, CONTINUED FRACTION, INCOMPLETE BETA-FUNCTION, INCOMPLETE BETA-FUNCTION RATIO. 1SECTION : 6.6 (SEPTEMBER 1974) PAGE 2 SUBSECTION : RECIP GAMMA. CALLING SEQUENCE: THE HEADING OF THIS PROCEDURE IS: "REAL" "PROCEDURE" RECIP GAMMA(X, ODD, EVEN); "VALUE" X; "REAL" X, ODD, EVEN; "CODE" 35060; RECIP GAMMA:= 1/GAMMA(1-X). THE MEANING OF THE FORMAL PARAMETERS IS: X: <ARITHMETIC EXPRESSION>; THE ARGUMENT. THIS ARGUMENT SHOULD SATISFY -.5 <= X < = .5 (ACTUALLY THE GAMMA FUNCTION IS CALCULATED FOR 1 - X, I.E. IF ONE WANTS TO CALCULATE 1/GAMMA(1), ONE HAS TO SET X TO 0); ODD: <IDENTIFIER>; EXIT: THE ODD PART OF 1 / GAMMA(1 - X) DIVIDED BY (2 * X); I.E. (1 / GAMMA(1 - X) - 1 / GAMMA(1 + X)) / (2 * X); EVEN: <IDENTIFIER>; EXIT: THE EVEN PART OF 1 / GAMMA(1 - X) DIVIDED BY 2; I.E. (1 / GAMMA(1 - X) + 1 / GAMMA(1 + X)) / 2; PROCEDURES USED: NONE. REQUIRED CENTRAL MEMORY: EXECUTION FIELD LENGTH: AN ARRAY OF 12 ELEMENTS IS USED. LANGUAGE: ALGOL-60. METHOD AND PERFORMANCE: THE RECIPROCAL OF THE GAMMA FUNCTION IS APPROXIMATED BY A TRUNCATED CHEBYSHEV SERIES. ODD AND EVEN PART ARE CALCULATED SEPARATELY. THE COEFFICIENTS OF THE CHEBYSHEV SERIES AS GIVEN IN THE PROCEDURE TEXT SHOULD GUARANTEE A PRECISION OF 14 DECIMAL DIGITS, HOWEVER AS THESE COEFFICIENTS CAN NOT BE READ IN FULL PRECISION UNDER CD-ALGOL VERSION 3, THIS PRECISION CAN NOT BE GUARANTEED. A PRECISION OF 13 DECIMAL DIGITS HOWEVER WILL BE OBTAINED. MOREOVER FOR THE ARGUMENT 1 (I.E. X = 0) EVEN AND RECIP GAMMA BOTH YIELD THE CORRECT VALUE. 1SECTION : 6.6 (SEPTEMBER 1974) PAGE 3 EXAMPLE OF USE: THE FOLLOWING PROGRAM: "BEGIN" "REAL" X, ODD, EVEN; X:= RECIP GAMMA(.4, ODD, EVEN); OUTPUT(61, "(""("0.4")", 3(N), /")", X, ODD, EVEN); X:= RECIP GAMMA(0, ODD, EVEN); OUTPUT(61, "(""("0.0")", 3(N)")", X, ODD, EVEN) "END" YIELDS THE FOLLOWING RESULTS: 0.4 +6.7150497244208"-001 -5.6944440692994"-001 +8.9928273521406"-001 0.0 +1.0000000000000"+000 -5.7721566490154"-001 +1.0000000000000"+000 SUBSECTION : GAMMA. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE IS: "REAL" "PROCEDURE" GAMMA(X); "VALUE" X; "REAL" X; "CODE" 35061; GAMMA:= THE VALUE OF THE GAMMA-FUNCTION AT X. THE MEANING OF THE FORMAL PARAMETER IS: X: <ARITHMETIC EXPRESSION>; THE ARGUMENT. IF ONE OF THE FOLLOWING THREE CONDITIONS IS FULFILLED OVERFLOW WILL OCCUR: 1: THE ARGUMENT IS TOO LARGE (> 177); 2: THE ARGUMENT IS A NON-POSITIVE INTEGER; 3: THE ARGUMENT IS TOO 'CLOSE' TO A LARGE (IN ABSOLUTE VALUE) NON-POSITIVE INTEGER. PROCEDURES USED: RECIP GAMMA = CP35060 LOG GAMMA = CP35062. REQUIRED CENTRAL MEMORY: EXECUTION FIELD LENGTH: NO AUXILIARY ARRAYS ARE DECLARED. LANGUAGE: ALGOL-60. 1SECTION : 6.6 (SEPTEMBER 1974) PAGE 4 METHOD AND PERFORMANCE: WE DISTINGUISH BETWEEN THE FOLLOWING CASES FOR THE ARGUMENT X: X < .5: IN THIS CASE THE FORMULA GAMMA(X) * GAMMA(1-X) = PI / SIN(PI*X) IS USED. HOWEVER THE SINE FUNCTION IS NOT CALCULATED DIRECTLY ON THE ARGUMENT PI*X BUT ON THE ARGUMENT PI*(X MOD .5), IN THIS WAY A BIG DECREASE OF PRECISION IS AVOIDED. THE PRECISION HERE DEPENDS STRONGLY ON THE PRECISION OF THE SINE FUNCTION; HOWEVER A PRECISION BETTER THAN 12 DECIMAL DIGITS CAN BE EXPECTED IN THE GAMMA FUNCTION. .5 <= X <= 1.5: HERE THE PROCEDURE RECIP GAMMA IS CALLED. A PRECISION OF MORE THAN 13 DECIMAL DIGITS IS OBTAINED; MOREOVER: GAMMA(1) = 1. 1.5 < X <= 22: THE RECURSION FURMULA GAMMA(1 + X) = X * GAMMA(X) IS USED. THE PRECISION DEPENDS ON THE NUMBER OF RECURSIONS NEEDED, A PRECISION BETTER THAN 10 DECIMAL DIGITS IS ALWAYS OBTAINED. THE UPPERBOUND OF 22 HAS BEEN CHOSEN, BECAUSE NOW IT IS ASSURED THAT FOR ALL INTEGER ARGUMENTS FOR WHICH THE VALUE OF THE GAMMA FUNCTION IS REPRESENTABLE (AND THIS IS THE CASE FOR ALL INTEGER ARGUMENTS IN THE RANGE [1,22]), THIS VALUE IS OBTAINED, I.E. GAMMA(I) = 1 * 2 * ... * (I - 1). X > 22: NOW THE PROCEDURES LOG GAMMA AND EXP ARE USED. THE PRECISION STRONGLY DEPENDS ON THE PRECISION OF THE EXPONENTIAL FUNCTION, AND NO BOUND FOR THE ERROR CAN BE GIVEN. EXAMPLE OF USE: THE PROGRAM: "BEGIN" "REAL" X; "FOR" X:= -8.5, .25, 1.5, 22, 50 "DO" OUTPUT(61, "("+2Z.2D3B, N, /")", X, GAMMA(X)) "END" YIELDS THE FOLLOWING RESULTS: -8.50 -2.6335215159963"-005 +.25 +3.6256099082219"+000 +1.50 +8.8622692545276"-001 +22.00 +5.1090942171709"+019 +50.00 +6.0828186403422"+062 1SECTION : 6.6 (SEPTEMBER 1974) PAGE 5 SUBSECTION : LOG GAMMA. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE IS: "REAL" "PROCEDURE" LOG GAMMA(X); "VALUE" X; "REAL" X; "CODE" 35062; LOG GAMMA:= THE NATURAL LOGARITHM OF THE GAMMA FUNCTION AT X. THE MEANING OF THE FORMAL PARAMETER IS: X: <ARITHMETIC EXPRESSION>; THE ARGUMENT. THIS ARGUMENT MUST BE POSITIVE. PROCEDURES USED: NONE. REQUIRED CENTRAL MEMORY: EXECUTION FIELD LENGTH: AN ARRAY OF 18 ELEMENTS IS USED. LANGUAGE: ALGOL-60. METHOD AND PERFORMANCE: WE DISTIGUISH BETWEEN THE FOLLOWING CASES FOR THE ARGUMENT X (IN MOST CASES NOTHING IS SAID ABOUT PRECISION, AS THIS HIGHLY DEPENDS ON THE PRECISION OF THE NATURAL LOGARITHM; HOWEVER, A PRECISION BETTER THAN 11 DECIMAL DIGITS IS ALWAYS OBTAINED): 0 < X < 1: HERE THE RECURSION FORMULA (LOG GAMMA(X)=LOG GAMMA(1+X)-LN(X) ) IS USED. 1 <= X <= 2: ON THIS INTERVAL THE TRUNCATED CHEBYSHEV SERIES FOR THE FUNCTION LOG GAMMA(X) / ((X-1)*(X-2)) IS USED. IN THIS WAY A PRECISION BETTER THAN 13 DECIMAL DIGITS IS ASSURED. 2 < X <= 13: THE RECURSION FORMULA LOG GAMMA(X) = LOG GAMMA(1-X) + LN(X) IS USED. 13 < X <= 22: AS FOR X < 1 THE FORMULA LOG GAMMA(X) = LOG GAMMA(1+X)-LN(X) IS USED. X < 22: IN THIS CASE LOG GAMMA IS CALCULATED BY USE OF THE ASYMPTOTIC EXPANSION FOR LOG GAMMA(X) - (X - .5) * LN(X) . 1SECTION : 6.6 (SEPTEMBER 1974) PAGE 6 EXAMPLE OF USE: THE FOLLOWING PROGRAM: "BEGIN" "REAL" X; "FOR" X:= .25, 1.5, 12, 15, 80 "DO" OUTPUT(61, "("+2Z.2D3B, N, /")", X, LOG GAMMA(X)) "END" YIELDS THE FOLLOWING RESULTS: +.25 +1.2880225246981"+000 +1.50 -1.2078223763524"-001 +12.00 +1.7502307845874"+001 +15.00 +2.5191221182739"+001 +80.00 +2.6929109765102"+002 SUBSECTION : INCOMGAM. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "PROCEDURE" INCOMGAM(X,A,KLGAM,GRGAM,GAM,EPS); "VALUE" X,A,EPS; "REAL" X,A,KLGAM,GRGAM,GAM,EPS; "CODE" 35030; THE MEANING OF THE FORMAL PARAMETERS IS: X: <ARITHMETIC EXPRESSION>; THE INDEPENDENT ARGUMENT X, X>=0; A: <ARITHMETIC EXPRESSION>; THE INDEPENDENT PARAMETER A, A>0; KLGAM: <VARIABLE>; EXIT: THE INTEGRAL FROM 0 TO X OF EXP(-T)*T**(A-1)*DT IS DELIVERED IN KLGAM; GRGAM: <VARIABLE>; EXIT: THE INTEGRAL FROM X TO INFINITY OF EXP(-T)* T**(A-1)*DT IS DELIVERED IN GRGAM; GAM: <ARITHMETIC EXPRESSION>; ENTRY: THE VALUE OF THE GAMMAFUNCTION WITH ARGUMENT A. FOR THIS EXPRESSION THE "REAL" "PROCEDURE" GAMMA(X); "CODE" 35061 MAY BE USED; EPS: <ARITHMETIC EXPRESSION>; ENTRY: THE DESIRED RELATIVE ACCURACY. THE VALUE OF EPS SHOULD NOT BE SMALLER THAN THE MACHINE ACCURACY, WHICH IS ABOUT "-14. 1SECTION : 6.6 (SEPTEMBER 1974) PAGE 7 PROCEDURES USED: NONE. RUNNING TIME: DEPENDS ON THE VALUES OF X,A,EPS. FOR THE EXAMPLE BELOW THE EXECUTION TIME IS 0.003 SEC. LANGUAGE: ALGOL 60. METHOD AND PERFORMANCE: FOR THE METHOD SEE REFERENCE [4]. THE RELATIVE ACCURACY OF THE RESULTS DEPENDS NOT ONLY ON THE QUANTITY EPS, BUT ALSO ON THE ACCURACY OF THE FUNCTIONS EXP AND GAMMA. ESPECIALLY FOR LARGE VALUES OF X AND A THE DESIRED ACCURACY CANNOT BE GUARANTEED. REFERENCES: SEE REFERENCES [1] AND [4] OF THE PROCEDURE IBQPLUSN(THIS SECTION). EXAMPLE OF USE: "BEGIN" "REAL" P,Q; INCOMGAM(3,4,P,Q,1*2*3.0,2.0**(-48)); "COMMENT" 1*2*3 = GAMMA(4); OUTPUT(61,"("/,"("KLGAM AND GRGAM ARE")", /,2(N)")",P,Q); "END" DELIVERS: KLGAM AND GRGAM ARE +2.1166086673066"+000 +3.8833913326934"+000. 1SECTION : 6.6 (SEPTEMBER 1974) PAGE 8 SUBSECTION : INCBETA. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS : "REAL" "PROCEDURE" INCBETA(X,P,Q,EPS); "VALUE" X,P,Q,EPS; "REAL" X,P,Q,EPS; "CODE" 35050; INCBETA DELIVERS THE VALUE OF I(X,P,Q); THE MEANING OF THE FORMAL PARAMETERS IS : X: <ARITHMETIC EXPRESSION>; THE ARGUMENT. THIS ARGUMENT SHOULD SATISFY 0<=X<=1; P: <ARITHMETIC EXPRESSION>; PARAMETER: SEE DEFINITION IN BRIEF DESCRIPTION; P>0; Q: <ARITHMETIC EXPRESSION>; PARAMETER: SEE DEFINITION IN BRIEF DESCRIPTION; Q>0; EPS: <ARITHMETIC EXPRESSION>; ENTRY: THE DESIRED RELATIVE ACCURACY; EPS SHOULD NOT BE SMALLER THAN THE MACHINE ACCURACY. PROCEDURES USED: GAMMA = CP 35061. REQUIRED CENTRAL MEMORY: EXECUTION FIELD LENGTH: NO AUXILIARY ARRAYS ARE USED. METHOD AND PERFORMANCE: THE INCOMPLETE BETA FUNCTION I(X,P,Q) IS APPROXIMATED BY THE CONTINUED FRACTION CORRESPONDING TO FORMULA 26.5.8 IN REFERENCE[1]. IF X > .5 THE RELATION I(X,P,Q) = 1 - I(1-X,Q,P) IS USED. IT IS ADVISED TO USE IN INCBETA ONLY SMALL VALUES OF P AND Q, SAY 0 < P <= 5, 0 < Q <= 5. FOR OTHER RANGES OF THE PARAMETERS P AND Q THE PROCEDURES IBPPLUSN AND IBQPLUSN CAN BE USED. INCBETA SATISFIES INCBETA = X IF X = 0 OR X = 1, WHATEVER P AND Q. THERE IS NO CONTROL ON THE PARAMETERS X,P,Q FOR THEIR INTENDED RANGES. 1SECTION : 6.6 (SEPTEMBER 1974) PAGE 9 REFERENCES: SEE REFERENCES [1], [2] AND [3] OF THE PROCEDURE IBQPLUSN (THIS SECTION). EXAMPLE OF USE: THE FOLLOWING PROGRAM: "BEGIN" OUTPUT(61,"("N")",INCBETA(.3,1.4,1.5,1/2**46)) "END" YIELDS THE FOLLOWING RESULT: +2.7911593308577"-001. SUBSECTION : IBPPLUSN. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS : "PROCEDURE" IBPPLUSN(X,P,Q,NMAX,EPS,I); "VALUE" X,P,Q,NMAX,EPS; "INTEGER" NMAX; "REAL" X,P,Q,EPS; "ARRAY" I; "CODE" 35051; THE MEANING OF THE FORMAL PARAMETERS IS : X: <ARITHMETIC EXPRESSION>; THE ARGUMENT. THIS ARGUMENT SHOULD SATISFY 0<=X<=1; P: <ARITHMETIC EXPRESSION>; PARAMETER: SEE DEFINITION IN BRIEF DESCRIPTION; P>0. IT IS ADVISED TO TAKE 0<P<=1; Q: <ARITHMETIC EXPRESSION>; PARAMETER: SEE DEFINITION IN BRIEF DESCRIPTION; Q>0; NMAX: <ARITHMETIC EXPRESSION>; NMAX INDICATES THE MAXIMUM NUMBER OF FUNCTION VALUES I(X,P+N,Q) TO BE GENERATED; EPS: <ARITHMETIC EXPRESSION>; ENTRY: THE DESIRED RELATIVE ACCURACY; EPS SHOULD NOT BE SMALLER THAN THE MACHINE ACCURACY; I: <ARRAY IDENTIFIER>; "ARRAY" I[0:NMAX]; NMAX>=0; EXIT: I[N] = I(X,P+N,Q) FOR N=0(1)NMAX. 1SECTION : 6.6 (SEPTEMBER 1974) PAGE 10 PROCEDURES USED: IXQFIX = CP 35053; IXPFIX = CP 35054. BOTH PROCEDURES IXQFIX AND IXPFIX CALL FOR INCBETA = CP 35050; FORWARD = CP 35055; BACKWARD = CP 35056. REQUIRED CENTRAL MEMORY: EXECUTION FIELD LENGTH: AN ARRAY OF NMAX + 1 ELEMENTS IS TO BE INSERTED BY THE USER. AN AUXILIARY ARRAY OF ENTIER(Q) + 1 ELEMENTS IS DECLARED IN THE AUXILIARY PROCEDURES. METHOD AND PERFORMANCE: SEE REFERENCE [2] AND [3]. IN [2] THE PROCEDURE IBPPLUSN IS CALLED INCOMPLETE BETA Q FIXED. THERE IS NO CONTROL ON THE PARAMETERS X,P,Q,NMAX FOR THEIR INTENDED RANGES. REFERENCES: SEE REFERENCES [1], [2] AND [3] OF THE PROCEDURE IBQPLUSN (THIS SECTION). EXAMPLE OF USE: THE FOLLOWING PROGRAM: "BEGIN" "REAL" "ARRAY" ISUBX[0:2]; IBPPLUSN(.3,.4,1.5,2,1/2**46,ISUBX); OUTPUT(61,"("3(N)")",ISUBX[0],ISUBX[1],ISUBX[2]) "END" YIELDS THE FOLLOWING RESULTS: +7.2167087410147"-001 +2.7911593308576"-001 +9.8932849957944"-002. 1SECTION : 6.6 (SEPTEMBER 1974) PAGE 11 SUBSECTION : IBQPLUSN. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS : "PROCEDURE" IBQPLUSN(X,P,Q,NMAX,EPS,I); "VALUE" X,P,Q,NMAX,EPS; "INTEGER" NMAX; "REAL" X,P,Q,EPS; "ARRAY" I; "CODE" 35052; THE MEANING OF THE FORMAL PARAMETERS IS : X: <ARITHMETIC EXPRESSION>; THE ARGUMENT. THIS ARGUMENT SHOULD SATISFY 0<=X<=1; P: <ARITHMETIC EXPRESSION>; PARAMETER: SEE DEFINITION IN BRIEF DESCRIPTION; P>0; Q: <ARITHMETIC EXPRESSION>; PARAMETER: SEE DEFINITION IN BRIEF DESCRIPTION; Q>0; IT IS ADVISED TO TAKE 0<Q<=1; NMAX: <ARITHMETIC EXPRESSION>; NMAX INDICATES THE MAXIMUM NUMBER OF FUNCTION VALUES I(X,P,Q+N) TO BE GENERATED; EPS: <ARITHMETIC EXPRESSION>; ENTRY: THE DESIRED RELATIVE ACCURACY; EPS SHOULD NOT BE SMALLER THAN THE MACHINE ACCURACY; I: <ARRAY IDENTIFIER>; "ARRAY" I[0:NMAX]; NMAX>=0; EXIT: I[N] = I(X,P,Q+N) FOR N=0(1)NMAX. PROCEDURES USED: IXQFIX = CP 35053; IXPFIX = CP 35054. BOTH PROCEDURES IXQFIX AND IXPFIX CALL FOR INCBETA = CP 35050; FORWARD = CP 35055; BACKWARD = CP 35056. REQUIRED CENTRAL MEMORY: EXECUTION FIELD LENGTH: AN ARRAY OF NMAX + 1 ELEMENTS IS TO BE INSERTED BY THE USER. AN AUXILIARY ARRAY OF ENTIER(P) + 1 ELEMENTS IS DECLARED IN THE AUXILIARY PROCEDURES. METHOD AND PERFORMANCE: SEE REFERENCE [2] AND [3]. IN [2] THE PROCEDURE IBQPLUSN IS CALLED INCOMPLETE BETA P FIXED. THERE IS NO CONTROL ON THE PARAMETERS X,P,Q,NMAX FOR THEIR INTENDED RANGES. 1SECTION : 6.6 (SEPTEMBER 1974) PAGE 12 REFERENCES: [1].M.ABRAMOWITZ AND I.A.STEGUN (ED.). HANDBOOK OF MATHEMATICAL FUNCTIONS. DOVER PUBLICATIONS, INC., NEW YORK, 1965. [2].W.GAUTSCHI. COMM.A.C.M. 7, 1964, ALGORITHM 222, P 143. [3].W.GAUTSCHI. SIAM REV. 9, 1967, PP 24-82. [4].Y.L.LUKE. SIAM J. MATH. ANAL. VOL.1, 1971, PP. 266-281. EXAMPLE OF USE: THE FOLLOWING PROGRAM: "BEGIN" "REAL" "ARRAY" ISUBX[0:2]; IBQPLUSN(.3,1.4,.5,2,1/2**46,ISUBX); OUTPUT(61,"("3(N)")",ISUBX[0],ISUBX[1],ISUBX[2]) "END" YIELDS THE FOLLOWING RESULTS: +8.9449529793325"-002 +2.7911593308576"-001 +4.4728681067173"-001. THE REMAINING PROCEDURES AND SUBSECTIONS ARE: THE REMAINING PROCEDURES AND SUBSECTIONS ARE: SUBSECTION : IXQFIX. CALLING SEQUENCE : "PROCEDURE" IXQFIX(X,P,Q,NMAX,EPS,I); "VALUE" X,P,Q,NMAX,EPS; "REAL" X,P,Q,EPS; "INTEGER" NMAX; "ARRAY" I; "CODE" 35053; SUBSECTION : IXPFIX. CALLING SEQUENCE : "PROCEDURE" IXPFIX(X,P,Q,NMAX,EPS,I); "VALUE" X,P,Q,NMAX,EPS; "REAL" X,P,Q,EPS; "INTEGER" NMAX; "ARRAY" I; "CODE" 35054; SUBSECTION : FORWARD. CALLING SEQUENCE : "PROCEDURE" FORWARD(X,P,Q,I0,I1,NMAX,I); "VALUE" X,P,Q,I0,I1,NMAX; "INTEGER" NMAX; "REAL" X,P,Q,I0,I1; "ARRAY" I; "CODE" 35055; 1SECTION : 6.6 (SEPTEMBER 1974) PAGE 12A SUBSECTION : BACKWARD. CALLING SEQUENCE : "PROCEDURE" BACKWARD(X,P,Q,I0,NMAX,EPS,I); "VALUE" X,P,Q,I0,NMAX,EPS; "INTEGER" NMAX; "REAL" X,P,Q,I0,EPS; "ARRAY" I; "CODE" 35056; THESE AUXILIARY PROCEDURES ARE NOT DESCRIBED HERE. MORE INFORMATION CAN BE FOUND IN REFERENCE [2], WHERE THE PROCEDURES FORWARD AND BACKWARD HAVE THE SAME NAME, WHILE IXQFIX AND IXPFIX ARE CALLED ISUBXQFIXED AND ISUBXPFIXED RESPECTIVELY. IN THE PROCEDURE BACKWARD WE CHANGED THE STARTING VALUE NU FOR THE BACKWARD RECURRENCE ALGORITHM. THE NEW VALUE OF NU IS MORE REALISTIC. ITS COMPUTATION IS BASED ON SOME ASYMPTOTIC ESTIMATIONS. ALSO THE INITIAL VALUE R=0 IS CHANGED INTO R=X. 1SECTION : 6.6 (SEPTEMBER 1974) PAGE 13 SOURCE TEXT(S) : 0"CODE" 35060; "REAL" "PROCEDURE" RECIP GAMMA(X, ODD, EVEN); "VALUE" X; "REAL" X, ODD, EVEN; "BEGIN" "INTEGER" I; "REAL" ALFA, BETA, X2; "ARRAY" B[1:12]; B[ 1]:= -.28387 65422 76024; B[ 2]:= -.07685 28408 44786; B[ 3]:= +.00170 63050 71096; B[ 4]:= +.00127 19271 36655; B[ 5]:= +.00007 63095 97586; B[ 6]:= -.00000 49717 36704; B[ 7]:= -.00000 08659 20800; B[ 8]:= -.00000 00331 26120; B[ 9]:= +.00000 00017 45136; B[10]:= +.00000 00002 42310; B[11]:= +.00000 00000 09161; B[12]:= -.00000 00000 00170; X2:= X * X * 8; ALFA:= -.00000 00000 00001; BETA:= 0; "FOR" I:= 12 "STEP" - 2 "UNTIL" 2 "DO" "BEGIN" BETA:= -(ALFA * 2 + BETA); ALFA:= - BETA * X2 - ALFA + B[I] "END"; EVEN:= (BETA / 2 + ALFA) * X2 - ALFA + .92187 02936 50453; ALFA:= -.00000 00000 00034; BETA:= 0; "FOR" I:= 11 "STEP" - 2 "UNTIL" 1 "DO" "BEGIN" BETA:= -(ALFA * 2 + BETA); ALFA:= - BETA * X2 - ALFA + B[I] "END"; ODD:= (ALFA + BETA) * 2; RECIP GAMMA:= ODD * X + EVEN "END" RECIP GAMMA; "EOP" 0"CODE" 35061; "REAL" "PROCEDURE" GAMMA(X); "VALUE" X; "REAL" X; "BEGIN" "REAL" Y, S, F, G, ODD, EVEN; "BOOLEAN" INV; "IF" X < .5 "THEN" "BEGIN" Y:= X - ENTIER(X / 2) * 2; S:= 3.14159 26535 8979; "IF" Y >= 1 "THEN" "BEGIN" S:= - S; Y:= 2 - Y "END"; "IF" Y >= .5 "THEN" Y:= 1 - Y; INV:= "TRUE"; X:= 1 - X; F:= S / SIN(3.14159 26535 8979 * Y) "END" "ELSE" INV:= "FALSE"; "IF" X > 22 "THEN" G:= EXP(LOG GAMMA(X)) "ELSE" "BEGIN" S:= 1; NEXT: "IF" X > 1.5 "THEN" "BEGIN" X:= X - 1; S:= S * X; "GOTO" NEXT "END"; G:= S / RECIP GAMMA(1 - X, ODD, EVEN) "END"; GAMMA:= "IF" INV "THEN" F / G "ELSE" G "END" GAMMA 1SECTION : 6.6 (SEPTEMBER 1974) PAGE 14 ; "EOP" 0"CODE" 35062; "REAL" "PROCEDURE" LOG GAMMA(X); "VALUE" X; "REAL" X; "IF" X > 13 "THEN" "BEGIN" "REAL" R, X2; R:= 1; NEXT: "IF" X <= 22 "THEN" "BEGIN" R:= R / X; X:= X + 1; "GOTO" NEXT "END"; X2:= - 1 / (X * X); R:= LN(R); LOG GAMMA:= LN(X) * (X - .5) - X + R + .91893 85332 04672 + (((.59523 80952 38095"-3 * X2 + .79365 07936 50794"-3) * X2 + .27777 77777 77778"-2) * X2 + .83333 33333 33333"-1) / X "END" "ELSE" "BEGIN" "REAL" Y, F, U0, U1, U, Z; "INTEGER" I; "ARRAY" B[1:18]; F:= 1; U0:= U1:= 0; B[ 1]:= -.07611 41616 704358; B[ 2]:= +.00843 23249 659328; B[ 3]:= -.00107 94937 263286; B[ 4]:= +.00014 90074 800369; B[ 5]:= -.00002 15123 998886; B[ 6]:= +.00000 31979 329861; B[ 7]:= -.00000 04851 693012; B[ 8]:= +.00000 00747 148782; B[ 9]:= -.00000 00116 382967; B[10]:= +.00000 00018 294004; B[11]:= -.00000 00002 896918; B[12]:= +.00000 00000 461570; B[13]:= -.00000 00000 073928; B[14]:= +.00000 00000 011894; B[15]:= -.00000 00000 001921; B[16]:= +.00000 00000 000311; B[17]:= -.00000 00000 000051; B[18]:= +.00000 00000 000008; "IF" X < 1 "THEN" "BEGIN" F:= 1 / X; X:= X + 1 "END" "ELSE" NEXT: "IF" X > 2 "THEN" "BEGIN" X:= X - 1; F:= F * X; "GOTO" NEXT "END"; F:= LN(F); Y:= X + X - 3; Z:= Y + Y; "FOR" I:= 18 "STEP" - 1 "UNTIL" 1 "DO" "BEGIN" U:= U0; U0:= Z * U0 + B[I] - U1; U1:= U "END"; LOG GAMMA:= (U0 * Y + .49141 53930 29387 - U1) * (X - 1) * (X - 2) + F "END" LOG GAMMA 1SECTION : 6.6 (MARCH 1977) PAGE 15 ; "EOP" 0"CODE" 35030; "PROCEDURE" INCOMGAM(X,A,KLGAM,GRGAM,GAM,EPS); "VALUE" X,A,EPS; "REAL" X,A,KLGAM,GRGAM,GAM,EPS; "BEGIN" "REAL" C0,C1,C2,D0,D1,D2,X2,AX,P,Q,R,S,R1,R2,SCF; "INTEGER" N; S:= EXP(-X + A * LN(X)); SCF:= "+300; "IF" X <= ("IF" A < 3 "THEN" 1 "ELSE" A) "THEN" "BEGIN" X2:= X * X; AX:= A * X; D0:= 1; P:= A; C0:= S; D1:=(A+1)*(A+2-X); C1:=((A+1) * (A+2)+X) * S; R2:= C1/D1; "FOR" N:= 1, N+1 "WHILE" ABS((R2-R1)/R2) > EPS "DO" "BEGIN" P:= 2+P; Q:= (P+1) * (P*(P+2)-AX); R:= N * (N+A) * (P+2) * X2; C2:= (Q*C1 + R*C0)/P; D2:= (Q*D1 + R*D0)/P; R1:=R2; R2:=C2/D2; C0:=C1; C1:=C2; D0:=D1; D1:=D2; "IF" ABS(C1) > SCF "OR" ABS(D1) > SCF "THEN" "BEGIN" C0:= C0/SCF; C1:= C1/SCF; D0:= D0/SCF; D1:= D1/SCF "END" "END"; KLGAM:= R2/A; GRGAM:= GAM - KLGAM "END" "ELSE" "BEGIN" C0:=A*S; C1:=(1+X)* C0; Q:= X +2 - A; D0:= X; D1:= X * Q; R2:= C1/D1; "FOR" N:=1, N+1 "WHILE" ABS((R2-R1)/R2)>EPS "DO" "BEGIN" Q:= 2 + Q; R:= N * (N+1-A); C2:= Q*C1-R*C0; D2:= Q*D1-R*D0; R1:=R2; R2:=C2/D2; C0:=C1; C1:=C2; D0:=D1; D1:=D2; "IF" ABS(C1) > SCF "OR" ABS(D1) > SCF "THEN" "BEGIN" C0:= C0/SCF; C1:= C1/SCF; D0:= D0/SCF; D1:= D1/SCF "END" "END"; GRGAM:= R2/A; KLGAM:= GAM - GRGAM "END" "END" INCOMGAM 1SECTION : 6.6 (SEPTEMBER 1974) PAGE 16 ; "EOP" 0"CODE" 35050; "REAL" "PROCEDURE" INCBETA(X,P,Q,EPS); "VALUE" X,P,Q,EPS; "REAL" X,P,Q,EPS; "BEGIN" "INTEGER" M,N; "REAL" G,F,FN,FN1,FN2,GN,GN1,GN2,DN,PQ; "BOOLEAN" N EVEN,RECUR; "IF" X=0 "OR" X=1 "THEN" INCBETA:= X "ELSE" "BEGIN" "IF" X>.5 "THEN" "BEGIN" F:= P; P:= Q; Q:= F; X:= 1-X; RECUR:= "TRUE""END" "ELSE" RECUR:= "FALSE"; G:= FN2:= 0; M:= 0; PQ:= P+Q; F:= FN1:= GN1:= GN2:= 1; N EVEN:= "FALSE"; "FOR" N:= 1,N+1 "WHILE" ABS((F-G)/F) > EPS "DO" "BEGIN" "IF" N EVEN "THEN" "BEGIN" M:= M+1; DN:= M*X*(Q-M)/(P+N-1)/(P+N) "END" "ELSE" DN:= -X*(P+M)*(PQ+M)/(P+N-1)/(P+N); G:= F; FN:= FN1+DN*FN2; GN:= GN1+DN*GN2; N EVEN:= ^ N EVEN; F:= FN/GN; FN2:= FN1; FN1:= FN; GN2:= GN1; GN1:= GN "END"; F:= F*X**P*(1-X)**Q*GAMMA(P+Q)/GAMMA(P+1)/GAMMA(Q); "IF" RECUR "THEN" F:= 1-F; INCBETA:= F "END" "END" INCBETA; "EOP" 0"CODE" 35051; "PROCEDURE" IBPPLUSN(X,P,Q,NMAX,EPS,I); "VALUE" X,P,Q,NMAX,EPS; "INTEGER" NMAX; "REAL" X,P,Q,EPS; "ARRAY" I; "BEGIN" "INTEGER" N; "IF" X=0 "OR" X=1 "THEN" "BEGIN" "FOR" N:= 0 "STEP" 1 "UNTIL" NMAX "DO" I[N]:= X "END" "ELSE" "BEGIN" "IF" X <=.5 "THEN" IXQFIX(X,P,Q,NMAX,EPS,I) "ELSE" "BEGIN" IXPFIX(1-X,Q,P,NMAX,EPS,I); "FOR" N:= 0 "STEP" 1 "UNTIL" NMAX "DO" I[N]:= 1-I[N] "END" "END" "END" IBPPLUSN 1SECTION : 6.6 (SEPTEMBER 1974) PAGE 17 ; "EOP" 0"CODE" 35052; "PROCEDURE" IBQPLUSN(X,P,Q,NMAX,EPS,I); "VALUE" X,P,Q,NMAX,EPS; "INTEGER" NMAX; "REAL" X,P,Q,EPS; "ARRAY" I; "BEGIN" "INTEGER" N; "IF" X=0 "OR" X=1 "THEN" "BEGIN" "FOR" N:= 0 "STEP" 1 "UNTIL" NMAX "DO" I[N]:= X "END" "ELSE" "BEGIN" "IF" X <=.5 "THEN" IXPFIX(X,P,Q,NMAX,EPS,I) "ELSE" "BEGIN" IXQFIX(1-X,Q,P,NMAX,EPS,I); "FOR" N:= 0 "STEP" 1 "UNTIL" NMAX "DO" I[N]:= 1-I[N] "END" "END" "END" IBQPLUSN; "EOP" 0"CODE" 35053; "PROCEDURE" IXQFIX(X,P,Q,NMAX,EPS,I); "VALUE" X,P,Q,NMAX,EPS; "REAL" X,P,Q,EPS; "INTEGER" NMAX; "ARRAY" I; "BEGIN" "INTEGER" M,MMAX; "REAL" S,IQ0,IQ1,Q0; M:= ENTIER(Q); S:= Q-M; Q0:= "IF" S>0 "THEN" S "ELSE" S+1; MMAX:= "IF" S>0 "THEN" M "ELSE" M-1; IQ0:= INCBETA(X,P,Q0,EPS); "IF" MMAX>0 "THEN" IQ1:= INCBETA(X,P,Q0+1,EPS); "BEGIN" "ARRAY" IQ[0:MMAX]; FORWARD(X,P,Q0,IQ0,IQ1,MMAX,IQ); BACKWARD(X,P,Q,IQ[MMAX],NMAX,EPS,I) "END" "END" IXQFIX 1SECTION : 6.6 (SEPTEMBER 1974) PAGE 18 ; "EOP" 0"CODE" 35054; "PROCEDURE" IXPFIX(X,P,Q,NMAX,EPS,I); "VALUE" X,P,Q,NMAX,EPS; "REAL" X,P,Q,EPS; "INTEGER" NMAX; "ARRAY" I; "BEGIN" "INTEGER" M,MMAX; "REAL" S,P0,I0,I1,IQ0,IQ1; M:= ENTIER(P); S:= P-M; P0:= "IF" S>0 "THEN" S "ELSE" S+1; MMAX:= "IF" S>0 "THEN" M "ELSE" M-1; I0:= INCBETA(X,P0,Q,EPS); I1:= INCBETA(X,P0,Q+1,EPS); "BEGIN" "ARRAY" IP[0:MMAX]; BACKWARD(X,P0,Q,I0,MMAX,EPS,IP); IQ0:= IP[MMAX]; BACKWARD(X,P0,Q+1,I1,MMAX,EPS,IP); IQ1:= IP[MMAX] "END"; FORWARD(X,P,Q,IQ0,IQ1,NMAX,I) "END" IXPFIX; "EOP" 0"CODE" 35055; "PROCEDURE" FORWARD(X,P,Q,I0,I1,NMAX,I); "VALUE" X,P,Q,I0,I1,NMAX; "INTEGER" NMAX; "REAL" X,P,Q,I0,I1; "ARRAY" I; "BEGIN" "INTEGER" M,N; "REAL" Y,R,S; I[0]:= I0; "IF" NMAX > 0 "THEN" I[1]:= I1; M:= NMAX-1; R:= P+Q-1; Y:= 1-X; "FOR" N:= 1 "STEP" 1 "UNTIL" M "DO" "BEGIN" S:= (N+R)*Y; I[N+1]:= ((N+Q+S)*I[N]-S*I[N-1])/(N+Q) "END" "END" FORWARD 1SECTION : 6.6 (SEPTEMBER 1974) PAGE 19 ; "EOP" 0"CODE" 35056; "PROCEDURE" BACKWARD(X,P,Q,I0,NMAX,EPS,I); "VALUE" X,P,Q,I0,NMAX,EPS; "INTEGER" NMAX; "REAL" X,P,Q,I0,EPS; "ARRAY" I; "BEGIN" "INTEGER" M,N,NU; "REAL" R,PQ,Y,LOGX; "ARRAY" IAPPROX[0:NMAX]; I[0]:= I0; "IF" NMAX>0 "THEN" "BEGIN""FOR" N:= 1 "STEP" 1 "UNTIL" NMAX "DO" IAPPROX[N]:= 0; PQ:= P+Q-1; LOGX:= LN(X); R:= NMAX+(LN(EPS)+Q*LN(NMAX))/LOGX; NU:= ENTIER(R-Q*LN(R)/LOGX); L1: N:= NU; R:= X; L2: Y:= (N+PQ)*X; R:= Y/(Y+(N+P)*(1-R)); "IF" N<= NMAX "THEN" I[N]:= R; N:= N-1; "IF" N >= 1 "THEN" "GOTO" L2; R:= I0; "FOR" N:= 1 "STEP" 1 "UNTIL" NMAX "DO" R:= I[N]:= I[N]*R; "FOR" N:= 1 "STEP" 1 "UNTIL" NMAX "DO" "IF" ABS((I[N]-IAPPROX[N])/I[N]) > EPS "THEN" "BEGIN" "FOR" M:= 1 "STEP" 1 "UNTIL" NMAX "DO" IAPPROX[M]:= I[M]; NU:= NU+5; "GOTO" L1 "END" "END" "END" BACKWARD; "EOP" 1SECTION : 6.7 (OCTOBER 1974) PAGE 1 AUTHOR: S.P.N. VAN KAMPEN. INSTITUTE: MATHEMATICAL CENTRE. RECEIVED: 740410. BRIEF DESCRIPTION: THIS SECTION CONTAINS FIVE PROCEDURES: A) THE PROCEDURE ERRORFUNCTION COMPUTES THE ERROR FUNCTION AND COMPLEMENTARY ERROR FUNCTION FOR A REAL ARGUMENT, I.E. ERF(X) = 2 / SQRT(PI) * INTEGRAL FROM 0 TO X OF EXP(-T ** 2)DT AND ERFC(X) = 2 / SQRT(PI) * INTEGRAL FROM X TO INFINITY OF EXP(-T ** 2)DT = 1 - ERF(X), (SEE E.G. [1] EQ. 7.1.1 AND 7.1.2); THESE FORMULAS ARE RELATED TO THE NORMAL OR GAUSSIAN PROBABILITY FUNCTION: P(X) = 1 / SQRT(2 * PI) * INTEGRAL FROM - INFINITY TO X OF EXP(-T ** 2 / 2)DT = (1 + ERF(X / SQRT(2))) / 2 AND Q(X) = 1 / SQRT(2 * PI) * INTEGRAL FROM X TO INFINITY OF EXP(-T ** 2 / 2)DT = ERFC(X / SQRT(2)) / 2, (SEE E.G. [1] EQ. 26.2.2, 26.2.3 AND 26.2.29). B) THE AUXILIARY PROCEDURE NONEXPERFC COMPUTES EXP(X * X) * ERFC(X). C) THE PROCEDURE INVERSE ERROR FUNCTION CALCULATES THE INVERSE OF THE ERROR FUNCTION DEFINED BY: Y = INVERF(X), WHERE X = ERF(Y) = = 2 / SQRT(PI) * INTEGRAL FROM 0 TO Y OF EXP(-T ** 2) DT, (SEE THE PROCEDURE ERRORFUNCTION (THIS SECTION) ). D) THE PROCEDURE FRESNEL CALCULATES THE FRESNEL INTEGRALS C(X) AND S(X) DEFINED BY C(X) = INTEGRAL FROM 0 TO X OF COS(PI / 2 * T * T)DT AND S(X) = INTEGRAL FROM 0 TO X OF SIN(PI / 2 * T * T)DT (SEE [1] EQ. 7.3.1 AND 7.3.2); 1SECTION : 6.7 (OCTOBER 1974) PAGE 2 E) THE AUXILIARY PROCEDURE FG CALCULATES F(X) AND G(X) DEFINED BY F(X) = (0.5 - S(X))COS(PI / 2 * X * X) - (0.5 - C(X))SIN(PI / 2 * X * X) AND G(X) = (0.5 - C(X))COS(PI / 2 * X * X) + (0.5 - S(X))SIN(PI / 2 * X * X) (SEE [1] EQ. 7.3.5 AND 7.3.6). KEYWORDS: ERROR FUNCTION, COMPLEMENTARY ERROR FUNCTION, NORMAL PROBABILITY FUNCTION, GAUSSIAN PROBABILITY FUNCTION, FRESNEL INTEGRALS, INVERSE ERROR FUNCTION. 1SECTION : 6.7 (OCTOBER 1974) PAGE 3 SUBSECTION: ERRORFUNCTION. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS : "PROCEDURE" ERRORFUNCTION(X, ERF, ERFC); "VALUE" X; "REAL" X, ERF, ERFC; "CODE" 35021; THE MEANING OF THE FORMAL PARAMETERS IS : X: <ARITHMETIC EXPRESSION>; ENTRY: THE (REAL) ARGUMENT OF ERF(X) AND ERFC(X); ERF: <VARIABLE>; EXIT: THE VALUE OF ERF(X), ERFC: <VARIABLE>; EXIT: THE VALUE OF ERFC(X). PROCEDURES USED: NONEXPERFC = CP35022. RUNNING TIME: ABOUT 0.001 100 SEC. LANGUAGE: ALGOL 60. METHOD AND PERFORMANCE: SEE METHOD AND PERFORMANCE OF NONEXPERFC (THIS SECTION). 1SECTION : 6.7 (OCTOBER 1974) PAGE 4 SUBSECTION: NONEXPERFC. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS : "REAL" "PROCEDURE" NONEXPERFC(X); "VALUE" X; "REAL" X; "CODE" 35022; NONEXPERFC DELIVERS THE VALUE OF EXP(X * X) * ERFC(X); THE MEANING OF THE FORMAL PARAMETERS IS : X: <ARITHMETIC EXPRESSION>; ENTRY: THE (REAL) ARGUMENT OF NONEXPERFC. PROCEDURES USED: ERRORFUNCTION = CP35021. RUNNING TIME: ABOUT 0.000 900 SEC. LANGUAGE: ALGOL 60. METHOD AND PERFORMANCE: IF ABS(X) <= 0.5 THE VALUES OF ERF(X) AND ERFC(X) ARE COMPUTED IN THE PROCEDURE ERRORFUNCTION BY MEANS OF RATIONAL CHEBYSHEV APPROXIMATION AS GIVEN IN [2]. ON THIS INTERVAL THE VALUE OF NONEXPERFC(X) = EXP(X * X) * ERFC(X) IS COMPUTED BY CALLING THE PROCEDURE ERRORFUNCTION. IF ABS(X) > 0.5 THE VALUES OF ERF(X) AND ERFC(X) ARE COMPUTED BY CALLING THE PROCEDURE NONEXPERFC, WHILE THE VALUE OF NONEXPERFC(X) IS COMPUTED BY MEANS OF RATIONAL CHEBYSHEV APPROXIMATIONS AS GIVEN IN [2]. THE COMPUTED VALUES OF ERF(X) AND ERFC(X) ARE COMPARED WITH HIGHER PRECISION VALUES USING 4000 PSEUDO-RANDOM ARGUMENTS. IT APPEARED THAT ERF(X) IS COMPUTED WITH AN AVERAGE RELATIVE ERROR 1.93"-15 AND A MAXIMUM RELATIVE ERROR 1.35"-14. IF X < 6 ERFC(X) IS COMPUTED WITH AN AVERAGE RELATIVE ERROR 8.87"-15 AND A MAXIMUM RELATIVE ERROR 1.55"-13. IF X <= 26 ERFC(X) IS COMPUTED WITH AN AVERAGE RELATIVE ERROR 5.71"-14 AND A MAXIMUM RELATIVE ERROR 2.70"-12. IF X > 26 ERFC(X)=0, BECAUSE IN THIS CASE ERFC(X) IS LESS THAN THE SMALLEST REPRESENTABLE POSITIVE NUMBER ON THE CD CYBER 73-28. FOR THIS REASON IT IS ADVISABLE TO COMPUTE FOR X > 26 NONEXPERFC(X) INSTEAD OF ERFC(X). IF X < -26.2 THE PROCEDURE NONEXPERFC WILL BE TERMINATED ABNORMALLY BY CAUSE OF OVERFLOW. REFERENCES: SEE REFERENCES [1] AND [2] OF THE PROCEDURE FG (THIS SECTION). 1SECTION : 6.7 (OCTOBER 1974) PAGE 5 EXAMPLE OF USE: WE COMPUTE THE VALUES OF ERF(1) = 0.84270 07929 49714 8693, ERFC(1) = 0.15729 92070 50285 1307 AND NONEXPERFC(100) = EXP(100 * 100) * ERFC(100) = 0.56416 13782 98943 2905"-2; "BEGIN" "REAL" ERF, ERFC, P; ERRORFUNCTION(1, ERF, ERFC); P:= NONEXPERFC(100); OUTPUT(61, "(""(" ERF(1) = ")", +D.5DB5DB5D, /, "(" ERFC(1) = ")", +D.5DB5DB5D, /, "(" NONEXPERFC(100) = ")", +.5DB5DB5D"+D")", ERF, ERFC, P); "END" THIS PROGRAM DELIVERS: ERF(1) = +0.84270 07929 49713 ERFC(1) = +0.15729 92070 50285 NONEXPERFC(100) = +.56416 13782 98941"-2. 1SECTION : 6.7 (OCTOBER 1974) PAGE 6 SUBSECTION : INVERSE ERROR FUNCTION. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "PROCEDURE" INVERSE ERROR FUNCTION(X, ONEMINX, INVERF); "VALUE" X, ONEMINX; "REAL" X, ONEMINX, INVERF; "CODE" 35023; THE MEANING OF THE FORMAL PARAMETERS IS : X: <ARITHMETIC EXPRESSION>; ENTRY: THE ARGUMENT OF THE FUNCTION INVERF; IT IS NECESSARY THAT -1 < X < 1; IF ABS(X) > 0.8 THE VALUE OF X IS NOT USED IN THE PROCEDURE; ONEMINX: <ARITHMETIC EXPRESSION>; ENTRY: IF ABS(X) <= 0.8 THE VALUE OF ONEMINX IS NOT USED IN THE PROCEDURE; IF ABS(X) > 0.8 ONEMINX HAS TO CONTAIN THE VALUE OF 1 - ABS(X); IN THE CASE THAT ABS(X) IS IN THE NEIGHBOURHOOD OF 1, CANCELLATION OF DIGITS TAKE PLACE IN THE CALCULATION OF 1 - ABS(X); IF THE VALUE 1-ABS(X) IS KNOWN EXACTLY FROM ANOTHER SOURCE, ONEMINX HAS TO CONTAIN THIS VALUE, WHICH WILL GIVE BETTER RESULTS; INVERF: <VARIABLE>; EXIT: THE RESULT OF THE PROCEDURE. PROCEDURES USED: CHEPOLSUM = CP31046, UNDERFLOW = CP30009. RUNNING TIME: ABOUT 0.003 800 SEC. LANGUAGE: ALGOL 60. 1SECTION : 6.7 (OCTOBER 1974) PAGE 7 METHOD AND PERFORMANCE: THE FUNCTION VALUE INVERF IS CALCULATED ON DIFFERENT INTERVALS BY MEANS OF CHEBYSHEV POLYNOMIALS, OF WHICH THE COEFFICIENTS ARE GIVEN IN [1]. ON THE COMPUTED RESULTS WE USED THE TESTS: EPS1:= ABS(ERF(INVERF(X)) / X - 1), EPS2:= ABS(INVERF(ERF(Y)) / Y - 1), EPS3:= ABS((1 - ERF(INVERF(1 - X))) / X - 1). IF ABS(X) < 0.9 UPPER BOUNDS FOR EPS1 AND EPS2 ARE 7.1"-15 AND 4.1"-14 RESP. IF 0.9 < ABS(X) < 1 CANCELLATION OF DIGITS TAKE PLACE IN THE CALCULATION OF 1 - ABS(X). THIS CANCELLED DIGITS ARE ALSO LOST IN THE RESULT. IF THE VALUE OF 1 - ABS(X) IS KNOWN EXACTLY AND GIVEN IN ONEMINX , EPS1 AND EPS2 HAVE THE SAME UPPER BOUND AS BEFORE. IF ABS(X) <= 0.99 AND THE VALUE OF 1 - ABS(X) IS KNOWN EXACTLY EPS3 <= 3.6"-14. FOR "-300 <= 1 - ABS(X) < "-2 WE FOUND EPS3 <= 2.2"-11. REFERENCES: 1. ANTHONY J. STRECOK. ON THE CALCULATION OF THE INVERSE OF THE ERROR FUNCTION. MATH. OF COMP., V. 22, 1968, PP144 - 158. EXAMPLE OF USE: IN THE FOLLOWING PROGRAM WE COMPUTE THE VALUES OF INVERF(0.6) AND INVERF(1 - "-150): "BEGIN" "REAL" INVERF1, INVERF2; INVERSE ERROR FUNCTION(0.6, 0, INVERF1); INVERSE ERROR FUNCTION(1, "-150, INVERF2); OUTPUT(61,"(""(" X = ")", +D.D, "(" 1 - X = ")", +D.3D"+2ZD, "(" INVERF = ")", +.5DB5DB5D"+D, /")", 0.6, 0.4, INVERF1); OUTPUT(61,"(""(" X = ")", +D.D, "(" 1 - X = ")", +D.3D"+2ZD, "(" INVERF = ")", +.5DB5DB5D"+D, /")", 1 - "-150, "-150, INVERF2) "END" THIS PROGRAM DELIVERS: X = +0.6 1 - X = +4.000" -1 INVERF = +.59511 60814 50000"+0 X = +1.0 1 - X = +1.000"-150 INVERF = +.18490 44855 00090"+2 1SECTION : 6.7 (OCTOBER 1974) PAGE 8 SUBSECTION: FRESNEL. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS : "PROCEDURE" FRESNEL(X, C, S); "VALUE" X; "REAL" X, C, S; "CODE" 35027; THE MEANING OF THE FORMAL PARAMETERS IS : X: <ARITHMETIC EXPRESSION>; ENTRY: THE (REAL) ARGUMENT OF C(X) AND S(X); C: <VARIABLE>; EXIT: THE VALUE OF C(X); S: <VARIABLE>; EXIT: THE VALUE OF S(X). PROCEDURES USED: FG = CP35028. LANGUAGE: ALGOL 60. METHOD AND PERFORMANCE: SEE METHOD AND PERFORMANCE OF THE PROCEDURE FG (THIS SECTION). REFERENCES : SEE REF. [1] AND [3] OF THE PROCEDURE FG (THIS SECTION). 1SECTION : 6.7 (OCTOBER 1974) PAGE 9 SUBSECTION: FG. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS : "PROCEDURE" FG(X, F, G); "VALUE" X; "REAL" X, F, G; "CODE" 35028; THE MEANING OF THE FORMAL PARAMETERS IS : X: <ARITHMETIC EXPRESSION>; ENTRY: THE (REAL) ARGUMENT OF F(X) AND G(X); F: <VARIABLE>; EXIT: THE VALUE OF F(X); G: <VARIABLE>; EXIT: THE VALUE OF G(X). PROCEDURES USED: FRESNEL = CP35027. RUNNING TIME: ABOUT 0.001 400 SEC. LANGUAGE: ALGOL 60. METHOD AND PERFORMANCE: IF ABS(X) <= 1.6 THE FRESNEL INTEGRALS ARE COMPUTED WITH RATIONAL CHEBYSHEV APPROXIMATIONS AS GIVEN IN [3]. ON THIS INTERVAL THE FUNCTIONS F AND G ARE CALCULATED BY MEANS OF THE EQUATIONS GIVEN IN THE BRIEF DESCRIPTION. IF ABS(X) > 1.6 THE FUNCTIONS F AND G ARE COMPUTED WITH RATIONAL CHEBYSHEV APPROXIMATIONS AS GIVEN IN [3]. IN THIS CASE THE FRESNEL INTEGRALS ARE COMPUTED BY MEANS OF C(X) = 0.5 + F(X)SIN(PI / 2 * X * X) - G(X)COS(PI / 2 * X * X) AND S(X) = 0.5 - F(X)COS(PI / 2 * X * X) - G(X)SIN(PI / 2 * X * X). IF X < 0 WE USE THE RELATIONS C(-X) = -C(X), S(-X) = -S(X), F(-X) = -F(X) AND G(-X) = -G(X). THE FUNCTION VALUES ARE COMPUTED WITH A RELATIVE PRECISION OF ABOUT "-14. 1SECTION : 6.7 (OCTOBER 1974) PAGE 10 REFERENCES: [1].M.ABRAMOWITZ AND I.A.STEGUN (ED.). HANDBOOK OF MATHEMATICAL FUNCTIONS. DOVER PUBLICATIONS, INC., NEW YORK, 1965. [2].W.J.CODY. RATIONAL CHEBYSHEV APPROXIMATIONS FOR THE ERROR FUNCTION. MATH. COMP. V. 23, 1969, PP631-637. [3].W.J.CODY. CHEBYSHEV APPROXIMATIONS FOR THE FRESNEL INTEGRALS. MATH. COMP. V. 22, 1968, PP450-453. EXAMPLE OF USE: IN THE FOLLOWING PROGRAM WE COMPUTE THE VALUES OF C(X), S(X), F(X) AND G(X) FOR X = 1; "BEGIN" "REAL" C, S, F, G; FRESNEL(1, C, S); FG(1, F, G); OUTPUT(61, "(""(" C(1) = ")", +.5DB5D, "(" S(1) = ")", +.5DB5D, /")", C, S); OUTPUT(61, "(""(" F(1) = ")", +.5DB5D, "(" G(1) = ")", +.5DB5D")", F, G) "END" THIS PROGRAM DELIVERS: C(1) = +.77989 34004 S(1) = +.43825 91474 F(1) = +.27989 34004 G(1) = +.06174 08526 1SECTION : 6.7 (OCTOBER 1974) PAGE 11 SOURCE TEXT(S) : 0"CODE" 35021; "PROCEDURE" ERRORFUNCTION(X, ERF, ERFC); "VALUE" X; "REAL" X, ERF, ERFC; "IF" X > 26 "THEN" "BEGIN" ERF:= 1; ERFC:= 0 "END" "ELSE" "IF" X < -5.5 "THEN" "BEGIN" ERF:= -1; ERFC:= 2 "END" "ELSE" "BEGIN" "REAL" ABSX, C, P, Q; ABSX:= ABS(X); "IF" ABSX <= 0.5 "THEN" "BEGIN" C:= X * X; P:= ((-0.35609 84370 18154"-1 * C + 0.69963 83488 61914"+1) * C + 0.21979 26161 82942"+2) * C + 0.24266 79552 30532"+3; Q:= ((C + 0.15082 79763 04078"+2) * C + 0.91164 90540 45149"+2) * C + 0.21505 88758 69861"+3; ERF:= X * P / Q; ERFC:= 1 - ERF "END" "ELSE" "BEGIN" ERFC:= EXP(-X * X) * NONEXPERFC(ABSX); ERF:= 1 - ERFC; "IF" X < 0 "THEN" "BEGIN" ERF:= -ERF; ERFC:= 2 - ERFC "END" "END" "END" ERRORFUNCTION; "EOP" "CODE" 35023; "PROCEDURE" INVERSE ERROR FUNCTION(X, ONEMINX, INVERF); "VALUE" X, ONEMINX; "REAL" X, ONEMINX, INVERF; "BEGIN" "REAL" ABSX, P, BETAX; "REAL" "ARRAY" A[0 : 23]; ABSX:= ABS(X); "IF" ABSX > 0.8 "AND" ONEMINX > 0.2 "THEN" ONEMINX:= 0; "IF" ABSX <= 0.8 "THEN" "BEGIN" A[ 0]:= 0.99288 53766 18941; A[ 1]:= 0.12046 75161 43104; A[ 2]:= 0.01607 81993 42100; A[ 3]:= 0.00268 67044 37162; A[ 4]:= 0.00049 96347 30236; A[ 5]:= 0.00009 88982 18599; A[ 6]:= 0.00002 03918 12764; A[ 7]:= 0.00000 43272 71618; A[ 8]:= 0.00000 09380 81413; A[ 9]:= 0.00000 02067 34720; A[10]:= 0.00000 00461 59699; A[11]:= 0.00000 00104 16680; A[12]:= 0.00000 00023 71501; A[13]:= 0.00000 00005 43928; A[14]:= 0.00000 00001 25549; A[15]:= 0.00000 00000 29138; A[16]:= 0.00000 00000 06795; A[17]:= 0.00000 00000 01591; A[18]:= 0.00000 00000 00374; A[19]:= 0.00000 00000 00088; A[20]:= 0.00000 00000 00021; A[21]:= 0.00000 00000 00005; INVERF:= CHEPOLSUM(21, X * X / 0.32 - 1, A) * X "END" "ELSE" "IF" ONEMINX >= 25"-4 "THEN" "BEGIN" "COMMENT" 1SECTION : 6.7 (MARCH 1977) PAGE 12 ; A[ 0]:= 0.91215 88034 17554; A[ 1]:= -0.01626 62818 67664; A[ 2]:= 0.00043 35564 72949; A[ 3]:= 0.00021 44385 70074; A[ 4]:= 0.00000 26257 51076; A[ 5]:= -0.00000 30210 91050; A[ 6]:= -0.00000 00124 06062; A[ 7]:= 0.00000 00624 06609; A[ 8]:= -0.00000 00005 40125; A[ 9]:= -0.00000 00014 23208; A[10]:= 0.00000 00000 34384; A[11]:= 0.00000 00000 33584; A[12]:= -0.00000 00000 01458; A[13]:= -0.00000 00000 00810; A[14]:= 0.00000 00000 00053; A[15]:= 0.00000 00000 00020; BETAX:= SQRT(- LN((1 + ABSX) * ONEMINX)); P:= -1.54881 30423 7326 * BETAX + 2.56549 01231 4782; P:= CHEPOLSUM(15, P, A); INVERF:= "IF" X < 0 "THEN" - BETAX * P "ELSE" BETAX * P "END" "ELSE" "IF" ONEMINX >= 5"-16 "THEN" "BEGIN" A[ 0]:= 0.95667 97090 20493; A[ 1]:= -0.02310 70043 09065; A[ 2]:= -0.00437 42360 97508; A[ 3]:= -0.00057 65034 22651; A[ 4]:= -0.00001 09610 22307; A[ 5]:= 0.00002 51085 47025; A[ 6]:= 0.00001 05623 36068; A[ 7]:= 0.00000 27544 12330; A[ 8]:= 0.00000 04324 84498; A[ 9]:= -0.00000 00205 30337; A[10]:= -0.00000 00438 91537; A[11]:= -0.00000 00176 84010; A[12]:= -0.00000 00039 91289; A[13]:= -0.00000 00001 86932; A[14]:= 0.00000 00002 72923; A[15]:= 0.00000 00001 32817; A[16]:= 0.00000 00000 31834; A[17]:= 0.00000 00000 01670; A[18]:= -0.00000 00000 02036; A[19]:= -0.00000 00000 00965; A[20]:= -0.00000 00000 00220; A[21]:= -0.00000 00000 00010; A[22]:= 0.00000 00000 00014; A[23]:= 0.00000 00000 00006; BETAX:= SQRT(- LN((1 + ABSX) * ONEMINX)); P:= -0.55945 76313 29832 * BETAX + 2.28791 57162 6336; P:= CHEPOLSUM(23, P, A); INVERF:= "IF" X < 0 "THEN" - BETAX * P "ELSE" BETAX * P "END" "ELSE" "IF" "NOT" UNDERFLOW(ONEMINX) "THEN" "BEGIN" A[ 0]:= 0.98857 50640 66189; A[ 1]:= 0.01085 77051 84599; A[ 2]:= -0.00175 11651 02763; A[ 3]:= 0.00002 11969 93207; A[ 4]:= 0.00001 56648 71404; A[ 5]:= -0.00000 05190 41687; A[ 6]:= -0.00000 00371 35790; A[ 7]:= 0.00000 00012 17431; A[ 8]:= -0.00000 00001 76812; A[ 9]:= -0.00000 00000 11937; A[10]:= 0.00000 00000 00380; A[11]:= -0.00000 00000 00066; A[12]:= -0.00000 00000 00009; BETAX:= SQRT(- LN((1 + ABSX) * ONEMINX)); P:= -9.19999 23588 3015 / SQRT(BETAX) + 2.79499 08201 2460; P:= CHEPOLSUM(12, P, A); INVERF:= "IF" X < 0 "THEN" - BETAX * P "ELSE" BETAX * P "END" "ELSE" INVERF:= SIGN(X) * 26 "END" INVERSE ERROR FUNCTION 1SECTION : 6.7 (OCTOBER 1974) PAGE 13 ; "EOP" 0"CODE" 35022; "REAL" "PROCEDURE" NONEXPERFC(X); "VALUE" X; "REAL" X; "BEGIN" "REAL" ABSX, ERF, ERFC, C, P, Q; ABSX:= ABS(X); "IF" ABSX <= 0.5 "THEN" "BEGIN" ERRORFUNCTION(X, ERF, ERFC); NONEXPERFC:= EXP(X * X) * ERFC "END" "ELSE" "IF" ABSX < 4 "THEN" "BEGIN" C:= ABSX; P:= ((((((-0.13686 48573 82717"-6 * C + 0.56419 55174 78974"+0) * C + 0.72117 58250 88309"+1) * C + 0.43162 22722 20567"+2) * C + 0.15298 92850 46940"+3) * C + 0.33932 08167 34344"+3) * C + 0.45191 89537 11873"+3) * C + 0.30045 92610 20162"+3; Q:= ((((((C + 0.12782 72731 96294"+2) * C + 0.77000 15293 52295"+2) * C + 0.27758 54447 43988"+3) * C + 0.63898 02644 65631"+3) * C + 0.93135 40948 50610"+3) * C + 0.79095 09253 27898"+3) * C + 0.30045 92609 56983"+3; NONEXPERFC:= "IF" X > 0 "THEN" P / Q "ELSE" EXP(X * X) * 2 - P / Q "END" "ELSE" "BEGIN" C:= 1 / X / X; P:= (((0.22319 24597 34185"-1 * C + 0.27866 13086 09648"-0) * C + 0.22695 65935 39687"-0) * C + 0.49473 09106 23251"-1) * C + 0.29961 07077 03542"-2; Q:= (((C + 0.19873 32018 17135"+1) * C + 0.10516 75107 06793"+1) * C + 0.19130 89261 07830"+0) * C + 0.10620 92305 28468"-1; C:= (C * (-P) / Q + 0.56418 95835 47756) / ABSX; NONEXPERFC:= "IF" X > 0 "THEN" C "ELSE" EXP(X * X) * 2 - C "END" "END" NONEXPERFC; "EOP" 0"CODE" 35027; "PROCEDURE" FRESNEL(X, C, S); "VALUE" X; "REAL" X, C, S; "BEGIN" "REAL" ABSX, X3, X4, A, P, Q, F, G, C1, S1; ABSX:= ABS(X); "IF" ABSX <= 1.2 "THEN" "BEGIN" A:= X * X; X3:= A * X; X4:= A * A; P:= (((5.47711 38568 2687"-6 * X4 - 5.28079 65137 2623"-4) * X4 + 1.76193 95254 3491"-2) * X4 - 1.99460 89882 6184"-1) * X4 + 1; Q:= (((1.18938 90142 2876"-7 * X4 + 1.55237 88527 6994"-5) * X4 + 1.09957 21502 5642"-3) * X4 + 4.72792 11201 0453"-2) * X4 + 1; C:= X * P / Q; P:= (((6.71748 46662 5141"-7 * X4 - 8.45557 28435 2777"-5) * X4 + 3.87782 12346 3683"-3) * X4 - 7.07489 91514 4523"-2) * X4 + 5.23598 77559 8299"-1; "COMMENT" 1SECTION : 6.7 (OCTOBER 1974) PAGE 14 ; Q:= (((5.95281 22767 8410"-8 * X4 + 9.62690 87593 9034"-6) * X4 + 8.17091 94215 2134"-4) * X4 + 4.11223 15114 2384"-2) * X4 + 1; S:= X3 * P / Q "END" "ELSE" "IF" ABSX <= 1.6 "THEN" "BEGIN" A:= X * X; X3:= A * X; X4:= A * A; P:=((((-5.68293 31012 1871"-8 * X4 + 1.02365 43505 6106"-5) * X4 - 6.71376 03469 4922"-4) * X4 + 1.91870 27943 1747"-2) * X4 - 2.07073 36033 5324"-1) * X4 + 1.00000 00000 0111"+0; Q:=((((4.41701 37406 5010"-10 * X4 + 8.77945 37789 2369"-8) * X4 + 1.01344 63086 6749"-5) * X4 + 7.88905 24505 2360"-4) * X4 + 3.96667 49695 2323"-2) * X4 + 1; C:= X * P / Q; P:=((((-5.76765 81559 3089"-9 * X4 + 1.28531 04374 2725"-6) * X4 - 1.09540 02391 1435"-4) * X4 + 4.30730 52650 4367"-3) * X4 - 7.37766 91401 0191"-2) * X4 + 5.23598 77559 8344"-1; Q:=((((2.05539 12445 8580"-10 * X4 + 5.03090 58124 6612"-8) * X4 + 6.87086 26571 8620"-6) * X4 + 6.18224 62019 5473"-4) * X4 + 3.53398 34276 7472"-2) * X4 + 1; S:= X3 * P / Q "END" "ELSE" "IF" ABSX < "15 "THEN" "BEGIN" FG(X, F, G); A:= X * X; A:= (A - ENTIER(A / 4) * 4) * 1.57079 63267 9490; C1:= COS(A); S1:= SIN(A); A:= "IF" X < 0 "THEN" -0.5 "ELSE" 0.5; C:= F * S1 - G * C1 + A; S:= -F * C1 - G * S1 + A "END" "ELSE" C:= S:= SIGN(X) * 0.5 "END" FRESNEL; "EOP" 0"CODE" 35028; "PROCEDURE" FG(X, F, G); "VALUE" X; "REAL" X, F, G; "BEGIN" "REAL" ABSX, C, S, C1, S1, A, XINV, X3INV, C4, P, Q; ABSX:= ABS(X); "IF" ABSX <= 1.6 "THEN" "BEGIN" FRESNEL(X, C, S); A:= X * X * 1.57079 63267 9490; C1:= COS(A); S1:= SIN(A); A:= "IF" X < 0 "THEN" -0.5 "ELSE" 0.5; P:= A - C; Q:= A - S; F:= Q * C1 - P * S1; G:= P * C1 + Q * S1 "END" "ELSE" "IF" ABSX <= 1.9 "THEN" "BEGIN" XINV:= 1 / X; A:= XINV * XINV; X3INV:= A * XINV; C4:= A * A; "COMMENT" 1SECTION : 6.7 (OCTOBER 1974) PAGE 15 ; P:= (((1.35304 23554 0388"+1 * C4 + 6.98534 26160 1021"+1) * C4 + 4.80340 65557 7925"+1) * C4 + 8.03588 12280 3942"+0) * C4 + 3.18309 26850 4906"-1; Q:= (((6.55630 64008 3916"+1 * C4 + 2.49561 99380 5172"+2) * C4 + 1.57611 00558 0123"+2) * C4 + 2.55491 61843 5795"+1) * C4 + 1; F:= XINV * P / Q; P:=((((2.05421 43249 8501"+1 * C4 + 1.96232 03797 1663"+2) * C4 + 1.99182 81867 8903"+2) * C4 + 5.31122 81348 0989"+1) * C4 + 4.44533 82755 0512"+0) * C4 + 1.01320 61881 0275"-1; Q:=((((1.01379 48339 6003"+3 * C4 + 3.48112 14785 6545"+3) * C4 + 2.54473 13318 1822"+3) * C4 + 5.83590 57571 6429"+2) * C4 + 4.53925 01967 3689"+1) * C4 + 1; G:= X3INV * P / Q "END" "ELSE" "IF" ABSX <= 2.4 "THEN" "BEGIN" XINV:= 1 / X; A:= XINV * XINV; X3INV:= A * XINV; C4:= A * A; P:=((((7.17703 24936 5140"+2 * C4 + 3.09145 16157 4430"+3) * C4 + 1.93007 64078 6716"+3) * C4 + 3.39837 13492 6984"+2) * C4 + 1.95883 94102 1969"+1) * C4 + 3.18309 88182 2017"-1; Q:=((((3.36121 69918 0551"+3 * C4 + 1.09334 24898 8809"+4) * C4 + 6.33747 15585 1144"+3) * C4 + 1.08535 06750 0650"+3) * C4 + 6.18427 13817 2887"+1) * C4 + 1; F:= XINV * P / Q; P:=((((3.13330 16306 8756"+2 * C4 + 1.59268 00608 5354"+3) * C4 + 9.08311 74952 9594"+2) * C4 + 1.40959 61791 1316"+2) * C4 + 7.11205 00178 9783"+0) * C4 + 1.01321 16176 1805"-1; Q:=((((1.15149 83237 6261"+4 * C4 + 2.41315 56721 3370"+4) * C4 + 1.06729 67803 0581"+4) * C4 + 1.49051 92279 7329"+3) * C4 + 7.17128 59693 9302"+1) * C4 + 1; G:= X3INV * P / Q "END" "ELSE" "BEGIN" XINV:= 1 / X; A:= XINV * XINV; X3INV:= A * XINV; C4:= A * A; P:=((((2.61294 75322 5142"+4 * C4 + 6.13547 11361 4700"+4) * C4 + 1.34922 02817 1857"+4) * C4 + 8.16343 40178 4375"+2) * C4 + 1.64797 71284 1246"+1) * C4 + 9.67546 03296 7090"-2; Q:=((((1.37012 36481 7226"+6 * C4 + 1.00105 47890 0791"+6) * C4 + 1.65946 46262 1853"+5) * C4 + 9.01827 59623 1524"+3) * C4 + 1.73871 69067 3649"+2) * C4 + 1; F:= (C4 * (-P) / Q + 0.31830 98861 83791) * XINV; P:=(((((1.72590 22465 4837"+6 * C4 + 6.66907 06166 8636"+6) * C4 + 1.77758 95083 8030"+6) * C4 + 1.35678 86781 3756"+5) * C4 + 3.87754 14174 6378"+3) * C4 + 4.31710 15782 3358"+1) * C4 + 1.53989 73381 9769"-1; Q:=(((((1.40622 44112 3580"+8 * C4 + 9.38695 86253 1635"+7) * C4 + 1.62095 60050 0232"+7) * C4 + 1.02878 69305 6688"+6) * C4 + 2.69183 18039 6243"+4) * C4 + 2.86733 19497 5899"+2) * C4 + 1; G:= (C4 * (-P) / Q + 0.10132 11836 42338) * X3INV "END" "END" FG; "EOP" 1SECTION : 6.9.1 (DECEMBER 1978) PAGE 1 AUTHORS: M. BAKKER AND N.M. TEMME. INSTITUTE: MATHEMATICAL CENTRE. RECEIVED: 780601. BRIEF DESCRIPTION: THIS SECTION CONTAINS THE FOLLOWING PROCEDURES: BESS J0; COMPUTES THE ORDINARY BESSEL FUNCTION OF THE FIRST KIND OF ORDER ZERO WITH ARGUMENT X; BESS J1; COMPUTES THE ORDINARY BESSEL FUNCTION OF THE FIRST KIND OF ORDER ONE WITH ARGUMENT X; BESS J; GENERATES AN ARRAY OF ORDINARY BESSEL FUNCTIONS OF THE FIRST KIND OF ORDER L (L = 0,...,N) WITH ARGUMENT X; BESS Y01; COMPUTES THE ORDINARY BESSEL FUNCTIONS OF THE SECOND KIND OF ORDERS ZERO AND ONE WITH ARGUMENT X; X > 0; BESS Y; GENERATES AN ARRAY OF ORDINARY BESSEL FUNCTIONS OF THE SECOND KIND OF ORDER L ( L = 0,...N) WITH ARGUMENT X; X> 0; BESS PQ0; THIS PROCEDURE IS AN AUXILIARY PROCEDURE FOR THE COMPUTATION OF THE ORDINARY BESSEL FUNCTIONS OF ORDER ZERO FOR LARGE VALUES OF THEIR ARGUMENT; BESS PQ1; THIS PROCEDURE IS AN AUXILIARY PROCEDURE FOR THE COMPUTATION OF THE ORDINARY BESSEL FUNCTIONS OF ORDER ONE FOR LARGE VALUES OF THEIR ARGUMENT. 1SECTION : 6.9.1 (DECEMBER 1978) PAGE 2 KEYWORDS: BESSEL FUNCTION, ORDINARY BESSEL FUNCTION OF THE FIRST KIND, ORDINARY BESSEL FUNCTION OF THE SECOND KIND. REFERENCES: [1] ABRAMOWITZ, M., AND STEGUN, I. (EDS), HANDBOOK OF MATHEMATICAL FUNCTIONS WITH FORMULAS, GRAPHS AND MATHEMATICAL TABLES. APPL. MATH. SER. 55, U.S. GOVT. PRINTING OFFICE, WASHINGTON, D.C. (1964). [2] C.W. CLENSHAW, CHEBYSHEV SERIES FOR MATHEMATICAL FUNCTIONS, NAT. PHYS. LAB. MATH. TABLES, VOL. 5, HER MAJESTY'S STATIONARY OFFICE, LONDON (1962). [3] W. GAUTSCHI, COMPUTATIONAL ASPECTS OF THREE TERM RECURRENCE RELATIONS, SIAM REVIEW, VOL. 9, 24-82 (1967). SUBSECTION: BESS J0. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS : "REAL" "PROCEDURE" BESS J0(X); "VALUE" X; "REAL" X; "CODE" 35160; BESS J0 DELIVERS THE ORDINARY BESSEL FUNCTION OF THE FIRST KIND OF ORDER ZERO WITH ARGUMENT X; THE MEANING OF THE FORMAL PARAMETERS IS: X: <ARITHMETIC EXPRESSION>; THE ARGUMENT OF THE BESSEL FUNCTION. PROCEDURES USED: BESS PQ0 = CP 35165. REQUIRED CENTRAL MEMORY: NO ARRAYS ARE USED. 1SECTION : 6.9.1 (DECEMBER 1978) PAGE 3 RUNNING TIME: FOR ABS(X) < 8: LESS THAN 3 MS, FOR ABS(X) >= 8: LESS THAN 5 MS, ON THE CYBER 73/28. METHOD AND PERFORMANCE: CHEBYSHEV SERIES FROM [2]. EXAMPLE OF USE: THE PROGRAM "BEGIN" "REAL" X; X:= 1; OUTPUT(61,"("/,D,6B-.14D "-ZD")", X, BESS J0(X)) "END" PRINTS THE FOLLOWING RESULTS: 1 .76519768655794" 0 SUBSECTION: BESS J1. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "REAL" "PROCEDURE" BESS J1(X); "VALUE" X; "REAL" X; "CODE" 35161; BESS J1 DELIVERS THE ORDINARY BESSEL FUNCTION OF THE FIRST KIND OF ORDER ONE WITH ARGUMENT X; THE MEANING OF THE FORMAL PARAMETERS IS: X: <ARITHMETIC EXPRESSION>; THE ARGUMENT OF THE BESSEL FUNCTION. PROCEDURES USED: BESS PQ1 = CP 35166. REQUIRED CENTRAL MEMORY: NO ARRAYS ARE USED. 1SECTION : 6.9.1 (DECEMBER 1978) PAGE 4 RUNNING TIME: FOR ABS(X) < 8: LESS THAN 3 MS, FOR ABS(X) >= 8: LESS THAN 5 MS, ON THE CYBER 73/28. METHOD AND PERFORMANCE: CHEBYSHEV SERIES FROM [2]. EXAMPLE OF USE: THE PROGRAM "BEGIN" "REAL" X; X:= 1; OUTPUT(61,"("/,D,6B-.14D "-ZD")", X, BESS J1(X)) "END" DELIVERS THE FOLLOWING RESULTS: 1 .44005058574492" 0 SUBSECTION: BESS J. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS : "PROCEDURE" BESS J(X,N,J); "VALUE" X,N; "INTEGER" N; "REAL" X; "ARRAY" J; "CODE" 35162; THE MEANING OF THE FORMAL PARAMETERS IS: X: <ARITHMETIC EXPRESSION>; THE ARGUMENT OF THE BESSEL FUNCTIONS; N: <ARITHMETIC EXPRESSION>; THE UPPER BOUND OF THE INDICES OF ARRAY J; N >= 0; J: <ARRAY IDENTIFIER>; "ARRAY" J[0:N]; EXIT: J[L] IS THE ORDINARY BESSEL FUNCTION OF THE FIRST KIND OF ORDER L AND ARGUMENT X. PROCEDURES USED: START = CP 35185; 1SECTION : 6.9.1 (DECEMBER 1978) PAGE 5 REQUIRED CENTRAL MEMORY: NO AUXILIARY ARRAYS ARE DECLARED. RUNNING TIME: ROUGHLY PROPORTIONAL TO THE MAXIMUM OF 1.359 * X + 72 AND N + 18. METHOD AND PERFORMANCE: MILLER'S ALGORITHM, SEE [3]. EXAMPLE OF USE: THE PROGRAM THE PROGRAM "BEGIN" "REAL" X; "ARRAY" J[0:1]; "FOR" X:= 1,5,10,25 "DO" "BEGIN" BESS J(X,1,J); OUTPUT(61,"("ZZ.D, 2(BB-.D"-ZD),/")", X, J[0] - BESS J0(X),J[1] - BESS J1(X)) "END" "END" DELIVERS THE FOLLOWING RESULTS: 1.0 .2"-13 .2"-13 5.0 -.8"-14 -.4"-14 10.0 -.4"-14 .4"-14 25.0 -.1"-14 -.9"-15 1SECTION : 6.9.1 (DECEMBER 1978) PAGE 6 SUBSECTION: BESS Y01. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS : "PROCEDURE" BESS Y01(X,Y0,Y1); "VALUE" X; "REAL" X,Y0,Y1; "CODE" 35163; THE MEANING OF THE FORMAL PARAMETERS IS: X: <ARITHMETIC EXPRESSION>; THE ARGUMENT OF THE BESSEL FUNCTIONS; X > 0; Y0: <VARIABLE>; EXIT: Y0 HAS THE VALUE OF THE ORDINARY BESSEL FUNCTION OF THE SECOND KIND OF ORDER 0 AND ARGUMENT X; Y1: <VARIABLE>; EXIT: Y1 HAS THE VALUE OF THE ORDINARY BESSEL FUNCTION OF THE SECOND KIND OF ORDER 1 AND ARGUMENT X. PROCEDURES USED: BESS J0 = CP 35160, BESS J1 = CP 35161, BESS PQ0 = CP 35165, BESS PQ1 = CP 35166. REQUIRED CENTRAL MEMORY: NO AUXILIARY ARRAYS ARE DECLARED. RUNNING TIME: ABOUT 15 MS, ON THE CYBER 73/28. METHOD AND PERFORMANCE: CHEBYSHEV SERIES FROM [2]. EXAMPLE OF USE: THE PROGRAM "BEGIN" "REAL" X,Y0,Y1; X:= 1; BESS Y01(X,Y0,Y1); OUTPUT(61,"("/,4BD.D,2(B-.14D"-ZD)")",X,Y0,Y1) "END" 1SECTION : 6.9.1 (DECEMBER 1978) PAGE 7 DELIVERS THE FOLLOWING RESULTS: 1.0 .88256964215676" -1 -.78121282130028" 0 SUBSECTION: BESS Y. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "PROCEDURE" BESS Y(X,N,Y); "VALUE" X,N; "INTEGER" N; "REAL" X; "ARRAY" Y; "CODE" 35164; THE MEANING OF THE FORMAL PARAMETERS IS: X: <ARITHMETIC EXPRESSION>; THE ARGUMENT; THIS ARGUMENT SHOULD SATISFY X > 0; N: <ARITHMETIC EXPRESSION>; THE UPPER BOUND OF THE INDICES OF THE ARRAY Y; N >= 0; Y: <ARRAY IDENTIFIER>; "ARRAY" Y[0:N]; EXIT: Y[I] IS THE VALUE OF THE ORDINARY BESSEL FUNCTION OF THE SECOND KIND OF ORDER I (I = 0,...,N) AND ARGUMENT X. PROCEDURES USED: BESS Y01 = CP 35163. REQUIRED CENTRAL MEMORY: NO AUXILIARY ARRAYS ARE DECLARED. RUNNING TIME: DEPENDS ON N; SEE BESS Y01. METHOD AND PERFORMANCE: Y[0] AND Y[1] ARE COMPUTED BY USING BESS Y01 (CP 35163); THE REMAINING Y[I] ARE COMPUTED BY USING THE RECURRENCE RELATION Y[I+1]:= Y[I] * 2 * I/X - Y[I-1], I >= 1. 1SECTION : 6.9.1 (DECEMBER 1978) PAGE 8 EXAMPLE OF USE: THE PROGRAM "BEGIN" "ARRAY" Y[0:2]; BESS Y(1,2,Y); OUTPUT(61,"("3(-D.13D"-ZD)")", Y[0], Y[1], Y[2]) "END" PRINTS THE FOLLOWING RESULTS: 8.8256964215676"- 2 -7.8121282130028"- 1 -1.6506826068162" 0 SUBSECTION: BESS PQ0. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "PROCEDURE" BESS PQ0(X,P0,Q0); "VALUE" X; "REAL" X,P0,Q0; "CODE" 35165; THE MEANING OF THE FORMAL PARAMETERS IS: X: <ARITHMETIC EXPRESSION>; THE ARGUMENT; THIS ARGUMENT SHOULD SATISFY X > 0; P0: <VARIABLE>; EXIT: P0 CORRESPONDS WITH THE FUNCTION P(X,0) DEFINED IN [1,FORMULAS 9.2.5 AND 9.2.6]; Q0: <VARIABLE>; EXIT: Q0 CORRESPONDS WITH THE FUNCTION Q(X,0) DEFINED IN [1,FORMULAS 9.2.5 AND 9.2.6]. PROCEDURES USED: BESS J0 = CP 35160, BESS Y01 = CP 35163. REQUIRED CENTRAL MEMORY: NO ARRAYS ARE USED. RUNNING TIME: ABOUT 15 MS, ON THE CYBER 73/28. 1SECTION : 6.9.1 (DECEMBER 1978) PAGE 9 METHOD AND PERFORMANCE: FOR X >= 8 CHEBYSHEV SERIES FROM [2], FOR X < 8 WITH BESS J0 AND BESS Y01. EXAMPLE OF USE: SEE SUBSECTION BESS PQ1. SUBSECTION: BESS PQ1. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "PROCEDURE" BESS PQ1(X,P1,Q1); "VALUE" X; "REAL" X,P1,Q1; "CODE" 35166; THE MEANING OF THE FORMAL PARAMETERS IS: X: <ARITHMETIC EXPRESSION>; THE ARGUMENT; THIS ARGUMENT SHOULD SATISFY X > 0; P1: <VARIABLE>; EXIT: P1 CORRESPONDS WITH THE FUNCTION P(X,1) DEFINED IN [1,FORMULAS 9.2.5 AND 9.2.6]; Q1: <VARIABLE>; EXIT: Q1 CORRESPONDS WITH THE FUNCTION Q(X,1) DEFINED IN [1,FORMULAS 9.2.5 AND 9.2.6]. PROCEDURES USED: BESS J1 = CP 35161, BESS Y01 = CP 35163. REQUIRED CENTRAL MEMORY: NO ARRAYS ARE USED. RUNNING TIME: ABOUT 15 MS, ON THE CYBER 73/28. METHOD AND PERFORMANCE: FOR X >= 8 CHEBYSHEV SERIES FROM [2], FOR X < 8 WITH BESS J1 AND BESS Y01. 1SECTION : 6.9.1 (DECEMBER 1978) PAGE 10 EXAMPLE OF USE: FROM THE WRONSKIAN RELATION [1,9.1.16] IT CAN BE SHOWN THAT P0 * P1 + Q0 * Q1 = 1, WHATEVER X. IN THE FOLLOWING PROGRAM WE VERIFY THIS RELATION. "BEGIN" "REAL" X,P,Q,R,S; "FOR" X:= 1,3,5,10 "DO" "BEGIN" BESSPQ0(X,P,Q); BESSPQ1(X,R,S); OUTPUT(61,"("BB,D.2D"+3D")", ABS(P*R + Q*S -1)) "END" "END" THE RESULTS ARE: 4.97"-014 4.26"-014 5.68"-014 7.11"-015 SOURCE TEXT(S): "CODE" 35160; "REAL" "PROCEDURE" BESS J0(X); "VALUE" X; "REAL" X; "IF" X=0 "THEN" BESS J0:= 1 "ELSE" "IF" ABS(X) < 8 "THEN" "BEGIN" "REAL" Z, Z2, AR, B0, B1, B2; X:= X/8; Z:= 2*X*X - 1; Z2:= Z + Z; B1:= B2:= 0; "FOR" AR:=-.75885"-15, +.4125321 "-13, -.194383469 "-11, +.7848696314 "-10, -.267925353056 "- 8, +.7608163592419 "- 7, -.176194690776215"- 5, +.324603288210051"- 4, -.46062616620628 "- 3, +.48191800694676 "- 2, -.34893769411409 "- 1, +.158067102332097 , -.37009499387265 "- 0, +.265178613203337 , -.872344235285222"- 2 "DO" "BEGIN" B0:= Z2*B1-B2+AR; B2:= B1; B1:= B0 "END"; BESS J0:= Z*B1 - B2 + .15772 79714 7489 "END" "ELSE" "BEGIN" "REAL" C, COSX, SINX, P0, Q0; X:= ABS(X); C:= .79788 45608 02865 / SQRT(X); COSX:= COS(X-.70685 83470 57703" 1); SINX:= SIN(X-.70685 83470 57703" 1); BESS PQ0(X, P0, Q0); BESSJ0:= C * (P0 * COSX - Q0 * SINX) "END" BESS J0 1SECTION : 6.9.1 (DECEMBER 1978) PAGE 11 ; "EOP" "CODE" 35161; "REAL" "PROCEDURE" BESS J1(X); "VALUE" X; "REAL" X; "IF" X=0 "THEN" BESS J1:= 0 "ELSE" "IF" ABS(X) < 8 "THEN" "BEGIN" "REAL" Z, Z2, AR, B0, B1, B2; X:= X/8; Z:= 2*X*X - 1; Z2:= Z + Z; "COMMENT" COMPUTATION OF J1; B1:= B2:= 0; "FOR" AR:= -.19554 "-15, +.1138572 "-13, -.57774042 "-12, +.2528123664 "-10, -.94242129816 "- 9, +.2949707007278 "- 7, -.76175878054003 "- 6, +.158870192399321"- 4, -.260444389348581"- 3, +.324027018268386"- 2, -.291755248061542"- 1, +.177709117239728"- 0, -.661443934134543"- 0, +.128799409885768"+ 1, -.119180116054122"+ 1 "DO" "BEGIN" B0:= Z2*B1-B2+AR; B2:= B1; B1:= B0 "END"; BESS J1:= X * (Z * B1 - B2 + .64835 87706 05265) "END" "ELSE" "BEGIN" "REAL" C, COSX, SINX, P1, Q1; "INTEGER" SGNX; SGNX:= SIGN(X); X:= ABS(X); C:= .79788 45608 02865 / SQRT(X); COSX:= COS(X-.70685 83470 57703"+1); SINX:= SIN(X-.70685 83470 57703"+1); BESS PQ1(X, P1, Q1); BESS J1:= SGNX * C * (P1*SINX + Q1*COSX) "END" BESS J1; "EOP" "CODE" 35162; "PROCEDURE" BESS J(X, N, J); "VALUE" X, N; "REAL"X; "INTEGER" N; "ARRAY" J; "IF" X=0 "THEN" "BEGIN" J[0]:= 1; "FOR" N:= N "STEP" -1 "UNTIL" 1 "DO" J[N]:= 0 "END" 1SECTION : 6.9.1 (DECEMBER 1978) PAGE 12 "ELSE" "BEGIN""REAL" X2, R, S; "INTEGER" L, M, NU, SIGNX; SIGNX:= SIGN(X); X:= ABS(X); R:= S:= 0; X2:= 2/X; L:= 0; NU:= START(X,N,0); "FOR" M:= NU "STEP" -1 "UNTIL" 1 "DO" "BEGIN" R:= 1/(X2*M-R); L:= 2-L; S:= R*(L+S); "IF" M<=N "THEN" J[M]:= R "END"; J[0]:= R:= 1/(1+S); "FOR" M:= 1 "STEP" 1 "UNTIL" N "DO" J[M]:= R:= R*J[M]; "IF" SIGNX < 0 "THEN" "FOR" M:= 1 "STEP" 2 "UNTIL" N "DO" J[M]:= -J[M]; "END" BESSELJ; "EOP" "CODE" 35163; "PROCEDURE" BESS Y01(X, Y0, Y1); "VALUE" X; "REAL" X, Y0, Y1; "IF" X< 8 "THEN" "BEGIN" "REAL" Z, Z2, C, LNX, AR, B0, B1, B2; C:= .63661 97723 67581; LNX:= C * LN(X); C:= C/X; X:= X/8; Z:= 2*X*X - 1; Z2:= Z + Z; "COMMENT" COMPUTATION OF Y0; B1:= B2:= 0; "FOR" AR:= +.164349 "-14, -.8747341 "-13, +.402633082 "-11, -.15837552542 "- 9, +.524879478733 "- 8, -.14407233274019 "- 6, +.32065325376548 "- 5, -.563207914105699"- 4, +.753113593257774"- 3, -.72879624795521 "- 2, +.471966895957634"- 1, -.177302012781143"- 0, +.261567346255047"- 0, +.179034314077182"- 0, -.274474305529745"DO" "BEGIN" B0:= Z2*B1-B2+AR; B2:= B1; B1:= B0 "END"; Y0:= LNX * BESS J0(8*X)+Z*B1-B2-.33146 11320 3285"-1; "COMMENT" COMPUTATION OF Y1; B1:= B2:= 0; "COMMENT" 1SECTION : 6.9.1 (DECEMBER 1978) PAGE 13 ; "FOR" AR:= +.42773 "-15, -.2440949 "-13, +.121143321 "-11, -.5172121473 "-10, +.187547032473 "- 8, -.5688440039919 "- 7, +.141662436449235"- 5, -.283046401495148"- 4, +.440478629867099"- 3, -.51316411610611 "- 2, +.423191803533369"- 1, -.226624991556755"- 0, +.675615780772188"- 0, -.767296362886646"- 0, -.128697384381350"- 0"DO" "BEGIN" B0:= Z2*B1-B2+AR; B2:= B1; B1:= B0 "END"; Y1:= LNX * BESS J1(X*8)-C + X * (Z*B1-B2+.20304 10588 593425"-1) "END" "ELSE" "BEGIN" "REAL" C, COSX, SINX, P0, Q0, P1, Q1; C:= .79788 45608 02865 / SQRT(X); BESS PQ0(X, P0, Q0); BESS PQ1(X, P1, Q1); X:= X-.70685 83470 57703"1; COSX:= COS(X); SINX:= SIN(X); Y0:= C * (P0*SINX + Q0*COSX); Y1:= C * (Q1*SINX - P1*COSX) "END" BESS Y01; "EOP" "CODE" 35164; "PROCEDURE" BESS Y(X, N, Y); "VALUE" X, N; "REAL" X; "INTEGER" N; "ARRAY" Y; "BEGIN" "INTEGER" I; "REAL" Y0, Y1, Y2; BESS Y01(X, Y0, Y1); Y[0]:= Y0; "IF" N > 0 "THEN" Y[1]:= Y1 ; X:= 2/X; "FOR" I:=2 "STEP" 1 "UNTIL" N "DO" "BEGIN" Y[I]:= Y2:= (I-1)*X*Y1 - Y0; Y0:= Y1; Y1:= Y2 "END" "END" BESS Y 1SECTION : 6.9.1 (DECEMBER 1978) PAGE 14 ; "EOP" "CODE" 35165; "PROCEDURE" BESS PQ0(X, P0, Q0); "VALUE" X; "REAL" X, P0, Q0; "IF" X < 8 "THEN" "BEGIN" "REAL" B, COSX, SINX, J0X, Y0; B:= SQRT(X) * 1.2533 14137 31550; BESS Y01(X, Y0, J0X); J0X:= BESS J0(X); X:= X-.78539 81633 97448; COSX:= COS(X); SINX:= SIN(X); P0:= B * (Y0 * SINX + J0X * COSX); Q0:= B * (Y0 * COSX - J0X * SINX) "END" "ELSE" "BEGIN" "REAL" X2, AR, B0, B1, B2, Y; Y:= 8/X; X:= 2*Y*Y-1; X2:= X+X; B1:= B2:= 0; "FOR" AR:= -.10012 "-15, +.67481 "-15, -.506903 "-14, +.4326596 "-13, -.43045789 "-12, +.516826239 "-11, -.7864091377 "-10, +.163064646352 "- 8, -.5170594537606 "- 7, +.30751847875195 "- 5, -.536522046813212"- 3 "DO" "BEGIN" B0:= X2 * B1 - B2 + AR; B2:= B1; B1:= B0 "END"; P0:= X * B1 - B2 + .99946034934752; "COMMENT" COMPUTATION OF Q0; B1:= B2:= 0; "FOR" AR:= -.60999 "-15, +.425523 "-14, -.3336328 "-13, +.30061451 "-12, -.320674742 "-11, +.4220121905 "-10, -.72719159369 "- 9, +.1797245724797 "- 7, -.74144984110606 "- 6, +.683851994261165"- 4 "DO" "BEGIN" B0:= X2 * B1 - B2 + AR; B2:= B1; B1:= B0 "END"; Q0:=(X * B1 - B2 -.015555854605337) * Y "END" BESS PQ0 1SECTION : 6.9.1 (DECEMBER 1978) PAGE 15 ; "EOP" "CODE" 35166; "PROCEDURE" BESS PQ1(X, P1, Q1); "VALUE" X; "REAL" X, P1, Q1; "IF" X < 8 "THEN" "BEGIN" "REAL" B, COSX, SINX, J1X, Y1; BESS Y01(X, J1X, Y1); J1X:= BESS J1(X); X:= X-.78539 81633 97448; COSX:= COS(X); SINX:= SIN(X); P1:= B * (J1X * SINX - Y1 * COSX); Q1:= B * (J1X * COSX + Y1 * SINX) "END" "ELSE" "BEGIN" "REAL" X2, AR, B0, B1, B2, Y; Y:= 8 / X; X:= 2 * Y * Y - 1; X2 := X + X; "COMMENT" COMPUTATION OF P1; B1:= B2:= 0; "FOR" AR:= +.10668"-15, -.72212 "-15, +.545267 "-14, -.4684224 "-13, +.46991955 "-12, -.570486364 "-11, +.881689866 "-10, -.187189074911 "- 8, +.6177633960644 "- 7, -.39872843004889 "- 5, +.89898983308594 "- 3 "DO" "BEGIN" B0:= B1 * X2 - B2 + AR; B2:= B1; B1:= B0 "END"; P1:= X * B1 - B2 + 1.0009030408600137; "COMMENT" COMPUTATION OF Q1; B1:= B2:= 0; "FOR" AR:= -.10269 "-15, +.65083 "-15, -.456125 "-14, +.3596777 "-13, -.32643157 "-12, +.351521879 "-11, -.4686363688 "-10, +.82291933277 "- 9, -.2095978138408 "- 7, +.91386152579555 "- 6, -.96277235491571 "- 4 "DO" "BEGIN" B0:= X2 * B1 - B2 + AR; B2:= B1; B1:= B0 "END"; Q1:=(X * B1 - B2 + .46777787069535" -1) * Y "END" BESS PQ1; "EOP" 1SECTION : 6.9.2 (DECEMBER 1978) PAGE 1 AUTHORS: M. BAKKER AND N.M. TEMME. INSTITUTE: MATHEMATICAL CENTRE. RECEIVED: 750201. BRIEF DESCRIPTION: THIS SECTION CONTAINS THE FOLLOWING PROCEDURES: BESS I0; COMPUTES THE MODIFIED BESSEL FUNCTION OF THE FIRST KIND OF ORDER ZERO WITH ARGUMENT X; BESS I1; COMPUTES THE MODIFIED BESSEL FUNCTION OF THE FIRST KIND OF ORDER ONE WITH ARGUMENT X; BESS I; GENERATES AN ARRAY OF MODIFIED BESSEL FUNCTIONS OF THE FIRST KIND OF ORDER L (L = 0, ..., N) WITH ARGUMENT X; BESS K01; COMPUTES THE MODIFIED BESSEL FUNCTIONS OF THE THIRD KIND OF ORDERS ZERO AND ONE WITH ARGUMENT X; X > 0; BESS K; GENERATES AN ARRAY OF MODIFIED BESSEL FUNCTIONS OF THE THIRD KIND OF ORDER L ( L = 0, ..., N) WITH ARGUMENT X; X > 0; NONEXP BESS I0; DOES THE SAME AS BESS I0, BUT THE RESULT IS MULTIPLIED BY EXP(-ABS(X)); NONEXP BESS I1; DOES THE SAME AS BESS I1, BUT THE RESULT IS MULTIPLIED BY EXP(-ABS(X)); NONEXP BESS I; DOES THE SAME AS BESS I, BUT THE ARRAY ELEMENTS ARE MULTIPLIED BY EXP(-ABS(X)); NONEXP BESS K01; DOES THE SAME AS BESS K01, BUT THE RESULTS ARE MULTIPLIED BY EXP(X); 1SECTION : 6.9.2 (DECEMBER 1978) PAGE 2 NONEXP BESS K; DOES THE SAME AS BESS K, BUT THE ARRAY ELEMENTS ARE MULTIPLIED BY EXP(X). KEYWORDS: BESSEL FUNCTIONS, MODIFIED BESSEL FUNCTIONS, INTEGER ORDER. REFERENCES: [1] M.ABRAMOWITZ AND I.A. STEGUN, HANDBOOK OF MATHEMATICAL FUNCTIONS, DOVER PUBLICATIONS, INC., NEW YORK, 1968. [2] D.B.HUNTER, THE CALCULATION OF SOME BESSEL FUNCTIONS, MATHEMATICS OF COMPUTATION (1964), P. 123. [3] YUDELL LUKE, THE SPECIAL FUNCTIONS AND THEIR APPROXIMATIONS, VOLUME 2, ACADEMIC PRESS, NEW YORK AND LONDON (1969). [4] C.W.CLENSHAW, CHEBYSHEV SERIES FOR MATHEMATICAL FUNCTIONS, NAT. PHYS. LAB. MATH. TABLES, VOLUME 5, HER MAJESTY,S STATIONARY OFFICE, LONDON (1962). [5] W.GAUTSCHI, COMPUTATIONAL ASPECTS OF THREE TERM RECURRENCE RELATIONS, SIAM REVIEWS, VOLUME 9 (1967), P. 24. [6] J.M.BLAIR, RATIONAL CHEBYSHEV APPROXIMATIONS FOR THE MODIFIED BESSEL FUNCTIONS I0(X) AND I1(X); MATHEMATICS OF COMPUTATIONS,VOLUME 28, NR 126, APRIL 1974, P. 581-583. 1SECTION : 6.9.2 (DECEMBER 1978) PAGE 3 SUBSECTION: BESS I0. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "REAL" "PROCEDURE" BESS I0(X); "VALUE" X; "REAL" X; "CODE" 35170; BESS I0 DELIVERS THE MODIFIED BESSEL FUNCTION OF THE FIRST KIND OF ORDER ZERO WITH ARGUMENT X; THE MEANING OF THE FORMAL PARAMETERS IS: X: <ARITHMETIC EXPRESSION>; THE ARGUMENT OF THE BESSEL FUNCTION. PROCEDURES USED: NONEXP BESS I0 = CP35175. REQUIRED CENTRAL MEMORY: NO ARRAYS ARE USED. RUNNING TIME: FOR X = 0 BESS I0 IS ASSIGNED ITS VALUE IMMEDIATELY; FOR 0 < ABS(X) <= 15.0 17 MULTIPLICATIONS AND ONE DIVISION ARE REQUIRED; FOR ABS(X) > 15.0 11 MULTIPLICATIONS, 3 DIVISIONS, ONE EVALUATION OF THE SQUARE ROOT AND ONE EVALUATION OF THE EXPONENNTIAL FUNCTION ARE REQUIRED. METHOD AND PERFORMANCE: RATIONAL APPROXIMATION, SEE [6]. EXAMPLE OF USE: THE PROGRAM "BEGIN" "REAL" X; X:= 1; OUTPUT(61,"("/,D,6B-.14D"-ZD")", X, BESS I0(X)) "END" 1SECTION : 6.9.2 (DECEMBER 1978) PAGE 4 PRINTS THE FOLLOWING RESULTS: 1 .12660658777520" 1 SUBSECTION: BESS I1. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "REAL" "PROCEDURE" BESS I1(X); "VALUE" X; "REAL" X; "CODE" 35171; BESS I1 DELIVERS THE MODIFIED BESSEL FUNCTION OF THE FIRST KIND OF ORDER ONE WITH ARGUMENT X; THE MEANING OF THE FORMAL PARAMETERS IS: X: <ARITHMETIC EXPRESSION>; THE ARGUMENT OF THE BESSEL FUNCTION. PROCEDURES USED: NONEXP BESS I1 = CP35176. REQUIRED CENTRAL MEMORY: NO ARRAYS ARE USED. RUNNING TIME: FOR X = 0 BESS I1 IS ASSIGNED ITS VALUE IMMEDIATELY; FOR 0 < ABS(X) <= 15.0 17 MULTIPLICATIONS AND ONE DIVISION ARE REQUIRED; FOR ABS(X) > 15.0 12 MULTIPLICATIONS, 3 DIVISIONS, ONE EVALUATION OF THE SQUARE ROOT AND ONE EVALUATION OF THE EXPONENTIAL FUNCTION ARE REQUIRED. METHOD AND PERFORMANCE: RATIONAL APPROXIMATION, SEE [6]. 1SECTION : 6.9.2 (DECEMBER 1978) PAGE 5 EXAMPLE OF USE: THE PROGRAM "BEGIN" "REAL" X; X:= 1; OUTPUT(61,"("/,D,6B-.14D"-ZD")", X, BESS I1(X)) "END" PRINTS THE FOLLOWING RESULTS: 1 .56515910399252" 0 SUBSECTION: BESS I. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "PROCEDURE" BESS I(X, N, I); "VALUE" X, N; "INTEGER" N; "REAL" X; "ARRAY" I; "CODE" 35172; THE MEANING OF THE FORMAL PARAMETERS IS: X: <ARITHMETIC EXPRESSION>; THE ARGUMENT OF THE BESSEL FUNCTIONS; N: <ARITHMETIC EXPRESSION>; THE UPPER BOUND OF THE INDICES OF THE ARRAY I; I: <ARRAY IDENTIFIER>; "ARRAY" I[0 : N]; EXIT: I[L] POSSESSES THE VALUE OF THE MODIFIED BESSEL FUNCTION OF THE FIRST KIND OF ORDER L (0 <= L <= N). METHOD AND PERFORMANCE: SEE NON EXP BESS I (THIS SECTION). PROCEDURES USED : NONEXP BESS I = CP 35177. REQUIRED CENTRAL MEMORY: NO AUXILIARY ARRAYS ARE USED. 1SECTION : 6.9.2 (DECEMBER 1978) PAGE 6 RUNNING TIME: ROUGHLY PROPORTIONAL TO THE MAXIMUM OF 1.359 * X + 72 AND N + 18. EXAMPLE OF USE : THE FOLLOWING PROGRAM CHECKS FOR X = 1 (1) 20 THE WRONSKIAN RELATION X * (I[N - 1] * K[N] + I[N] * K[N - 1]) - 1 = 0 FOR N = 1 (1) 5; THE PROGRAM READS: "BEGIN" "REAL" X; "INTEGER" N; "ARRAY" I, K[0:5]; "FOR" X:= 1 "STEP" 1 "UNTIL" 20 "DO" "BEGIN" OUTPUT(61,"("/ZD")", X); BESS I(X, 5, I); BESS K(X, 5, K); "FOR" N:= 1, 2, 3, 4, 5 "DO" OUTPUT(61,"("BB-.D"-ZD")", X * (I[N] * K[N - 1] + I[N - 1] * K[N]) - 1) "END" "END" THE RESULTS ARE: 1 .0" 0 .0" 0 -.7"-14 -.7"-14 -.7"-14 2 .0" 0 .0" 0 .0" 0 .0" 0 .0" 0 3 .7"-14 .7"-14 .0" 0 .0" 0 .0" 0 4 .7"-14 .0" 0 .0" 0 .0" 0 .0" 0 5 .0" 0 .7"-14 .7"-14 .0" 0 .0" 0 6 .0" 0 .0" 0 .0" 0 .0" 0 -.7"-14 7 .0" 0 .0" 0 .0" 0 .0" 0 .0" 0 8 -.1"-13 -.1"-13 -.1"-13 -.1"-13 -.1"-13 9 .0" 0 .0" 0 .0" 0 -.7"-14 -.7"-14 10 .0" 0 .0" 0 .0" 0 .0" 0 .0" 0 11 .0" 0 .0" 0 .0" 0 .0" 0 .0" 0 12 .0" 0 .0" 0 .0" 0 .0" 0 .0" 0 13 .7"-14 .7"-14 .0" 0 .7"-14 .0" 0 14 .0" 0 .7"-14 .0" 0 .0" 0 .0" 0 15 .0" 0 .0" 0 .0" 0 .0" 0 .0" 0 16 .0" 0 .0" 0 .0" 0 .0" 0 -.7"-14 17 .7"-14 .0" 0 .0" 0 .0" 0 .0" 0 18 .7"-14 .0" 0 .0" 0 .0" 0 -.7"-14 19 .7"-14 .0" 0 .0" 0 .0" 0 .0" 0 20 .0" 0 .0" 0 .0" 0 .0" 0 -.7"-14 1SECTION : 6.9.2 (DECEMBER 1978) PAGE 7 SUBSECTION: BESS K01. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "PROCEDURE" BESS K01(X, K0, K1); "VALUE" X; "REAL" X, K0, K1; "CODE" 35173; THE MEANING OF THE FORMAL PARAMETERS IS: X: <ARITHMETIC EXPRESSION>; THE ARGUMENT OF THE BESSEL FUNCTIONS; X > 0; K0: <VARIABLE>; EXIT: K0 HAS THE VALUE OF THE MODIFIED BESSEL FUNCTION OF THE THIRD KIND OF ORDER 0 WITH ARGUMENT X; K1: <VARIABLE>; EXIT: K1 HAS THE VALUE OF THE MODIFIED BESSEL FUNCTION OF THE THIRD KIND OF ORDER ONE. PROCEDURES USED: NONEXP BESS K01 = CP35178 REQUIRED CENTRAL MEMORY: NO ARRAYS ARE USED. RUNNING TIME: DEPENDS ON THE VALUE OF X; THE GLOBAL VALUES IN MILLISECONDS ARE: 0 < X <= 1.5 : 2.2 MS, 1.5 < X <= 5.0 : 5.5 MS, 5.0 < X : 2.3 MS, ON THE CYBER 73/28. METHOD AND PERFORMANCE: FOR THE COMPUTATION OF K0 AND K1 THREE DIFFERENT METHODS ARE USED DEPENDING ON THE VALUE OF X: FOR 0 < X <= 1.5 K0 AND K1 ARE EVALUATED BY MEANS OF TAYLOR SERIES EXPANSIONS (SEE [1], P. 375, FORMULA 9.6.13); FOR X > 1.5 K0 AND K1 ARE COMPUTED BY MEANS OF A CALL OF THE CODE PROCEDURE NONEXP BESS K01 (SEE DESCRIPTION AHEAD) AND MULTIPLICATION BY EXP(- X). 1SECTION : 6.9.2 (DECEMBER 1978) PAGE 8 EXAMPLE OF USE: THE PROGRAM "BEGIN" "REAL" X, K0, K1; "FOR" X:= .5, 1.5, 2.5 "DO" "BEGIN" BESS K01(X, K0, K1); OUTPUT(61,"("/,4BD.D,2(B-.14D"-ZD)")",X,K0,K1) "END" "END" PRINTS THE FOLLOWING RESULTS: 0.5 .92441907122766" 0 .16564411200033" 1 1.5 .21380556264754" 0 .27738780045683" 0 2.5 .62347553200366" -1 .73890816347746" -1 SUBSECTION: BESS K. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "PROCEDURE" BESS K(X, N, K); "VALUE" X, N; "INTEGER" N; "REAL" X; "ARRAY" K; "CODE" 35174; THE MEANING OF THE FORMAL PARAMETERS IS: X: <ARITHMETIC EXPRESSION>; THE ARGUMENT OF THE BESSEL FUNCTIONS; X > 0; N: <ARITHMETIC EXPRESSION>; THE UPPER BOUND OF THE INDICES OF THE ARRAY K; N >= 0; K: <ARRAY IDENTIFIER>; "ARRAY" K[0 : N]; EXIT: K[I] POSSESSES THE VALUE OF THE MODIFIED BESSEL FUNCTION OF THE THIRD KIND OF ORDER I (0 <= I <= N). PROCEDURES USED: BESS K01 = CP 35173. REQUIRED CENTRAL MEMORY: NO AUXILIARY ARRAYS ARE USED. RUNNING TIME : DEPENDS ON THE VALUE OF X (SEE TABLE BELONGING TO BESS K01) AND N. 1SECTION : 6.9.2 (DECEMBER 1978) PAGE 9 METHOD AND PERFORMANCE: K[0], ..., K[N] ARE COMPUTED ACCORDING TO THE RECURRENCE RELATION K[I + 1] = K[I - 1] + (2 * I / X) * K[I], I = 2, ..., N, (SEE [1], P. 376, FORMULA 9.6.26). EXAMPLE OF USE: THE PROGRAM "BEGIN" "ARRAY" K[0 : 2]; "REAL" X; "FOR" X:= .5, 1.0, 1.5, 2.0 "DO" "BEGIN" BESS K(X, 2, K); OUTPUT(61,"("/D.D,3(BB.12D"-D)")",X,K) "END" "END" PRINTS THE FOLLOWING RESULTS: 0.5 .924419071228"0 .165644112000"1 .755018355124"1 1.0 .421024438241"0 .601907230197"0 .162483889864"1 1.5 .213805562648"0 .277387800457"0 .583655963257"0 2.0 .113893872750"0 .139865881817"0 .253759754566"0 SUBSECTION: NONEXP BESS I0. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "REAL" "PROCEDURE" NONEXP BESS I0(X); "VALUE" X; "REAL" X; "CODE" 35175; NONEXP BESS I0 DELIVERS THE MODIFIED BESSEL FUNCTION OF THE FIRST KIND OF ORDER 0 WITH ARGUMENT X MULTIPLIED BY EXP(-ABS(X)). THE MEANING OF THE FORMAL PARAMETERS IS: X: <ARITHMETIC EXPRESSION>; THE ARGUMENT OF THE BESSEL FUNCTION. PROCEDURES USED: BESS I0 = CP35170. 1SECTION : 6.9.2 (DECEMBER 1978) PAGE 10 REQUIRED CENTRAL MEMORY: NO ARRAYS ARE USED. RUNNING TIME: FOR X = 0 NONEXP BESS I0 IS ASSIGNED ITS VALUE IMMEDIATELY; FOR 0 < ABS(X) <= 15.0 18 MULTIPLICATIONS, ONE DIVISION AND ONE EVALUATION OF THE EXPONENTIAL FUNCTION ARE REQUIRED; FOR ABS(X) > 15.0 10 MULTIPLICATIONS, 3 DIVISIONS AND ONE EVALUATION OF THE SQUARE ROOT ARE REQUIRED. METHOD AND PERFORMANCE: SEE [6]. EXAMPLE OF USE: THE PROGRAM "BEGIN" "REAL" X; X:= 1; OUTPUT(61,"("/,D,6B-.14D"-ZD")", X, NONEXP BESS I0(X)) "END" PRINTS THE FOLLOWING RESULTS: 1 .46575960759364" 0 SUBSECTION: NONEXP BESS I1. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "REAL" "PROCEDURE" NONEXP BESS I1(X); "VALUE" X; "REAL" X; "CODE" 35176; NONEXP BESS I1 DELIVERS THE MODIFIED BESSEL FUNCTION OF THE FIRST KIND OF ORDER 1 WITH ARGUMENT X MULTIPLIED BY EXP(-ABS(X)). THE MEANING OF THE FORMAL PARAMETERS IS: X: <ARITHMETIC EXPRESSION>; THE ARGUMENT OF THE BESSEL FUNCTION. 1SECTION : 6.9.2 (DECEMBER 1978) PAGE 11 PROCEDURES USED: BESS I1 = CP35171. REQUIRED CENTRAL MEMORY: NO ARRAYS ARE USED. RUNNING TIME: FOR X = 0 NONEXP BESS I1 IS ASSIGNED ITS VALUE IMMEDIATELY; FOR 0 < ABS(X) <= 15.0 18 MULTIPLICATIONS, ONE DIVISION AND ONE EVALUATION OF THE EXPONENTIAL FUNCTION ARE REQUIRED; FOR X > 15.0 11 MULTIPLICATIONS, 3 DIVISIONS AND ONE EVALUATION OF THE SQUARE ROOT ARE REQUIRED. METHOD AND PERFORMANCE: SEE [6]. EXAMPLE OF USE: THE PROGRAM "BEGIN" "REAL" X; X:= 1; OUTPUT(61,"("/,D,6B-.14D"-ZD")", X, NONEXP BESS I1(X)) "END" DELIVERS THE FOLLOWING RESULTS: 1 .20791041534972" 0 1SECTION : 6.9.2 (DECEMBER 1978) PAGE 12 SUBSECTION: NONEXP BESS I. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "PROCEDURE" NONEXP BESS I(X, N, I); "VALUE" X, N; "INTEGER" N; "REAL" X; "ARRAY" I; "CODE" 35177; THE MEANING OF THE FORMAL PARAMETERS IS: X: <ARITHMETIC EXPRESSION>; THE ARGUMENT OF THE BESSEL FUNCTIONS; N: <ARITHMETIC EXPRESSION>; THE UPPER BOUND OF THE INDICES OF THE ARRAY I; N >= 0; I: <ARRAY IDENTIFIER>; "ARRAY" I[0:N]; EXIT: I[L] POSSESSES THE VALUE OF THE MODIFIED BESSEL FUNCTION OF THE FIRST KIND OF ORDER L (L=0,..,N) MULTIPLIED BY EXP (- ABS(X)). PROCEDURES USED: START = CP 35185; REQUIRED CENTRAL MEMORY: NO AUXILIARY ARRAYS ARE USED. RUNNING TIME: ROUGHLY PROPORTIONAL TO THE MAXIMUM OF 1.359*X + 72 AND N+18. METHOD AND PERFORMANCE: SEE [5]. EXAMPLE OF USE: THE PROGRAM "BEGIN" "REAL" X; "ARRAY" I[0:2]; "FOR" X:= .5, 1.0, 1.5, 2.0, 2.5 "DO" "BEGIN" NONEXP BESS I(X, 2, I); OUTPUT(61, "("/,4BZ.D,3(B-.12D"-D)")",X, I[0], I[1], I[2]) "END" "END" 1SECTION : 6.9.2 (DECEMBER 1978) PAGE 13 PRINTS THE FOLLOWING RESULTS: .5 .645035270449" 0 .156420803185" 0 .193520577097"-1 1.0 .465759607594" 0 .207910415350" 0 .499387768942"-1 1.5 .367433609054" 0 .219039387421" 0 .753810924929"-1 2.0 .308508322554" 0 .215269289249" 0 .932390333047"-1 2.5 .270046441612" 0 .206584649531" 0 .104778721987" 0 SUBSECTION: NONEXP BESS K01. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "PROCEDURE" NONEXP BESS K01(X, K0, K1); "VALUE" X; "REAL" X, K0, K1; "CODE" 35178; THE MEANING OF THE FORMAL PARAMETERS IS: X: <ARITHMETIC EXPRESSION>; THE ARGUMENT OF THE BESSEL FUNCTIONS; X > 0; K0: <VARIABLE>; EXIT: K0 HAS THE VALUE OF THE MODIFIED BESSEL FUNCTION OF THE THIRD KIND OF ORDER 0 WITH ARGUMENT X MULTIPLIED BY EXP(X); K1: <VARIABLE>; EXIT: K1 HAS THE VALUE OF THE MODIFIED BESSEL FUNCTION OF THE THIRD KIND OF ORDER 1 MULTIPLIED BY EXP(X). PROCEDURES USED: BESS K01 = CP35173. REQUIRED CENTRAL MEMORY: NO ARRAYS ARE USED. RUNNING TIME: DEPENDS ON THE VALUE OF X; BECAUSE OF THE STRONG INTERDEPENDENCE OF THE BESS K01 ( = CP35173) AND NONEXP BESS K01 THE READER IS REFERRED TO THE TABLE OF RUNNING TIMES BELONGING TO BESS K01. 1SECTION : 6.9.2 (DECEMBER 1978) PAGE 14 METHOD AND PERFORMANCE: FOR THE COMPUTATION OF K0 AND K1 THREE DIFFERENT METHODS ARE USED DEPENDING ON THE VALUE OF X: FOR 0 < X <= 1.5 K0 AND K1 ARE COMPUTED BY MEANS OF MULTIPLICATION OF THE MODIFIED BESSEL FUNCTIONS OF ORDER ZERO AND ONE (SEE DESCRIPTION OF K0) BY EXP(X); FOR 1.5 < X <= 5 K0 AND K1 ARE COMPUTED BY THE EVALUATION OF THEIR INTEGRAL REPRESENTATIONS (SEE [1], P. 376, FORMULA 9.6.23) BY MEANS OF THE TRAPEZOIDAL RULE (SEE [2]); FOR X > 5 K0 AND K1 ARE COMPUTED BY MEANS OF A FINITE CHEBYSHEV SERIES EXPANSION (SEE [3], P. 339 AND [4]). EXAMPLE OF USE: THE PROGRAM "BEGIN" "REAL" X, K0, K1; "FOR" X:= .5, 1.0, 1.5, 2.0, 2.5 "DO" "BEGIN" NON EXP BESS K01(X, K0, K1); OUTPUT(61,"("/,4BZ.D,2(5B-.14D"-ZD)")", X, K0, K1) "END" "END" PRINTS THE FOLLOWING RESULTS: .5 .15241093857739" 1 .27310097082118" 1 1.0 .11444630798069" 1 .16361534862633" 1 1.5 .95821005329496" 0 .12431658735525" 1 2.0 .84156821507078" 0 .10334768470687" 1 2.5 .75954869032810" 0 .90017442390788" 0 SUBSECTION: NONEXP BESS K. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "PROCEDURE" NONEXP BESS K(X, N,K); "VALUE" X, N; "INTEGER" N; "REAL" X; "ARRAY" K; "CODE" 35179; 1SECTION : 6.9.2 (DECEMBER 1978) PAGE 15 THE MEANING OF THE FORMAL PARAMETERS IS: X: <ARITHMETIC EXPRESSION>; THE ARGUMENT OF THE BESSEL FUNCTIONS; X > 0; N: <ARITHMETIC EXPRESSION>; THE UPPER BOUND OF THE INDICES OF THE ARRAY K; N >= 0; K: <ARRAY IDENTIFIER>; "ARRAY" K[0:N]; EXIT: K[I] POSSESSES THE VALUE OF THE MODIFIED BESSEL FUNCTION OF THE THIRD KIND OF ORDER I (I = 0, ..., N) MULTIPLIED BY EXP(X). PROCEDURES USED: NONEXP BESS K01 = CP 35178. REQUIRED CENTRAL MEMORY: NO AUXILIARY ARRAYS ARE USED. METHOD AND PERFORMANCE: K[0] AND K[1] ARE COMPUTED BY USING NONEXP BESS K01 (CP 35178), WHILE K[2], ..., K[N] ARE COMPUTED ACCORDING TO THE RECURRENCE RELATION K[I+1]=K[I]+(2*I/X)*K[I], I>=2 (SEE [1], P. 376, FORMULA 9.6.26). EXAMPLE OF USE: THE PROGRAM "BEGIN" "REAL" X; "ARRAY" K[0:2]; "FOR" X:= .5, 1.0, 1.5, 2.0 "DO" "BEGIN" NONEXP BESS K(X, 2, K); OUTPUT(61, "("/,Z.D,3(5B.14D"D)")",X,K) "END" "END" PRINTS THE FOLLOWING RESULTS: .5 .15241093857739"1 .27310097082118"1 .12448148218621"2 1.0 .11444630798069"1 .16361534862633"1 .44167700523334"1 1.5 .95821005329496"0 .12431658735525"1 .26157645513649"1 2.0 .84156821507078"0 .10334768470687"1 .18750450621395"1 1SECTION : 6.9.2 (DECEMBER 1978) PAGE 16 SOURCE TEXT(S): "CODE" 35170; "REAL" "PROCEDURE" BESS I0(X); "VALUE" X; "REAL" X; "IF" X= 0 "THEN" BESS I0:=1 "ELSE" "IF" ABS(X) < = 15.0 "THEN" "BEGIN" "REAL" Z, DENOMINATOR, NUMERATOR; Z:= X*X; NUMERATOR:= (Z*(Z*(Z*(Z*(Z*(Z*(Z* (Z*(Z*(Z*(Z*(Z*(Z*(Z* .21058 07228 90567 "-22 +.38071 52423 45326 "-19) +.47944 02575 48300 "-16) +.43512 59712 62668 "-13) +.30093 11271 12960 "-10) +.16022 46793 95361 "-07) +.65485 83700 96785 "-05) +.20259 10841 43397 "-02) +.46307 62847 21000 "+00) +.75433 73289 48189 "+02) +.83079 25418 09429 "+04) +.57166 11305 63785 "+06) +.21641 55723 61227 "+08) +.35664 44822 44025 "+09) +.14404 82982 27235 "+10); DENOMINATOR:= (Z*(Z* (Z-.30764 69126 82801 "04) +.34762 63324 05882 "07) -.14404 82982 27235 "10); BESS I0:= -NUMERATOR/DENOMINATOR; "END" "ELSE" "BEGIN" BESS I0:= EXP(ABS(X)) * NONEXP BESS I0(X) "END" 1SECTION : 6.9.2 (DECEMBER 1978) PAGE 17 ; "EOP" "CODE" 35171; "REAL" "PROCEDURE" BESS I1(X); "VALUE" X; "REAL" X; "IF" X=0 "THEN" BESS I1:=0 "ELSE" "IF" ABS(X) <= 15.0 "THEN" "BEGIN" "REAL" Z, DENOMINATOR, NUMERATOR; Z:= X*X; DENOMINATOR:= Z*(Z-.22258 36740 00860 "4) +.13629 35930 52499 "7; NUMERATOR:= (Z*(Z*(Z*(Z*(Z*(Z*(Z* (Z*(Z*(Z*(Z*(Z*(Z*(Z* .20717 57672 32792 "-26 +.25709 19055 84414 "-23) +.30627 92836 56135 "-20) +.26137 27721 58124 "-17) +.17846 93614 10091 "-14) +.96362 88915 18450 "-12) +.41006 89068 47159 "-09) +.13545 52288 41096 "-06) +.33947 28903 08516 "-04) +.62472 61951 27003 "-02) +.80614 48788 21295 "-00) +.68210 05679 80207 "+02) +.34106 97522 84422 "+04) +.84070 57728 77836 "+05) +.68146 79652 62502 "+06); BESS I1:= X*(NUMERATOR/DENOMINATOR) "END" "ELSE" "BEGIN" BESS I1:= EXP(ABS(X))*NONEXP BESS I1(X) "END"; "EOP" "CODE" 35172; "PROCEDURE" BESS I(X, N, I); "VALUE" X, N; "INTEGER" N; "REAL" X; "ARRAY" I; "IF" X = 0 "THEN" "BEGIN" I[0]:= 1; "FOR" N:= N "STEP" - 1 "UNTIL" 1 "DO" I[N]:= 0; "END" "ELSE" "BEGIN" "REAL" EXPX; EXPX:= EXP(ABS(X)); NONEXP BESS I(X, N, I); "FOR" N:= N "STEP" - 1 "UNTIL" 0 "DO" I[N]:= I[N] * EXPX "END" BESS I 1SECTION : 6.9.2 (DECEMBER 1978) PAGE 18 ; "EOP" "CODE" 35173; "PROCEDURE" BESS K01(X, K0, K1); "VALUE" X; "REAL" X, K0, K1; "IF" X <= 1.5 "THEN" "BEGIN" "INTEGER" K; "REAL" C, D, R, S, SUM0, SUM1, T, TERM, T0, T1; SUM0:= D:= LN(2/X) -.5772156649015328606; SUM1:= C:= -1 -2 * D; R:= TERM:= 1; T:= X * X/4; "FOR" K:= 1,K+1 "WHILE" ABS(T0/SUM0) + ABS(T1/SUM1) > "-15 "DO" "BEGIN" TERM:= T * TERM * R * R; D:= D + R; C:= C - R; R:= 1/(K+1); C:= C - R; T0:= TERM * D; T1:= TERM * C * R; SUM0:= SUM0 + T0; SUM1:= SUM1 + T1 "END"; K0:= SUM0; K1:= (1 + T * SUM1) / X "END" "ELSE" "BEGIN" "REAL" EXPX; EXPX:= EXP(- X); NONEXP BESS K01(X, K0, K1); K1:= EXPX * K1; K0:= K0 * EXPX "END" BESS K01; "EOP" "CODE" 35174; "PROCEDURE" BESS K(X, N, K); "VALUE" X, N; "REAL" X; "INTEGER" N; "ARRAY" K; "BEGIN" "INTEGER" I; "REAL" K0, K1, K2; BESS K01(X, K0, K1); K[0]:= K0; "IF" N > 0 "THEN" K[1]:= K1; X:= 2 / X; "FOR" I:= 2 "STEP" 1 "UNTIL" N "DO" "BEGIN" K[I]:= K2:= K0 + X * (I-1)* K1; K0:= K1; K1:= K2 "END" "END" BESS K; "EOP" "CODE" 35175; "REAL" "PROCEDURE" NONEXP BESS I0(X); "VALUE" X; "REAL" X; "IF" X= 0 "THEN" NONEXP BESS I0:=1 "ELSE" "IF" ABS(X) <= 15.0 "THEN" "BEGIN" NONEXP BESS I0:= EXP(-ABS(X))*BESS I0(X) "END" "ELSE" "BEGIN" "REAL" SQRTX, AR, BR, BR1, BR2, Z, Z2, NUMERATOR, DENOMINATOR; X:=ABS(X); SQRTX:= SQRT(X); "COMMENT" 1SECTION : 6.9.2 (DECEMBER 1978) PAGE 19 ; BR1:= BR2:= 0; Z:= 30/X-1; Z2:= Z+Z; "FOR" AR:= .24392 60769 778, -.11559 19781 04435 "3, +.78403 42490 05088 "4, -.14346 46313 13583 "6 "DO" "BEGIN" BR:= Z2*BR1-BR2+AR; BR2:= BR1; BR1:= BR "END"; NUMERATOR:= Z*BR1-BR2+.34651 98333 57379 "6; BR1:= BR2:= 0; "FOR" AR:= 1, -.32519 73333 69824 "3, +.20312 84361 00794 "5, -.36184 77792 19653 "6 "DO" "BEGIN" BR:= Z2*BR1 - BR2 + AR; BR2:= BR1; BR1:= BR "END"; DENOMINATOR:= Z*BR1 - BR2 +.86566 52748 32055 "6; NONEXP BESS I0:= (NUMERATOR/DENOMINATOR)/SQRTX; "END"; "EOP" "CODE" 35176; "REAL" "PROCEDURE" NONEXP BESS I1(X); "VALUE" X; "REAL" X; "IF" X=0 "THEN" NONEXP BESS I1:= 0 "ELSE" "IF" ABS(X)> 15.0 "THEN" "BEGIN" "INTEGER" SIGNX ; "REAL" AR, BR, BR1, BR2, Z, Z2, SQRTX, DENOMINATOR, NUMERATOR; SIGNX:= SIGN(X); X:= ABS(X); SQRTX:= SQRT(X); Z:= 30/X - 1; Z2 := Z + Z; BR1:= BR2:= 0; "FOR" AR:= +.14940 52814 740 "+1, -.36202 64202 42263 "+3, +.22054 97222 60336 "+5, -.40892 80849 44275 "+6 "DO" "BEGIN" BR:= Z2 * BR1 - BR2 + AR; BR2:= BR1; BR1:= BR "END"; NUMERATOR:= Z * BR1 -BR2 +.10277 66923 71524 "7; BR1:= BR2:= 0; "FOR" AR:= 1, -.63100 32005 51590 "3, +.49681 19495 33398 "5, -.10042 54281 33695 "7 "DO" "BEGIN" BR:= Z2 * BR1 - BR2 + AR; BR2:= BR1; BR1:=BR "END"; DENOMINATOR:= Z * BR1 - BR2 +.26028 87678 9105 "7; NONEXP BESS I1:= ((NUMERATOR/DENOMINATOR)/SQRTX) * SIGN X "END" "ELSE" "BEGIN" NONEXP BESS I1:= EXP(-ABS(X))*BESS I1(X) "END" 1SECTION : 6.9.2 (DECEMBER 1978) PAGE 20 ; "EOP" "CODE" 35177; "PROCEDURE" NONEXP BESS I(X, N, I); "VALUE" X, N; "INTEGER" N; "REAL" X; "ARRAY" I; "IF" X = 0 "THEN" "BEGIN" I[0]:= 1; "FOR" N:= N "STEP" - 1 "UNTIL" 1 "DO" I[N]:= 0 "END" "ELSE" "BEGIN" "INTEGER" K; "REAL" X2, R, S; "BOOLEAN" NEGATIVE; NEGATIVE:= X < 0; X:= ABS(X); R:= S:= 0; X2:= 2/X; K:= START(X,N,1); "FOR" K:= K "STEP" - 1 "UNTIL" 1 "DO" "BEGIN" R:= 1 / (R + X2 * K); S:= R * (2 + S); "IF" K <= N "THEN" I[K]:= R "END"; I[0]:= R:= 1 / (1 + S); "IF" NEGATIVE "THEN" "BEGIN" "FOR" K:= 1 "STEP" 1 "UNTIL" N "DO" I[K]:= R:= - R * I[K] "END" "ELSE" "FOR" K:=1 "STEP" 1 "UNTIL" N "DO" I[K]:= R:= R * I[K]; "END" NONEXP BESS I; "EOP" "CODE" 35178; "PROCEDURE" NONEXP BESS K01(X, K0, K1);"VALUE" X;"REAL" X, K0, K1; "IF" X <= 1.5 "THEN" "BEGIN" "REAL" EXPX; EXPX:= EXP(X); BESS K01(X, K0, K1); K0:= K0 * EXPX; K1:= EXPX * K1 "END" "ELSE" "IF" X <= 5 "THEN" "BEGIN" "INTEGER" R; "REAL" T2, FAC, S1, S2, TERM1, TERM2, SQRTEXPR, EXPH2, X2; S1:= .5; S2:=0; R:= 0; X2:= X + X; EXPH2:= 1 / SQRT(5 * X); "FOR" FAC:= .90483741803596, .67032004603564, .40656965974060, .20189651799466, .82084998623899"-1, .27323722447293"-1, .74465830709243"-2, .16615572731739"-2, .30353913807887"-3, .45399929762485"-4, .55595132416500"-5, .55739036926944"-6, .45753387694459"-7, .307487987958650"-8, .16918979226151"-9, .76218651945127"-11, .28111852987891"-12, .84890440338729"-14, .2098791048793"-15, .42483542552916"-17 "DO" "BEGIN" R:= R + 1; T2:= R * R / 10; SQRTEXPR:= SQRT(T2 / X2 + 1); TERM1:= FAC / SQRTEXPR; TERM2:= FAC * SQRTEXPR * T2; S1:= S1 + TERM1; S2:= S2 + TERM2 "END"; "COMMENT" 1SECTION : 6.9.2 (DECEMBER 1978) PAGE 21 ; K0:= EXPH2 * S1; K1:= EXPH2 * S2 * 2 "END" "ELSE" "BEGIN" "INTEGER" R; "REAL" BR, BR1, BR2, CR, CR1, CR2, DR, ERMIN1, ERPLUS1, ER, F0, F1, EXPX, Y, Y2; Y:= 10 / X - 1; Y2:= Y + Y; R:= 30; BR1:= BR2:= CR1:= CR2:= ERPLUS1:= ER:= 0; "FOR" DR:= .27545" - 15, -.172697" - 14, .1136042 " - 13, -.7883236 " -13, .58081063 " -12, -.457993622 " -11, .3904375576 " -10, -.36454717921 " - 9, .379299645568 " - 8, -.450473376411 " - 7, .63257510850049 " - 6, -.11106685196665" - 4, .26953261276272 " - 3, -.11310504646928" - 1 "DO" "BEGIN" R:= R - 2; BR:= Y2 * BR1 - BR2 + DR; CR:= CR1 * Y2 - CR2 + ER; ERMIN1:= R * DR + ERPLUS1; ERPLUS1:= ER; ER:= ERMIN1; BR2:= BR1; BR1:= BR; CR2:= CR1; CR1:= CR "END"; F0:= Y * BR1 - BR2 + .9884081742308258; F1:= Y * CR1 - CR2 + ER / 2; EXPX:= SQRT(1.5707963267949 / X); K0:= F0:= F0 * EXPX; K1:= (1 + .5 / X) * F0 + (10 / X / X) * EXPX * F1 "END" K0; "EOP" "CODE" 35179; "PROCEDURE" NONEXP BESS K(X, N, K); "VALUE" X, N; "REAL" X; "INTEGER" N; "ARRAY" K; "BEGIN" "INTEGER" I; "REAL" K0, K1, K2; NONEXP BESS K01(X, K0, K1); K[0]:= K0; "IF" N> 0 "THEN" K[1]:= K1; X:= 2 / X; "FOR" I:= 2 "STEP" 1 "UNTIL" N "DO" "BEGIN" K[I]:= K2:= K0 + X * (I-1)* K1; K0:= K1; K1:= K2 "END" "END" NONEXP BESS K; "EOP" 1SECTION : 6.10.1 (DECEMBER 1978) PAGE 1 AUTHORS: M.BAKKER AND N.M.TEMME. CONTRIBUTOR: R.MONTIJN. INSTITUTE: MATHEMATICAL CENTRE. RECEIVED: 781101. BRIEF DESCRIPTION: THIS SECTION CONTAINS THE PROCEDURES: BESS JAPLUSN: THIS PROCEDURE CALCULATES THE BESSEL FUNCTIONS OF THE FIRST KIND OF ORDER A+K (0<=K<=N, 0<=A<1) AND ASSIGNS THEM TO AN ARRAY. THE ARGUMENT MUST BE NON-NEGATIVE. BESS YA01: THIS PROCEDURE CALCULATES THE BESSEL FUNCTIONS OF THE SECOND KIND (ALSO CALLED NEUMANN'S FUNCTIONS) OF ORDER A AND A+1 AND ARGUMENT X>0. BESS YAPLUSN: THIS PROCEDURE GENERATES AN ARRAY OF BESSEL FUNCTIONS OF THE SECOND KIND OF ORDER A+N, N=0, 1, 2, ..., NMAX, AND ARGUMENT X>0. THE BESSEL FUNCTIONS OF THE SECOND KIND CORRESPOND TO THE FUNCTION DEFINED IN FORMULA 9.1.2 OF REFERENCE [1]. BESS PQA01: THIS PROCEDURE IS AN AUXILIARY PROCEDURE FOR THE COMPUTATION OF THE BESSEL FUNCTIONS FOR LARGE VALUES OF THEIR ARGUMENT. BESS ZEROS: THIS PROCEDURE CALCULATES THE FIRST N ZEROS OF A BESSEL FUNCTION OF THE FIRST OR THE SECOND KIND OR ITS DERIVATIVE. START: THIS IS AN AUXILIARY PROCEDURE WHICH COMPUTES A STARTING VALUE OF AN ALGORITHM USED IN SEVERAL BESSEL FUNCTION PROCEDURES. 1SECTION : 6.10.1 (DECEMBER 1978) PAGE 2 KEYWORDS: BESSEL FUNCTION, BESSEL FUNCTION OF THE SECOND KIND, NEUMANN'S FUNCTION, ZEROS OF BESSEL FUNCTIONS. REFERENCES: [1]. ABRAMOWITZ, M., AND STEGUN, I. (EDS), HANDBOOK OF MATHEMATICAL FUNCTIONS WITH FORMULAS, GRAPHS AND MATHEMATICAL TABLES. APPL. MATH. SER. 55, U.S. GOVT. PRINTING OFFICE, WASHINGTON, D.C. , 1974. [2]. GAUTSCHI, W., COMPUTATIONAL ASPECTS OF THREE TERM RECURRENCE RELATIONS. SIAM REVIEW, VOLUME 9(1967), NUMBER 1, P.24 FF. [3]. TEMME, N.M. ON THE NUMERICAL EVALUATION OF THE ORDINARY BESSEL FUNCTION OF THE SECOND KIND. J. COMP. PHYS., 21, P. 343 FF, 1976. [4]. WATSON, G.N. A TREATISE ON THE THEORY OF BESSEL FUNCTIONS. CAMBRIDGE UNIV. PRESS, LONDON AND NEW YORK, 1945. [5]. TEMME, N.M., SPECIALE FUNCTIES, IN: COLLOQUIUM NUMERIEKE PROGRAMMATUUR, J.C.P. BUS (RED.), MC SYLLABUS 29.1B, MATHEMATICAL CENTRE, AMSTERDAM, 1976. [6]. TEMME, N.M., AN ALGOLRITHM WITH ALGOL 60 IMPLEMENTATION FOR THE CALCULATION OF THE ZEROS OF A BESSEL FUNCTION, REPORT TW 179 MATHEMATICAL CENTRE, AMSTERDAM, 1978. SUBSECTION: BESS JAPLUSN. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "PROCEDURE" BESS JAPLUSN(A, X, N, JA); "VALUE" A, X, N; "INTEGER" N; "REAL" A, X; "ARRAY" JA; "CODE" 35180; 1SECTION : 6.10.1 (DECEMBER 1978) PAGE 3 THE MEANING OF THE FORMAL PARAMETERS IS: A: < ARITHMETIC EXPRESSION > ; THE NONINTEGER PART OF THE ORDER; 0 <= A < 1; X: < ARITHMETIC EXPRESSION >; THE ARGUMENT VALUE; X > = 0; N: < ARITHMETIC EXPRESSION >; THE UPPER BOUND OF THE INDICES OF THE ARRAY JA; JA: < ARRAY IDENTIFIER >; "ARRAY" JA[0:N]; EXIT: JA[K] IS ASSIGNED THE VALUE OF THE BESSEL FUNCTION OF THE FIRST KIND J[K+A](X), 0 < = K < = N. PROCEDURES USED: BESS J = CP 35162, SPHER BESS J = CP 35150, GAMMA = CP 35061, START = CP 35185. REQUIRED CENTRAL MEMORY: NO AUXILIARY ARRAYS ARE DECLARED. METHOD AND PERFORMANCE: IN ALL THE CASES THE BESSEL FUNCTIONS ARE COMPUTED ACCORDING TO THE MILLER METHOD DISCRIBED IN [2, P.46-52]. THE STARTING VALUE IS COMPUTED BY THE PROCEDURE START. RUNNING TIME: ROUGHLY PROPORTIONAL TO THE MAXIMUM OF X AND N. EXAMPLE OF USE: "BEGIN" "INTEGER" N; "REAL" A, X; "ARRAY" JA[0:2]; X:= 2; A:= .78; N:= 2; BESS JAPLUSN(A, X, N, JA); OUTPUT(61, "("/, "("X=")"D, 3B"("A=")".DD, 3B"("N=")"D, /, 3(3B-.14D"-ZD)")", X, A, N, JA[0], JA[1], JA[2]) "END" RESULTS: X=2 A= .78 N=2 .57306126928364"0 .41529475124424" 0 .16616338793111" 0 1SECTION : 6.10.1 (DECEMBER 1978) PAGE 4 SUBSECTION: BESS YA01. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "PROCEDURE" BESS YA01(A, X, YA, YA1); "VALUE" A, X; "REAL" A, X, YA, YA1; "CODE" 35181; THE MEANING OF THE FORMAL PARAMETERS IS: A: <ARITHMETIC EXPRESSION>; THE ORDER; X: <ARITHMETIC EXPRESSION>; THE ARGUMENT. THIS ARGUMENT SHOULD SATISFY X>0; YA: <VARIABLE>; EXIT: THE NEUMANN FUNCTION OF ORDER A AND ARGUMENT X; YA1: <VARIABLE>; EXIT: THE NEUMANN FUNCTION OF ORDER A+1. PROCEDURES USED: RECIP GAMMA = CP 35060; BESS PQA01 = CP 35183; SINH = CP 35111. REQUIRED CENTRAL MEMORY: NO AUXILIARY ARRAYS ARE DECLARED. METHOD AND PERFORMANCE: FOR 0<X<3 THE BESSEL FUNCTIONS ARE COMPUTED BY USING TAYLOR SERIES. THE METHOD IS DESCRIBED IN REFERENCE [3]. FOR X>=3 THE PROCEDURE CALLS FOR THE PROCEDURE BESS PQA01 (SEE SUBSECTION BESS PQA01). THE RELATIVE ACCURACY IS ABOUT "-13, EXCEPT FOR LARGE VALUES OF X; IN THAT CASE THE ACCURACY MAINLY DEPENDS ON THE ACCURACY OF THE FUNCTIONS SIN(X) AND COS(X). 1SECTION : 6.10.1 (DECEMBER 1978) PAGE 5 EXAMPLE OF USE: THE PROGRAM: "BEGIN" "REAL" P, Q; BESS YA01(0, 1, P, Q); OUTPUT(61, "("2(N)")", P, Q) "END" YIELDS THE FOLLOWING RESULTS +8.8256964215677"-002 -7.8121282130028"-001. SUBSECTION: BESS YAPLUSN. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "PROCEDURE" BESS YAPLUSN(A, X, NMAX, YAN); "VALUE" A, X, NMAX; "REAL" A, X; "INTEGER" NMAX; "ARRAY" YAN; "CODE" 35182; THE MEANING OF THE FORMAL PARAMETERS IS: A: <ARITHMETIC EXPRESSION>; THE ORDER; X: <ARITHMETIC EXPRESSION>; THE ARGUMENT; THIS ARGUMENT SHOULD SATISFY X>0; NMAX: <ARITHMETIC EXPRESSION>; THE UPPER BOUND OF THE INDICES OF THE ARRAY YAN; YAN: <ARRAY IDENTIFIER>; "ARRAY" YAN[0:NMAX]; NMAX>=0; EXIT: THE VALUES OF THE BESSEL FUNCTIONS OF THE SECOND KIND OF ORDER A+K, FOR THE ARGUMENT X ARE ASSIGNED TO YAN[K],0<=K<=NMAX. PROCEDURES USED: BESS YA01 = CP 35181. REQUIRED CENTRAL MEMORY: NO AUXILIARY ARRAYS ARE DECLARED. 1SECTION : 6.10.1 (DECEMBER 1978) PAGE 6 METHOD AND PERFORMANCE: THE RECURRENCE RELATION YAN[N+1]= -YAN[N-1] + 2*(N+A)*YAN[N]/X IS USED. THE INITIAL VALUES ARE OBTAINED FROM THE PROCEDURE BESS YA01. THE RECURRENCE RELATION IS NUMERICALLY STABLE IN THE FORWARD DIRECTION (IF A >= 0). EXAMPLE OF USE: THE PROGRAM: "BEGIN" "ARRAY" YAN[0:2]; BESS YAPLUSN(0, 1, 2, YAN); OUTPUT(61, "("3(N)")", YAN[0], YAN[1], YAN[2]) "END" YIELDS THE FOLLOWING RESULTS +8.8256964215677"-002 -7.8121282130028"-001 -1.6506826068163"+000. SUBSECTION: BESS PQA01. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "PROCEDURE" BESS PQA01(A, X, PA, QA, PA1, QA1); "VALUE" X, A; "REAL" X, A, PA, QA, PA1, QA1; "CODE" 35183; THE MEANING OF THE FORMAL PARAMETERS IS: A: <ARITHMETIC EXPRESSION>; THE ORDER; X: <ARITHMETIC EXPRESSION>; THE ARGUMENT. THIS ARGUMENT SHOULD SATISFY X>0; PA: <VARIABLE>; EXIT: THIS FUNCTION CORRESPONDS TO THE FUNCTION P(X, A) DEFINED ON P. 205 OF REFERENCE [4]. SEE ALSO REFERENCE [1], FORMULA 9.2.6; QA: <VARIABLE>; EXIT: THIS FUNCTION CORRESPONDS TO THE FUNCTION Q(X, A) DEFINED ON P.205 OF REFERENCE [4]. SEE ALSO REFERENCE [1], FORMULA 9.2.6; 1SECTION : 6.10.1 (DECEMBER 1978) PAGE 7 PA1: <VARIABLE>; EXIT: THE FUNCTION P(X, A+1); QA1: <VARIABLE>; EXIT: THE FUNCTION Q(X, A+1). PROCEDURES USED: BESS JAPLUSN = CP35180, BESS YA01 = CP35181. REQUIRED CENTRAL MEMORY: NO AUXILIARY ARRAYS ARE DECLARED. METHOD AND PERFORMANCE: X < 3 : PA, QA, PA1, QA1 ARE COMPUTED FROM THE RELATIONS PA = B * (YA0 * S + JA0 * C), QA = B * (YA0 * C - JA0 * S), PA1 = B * (JA1 * S - YA1 * C), QA1 = B * (JA1 * C + YA1 * S), WHERE B = SQRT(HALFPI * X), C = COS(X - HALFPI * (A + .5)), S = SIN(X - HALFPI * (A + .5)), HALFPI = 1.57079 63267 9489, YA0 = Y[A](X), YA1 = Y[A + 1](X), JA0 = J[A](X), JA1 = J[A + 1](X); X >= 3: THE METHOD IS DESCRIBED IN REFERENCE [3]. IT DEPENDS ON USING A MILLER ALGORITHM FOR CONFLUENT HYPERGEOMETRIC FUNCTIONS. THE ACCURACY IS ABOUT "-13 AND IS BETTER FOR LARGE X. THE FUNCTIONS PA AND QA CAN ALSO BE USED FOR THE COMPUTATION OF THE BESSEL FUNCTION J OF THE FIRST KIND. SEE REFERENCE[1], FORMULA 9.2.5. 1SECTION : 6.10.1 (DECEMBER 1978) PAGE 8 EXAMPLE OF USE: FROM SOME PROPERTIES OF THE BESSEL FUNCTIONS IT CAN BE PROVED THAT PA*PA1+QA*QA1=1, WHATEVER X AND A. IN THE FOLLOWING PROGRAM WE VERIFY THIS RELATION. "BEGIN" "REAL" A, X, P, Q, R, S; "FOR" X:= 1, 3, 5, 10, 15, 20, 50 "DO" "BEGIN" BESS PQA01(0, X, P, Q, R, S); OUTPUT(61, "("BB, D.2D"+3D")", ABS(P*R+Q*S-1)) "END" "END" THIS PROGRAM GIVES THE FOLLOWING RESULTS: 1.42"-014 7.11"-015 7.11"-015 7.11"-015 1.42"-014 0.00"+000 2.13"-014. SUBSECTION: BESS ZEROS. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "PROCEDURE" BESS ZEROS(A,N,Z,D); "VALUE" A,N,D; "REAL" A; "INTEGER" N,D; "ARRAY" Z; "CODE" 35184; THE MEANING OF THE FORMAL PARAMETERS IS: A: <ARITHMETIC EXPRESSION>; THE ORDER OF THE BESSEL FUNCTION, A>=0. N: <ARITHMETIC EXPRESSION>; THE NUMBER OF ZEROS TO BE EVALUATED, N>=1. Z: <ARRAY IDENTIFIER>; "ARRAY" Z[1:N]; EXIT: Z[J] IS THE J-TH ZERO OF THE SELECTED BESSEL FUNCTON; D: <ARITHMETIC EXPRESSION>; THE CHOICE OF D DETERMINES THE TYPE OF THE BESSEL FUNCTION OF WHICH THE ZEROS ARE COMPUTED: IF D=1 THEN JA , IF D=2 THEN YA , IF D=3 THEN JA-PRIME, IF D=4 THEN YA-PRIME. 1SECTION : 6.10.1 (DECEMBER 1978) PAGE 9 PROCEDURES USED: BESS PQA01 = CP 35183. REQUIRED CENTRAL MEMMORY: NO AUXILIARY ARRAYS ARE USED. RUNNING TIME: DEPENDS ON THE VALUES OF A AND N AND ON THE MUMBER OF ITERATIONS IN THE ALGORITHM. FROM TESTS IT FOLLOWS THAT FOR EACH ZERO AT MOST 3 EVALUATIONS OF THE PROCEDURE BESS PQA01 ARE NEEDED. METHOD AND PERFORMANCE: A FIRST APPROXIMATION OF THE ZEROS OF THE SELECTED BESSEL FUNCTION IS CALCULATED BY MEANS OF THE ASYMPTOTIC EXPANTIONS ( SEE THE FORMULAS 9.5.12, 9.5.13 ( FOR A < 3 ) AND 9.5.22, 9.5.24( FOR A >= 3 ) OF REF [1] ). THIS VALUE IS CORRECTED BY THE USE OF A FOURTH ORDER NEWTON-RAPHSON METHOD AS DISCRIBED ON P. 179 OF REF [6]. MORE DETAILS CAN BE FOUND IN REF [7]. A RELATIVE PRECISION OF 13 DIGITS IS PERSUED. THE COMPUTATION OF A ZERO IS TERMINATED IF THIS ACCURRACY IS ACHIEVED OR IF MORE THAN 5 ITERATIONS ARE NEEDED. THE PROCEDURE DOES NOT CHECK ON THE RANGE OF THE PARAMETERS A,N AND D. EXAMPLE OF USE: THE PROGRAM "BEGIN" "REAL" A; "INTEGER" N,D; "ARRAY" Z[1:2]; A:=3.14; N:= 2; D:= 2; BESS ZEROS(A,N,Z,D); OUTPUT(61,"("N,/,N")",Z[1],Z[2]) "END" PRINTS THE FIRST TWO ZEROS OF THE BESSEL FUNCTION Y OF THE ORDER 3.14; THE RESULT IS: +4.6847847078799"+000 +8.2765898338392"+000 1SECTION : 6.10.1 (DECEMBER 1978) PAGE 10 SUBSECTION: START. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "INTEGER" "PROCEDURE" START(X,N,T); "VALUE" X,N,T; "REAL" X; "INTEGER" N,T; "CODE" 35185; START:= A STARTING VALUE FOR THE MILLER ALGORITHM FOR COMPUTING AN ARRAY OF BESSEL FUNCTIONS; THE MEANING OF THE FORMAL PARAMETERS IS: X: <ARITHMETIC EXPRESSION>; THE ARGUMENT OF THE BESSEL FUNCTIONS, X > 0; N: <ARITHMETIC EXPRESSION>; THE NUMBER OF BESSEL FUNCTIONS TO BE COMPUTED, N >= 0; T: <ARITHMETIC EXPRESSION>; THE TYPE OF BESSEL FUNCTION IN QUESTION, T = 0 CORRESPONDS TO ORDINARY BESSEL FUNCTIONS, T = 1 CORRESPONDS TO MODIFIED BESSEL FUNCTIONS. PROCEDURES USED: NONE. REQUIRED CENTRAL MEMORY: NO AUXILIARY ARRAYS ARE DECLARED. METHOD AND PERFORMANCE: THE PROCEDURE IS CALLED IN THE FOLLOWING PROCEDURES: BESS J CODE 35162 NON EXP BESS I CODE 35177 BESS JAPLUSN CODE 35180 BESS KAPLUSN CODE 35192 NON EXP BESS IAPLUSN CODE 35193 SPHER BESS J CODE 35150 NON EXP SPHER BESS I CODE 35154. 1SECTION : 6.10.1 (DECEMBER 1978) PAGE 11 IN THESE PROCEDURES AN ARRAY OF BESSEL FUNCTIONS IS GENERATED BY USING MILLER 'S ALGORITHM (SEE REF[5]). FOR STARTING THIS ALGORITHM ONE NEEDS AN INTEGER NU WHICH CAN BE COMPUTED BY USING GAUTSCHI 'S ESTIMATES OF THE ERROR ( SEE REF[5,FORMULA (5.11)] ). WE COMPUTE THIS STARTING VALUE NU BY USING ASYMPTOTIC APPROXIMA- TIONS OF THE BESSEL FUNCTIONS, AS GIVEN IN REF[1, FORMULA 9.3.7, 9.3.8, 9.7.7, AND 9.7.8]. GAUTSCHI USED DIFFERENT FORMULAS, BUT THOSE USED HERE GIVE FOR LARGE X AND N MORE REALISTIC ESTIMATES. THE PERSUED ACCURACY IN THE ABOVE MENTIONED PROCEDURES IS ABOUT "-14 . FOR OBTAINING AN ACCURACY OF "-D THE NUMBERS 36 AND 18 APPEARING IN THE FOURTH AND SIXTH LINE OF THE SOURCE TEXT OF START SHOULD BE REPLACED BY (D+1)* LN(10) AND .5*(D+1)* LN(10), RESPECTIVELY. FOR MODIFIED BESSEL FUNCTIONS THE ACCURRACY IS IN A RELATIVE SENSE; FOR ORDINARY BESSEL FUNCTIONS THE ACCURRACY IS ABSOLUTE IF THE ORDER OF THE BESSEL FUNCTION IS SMALLER THAN X, OTHERWISE IT IS RELATIVE. RUNNING TIME: NEGLECTABLE IF COMPARED WITH THE TIME NEEDED FOR THE BESSEL FUNCTION PROCEDURES. EXAMPLE OF USE: SEE THE ABOVE MENTIONED PROCEDURES. SOURCE TEXT(S): "CODE" 35180; "PROCEDURE" BESS JAPLUSN(A, X, N, JA); "VALUE" A, X, N; "INTEGER" N; "REAL" X, A; "ARRAY" JA; "IF" X = 0 "THEN" "BEGIN" JA[0]:= "IF" A = 0 "THEN" 1 "ELSE" 0; "FOR" N:= N "STEP" -1 "UNTIL" 1 "DO" JA[N]:= 0 "END" "ELSE" "IF" A = 0 "THEN" "BEGIN" BESS J(X, N, JA) "END" "ELSE" "IF" A = .5 "THEN" "BEGIN" "REAL" S; S:= SQRT(X) * .797 884 560 802 865; "COMMENT" S = SQRT(2X / PI); SPHER BESS J(X, N, JA); "FOR" N:= N "STEP" - 1 "UNTIL" 0 "DO" JA[N]:= JA[N] * S "END" 1SECTION : 6.10.1 (DECEMBER 1978) PAGE 12 "ELSE" "BEGIN" "REAL" A2, X2, R, S, L, LABDA; "INTEGER" K, M, NU; L:= 1; NU:= START(X,N,0); "FOR" M:= 1 "STEP" 1 "UNTIL" NU "DO" L:= L * (M+A) / (M+1); R:= S:= 0; X2:= 2 / X; K:= -1; A2:= A + A; "FOR" M:= NU+NU "STEP" - 1 "UNTIL" 1 "DO" "BEGIN" R:= 1 / (X2 * (A + M) - R); "IF" K = 1 "THEN" LABDA:= 0 "ELSE" "BEGIN" L:= L * (M + 2) / (M + A2); LABDA:= L * (M + A) "END"; S:= R * (LABDA + S); K:= -K; "IF" M<= N "THEN" JA[M]:= R "END"; JA[0]:= R:= 1 / GAMMA(1 + A) / (1 + S) / X2 ** A; "FOR" M:= 1 "STEP" 1 "UNTIL" N "DO" JA[M]:= R:= R * JA[M]; "END" BESS JAPLUSN; "EOP" "CODE" 35181; "PROCEDURE" BESS YA01(A,X,YA,YA1);"VALUE" A,X; "REAL" A,X,YA,YA1; "IF" A = 0 "THEN" "BEGIN" BESS Y01(X,YA,YA1) "END" "ELSE" "BEGIN" "REAL" B,C,D,E,F,G,H,P,PI,Q,R,S;"INTEGER" N,NA; "BOOLEAN" REC,REV; PI:=4*ARCTAN(1);NA:=ENTIER(A+.5);REC:=A>=.5; REV:=A<-.5;"IF" REV "OR" REC "THEN" A:=A-NA; "IF" A=-.5 "THEN" "BEGIN" P:=SQRT(2/PI/X);F:=P*SIN(X);G:=-P*COS(X) "END" "ELSE" "IF" X<3 "THEN" "BEGIN" B:=X/2;D:=-LN(B);E:=A*D; C:="IF" ABS(A)<"-8 "THEN" 1/PI "ELSE" A/SIN(A*PI); S:="IF" ABS(E)<"-8 "THEN" 1 "ELSE" SINH(E)/E; E:=EXP(E);G:=RECIP GAMMA(A,P,Q)*E;E:=(E+1/E)/2; F:=2*C*(P*E+Q*S*D);E:=A*A; P:=G*C;Q:=1/G/PI;C:=A*PI/2; R:="IF" ABS(C)<"-8 "THEN" 1 "ELSE" SIN(C)/C;R:=PI*C*R*R; C:=1;D:=-B*B;YA:=F+R*Q;YA1:=P; "FOR" N:=1,N+1 "WHILE" ABS(G/(1+ABS(YA)))+ABS(H/(1+ABS(YA1)))>"-15 "DO" "BEGIN" F:=(F*N+P+Q)/(N*N-E);C:=C*D/N; P:=P/(N-A);Q:=Q/(N+A); G:=C*(F+R*Q);H:=C*P-N*G; YA:=YA+G;YA1:=YA1+H; "END"; F:=-YA;G:=-YA1/B "END" 1SECTION : 6.10.1 (DECEMBER 1978) PAGE 13 "ELSE" "BEGIN" B:=X-PI*(A+.5)/2;C:=COS(B);S:=SIN(B); D:=SQRT(2/X/PI); BESS PQA01(A,X,P,Q,B,H); F:=D*(P*S+Q*C);G:=D*(H*S-B*C) "END"; "IF" REV "THEN" "BEGIN" X:=2/X;NA:=-NA-1; "FOR" N:=0 "STEP" 1 "UNTIL" NA "DO" "BEGIN" H:=X*(A-N)*F-G;G:=F;F:=H "END" "END" "ELSE" "IF" REC "THEN" "BEGIN" X:=2/X; "FOR" N:=1 "STEP" 1 "UNTIL" NA "DO" "BEGIN" H:=X*(A+N)*G-F;F:=G;G:=H "END" "END"; YA:=F;YA1:=G "END" BESS YA01; "EOP" "CODE" 35182; "PROCEDURE" BESS YAPLUSN(A, X, NMAX, YAN); "VALUE" A, X, NMAX; "REAL" A, X; "INTEGER" NMAX; "ARRAY" YAN; "BEGIN" "INTEGER" N; "REAL" Y1; BESS YA01(A, X, YAN[0], Y1); A:= A-1; X:= 2/X; "IF" NMAX > 0 "THEN" YAN[1]:= Y1; "FOR" N:= 2 "STEP" 1 "UNTIL" NMAX "DO" YAN[N]:= -YAN[N-2] + (A+N)*X*YAN[N-1] "END" BESS YAPLUSN; "EOP" "CODE" 35183; "PROCEDURE" BESS PQA01(A,X,PA,QA,PA1,QA1);"VALUE" A,X; "REAL" A,X,PA,PA1,QA,QA1; "IF" A = 0 "THEN" "BEGIN" BESS PQ0(X,PA,QA); BESS PQ1(X,PA1,QA1) "END" "ELSE" "BEGIN" "INTEGER" N,NA; "REAL" B, PI, P0, Q0 ; "BOOLEAN" REC, REV; PI:= 4 * ARCTAN(1); REV:=A<-.5;"IF" REV "THEN" A:=-A-1; REC:=A>=.5;"IF" REC "THEN" "BEGIN" NA:=ENTIER(A+.5);A:=A-NA "END"; "IF" A=-.5 "THEN" "BEGIN" PA:=PA1:=1;QA:=QA1:=0 "END" 1SECTION : 6.10.1 (DECEMBER 1978) PAGE 14 "ELSE" "IF" X >= 3 "THEN" "BEGIN" "REAL" C,D,E,F,G,H,P,Q,R,S; C:=.25 - A*A; B:= X + X; F:= R:= 1; G:= -X; S:= 0; E:=(X*COS(A*PI)/PI*"15)**2; "FOR" N:=2,N+1 "WHILE" (P*P + Q*Q)*N*N<E "DO" "BEGIN" D:=(N-1+C/N); P:= (2 * N * F + B * G - D * R) / (N + 1); Q:= (2 * N * G - B * F - D * S) / (N + 1); R:= F; F:= P; S:= G; G:= Q "END"; E:= F * F + G * G; P:= (R * F + S * G) / E; Q:= (S * F - R * G) / E; F:= P; G:= Q; "FOR" N:=N-1 "WHILE" N>0 "DO" "BEGIN" R:=(N+1)*(2-P)-2;S:=B+(N+1)*Q;D:=(N-1+C/N)/ (R*R+S*S);P:=D*R;Q:=D*S;E:=F; F:=P*(E+1)-G*Q;G:=Q*(E+1)+P*G "END"; F:=1+F; D:=F*F + G*G; PA:=F/D;QA:=-G/D;D:=A+.5-P;Q:=Q+X; PA1:=(PA*Q-QA*D)/X; QA1:=(QA*Q+PA*D)/X "END" "ELSE" "BEGIN" "REAL" C, S, CHI, YA, YA1; "ARRAY" JA[0:1]; B:= SQRT(PI * X / 2); CHI:= X - PI * (A / 2 + .25); C:= COS(CHI); S:= SIN(CHI); BESS YA01(A, X, YA, YA1); BESS JAPLUSN(A, X, 1, JA); PA:= B * (YA * S + C * JA[0]); QA:= B * (C * YA - S * JA[0]); PA1:= B * (S * JA[1] - C * YA1); QA1:= B * (JA[1] * C + YA1 * S) "END"; "IF" REC "THEN" "BEGIN" X:=2/X;B:=(A+1)*X; "FOR" N:=1 "STEP" 1 "UNTIL" NA "DO" "BEGIN" P0:=PA-QA1*B; Q0:=QA+PA1*B; PA:=PA1;PA1:=P0; QA:=QA1; QA1:=Q0; B:=B+X "END" "END"; "IF" REV "THEN" "BEGIN" P0:=PA1;PA1:=PA;PA:=P0;Q0:=QA1;QA1:=QA;QA:=Q0 "END" "END" BESS PQA01 1SECTION : 6.10.1 (DECEMBER 1978) PAGE 15 ; "EOP" "CODE" 35184; "PROCEDURE" BESS ZEROS(A,N,Z,D); "VALUE" A,N,D; "REAL" A;"ARRAY" Z; "INTEGER" N,D; "COMMENT" COMPUTES Z[1],...Z[N],THE FIRST N ZEROS OF A BESSEL FUNCTION. THE CHOICE OF D DETERMINES THE TYPE OF THE BESSEL FUNCTION : IF D=1 THEN JA ELSE IF D=2 THEN YA ELSE IF D=3 THEN JA-PRIME ELSE IF D=4 THEN YA-PRIME. A IS THE ORDER OF THE BESSEL FUNCTION, IT MUST BE NON-NEGATIVE.; "BEGIN""REAL" AA,A2,B,BB,C,CHI,CO,MU,MU2,MU3,MU4,P,PI,PA,PA1,P0,P1,PP1, Q,QA,QA1,Q1,QQ1,RO,SI,T,TT,U,V,W,X,XX,X4,Y; "INTEGER" J,S; "REAL" "PROCEDURE" FI(Y); "VALUE" Y; "REAL" Y; "COMMENT" COMPUTES FI FROM THE EQUATION TAN(FI)-FI=Y , WHERE Y>=0. THE RELATIVE ACCURACY IS AT LEAST 5 DIGITS; "IF" Y=0 "THEN" FI:=0 "ELSE" "IF" Y>"5 "THEN" FI:=1.570796 "ELSE" "BEGIN" "REAL" R,P,PP; "IF" Y<1 "THEN" "BEGIN" P:=(3*Y)**(1/3); PP:=P*P; P:=P*(1+PP*(-210+PP*(27-2*PP))/1575) "END" "ELSE" "BEGIN" P:=1/(Y+1.570796); PP:=P*P; P:= 1.570796-P*(1+PP*(2310+PP*(3003+PP*(4818+PP* (8591+PP*16328))))/3465) "END"; PP:=(Y+P)*(Y+P); R:=(P-ARCTAN(P+Y))/PP; FI:=P-(1+PP)*R*(1+R/(P+Y)) "END" FI; "REAL" "PROCEDURE" R; "BEGIN" BESS PQA01(A,X,PA,QA,PA1,QA1); CHI:=X-PI*(A/2+0.25); SI :=SIN(CHI); CO:=COS(CHI); R:= "IF" D=1 "THEN" (PA*CO-QA*SI)/(PA1*SI+QA1*CO) "ELSE" "IF" D=2 "THEN" (PA*SI+QA*CO)/(QA1*SI-PA1*CO) "ELSE" "IF" D=3 "THEN" A/X-(PA1*SI+QA1*CO)/(PA*CO-QA*SI) "ELSE" A/X-(QA1*SI-PA1*CO)/(PA*SI+QA*CO) "END" R; "COMMENT" 1SECTION : 6.10.1 (DECEMBER 1978) PAGE 16 ; PI:=4*ARCTAN(1); AA:=A*A; MU:=4*AA; MU2:=MU*MU; MU3:=MU*MU2; MU4:=MU2*MU2; "IF" D<3 "THEN" "BEGIN" P:=7*MU-31; P0:=MU-1; P1:=4*(253*MU2-3722*MU+17869)/15/P*P0; Q1:=8*( 83*MU2- 982*MU+ 3779)/ 5/P "END" "ELSE" "BEGIN" P:=7*MU2+82*MU-9; P0:=MU+3; P1:=(4048*MU4+131264*MU3-221984*MU2-417600*MU+1012176)/60/P; Q1:=1.6*(83*MU3+2075*MU2-3039*MU+3537)/P "END"; T:="IF" D=1"OR"D=4 "THEN" 0.25 "ELSE" 0.75; TT:=4*T; "IF" D<3 "THEN" "BEGIN" PP1:= 5/48; QQ1:= -5/36 "END" "ELSE" "BEGIN" PP1:=-7/48; QQ1:= 35/288 "END"; Y:= 3*PI/8; BB:= "IF" A>=3 "THEN" A **(-2/3) "ELSE" 0.0 ; "FOR" S:=1 "STEP" 1 "UNTIL" N "DO" "BEGIN" "IF" A=0"AND"S=1"AND"D=3 "THEN" "BEGIN" X:=0; J:=0 "END" "ELSE" "BEGIN" "IF" S >= 3*A -8 "THEN" "BEGIN" B:=(S+A/2-T)*PI; C:=1/B/B/64; X:=B-1/B/8*(P0-P1*C)/(1-Q1*C) "END" "ELSE" "BEGIN" "IF" S=1 "THEN" "BEGIN" X:= "IF" D=1 "THEN" -2.33811 "ELSE" "IF" D=2 "THEN" -1.17371 "ELSE" "IF" D=3 "THEN" -1.01879 "ELSE" -2.29444 "END" "ELSE" "BEGIN" X:= Y*(4*S-TT); V:= 1/X/X; X:= -X**(2/3)*(1+V*(PP1+QQ1*V)) "END"; U:=X*BB; V:=FI(2/3*(-U)**1.5); W:=1/COS(V); XX:=1-W*W; C:=SQRT(U/XX); X:=W*(A+C/A/U* ("IF" D<3 "THEN" -5/48/U-C*(-5/24/XX+1/8) "ELSE" 7/48/U+C*(-7/24/XX+3/8))) "END"; J:=0; L1: XX:=X*X; X4:=XX*XX; A2:=AA-XX; RO:=R; J:=J+1; "IF" D<3 "THEN" "BEGIN" U:=RO; P:=(1-4*A2)/6/X/(2*A+1); Q:=(2*(XX-MU)-1-6*A)/3/X/(2*A+1) "END" "ELSE" "BEGIN" U:=-XX*RO/A2; V:=2*X*A2/(AA+XX)/3; W:=A2*A2*A2; Q:=V*(1+( MU2+32*MU*XX+48*X4)/32/W); P:=V*(1+(-MU2+40*MU*XX+48*X4)/64/W) "END"; W:=U*(1+P*RO)/(1+Q*RO); X:=X+W; "IF" ABS(W/X)>"-13 "AND"J<5 "THEN" "GOTO" L1 "END"; Z[S]:=X "END" "END" BESS ZEROS 1SECTION : 6.10.1 (DECEMBER 1978) PAGE 17 ; "EOP" "CODE" 35185; "INTEGER" "PROCEDURE" START(X,N,T); "VALUE" X,N,T; "REAL" X; "INTEGER" N,T; "BEGIN" "REAL"P,Q,R,Y; "INTEGER" S; S:= 2*T-1; P:= 36/X-T; R:= N/X; "IF" R>1 "OR" T=1 "THEN" "BEGIN" Q:= SQRT(R*R+S); R:= R*LN(Q+R)-Q "END" "ELSE" R:= 0; Q:= 18/X+R; R:= "IF" P>Q "THEN" P "ELSE" Q; P:= SQRT(2*(T+R)); P:= X*((1+R)+P)/(1+P); Y:= 0; "FOR" Q:= Y, Y "WHILE" P>Q "OR" P<Q-1 "DO" "BEGIN" Y:=P; P:= P/X; Q:= SQRT(P*P+S); P:= X*(R+Q)/LN(P+Q) "END"; START:= "IF" T=1 "THEN" ENTIER(P+1) "ELSE" -ENTIER(-P/2)*2 "END" START; "EOP" 1SECTION : 6.10.2 (DECEMBER 1978) PAGE 1 AUTHORS: M.BAKKER AND N.M.TEMME. INSTITUTE: MATHEMATICAL CENTRE. RECEIVED: 781101. BRIEF DESCRIPTION: THIS SECTION CONTAINS THE PROCEDURES: BESS IAPLUSN: THIS PROCEDURE GENERATES AN ARRAY OF MODIFIED BESSELFUNCTIONS OF THE FIRST KIND OF ORDER A+N, N=0, ..., NMAX, 0 < = A < 1 AND ARGUMENT X > = 0. NONEXP BESS IAPLUSN: THIS PROCEDURE GENERATES AN ARRAY OF MODIFIED BESSEL FUNCTIONS OF THE FIRST KIND OF ORDER A + N, N = 0, ..., NMAX, 0<=A <1 AND ARGUMENT X > = 0 MULTIPLIED BY THE FACTOR EXP(-X). THUS, APART FROM THE EXPONENTIAL FACTOR THE ARRAY ENTRIES ARE THE SAME AS THOSE COMPUTED BY BESS IAPLUSN. BESS KA01: THIS PROCEDURE CALCULATES THE MODIFIED BESSEL FUNCTIONS OF THE THIRD KIND OF ORDER A AND A+1, AND ARGUMENT X, X>0; BESS KAPLUSN: THIS PROCEDURE GENERATES AN ARRAY OF MODIFIED BESSEL FUNCTIONS OF THE THIRD KIND OF ORDER A+N, N=0, 1, ..., NMAX, AND ARGUMENT X>0. THE MODIFIED BESSEL FUNCTIONS CORRESPOND TO THE FUNCTION DEFINED IN FORMULA 9.6.2 OF REFERENCE[1]; NONEXP BESS KA01: THIS PROCEDURE CALCULATES THE MODIFIED BESSEL FUNCTIONS OF THE THIRD KIND OF ORDER A AND A + 1, AND ARGUMENT X, X > 0, MULTIPLIED BY THE FACTOR EXP(X). THUS, APART FROM THE EXPONENTIAL FACTOR, THE FUNCTIONS ARE THE SAME AS THOSE COMPUTED BY BESS KA01; 1SECTION : 6.10.2 (DECEMBER 1978) PAGE 2 NONEXP BESS KAPLUSN: THIS PROCEDURE GENERATES AN ARRAY OF MODIFIED BESSEL FUNCTIONS OF THE THIRD KIND OF ORDER A + N, N = 0, 1,..., NMAX, AND ARGUMENT X>0 MULTIPLIED BY THE FACTOR EXP(X). THUS, APART FROM THE EXPONENTIAL FACTOR, THE FUNCTIONS ARE THE SAME AS THOSE COMPUTED BY THE PROCEDURE BESS KAPLUSN. KEYWORDS: BESSEL FUNCTION, MODIFIED BESSEL FUNCTION, MODIFIED BESSEL FUNCTION OF THE THIRD KIND. REFERENCES: [1]. ABRAMOWITZ, M., AND STEGUN, I. (EDS.), HANDBOOK OF MATHEMATICAL FUNCTIONS WITH FORMULAS, GRAPHS AND MATHEMATICAL TABLES. APPL. MATH. SER. 55, U.S. GOVT. PRINTING OFFICE, WASHINGTON, D.C. (1964). [2]. GAUTSCHI, W., COMPUTATIONAL ASPECTS OF THREE TERM RECURRENCE RELATIONS. SIAM REVIEW, VOLUME 9, (1967), NUMBER 1, P.24. [3]. TEMME, N.M., ON THE NUMERICAL EVALUATION OF THE MODIFIED BESSEL FUNCTION OF THE THIRD KIND. J. COMP. PHYSICS, VOL. 19, (1975), NUMBER 3, P. 324. SUBSECTION: BESS IAPLUSN. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "PROCEDURE" BESS IAPLUSN(A, X, N, IA); "VALUE" X, N, A; "REAL" X, A; "INTEGER" N; "ARRAY" IA; "CODE" 35190; 1SECTION : 6.10.2 (DECEMBER 1979) PAGE 3 THE MEANING OF THE FORMAL PARAMETERS IS: A: < ARITHMETIC EXPRESSION >; THE NONINTEGER PART OF THE ORDER OF THE BESSEL FUNCTIONS; 0 < = A < 1; X: < ARITHMETIC EXPRESSION >; THE ARGUMENT OF THE BESSEL FUNCTIONS; X > = 0; N: < ARITHMETIC EXPRESSION >; THE UPPER BOUND OF THE INDICES OF THE ARRAY IA; N>= 0; IA: < ARRAY IDENTIFIER >; "ARRAY" IA[0:N]; N > = 0; EXIT: THE VALUES OF THE MODIFIED BESSEL FUNCTIONS OF THE FIRST KIND , OF ORDER A+K AND ARGUMENT X, I[A+K](X) ARE ASSIGNED TO THE ARRAY IA. PROCEDURES USED: NONEXP BESS IAPLUSN = CP 35193, BESS I = CP 35172, NONEXP SPHER BESS I = CP 35154. REQUIRED CENTRAL MEMORY: NO AUXILIARY ARRAYS ARE DECLARED. METHOD AND PERFORMANCE: SEE SUBSECTION NONEXP BESS IAPLUSN. RUNNING TIME: ROUGHLY PROPORTIONAL TO THE MAXIMUM OF X AND N. EXAMPLE OF USE: "BEGIN" "REAL" X, A; "ARRAY" IA[0:2] ; A:= .25; X:= 2; BESS IAPLUSN(A, X, 2, IA); OUTPUT(61,"("2(4BD.DD),/,3(4B-.14D"-ZD)")", A, X, IA[0], IA[1], IA[2]) "END" PRINTS THE FOLLOWING RESULTS: 0.25 2.00 .22033544516736" 1 .13401967589829" 1 .52810850294501" 0 1SECTION : 6.10.2 (DECEMBER 1978) PAGE 4 SUBSECTION: NONEXP BESS IAPLUSN. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "PROCEDURE" NONEXP BESS IAPLUSN(A, X, N, IA); "VALUE" A, X, N; "REAL" A, X; "INTEGER" N; "ARRAY" IA; "CODE" 35193; THE MEANING OF THE FORMAL PARAMETERS IS: A: < ARITHMETIC EXPRESSION >; THE NONINTEGER PART OF THE ORDER A+N, 0 < = A < 1; X: < ARITHMETIC EXPRESSION >; THE ARGUMENT OF THE BESSEL FUNCTIONS; X >= 0; N: < ARITHMETIC EXPRESSION >; THE UPPER BOUND OF THE INDICES OF THE ARRAY IA; N>= 0; IA: < ARRAY IDENTIFIER >; "ARRAY" IA[0:N]; N > = 0; EXIT: IA[K] HAS THE VALUE OF THE MODIFIED BESSEL FUNCTION OF THE FIRST KIND OF ORDER A + K AND ARGUMENT X MULTIPLIED BY EXP (-X), 0 < = K < = N. PROCEDURES USED: NONEXP BESS I = CP 35177 NONEXP SPHER BESS I = CP 35154 GAMMA = CP 35061 START = CP 35185 REQUIRED CENTRAL MEMORY: NO AUXILIARY ARRAYS ARE DECLARED. METHOD AND PERFORMANCE: IN ALL THE CASES THE BESSEL FUNCTIONS ARE COMPUTED ACCORDING TO THE MILLER METHOD DESCRIBED IN [2, P.46-52]. THE STARTING VALUE IS COMPUTED BY THE PROCEDURE START (SECTION 6.10.1). RUNNING TIME: ROUGHLY PROPORTIONAL TO THE MAXIMUM OF X AND N. 1SECTION : 6.10.2 (DECEMBER 1979) PAGE 5 EXAMPLE OF USE: THE PROGRAM "BEGIN" "REAL" X, A; "ARRAY" IA[0:2]; A:= .25; X:= 2; NON EXPBESS IAPLUSN(A, X, 2, IA); OUTPUT(61,"("2(4BD.DD),/,3(4B-.14D"-ZD)")", A, X, IA[0], IA[1], IA[2]) "END" PRINTS THE FOLLOWING RESULTS: 0.25 2.00 .29819159878790" 0 .18137590796974" 0 .71471713825726" -1 SUBSECTION: BESS KA01. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "PROCEDURE" BESS KA01(A, X, KA, KA1); "VALUE" A, X; "REAL" A, X, KA, KA1; "CODE" 35191; THE MEANING OF THE FORMAL PARAMETERS IS: A: <ARITHMETIC EXPRESSION>; THE ORDER; X: <ARITHMETIC EXPRESSION>; THE ARGUMENT. THIS ARGUMENT SHOULD SATISFY X>0; KA: <VARIABLE>; EXIT: THE VALUE OF THE MODIFIED BESSEL FUNCTION OF THE THIRD KIND OF ORDER A AND ARGUMENT X; KA1: <VARIABLE>; EXIT: THE VALUE OF THE MODIFIED BESSEL FUNCTION OF THE THIRD KIND OF ORDER A+1 AND ARGUMENT X. PROCEDURES USED: RECIP GAMMA = CP 35060; NONEXP BESS KA01 = CP 35194; SINH = CP 35111. REQUIRED CENTRAL MEMORY: NO AUXILIARY ARRAYS ARE DECLARED. 1SECTION : 6.10.2 (DECEMBER 1978) PAGE 6 METHOD AND PERFORMANCE: FOR 0<X<1 THE BESSEL FUNCTIONS ARE COMPUTED BY USING TAYLOR SERIES. THE METHOD IS DESCRIBED IN REFERENCE [3]. FOR X>=1 THE PROCEDURE CALLS FOR THE PROCEDURE NONEXP BESS KA ( SEE SUBSECTION NONEXP BESS KA). THE RELATIVE ACCURACY IS ABOUT "-13, EXCEPT FOR LARGE VALUES OF X; IN THAT CASE THE ACCURACY ALSO DEPENDS ON THE RELATIVE ACCURACY OF THE EXPONENTIAL FUNCTION. IF ONE IS INTERESTED IN THE MODIFIED BESSEL FUNCTION OF THE THIRD KIND TIMES THE FACTOR EXP(X), THE PROCEDURE NONEXP BESS KA SHOULD BE USED. EXAMPLE OF USE: THE PROGRAM: "BEGIN" "REAL" P, Q; BESS KA01(0, 1, P, Q); OUTPUT(61, "("2(N)")", P, Q) "END" YIELDS THE FOLLOWING RESULTS +4.2102443824071"-001 +6.0190723019724"-001. SUBSECTION: BESS KAPLUSN. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "PROCEDURE" BESS KAPLUSN(A, X, NMAX, KAN); "VALUE" A, X, NMAX; "INTEGER" NMAX; "REAL" A, X; "ARRAY" KAN; "CODE" 35192; THE MEANING OF THE FORMAL PARAMETERS IS: A: <ARITHMETIC EXPRESSION>; THE ORDER. IT IS ADVISED TO TAKE A >= 0; X: <ARITHMETIC EXPRESSION>; THE ARGUMENT. THIS ARGUMENT SHOULD SATISFY X>0; NMAX: <ARITHMETIC EXPRESSION>; THE UPPER BOUND OF THE INDICES OF THE ARRAY KAN; KAN: <ARRAY IDENTIFIER>; "ARRAY" KAN[0:NMAX]; NMAX>=0; EXIT: THE VALUE OF THE MODIFIED BESSEL FUNCTION OF THE THIRD KIND OF ORDER N+A IS ASSIGNED TO KAN[N], 0 <= N <= NMAX. 1SECTION : 6.10.2 (DECEMBER 1978) PAGE 7 PROCEDURES USED: BESS KA01 = CP 35191. REQUIRED CENTRAL MEMORY: NO AUXILIARY ARRAYS ARE DECLARED. METHOD AND PERFORMANCE: THE RECURRENCE RELATION KAN[N+1]=KAN[N-1]+2*(N+A)*KAN[N]/X IS USED. THE STARTING VALUES ARE OBTAINED FROM THE PROCEDURE BESS KA01. IF A>=0, RECURSION IS NUMERICALLY STABLE IN THE FORWARD DIRECTION. IF ONE IS INTERESTED IN THE MODIFIED BESSEL FUNCTIONS OF THE THIRD KIND TIMES THE FACTOR EXP(X), THE PROCEDURE NONEXP BESS KAPLUSN SHOULD BE USED. EXAMPLE OF USE: THE PROGRAM: "BEGIN" "ARRAY" KAN[0:2]; BESS KAPLUSN(0, 1, 2, KAN); OUTPUT(61, "("3(N)")", KAN[0], KAN[1], KAN[2]) "END" YIELDS THE FOLLOWING RESULTS +4.2102443824071"-001 +6.0190723019724"-001 +1.6248388986352"+000. SUBSECTION: NONEXP BESS KA01. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "PROCEDURE" NONEXP BESS KA01(A, X, KA, KA1); "VALUE" A, X; "REAL" A, X, KA, KA1; "CODE" 35194; 1SECTION : 6.10.2 (DECEMBER 1978) PAGE 8 THE MEANING OF THE FORMAL PARAMETERS IS: A: <ARITHMETIC EXPRESSION>; THE ORDER; X: <ARITHMETIC EXPRESSION>; THE ARGUMENT. THIS ARGUMENT SHOULD SATISFY X>0; KA: <VARIABLE>; EXIT: KA HAS THE VALUE OF THE MODIFIED BESSEL FUNCTION OF THE THIRD KIND OF ORDER A AND ARGUMENT X TIMES THE FACTOR EXP(X); KA1: <VARIABLE>; EXIT: THE VALUE OF THE MODIFIED BESSEL FUNCTION OF THE THIRD KIND OF ORDER A+1 AND ARGUMENT X TIMES THE FACTOR EXP(X). PROCEDURES USED: BESS KA01 = CP 35191. REQUIRED CENTRAL MEMORY: NO AUXILIARY ARRAYS ARE DECLARED. METHOD AND PERFORMANCE: FOR 0<X<1 THE PROCEDURE NONEXP BESS KA CALLS FOR THE PROCEDURE BESS KA01. FOR X>=1 THE BESSEL FUNCTIONS ARE COMPUTED WITH A MILLER ALGORITHM FOR CONFLUENT HYPERGEOMETRIC FUNCTIONS. THE METHOD IS DESCRIBED IN REFERENCE [3]. FOR ALL VALUES OF X CONSIDERED (X>0) THE FUNCTIONS DELIVERED ARE EQUAL TO THE VALUES COMPUTED BY THE PROCEDURE BESS KA01, APART FROM AN EXPONENTIAL FACTOR. THE RELATION BETWEEN THE TWO PROCEDURES WILL BE DESCRIBED BY THE PROGRAM: "BEGIN" "REAL" A, X, KA, NEKA, KA1, NEKA1; "PROCEDURE" BESS KA01(A, X, KA, KA1); "CODE" 35191; "PROCEDURE" NONEXP BESS KA(A, X, KA, KA1); "CODE" 35194; A:= .3; X:= 3.14; BESS KA01(A, X, KA, KA1); NONEXP KA 01(A, X, NEKA, NEKA1) "END" THEN WE HAVE KA = EXP(-X)*NEKA, KA1 = EXP(-X)*NEKA1. THE RELATIVE ACCURACY IS ABOUT "-13. 1SECTION : 6.10.2 (DECEMBER 1978) PAGE 9 EXAMPLE OF USE: THE PROGRAM: "BEGIN" "REAL" P, Q; NONEXP BESS KA 01(0, 2, P, Q); OUTPUT(61, "("2(N)")", P, Q) "END" YIELDS THE FOLLOWING RESULTS: 8.4156821507078"-001 +1.0334768470687"+000. SUBSECTION: NONEXP BESS KAPLUSN. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "PROCEDURE" NONEXP BESS KAPLUSN(A, X, NMAX, KAN); "VALUE" A, X, NMAX; "REAL" A, X; "INTEGER" NMAX; "ARRAY" KAN; "CODE" 35195; NONEXP BESS KAPLUSN GENERATES AN ARRAY OF MODIFIED BESSEL FUNCTIONS THE THIRD KIND OF ARGUMENT X AND ORDERS A+N, N=0, 1,..., NMAX TIMES THE FACTOR EXP(X). THE MEANING OF THE FORMAL PARAMETERS IS: A: <ARITHMETIC EXPRESSION>; THE ORDER. IT IS ADVISED TO TAKE A >= 0; X: <ARITHMETIC EXPRESSION>; THE ARGUMENT. THIS ARGUMENT SHOULD SATISFY X>0; NMAX: <ARITHMETIC EXPRESSION>; THIS PARAMETER SHOULD SATISFY NMAX>=0; NMAX INDICATES THE MAXIMUM NUMBER OF FUNCTION VALUES TO BE GENERATED; KAN: <ARRAY IDENTIFIER>; "ARRAY" KAN[0:NMAX]; NMAX>=0; EXIT: KAN[N] IS THE MODIFIED BESSEL FUNCTION OF THE THIRD KIND OF ORDER N+A AND OF ARGUMENT X (N=0(1)NMAX) TIMES THE FACTOR EXP(X). PROCEDURES USED: NONEXP BESS KA = CP 35194. REQUIRED CENTRAL MEMORY: NO AUXILIARY ARRAYS ARE DECLARED. 1SECTION : 6.10.2 (DECEMBER 1978) PAGE 10 METHOD AND PERFORMANCE: THE RECURRENCE RELATION KAN[N+1]=KAN[N-1]+2*(N+A)*KAN[N]/X IS USED. THE STARTING VALUES ARE OBTAINED FROM THE PROCEDURE NONEXP BESS KA. IF A>=0, RECURSION IS NUMERICALLY STABLE IN THE FORWARD DIRECTION. FOR ALL VALUES OF X AND NMAX CONSIDERED (X>0) THE FUNCTIONS DELIVERED ARE EQUAL TO THE VALUES COMPUTED BY THE PROCEDURE BESS KAPLUSN,APART FROM AN EXPONENTIAL FACTOR. THE RELATION BETWEEN THE TWO PROCEDURES WILL BE DESCRIBED BY THE PROGRAM: "BEGIN" "REAL" X, A; "ARRAY" KA, NEKA[0:10]; "PROCEDURE" BESS KAPLUSN(A, X, NMAX, KA); "CODE" 35193; "PROCEDURE" NONEXP BESS KAPLUSN(A, X, NMAX, KAN); "CODE" 35195; X:= 2.78; A:= .96; BESS KAPLUSN(A, X, 10, KA); NONEXP BESS KAPLUSN(A, X, 10, NEKA) "END" THEN WE HAVE KA[N] = EXP(-X)*NEKA[N], N=0, 1, ..., 10. EXAMPLE OF USE: THE PROGRAM: "BEGIN" "ARRAY" KAN[0:2]; NONEXP BESS KAPLUSN(0, 5, 2, KAN); OUTPUT(61, "("3(N)")", KAN[0], KAN[1], KAN[2]) "END" YIELDS THE FOLLOWING RESULTS: +5.4780756431352"-001 +6.0027385878831"-001 +7.8791710782884"-001. 1SECTION : 6.10.2 (DECEMBER 1979) PAGE 11 SOURCE TEXT(S): "CODE" 35190; "COMMENT" COMPUTATION OF I[A](X), , I[N+A](X); "PROCEDURE" BESS IAPLUSN(A, X, N, IA); "VALUE" A, X, N; "INTEGER" N; "REAL" X, A; "ARRAY" IA; "IF" X= 0 "THEN" "BEGIN" IA[0]:= "IF" A= 0 "THEN" 1 "ELSE" 0; "FOR" N:= N "STEP" -1 "UNTIL" 1 "DO" IA[N]:= 0 "END" "ELSE" "IF" A= 0 "THEN" "BEGIN" BESS I(X, N, IA); "END" "ELSE" "IF" A= .5 "THEN" "BEGIN" "REAL" C; C:= .797 884 560 802 865 * SQRT(ABS(X)) * EXP (ABS (X)); NONEXP SPHER BESSI(X, N, IA); "FOR" N:= N "STEP" -1 "UNTIL" 0 "DO" IA[N]:= C*IA[N] "END" "ELSE" "BEGIN" "REAL" EXPX; EXPX:= EXP(ABS(X)); NONEXP BESS IAPLUSN(A, X, N, IA); "FOR" N:= N "STEP" -1 "UNTIL" 0 "DO" IA[N]:= EXPX * IA[N] "END" BESS IAPLUSN; "EOP" "CODE" 35191; "PROCEDURE" BESS KA01(A, X, KA, KA1); "VALUE" A, X; "REAL" A, X, KA, KA1; "IF" A = 0 "THEN" "BEGIN" BESS K01(X,KA,KA1) "END" "ELSE" "BEGIN" "REAL" F, G, H, PI; "INTEGER" N, NA; "BOOLEAN" REC, REV; PI:= 4 * ARCTAN(1); REV:= A < -.5; "IF" REV "THEN" A:= -A-1; REC:= A >= .5; "IF" REC "THEN" "BEGIN" NA:=ENTIER(A+.5); A:= A - NA "END"; "IF" A = .5 "THEN" F:= G:= SQRT(PI / X / 2) * EXP (-X) "ELSE" "IF" X < 1 "THEN" "BEGIN" "COMMENT" 1SECTION : 6.10.2 (DECEMBER 1978) PAGE 12 ; "REAL" A1, B, C, D, E, P, Q, S; B:=X/2;D:=-LN(B);E:=A*D;C:=A*PI; C:="IF" ABS(C)<"-15 "THEN" 1 "ELSE" C/SIN(C); S:="IF" ABS(E)<"-15 "THEN" 1 "ELSE" SINH(E)/E; E:=EXP(E);A1:=(E+1/E)/2;G:=RECIP GAMMA(A,P,Q)*E; KA:=F:=C*(P*A1+Q*S*D);E:=A*A; P:=.5*G*C;Q:=.5/G;C:=1;D:=B*B;KA1:=P; "FOR" N:=1,N+1 "WHILE" H/KA+ABS(G)/KA1>"-15 "DO" "BEGIN" F:=(F*N+P+Q)/(N*N-E);C:=C*D/N; P:=P/(N-A);Q:=Q/(N+A);G:=C*(P-N*F); H:=C*F;KA:=KA+H;KA1:=KA1+G "END"; F:=KA;G:=KA1/B "END" "ELSE" "BEGIN" "REAL" EXPON; EXPON:= EXP(-X); NONEXP BESS KA01(A, X, KA, KA1); F:= EXPON * KA; G:= EXPON * KA1 "END"; "IF" REC "THEN" "BEGIN" X:= 2 / X; "FOR" N:= 1 "STEP" 1 "UNTIL" NA "DO" "BEGIN" H:= F + (A + N) * X * G; F:= G; G:= H "END" "END"; "IF" REV "THEN" "BEGIN" KA1:= F; KA:= G "END" "ELSE" "BEGIN" KA:= F; KA1:= G "END" "END" BESS KA01; "EOP" "CODE" 35192; "PROCEDURE" BESS KAPLUSN(A, X, NMAX, KAN); "VALUE" A, X, NMAX; "REAL" A, X; "INTEGER" NMAX; "ARRAY" KAN; "BEGIN" "INTEGER" N; "REAL" K1; BESS KA01(A, X, KAN[0], K1); A:= A-1; X:= 2/X; "IF" NMAX > 0 "THEN" KAN[1]:= K1; "FOR" N:= 2 "STEP" 1 "UNTIL" NMAX "DO" KAN[N]:= KAN[N-2] + (A+N) * X * KAN[N-1] "END" BESS KAPLUSN 1SECTION : 6.10.2 (DECEMBER 1979) PAGE 13 ; "EOP" "CODE" 35193; "COMMENT" COMPUTATION OF NONEXPONENTIAL MODIFIED BESSEL FUNCTIONS OF FRACTIONAL ORDER; "PROCEDURE" NONEXP BESS IAPLUSN(A, X, N, IA); "VALUE" A, X, N; "REAL" X, A; "INTEGER" N; "ARRAY" IA; "IF" X= 0 "THEN" "BEGIN" IA[0]:= "IF" A= 0 "THEN" 1 "ELSE" 0; "FOR" N:= N "STEP" -1 "UNTIL" 1 "DO" IA[N]:= 0 "END" "ELSE" "IF" A= 0 "THEN" "BEGIN" NONEXP BESSI(X, N, IA) "END" "ELSE" "IF" A= .5 "THEN" "BEGIN" "REAL" C; C:= .797 884 560 802 865 * SQRT(X); NONEXP SPHER BESSI(X, N, IA); "FOR" N:= N "STEP" -1 "UNTIL" 0 "DO" IA[N]:= C * IA[N] "END" "ELSE" "BEGIN" "INTEGER" M, NU; "REAL" R, S, LABDA, L, A2, X2; A2:= A+A; X2:= 2/X; L:=1; NU:= START(X,N,1) ; R:= S:= 0; "FOR" M:= 1 "STEP" 1 "UNTIL" NU "DO" L:= L * (M+A2)/(M+1); "FOR" M:= NU "STEP" -1 "UNTIL" 1 "DO" "BEGIN" R:= 1/(X2 *(A+M)+R); L:= L*(M+1)/(M+A2); LABDA:= L*(M+A) * 2; S:= R * (LABDA + S); "IF" M <= N "THEN" IA[M]:= R "END"; IA[0]:= R:= 1/(1+S)/GAMMA(1+A)/X2 **A; "FOR" M:= 1 "STEP" 1 "UNTIL" N "DO" IA[M]:= R:= IA[M] * R; "END"; "EOP" "CODE" 35194; "PROCEDURE" NONEXP BESS KA01(A, X, KA, KA1); "VALUE" A, X; "REAL" A, X, KA, KA1; "IF" A = 0 "THEN" "BEGIN" NONEXP BESS K01(X,KA,KA1) "END" "ELSE" "BEGIN" "REAL" F, G, H, PI; "INTEGER" N, NA; "BOOLEAN" REC, REV; PI:= 4 * ARCTAN(1); REV:= A < -.5; "IF" REV "THEN" A:= -A-1; REC:= A >= .5; "IF" REC "THEN" "BEGIN" NA:=ENTIER(A+.5); A:= A - NA "END"; "IF" A = -.5 "THEN" F:= G:= SQRT(PI / X / 2) "ELSE" "IF" X < 1 "THEN" "BEGIN" "COMMENT" 1SECTION : 6.10.2 (DECEMBER 1978) PAGE 14 ; "REAL" EXPON; EXPON:= EXP(X); BESS KA01(A, X, KA, KA1); F:= EXPON * KA; G:= EXPON * KA1 "END" "ELSE" "BEGIN" "REAL" B, C, E, P, Q; C:=.25-A*A;B:=X+X;G:=1;F:=0;E:=COS(A*PI)/PI*X*"15; "FOR" N:=1,N+1 "WHILE" H*N<E "DO" "BEGIN" H:=(2*(N+X)*G-(N-1+C/N)*F)/(N+1);F:=G; G:=H "END"; P:= Q:= F / G; E:= B - 2; "FOR" N:=N,N-1 "WHILE" N>0 "DO" "BEGIN" P:=(N-1+C/N)/(E+(N+1)*(2-P));Q:=P*(1+Q) "END"; F:=SQRT(PI/B)/(1+Q);G:=F*(A+X+.5-P)/X "END"; "IF" REC "THEN" "BEGIN" X:= 2 / X; "FOR" N:= 1 "STEP" 1 "UNTIL" NA "DO" "BEGIN" H:= F + (A + N) * X * G; F:= G; G:= H "END" "END"; "IF" REV "THEN" "BEGIN" KA1:= F; KA:= G "END" "ELSE" "BEGIN" KA:= F; KA1:= G "END" "END" NONEXP BESS KA01; "EOP" "CODE" 35195; "PROCEDURE" NONEXP BESS KAPLUSN(A, X, NMAX, KAN); "VALUE" A, X, NMAX; "REAL" A, X; "INTEGER" NMAX; "ARRAY" KAN; "BEGIN" "INTEGER" N; "REAL" K1; NONEXP BESS KA01(A, X, KAN[0], K1); A:= A-1; X:= 2/X; "IF" NMAX > 0 "THEN" KAN[1]:= K1; "FOR" N:= 2 "STEP" 1 "UNTIL" NMAX "DO" KAN[N]:= KAN[N-2] + (A+N)*X*KAN[N-1]; "END" NONEXP BESS KAPLUSN; "EOP" 1SECTION : 6.10.3 (DECEMBER 1978) PAGE 1 AUTHOR: M. BAKKER. INSTITUTE: MATHEMATICAL CENTRE. BRIEF DESCRIPTION: THIS SECTION CONTAINS THE PROCEDURES SPHER BESS J: THIS PROCEDURE CALCULATES THE SPHERICAL BESSEL FUNCTIONS J[K+.5](X)*SQRT(PI/(2*X)),K=0, ..., N, WHERE J[K+.5](X) DENOTES THE BESSEL FUNCTION OF THE FIRST KIND OF ORDER K+.5; X>= 0; SPHER BESS Y: THIS PROCEDURE CALCULATES THE SPHERICAL BESSEL FUNCTIONS Y[K+.5](X)*SQRT(PI/(2*X)), K=0, ..., N, WHERE Y[K+.5](X) DENOTES THE BESSEL FUNCTION OF THE THIRD KIND OF ORDER K+.5; X SHOULD BE POSITIVE; SPHER BESS I: THIS PROCEDURE CALCULATES THE MODIFIED SPHERICAL BESSEL FUNCTIONS I[K+.5](X)*SQRT(PI/(2*X))), K=0, ..., N, WHERE I[K+.5](X) DENOTES THE MODIFIED BESSEL FUNCTION OF THE FIRST KIND OF ORDER K+.5; X>=0; NONEXP SPHER BESS I: THIS PROCEDURE CALCULATES THE MODIFIED SPHERICAL BESSEL FUNCTIONS MULTIPIED BY EXP(-X) EXP(-X)*I[K+.5](X)*SQRT(PI/(2*X)), K=0, ...,N, WHERE I[K+.5](X) DENOTES THE MODIFIED BESSEL FUNCTION OF THE FIRST KIND OF ORDER K+.5; X>= 0; SPHER BESS K: THIS PROCEDURE CALCULATES THE MODIFIED SPHERICAL BESSEL FUNCTIONS K[I+.5](X)*SQRT(PI/(2*X)), I=0, ...,N, WHERE K[I+.5](X) DENOTES THE MODIFIED BESSEL FUNCTION OF THE THIRD KIND OF ORDER I+.5; X>0; NONEXP SPHER BESS K: THIS PROCEDURE CALCULATES THE MODIFIED SPHERICAL BESSEL FUNCTIONS MULTIPLIED BY EXP(+X) EXP(+X)*K[I+.5](X)*SQRT(PI/(2*X)), I=0, ..., N, WHERE K[I+.5](X) DENOTES THE MODIFIED BESSEL FUNCTION OF THE THIRD KIND OF ORDER I+.5; X>0; 1SECTION : 6.10.3 (DECEMBER 1978) PAGE 2 KEYWORDS: BESSEL FUNCTIONS, SPHERICAL BESSEL FUNCTIONS, MODIFIED SPHERICAL BESSEL FUNCTIONS. REFERENCES: [1]. ABRAMOWITZ, M., AND STEGUN, I. (EDS), HANDBOOK OF MATHEMATICAL FUNCTIONS WITH FORMULAS, GRAPHS AND MATHEMATICAL TABLES. APPL. MATH. SER. 55, U.S. GOVT. PRINTING OFFICE, WASHINGTON, D.C. , 1974. [2]. GAUTSCHI, W., COMPUTATIONAL ASPECTS OF THREE TERM RECURRENCE RELATIONS. SIAM REVIEW, VOLUME 9(1967), NUMBER 1, P.24 FF. SUBSECTION: SPHER BESS J. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "PROCEDURE" SPHER BESS J (X, N, J); "VALUE" X, N; "REAL" X; "INTEGER" N; "ARRAY" J; "CODE" 35150; THE MEANING OF THE FORMAL PARAMETERS IS: X: < ARITHMETIC EXPRESSION >; THE VALUE OF THE ARGUMENT; X > = 0; N: < ARITHMETIC EXPRESSION >; THE UPPER BOUND OF THE INDICES OF THE ARRAY J; N > = 0; J: < ARRAY IDENTIFIER >; "ARRAY" J[0:N]; EXIT: J[K] HAS THE VALUE OF THE SPHERICAL BESSEL FUNCTION J[K+.5](X) * SQRT(PI/(2*X)), 0< = K < = N; PROCEDURES USED: START = CP 35185. REQUIRED CENTRAL MEMORY: NO AUXILIARY ARRAYS ARE DECLARED. 1SECTION : 6.10.3 (DECEMBER 1978) PAGE 3 METHOD AND PERFORMANCE: AT FIRST THE RATIO OF TWO CONSEQUENT ARRAY ELEMENTS IS COMPUTED BY MEANS OF A BACKWARD RECURRENCE FORMULA USING MILLER 'S METHOD (SEE[2, P.46-52]) AND HENCE ALL THE ARRAY ELEMENTS ARE COMPUTED SINCE THE ZEROTH ELEMENT IS KNOWN TO BE SIN(X)/X. THE STARTING VALUE IS COMPUTED BY START. RUNNING TIME: ROUGHLY PROPERTIONAL TO THE MAXIMUM OF X AND N. EXAMPLE OF USE: THE PROGRAM "BEGIN" "REAL" X ; "ARRAY" J[0:2]; "INTEGER" N; X:= 1.5; N:= 2; SPHER BESS J(X, N, J); OUTPUT(61, "("/, "("X=")" D.D, B"("N=")"D,/, 3(3B-.14D"-ZD)")", X, N, J[0], J[1], J[2]) "END" PRINTS THE FOLLOWING RESULTS: X=1.5 N=2 .66499665773603"0 .3961729707122"0 .12734928368841"0 SUBSECTION: SPHER BESS Y. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "PROCEDURE" SPHER BESS Y(X, N, Y); "VALUE" X, N; "REAL" X; "INTEGER" N; "ARRAY" Y; "CODE" 35151; THE MEANING OF THE FORMAL PARAMETERS IS : X: < ARITHMETIC EXPRESSION >; THE ARGUMENT OF THE BESSEL FUNCTIONS; X > 0; N: < ARITHMETIC EXPRESSION >; THE UPPER BOUND OF THE INDICES OF THE ARRAY Y; N > = 0; Y: < ARRAY IDENTIFIER >; "ARRAY" Y[0:N]; EXIT: Y[K] HAS THE VALUE OF THE K-TH SPHERICAL BESSEL FUNCTION OF THE SECOND KIND; 1SECTION : 6.10.3 (DECEMBER 1978) PAGE 4 PROCEDURES USED: NONE. REQUIRED CENTRAL MEMORY: NO AUXILIARY ARRAYS ARE DECLARED. METHOD AND PERFORMANCE: Y[0] AND Y[1] ARE GIVEN IN [1, P.438, FORMULA 10.1.12] AND Y[2], ..., Y[N] ARE COMPUTED BY USING THE RECURRENCE FORMULA Y[K]:= ((2*K-1)/X) * Y[K-1] - Y[K-2], K > = 2. EXAMPLE OF USE: THE PROGRAM "BEGIN" "REAL" X; "INTEGER" N; "ARRAY" Y[0:2]; X:= 1.5707 96326 79489; "COMMENT" X= PI/2; N:= 2; SPHER BESS Y(X, N, Y); OUTPUT(61, "("2(4B-.10D"-ZD), /, 3(4B-.10D"-ZD)")", X, N, Y) "END" PRINTS THE FOLLOWING RESULTS: .15707963271"1 .2000000000"1 -.6223649549"-13 -.6366197724"0 -.1215854204"1 SUBSECTION: SPHER BESS I. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "PROCEDURE" SPHER BESS I(X, N, I); "VALUE" X, N; "REAL" X; "INTEGER" N; "ARRAY" I; "CODE" 35152; THE MEANING OF THE FORMAL PARAMETERS IS: X: < ARITHMETIC EXPRESSION >; THE ARGUMENT OF THE BESSEL FUNCTIONS; X > = 0; N: < ARITHMETIC EXPRESSION >; THE UPPER BOUND OF THE INDICES OF THE ARRAY I; N > = 0; I: < ARRAY IDENTIFIER >; "ARRAY" I[0:N]; EXIT: I[K] HAS THE VALUE OF THE MODIFIED SPHERICAL BESSEL FUNCTION AS DESCRIBED IN [1, CH.10.2]. 1SECTION : 6.10.3 (DECEMBER 1978) PAGE 5 METHOD AND PERFORMANCE: AT FIRST THE NONEXPONENTIAL MODIFIED SPHERICAL BESSEL FUNCTIONS ARE COMPUTED BY USING THE PROCEDURE NONEXP SPHER BESS I; AFTERWARDS THEY ARE MULTIPLIED BY EXP(X). REQUIRED CENTRAL MEMORY: NO AUXILIARY ARRAYS ARE DECLARED. PROCEDURES USED: NONEXP SPHER BESS I = CP 35154. EXAMPLE OF USE: THE PROGRAM SHOWS THAT THE RESULTS OF SPHER BESS I AND NONEXP SPHER BESS I DIFFER ONLY BY A FACTOR EXP(X): "BEGIN" "REAL" X, EXPX; "INTEGER" N; "ARRAY" I1, I2[0:3]; X:=1; EXPX:= EXP(X); N:= 3; SPHER BESS I(X, N,I1); NONEXPSPHER BESS I(X, N, I2);"FOR" N:=0, 1, 2, 3 "DO" OUTPUT(61, "("/ZD, 2(5B-.14D"-ZD)")", N, I1[N], I2[N]*EXPX) "END" RESULTS: 0 .11752011936438" 1 .11752011936438" 1 1 .36787944117144" 0 .36787944117144" 0 2 .71562870129474"-1 .71562870129474"-1 3 .10065090524070"-1 .10065090524070"-1 SUBSECTION: NONEXP SPHER BESS I. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "PROCEDURE" NONEXP SPHER BESS I(X, N, I); "VALUE" X, N; "REAL" X; "INTEGER" N; "ARRAY" I; "CODE" 35154; THE MEANING OF THE FORMAL PARAMETERS IS: X: <ARITHMETIC EXPRESSION>; THE ARGUMENT OF THE BESSEL FUNCTIONS; X >= 0; N: <ARITHMETIC EXPRESSION>; THE UPPER BOUND OF THE INDICES OF THE ARRAY I; N >= 0; I: <ARRAY IDENTIFIER>; "ARRAY" I[0:N]; EXIT: I[K] HAS THE VALUE OF THE FUNCTION I[K+.5](X)*EXP(-X)*SQRT(PI/(2*X)), K=0, ..., N, N >=0. 1SECTION : 6.10.3 (DECEMBER 1978) PAGE 6 PROCEDURES USED: SINH = CP 35111, START = CP 35185. REQUIRED CENTRAL MEMORY: NO AUXILIARY ARRAYS ARE DECLARED. METHOD AND PERFORMANCE: THE RATIO OF TWO SUBSEQUENT ELEMENTS IS COMPUTED USING A BACKWARD RECURRENCE FORMULA ACCORDING MILLER'S METHOD (SEE[2]); SINCE THE ZEROETH ELEMENT IS KNOWN TO BE (1-EXP(-2*X))/(2*X), THE OTHER ELEMENTS FOLLOW IMMEDIATELY.THE STARTING VALUE IS COMPUTED BY START. EXAMPLE OF USE: SEE SPHER BESS I. SUBSECTION: SPHER BESS K. CALLING SEQUENCE : THE HEADING OF THE PROCEDURE READS: "PROCEDURE" SPHER BESS K(X, N, K); "VALUE" X, N; "REAL" X; "INTEGER" N; "ARRAY" K; "CODE" 35153; THE MEANING OF THE FORMAL PARAMETERS IS: X: < ARITHMETIC EXPRESSION >; THE ARGUMENT VALUE; X > 0; N: < ARITHMETIC EXPRESSION >; THE UPPER BOUND OF THE INDICES OF THE ARRAY K; N > = 0; K: < ARRAY IDENTIFIER >; "ARRAY" K[0:N]; EXIT: K[J] HAS THE VALUE OF THE J-TH MODIFIED SPHERICAL BESSEL FUNCTION OF THE THIRD KIND, 0 < = J < = N. PROCEDURES USED: NON EXP SPHER BESS K = CP 35155. REQUIRED CENTRAL MEMORY: NO AUXILIARY ARRAYS ARE DECLARED. METHOD AND PERFORMANCE: AT FIRST THE NONEXPONENTIAL MODIFIED SPHERICAL BESSEL FUNCTIONS OF THE THIRD KIND ARE COMPUTED BY THE PROCEDURE NONEXP SPHER BESS K ; AFTERWARDS THEY ARE MULTIPLIED BY EXP(-X). 1SECTION : 6.10.3 (DECEMBER 1978) PAGE 7 EXAMPLE OF USE: THE FOLLOWING PROGRAM SHOWS THAT THE RESULTS OF THE PROCEDURES SPHER BESS K EN NONEXP SPHER BESS K DIFFER ONLY BY A FACTOR EXP(X); "BEGIN" "REAL" X, EXPX; "INTEGER" N; "ARRAY" K1, K2[0:3]; X:= 2; EXPX:= EXP(-X); N:= 3; SPHER BESS K (X, N, K1); NONEXPSPHER BESS K (X, N, K2); "FOR" N:= 0, 1, 2, 3 "DO" OUTPUT(61, "("/D, 2(5B-.14D"-ZD)")", N, K1[N], K2[N]*EXPX) "END" RESULTS: 0 .10629208289691"0 .10629208289691"0 1 .15943812434536"0 .15943812434536"0 2 .34544926941495"0 .34544926941494"0 3 .10230612978828"1 .10230612978828"1 SUBSECTION: NONEXP SPHER BESS K. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "PROCEDURE" NON EXP SPHER BESS K(X, N, K); "VALUE" X, N; "REAL" X; "INTEGER" N; "ARRAY" K; "CODE" 35155; THE MEANING OF THE FORMAL PARAMETERS IS: X: <ARITHMETIC EXPRESSION>; THE ARGUMENT OF THE BESSEL FUNCTIONS; X > 0; N: <ARITHMETIC EXPRESSION>; THE UPPER BOUND OF THE INDICES OF THE ARRAY K; N >= 0; K: <ARRAY IDENTIFIER>; "ARRAY" K[0:N]; EXIT: K[J] HAS THE VALUE OF THE FUNCTION K[J+.5](X)*EXP(X)*SQRT(PI/(2*X)), J=0,...,N. PROCEDURES USED: NONE. REQUIRED CENTRAL MEMORY : NO AUXILIARY ARRAYS ARE DECLARED. METHOD AND PERFORMANCE: THE FUNCTIONS ARE COMPUTED BY USING THE (NUMERICALLY STABLE) RECURRENCE FORMULA : K[J]=((2*J-1)/X)*K[J-1]+K[J-2], J >=2, K[0]=PI/(2*X), K[1]=K[0]*(1+1/X) . EXAMPLE OF USE: SEE SPHER BESS K. 1SECTION : 6.10.3 (DECEMBER 1978) PAGE 8 SOURCE TEXT(S): 0"CODE" 35150; "COMMENT" SPHERICAL BESSEL FUNCTIONS J[.5](X), , J[N+.5](X); "PROCEDURE" SPHER BESS J(X, N, J); "VALUE" X, N; "REAL" X; "INTEGER" N; "ARRAY" J; "IF" X = 0 "THEN" "BEGIN" J[0]:= 1; "FOR" N:= N "STEP" -1 "UNTIL" 1 "DO" J[N]:=0 "END" "ELSE" "IF" N = 0 "THEN" "BEGIN" "REAL" X2; "IF" ABS(X) < .015 "THEN" "BEGIN" X2:= X * X / 6; J[0]:= 1 + X2 * (X2 * .3 - 1) "END" "ELSE" J[0]:= SIN(X)/X "END" "ELSE" "BEGIN" "INTEGER" M; "REAL" R, S; R:= 0; M:= START(X,N,0); "FOR" M:= M "STEP" - 1 "UNTIL" 1 "DO" "BEGIN" R:= 1 / ((M + M + 1) / X - R); "IF" M <= N "THEN" J[M]:= R "END"; "IF" X < .015 "THEN" "BEGIN" S:= X * X / 6; J[0]:= R:= S * (S * .3 - 1) + 1 "END" "ELSE" J[0]:= R:= SIN(X) / X; "FOR" M:= 1 "STEP" 1 "UNTIL" N "DO" J[M]:= R:= J[M] * R; "END" SPHER BESS J; "EOP" "CODE" 35151; "COMMENT" SPHERICAL BESSEL FUNCTIONS Y[.5](X), , Y[N+.5](X); "PROCEDURE" SPHER BESS Y(X, N, Y); "VALUE" X, N; "INTEGER" N; "REAL" X; "ARRAY" Y; "IF" N=0 "THEN" Y[0]:= - COS(X)/X "ELSE" "BEGIN" "REAL" YI, YI1, YI2; "INTEGER" I; YI2:= Y[0]:= -COS(X)/X; YI1:= Y[1]:= (YI2 - SIN(X))/X; "FOR" I:= 2 "STEP" 1 "UNTIL" N "DO" "BEGIN" Y[I]:= YI:= -YI2 + (I+I-1) * YI1/X; YI2:= YI1; YI1:= YI "END" "END" 1SECTION : 6.10.3 (DECEMBER 1978) PAGE 9 ; "EOP" "CODE" 35152; "COMMENT" SPHERICAL BESSEL FUNCTIONS I[.5](X), , I[N+.5](X); "PROCEDURE" SPHER BESS I(X, N, I); "VALUE" X, N; "REAL" X; "INTEGER" N; "ARRAY" I; "IF" X= 0 "THEN" "BEGIN" I[0]:=1; "FOR" N:= N "STEP" -1 "UNTIL" 1 "DO" I[N]:= 0 "END" "ELSE" "BEGIN" "REAL" EXPX; EXPX:= EXP(X); NONEXP SPHER BESS I(X, N, I); "FOR" N:= N "STEP" - 1 "UNTIL" 0 "DO" I [N]:= I [N] * EXPX "END" SPHER BESS I; "EOP" "CODE" 35153; "COMMENT" MODIFIED SPHERICAL BESSEL FUNCTIONS K[.5](X), , K[N+.5](X); "PROCEDURE" SPHER BESS K(X, N, K); "VALUE" X, N; "INTEGER" N; "REAL" X; "ARRAY" K; "BEGIN" "REAL" EXPX; EXPX:= EXP(-X); NONEXP SPHER BESS K(X, N, K); "FOR" N:= N "STEP" -1 "UNTIL" 0 "DO" K[N]:= K[N] * EXPX "END" 1SECTION : 6.10.3 (DECEMBER 1978) PAGE 10 ; "EOP" "CODE" 35154; "PROCEDURE" NONEXP SPHER BESS I(X, N, I); "VALUE" X, N; "REAL" X; "INTEGER" N; "ARRAY" I; "IF" X= 0 "THEN" "BEGIN" I[0]:=1; "FOR" N:= N "STEP" -1 "UNTIL" 1 "DO" I[N]:= 0 "END" "ELSE" "BEGIN" "REAL" X2, R, S; "INTEGER" M; X2:= X+X; I[0]:= X2:= "IF" X = 0 "THEN" 1 "ELSE" "IF" X2 < 0.7 "THEN" SINH(X) / (X * EXP(X)) "ELSE" (1-EXP(-X2))/X2; "IF" N= 0 "THEN" "GO TO" EXIT; R:= 0; M:= START(X,N,1); "FOR" M:= M "STEP" -1 "UNTIL" 1 "DO" "BEGIN" R:= 1/((M+M+1)/X+R); "IF" M <= N "THEN" I[M]:= R "END"; "FOR" M:= 1 "STEP" 1 "UNTIL" N "DO" I[M]:= X2:= X2 * I[M]; EXIT: "END"; "EOP" "CODE" 35155; "PROCEDURE" NONEXP SPHER BESS K(X, N, K); "VALUE" X, N; "REAL" X; "INTEGER" N; "ARRAY" K; "BEGIN" "INTEGER" I; "REAL" KI, KI1, KI2; X:= 1/X; K[0]:= KI2:= X*1.5707963267949; "IF" N=0 "THEN" "GO TO" EXIT; K[1]:= KI1:= KI2 * (1+X); "FOR" I:= 2 "STEP" 1 "UNTIL" N "DO" "BEGIN" K[I]:= KI:= KI2 + (I+I-1) * X * KI1; KI2:= KI1; KI1:= KI "END"; EXIT: "END"; "EOP" 1SECTION : 6.10.4 (OCTOBER 1975) PAGE 1 AUTHOR : P.W.HEMKER. CONTRIBUTOR : F.GROEN. INSTITUTE : MATHEMATICAL CENTRE. RECEIVED : 740620. BRIEF DESCRIPTION : THIS SECTION CONTAINS TWO PROCEDURES FOR THE EVALUATION OF AIRY FUNCTIONS AND COMPUTING THEIR ZEROS. FOR THE DEFINITION OF THESE FUNCTIONS SEE REF[1]. AIRY EVALUATES THE AIRY FUNCTIONS AI(Z) AND BI(Z) AND THEIR DERIVATIVES. AIRYZEROS COMPUTES THE ZEROS AND ASSOCIATED VALUES OF THE AIRY FUNCTIONS AI(Z) AND BI(Z) AND THEIR DERIVATIVES. KEYWORDS : AIRY FUNCTION, DERIVATIVE AIRY FUNCTION, ZERO OF AIRY FUNCTION. 1SECTION : 6.10.4 (OCTOBER 1975) PAGE 2 SUBSECTION : AIRY. CALLING SEQUENCE : THE HEADING OF THE PROCEDURE READS : "PROCEDURE" AIRY(X,AI,AID,BI,BID,EXPON,FIRST); "VALUE" X,FIRST; "BOOLEAN" FIRST; "REAL" X,AI,AID,BI,BID,EXPON; "CODE" 35140; THE MEANING OF THE FORMAL PARAMETERS IS : X: <ARITHMETIC EXPRESSION>; ENTRY : THE REAL ARGUMENT OF THE AIRY FUNCTIONS. AI: <VARIABLE>; EXIT : THE VALUE OF THE AIRY FUNCTION AI IS GIVEN BY : EXP( -EXPON ) * AI. NOTE : IF X < 9 THEN EXPON = 0. AID: <VARIABLE>; EXIT : THE VALUE OF THE DERIVATIVE OF THE AIRY FUNCTION AI IS GIVEN BY : EXP( -EXPON ) * AID. NOTE : IF X < 9 THEN EXPON = 0. BI: <VARIABLE>; EXIT : THE VALUE OF THE AIRY FUNCTION BI IS GIVEN BY : EXP( EXPON ) * BI. NOTE : IF X < 9 THEN EXPON = 0. BID: <VARIABLE>; EXIT : THE VALUE OF THE DERIVATIVE OF THE AIRY FUNCTION BI IS GIVEN BY : EXP( EXPON ) * BID. NOTE : IF X < 9 THEN EXPON = 0. EXPON: <VARIABLE>; EXIT : IF X < 9 THEN 0 ELSE 2/3 * X ** (3/2). FIRST: <BOOLEAN EXPRESSION>; FIRST SHOULD BE "FALSE" UNLESS THE PROCEDURE IS CALLED FOR THE FIRST TIME. IF FIRST IS "TRUE" THEN TWO OWN ARRAYS OF COEFFICIENTS ARE BUILT UP. PROCEDURES USED : NONE. 1SECTION : 6.10.4 (OCTOBER 1975) PAGE 3 REQUIRED CENTRAL MEMORY : TWO OWN ARRAYS OF ORDER 10 ARE DECLARED. RUNNING TIME : IF 2.5 <= X <= 8 THEN ABOUT 8"-3 SEC., ELSE BETWEEN 3"-3 AND 4"-3 SEC. ON THE CYBER 73/28. LANGUAGE : ALGOL 60. METHOD AND PERFORMANCE : SEE REF[2] OF THE SUBSECTION AIRYZEROS (THIS SECTION). REFERENCES : SEE REFERENCES OF THE SUBSECTION AIRYZEROS (THIS SECTION). EXAMPLE OF USE : "BEGIN" "REAL" A,B,C,D,E; AIRY(9.654894,A,B,C,D,E,"TRUE"); OUTPUT(61,"("/,"("AI (9.654894) = ")",N")",A*EXP(-E)); OUTPUT(61,"("/,"("AID(9.654894) = ")",N")",B*EXP(-E)); OUTPUT(61,"("/,"("BI (9.654894) = ")",N")",C*EXP( E)); OUTPUT(61,"("/,"("BID(9.654894) = ")",N")",D*EXP( E)); "END" RESULTS : AI (9.654894) = +3.2873525549165"-010 AID(9.654894) = -1.0297999323482"-009 BI (9.654894) = +1.5583887049670"+008 BID(9.654894) = +4.8010374682654"+008 1SECTION : 6.10.4 (OCTOBER 1975) PAGE 4 SUBSECTION : AIRYZEROS. CALLING SEQUENCE : THE HEADING OF THE PROCEDURE READS : "REAL" "PROCEDURE" AIRYZEROS(N,D,ZAI,VAI); "VALUE" N,D; "INTEGER" N,D; "ARRAY" ZAI,VAI; "CODE" 35145; AIRYZEROS := THE N-TH ZERO OF THE SELECTED AIRY-FUNCTION. THE MEANING OF THE FORMAL PARAMETERS IS : N : <ARITHMETIC EXPRESSION>; ENTRY : THE NUMBER OF ZEROS TO BE CALCULATED; D : <ARITHMETIC EXPRESSION>; ENTRY : AN INTEGER WHICH SELECTS THE REQUIRED AIRY FUNCTION. D = 0, 1, 2 OR 3. ZAI : <ARRAY IDENTIFIER>; "ARRAY" ZAI[1 : N]; EXIT : ZAI[J] CONTAINS THE J-TH ZERO OF THE SELECTED AIRY-FUNCTION : IF D = 0 THEN AI(Z), IF D = 1 THEN (D/DX) AI(X), IF D = 2 THEN BI(X), IF D = 3 THEN (D/DX) BI(X); VAI : <ARRAY IDENTIFIER>; "ARRAY" VAI[1 : N]; EXIT: VAI[J] CONTAINS THE VALUE AT X = ZAI[J] OF THE FOLLOWING FUNCTION : IF D = 0 THEN (D/DX) AI(X), IF D = 1 THEN AI(X), IF D = 2 THEN (D/DX) BI(X), IF D = 3 THEN BI(X); PROCEDURES USED : AIRY = CP35140; REQUIRED CENTRAL MEMORY : NO AUXILIARY ARRAYS ARE DECLARED. RUNNING TIME : DEPENDENT ON THE VALUES OF N AND D. IN MOST CASES THE RUNNING TIME IS LESS THAN N * 0.01 SEC. ON THE CYBER 73/28. LANGUAGE : ALGOL 60. 1SECTION : 6.10.4 (OCTOBER 1975) PAGE 5 METHOD AND PERFORMANCE : A FIRST APPROXIMATION OF THE ZEROS OF THE SELECTED AIRY-FUNCTION IS CALCULATED BY MEANS OF THE ASYMPTOTIC EXPANSION ( SEE THE FORMULAS 10.4.94 - 10.4.105 OF REF[1] ); THIS VALUE IS CORRECTED BY THE (REPEATED) USE OF A QUADRATIC INTERPOLATION RULE. THE COMPUTED ZEROS WILL SATISFY AT LEAST ONE OF THE FOLLOWING CONDITIONS : 1: THE ABSOLUTE VALUE OF THE SELECTED AIRY-FUNCTION AT A COMPUTED ZERO IS LESS THAN "-12. NOTE: THE VALUES OF THE AIRY-FUNCTIONS ARE CALCULATED BY MEANS OF THE PROCEDURE AIRY (THIS SECTION). 2: THE RELATIVE PRECISION OF THE COMPUTED ZERO IS "-14. THE ASSOCIATED VALUES ( DELIVERED IN THE ARRAY VAI ) ARE ALSO CALCULATED BY MEANS OF THE PROCEDURE AIRY (THIS SECTION). REFERENCES : [1] : M.ABRAMOWITZ AND I.A.STEGUN, HANDBOOK OF MATHMATICAL FUNCTIONS, DOVER PUBLICATIONS, INC. NEW YORK, 1965. [2] : R.G.GORDON, EVALUATION OF AIRY FUNCTIONS, THE JOURNAL OF CHEMICAL PHYSICS, VOLUME 51, 1969, PP. 23-24. EXAMPLE OF USE : "BEGIN" "ARRAY" ZBI,VBID[1 : 3]; OUTPUT(61,"("/"("THE THIRD ZERO OF BI(X) IS")"/,N, /"("THE VALUE OF (D/DX)BI(X) IN THIS POINT IS")"/,N")" ,AIRYZEROS(3,2,ZBI,VBID),VBID[3]) "END" RESULTS : THE THIRD ZERO OF BI(X) IS -4.8307378416626"+000 THE VALUE OF (D/DX)BI(X) IN THIS POINT IS +8.3699101261986"-001 1SECTION : 6.10.4 (OCTOBER 1975) PAGE 6 SOURCE TEXT(S): 0"CODE" 35140; "PROCEDURE" AIRY(Z,AI,AID,BI,BID,EXPON,FIRST); "VALUE" Z,FIRST; "BOOLEAN" FIRST; "REAL" Z,AI,AID,BI,BID,EXPON; "BEGIN" "REAL" S,T,U,V,SC,TC,UC,VC,X,K1,K2,K3,K4, C,ZT,SI,CO,EXPZT,SQRTZ,WWL,PL,PL1,PL2,PL3; "OWN" "REAL" C1,C2,SQRT3,SQRT1OPI,PIO4; "OWN" "REAL" "ARRAY" XX,WW[1:10]; "INTEGER" N,L; "IF" FIRST "THEN" "BEGIN" SQRT3:= 1.73205080756887729; SQRT1OPI:= 0.56418958354775629; PIO4:= 0.78539816339744831; C1:= 0.35502 80538 87817; C2:= 0.25881 94037 92807; XX[ 1]:= 1.40830 81072 180964 "+1; XX[ 2]:= 1.02148 85479 197331 "+1; XX[ 3]:= 7.44160 18450 450930 ; XX[ 4]:= 5.30709 43061 781927 ; XX[ 5]:= 3.63401 35029 132462 ; XX[ 6]:= 2.33106 52303 052450 ; XX[ 7]:= 1.34479 70824 609268 ; XX[ 8]:= 6.41888 58369 567296 "-1; XX[ 9]:= 2.01003 45998 121046 "-1; XX[10]:= 8.05943 59172 052833 "-3; WW[ 1]:= 3.15425 15762 964787"-14; WW[ 2]:= 6.63942 10819 584921"-11; WW[ 3]:= 1.75838 89061 345669"- 8; WW[ 4]:= 1.37123 92370 435815"- 6; WW[ 5]:= 4.43509 66639 284350"- 5; WW[ 6]:= 7.15550 10917 718255"- 4; WW[ 7]:= 6.48895 66103 335381"- 3; WW[ 8]:= 3.64404 15875 773282"- 2; WW[ 9]:= 1.43997 92418 590999"- 1; WW[10]:= 8.12311 41336 261486"- 1; "END"; EXPON:= 0; "IF" Z >= -5.0 "AND" Z <= 8 "THEN" "BEGIN" U:= V:= T:= UC:= VC:= TC:= 1; S:= SC:= 0.5; N:= 0; X:= Z*Z*Z; "FOR" N:= N+3 "WHILE" ABS(U)+ABS(V)+ABS(S)+ABS(T) > "-18 "DO" "BEGIN" U:=U*X/(N*(N-1)); V:= V*X/(N*(N+1)); S:=S*X/(N*(N+2)); T:= T*X/(N*(N-2)); UC:= UC+U; VC:= VC+V; SC:= SC+S; TC:= TC+T "END"; "COMMENT" 1SECTION : 6.10.4 (OCTOBER 1975) PAGE 7 ; BI:= SQRT3 * (C1*UC + C2*Z*VC); BID:=SQRT3 * (C1*Z*Z*SC +C2*TC); "IF" Z<2.5 "THEN" "BEGIN" AI:= C1*UC - C2*Z*VC; AID:= C1*SC*Z*Z - C2*TC; "GOTO" END "END" "END"; K1:= K2:= K3:= K4:= 0; SQRTZ:= SQRT(ABS(Z)); ZT:= 0.66666 66666 66667 * ABS(Z)*SQRTZ; C:= SQRT1OPI/SQRT(SQRTZ); "IF" Z<0 "THEN" "BEGIN" Z:= -Z; CO:= COS(ZT-PIO4); SI:= SIN(ZT-PIO4); "FOR" L:= 1 "STEP" 1 "UNTIL" 10 "DO" "BEGIN" WWL:= WW[L]; PL:= XX[L]/ZT; PL2:=PL*PL; PL1:= 1+PL2; PL3:= PL1*PL1; K1:= K1 + WWL/PL1; K2:= K2 + WWL*PL/PL1; K3:= K3 + WWL*PL*(1+PL*(2/ZT+PL))/PL3; K4:= K4 + WWL*(-1-PL*(1+PL*(ZT-PL))/ZT)/PL3; "END"; AI:= C*(CO*K1+SI*K2); AID:= 0.25*AI/Z - C*SQRTZ*(CO*K3+SI*K4); BI:= C*(CO*K2-SI*K1); BID:= 0.25*BI/Z - C*SQRTZ*(CO*K4-SI*K3); "END" "ELSE" "BEGIN" "IF" Z < 9 "THEN" EXPZT:= EXP(ZT) "ELSE" "BEGIN" EXPZT:= 1; EXPON:= ZT "END"; "FOR" L:= 1 "STEP" 1 "UNTIL" 10 "DO" "BEGIN" WWL:= WW[L]; PL:= XX[L]/ZT; PL1:= 1+PL; PL2:= 1-PL; K1:= K1 + WWL/PL1; K2:= K2 + WWL*PL/(ZT*PL1*PL1); K3:= K3 + WWL/PL2; K4:= K4 + WWL*PL/(ZT*PL2*PL2); "END"; AI:= 0.5*C*K1/EXPZT; AID:= AI*(-.25/Z-SQRTZ) + 0.5*C*SQRTZ*K2/EXPZT; "IF" Z >= 8 "THEN" "BEGIN" BI:= C*K3*EXPZT; BID:= BI*(SQRTZ-0.25/Z) - C*K4*SQRTZ*EXPZT; "END"; "END"; END: "END" AIRY 1SECTION : 6.10.4 (OCTOBER 1975) PAGE 8 ; "EOP" 0"CODE" 35145; "REAL" "PROCEDURE" AIRYZEROS(N,D,ZAI,VAI); "VALUE" N,D; "INTEGER" N,D; "ARRAY" ZAI,VAI; "BEGIN" "BOOLEAN" A, FOUND; "INTEGER" I; "REAL" C,E,R,ZAJ,ZAK,VAJ,DAJ,KAJ,ZZ; A := D = 0 "OR" D = 2; R := "IF" D = 0 "OR" D = 3 "THEN" -1.1780 97245 09617 "ELSE" -3.5342 91735 28852; "COMMENT" R := "IF" D = 0 "OR" D = 3 "THEN" -3 * PI / 8 "ELSE" -9 * PI / 8; AIRY(0,ZAJ,VAJ,DAJ,KAJ,ZZ,"TRUE"); "FOR" I := 1 "STEP" 1 "UNTIL" N "DO" "BEGIN" R := R + 4.7123 88980 38469; "COMMENT" R := R + 3 * PI / 2; ZZ := R * R; ZAJ := "IF" I = 1 "AND" D = 1 "THEN" -1.01879 297 "ELSE" "IF" I = 1 "AND" D = 2 "THEN" -1.17371 322 "ELSE" R ** 0.66666 66666 66667 * ( "IF" A "THEN" - ( 1 + ( 5/48 - ( 5/36 - ( 77125/82944 - ( 1080 56875 / 69 67296 - (16 23755 96875 / 3344 30208) /ZZ)/ZZ)/ZZ)/ZZ)/ZZ) "ELSE" - ( 1 - ( 7/48 - ( 35/288 - ( 1 81223 / 2 07360 - ( 186 83371 / 12 44160 - ( 9 11458 84361 / 1911 02976 ) /ZZ)/ZZ)/ZZ)/ZZ)/ZZ)); "IF" D <= 1 "THEN" AIRY(ZAJ,VAJ,DAJ,C,E,ZZ,"FALSE") "ELSE" AIRY(ZAJ,C,E,VAJ,DAJ,ZZ,"FALSE"); FOUND := ABS( "IF" A "THEN" VAJ "ELSE" DAJ ) < "-12; "FOR" C := C "WHILE" "NOT" FOUND "DO" "BEGIN" "IF" A "THEN" "BEGIN" KAJ := VAJ / DAJ; ZAK := ZAJ - KAJ * (1 + ZAJ * KAJ * KAJ) "END" "ELSE" "BEGIN" KAJ := DAJ / (ZAJ * VAJ); ZAK := ZAJ - KAJ * (1 + KAJ * (KAJ * ZAJ + 1 / ZAJ)) "END"; "IF" D <= 1 "THEN" AIRY(ZAK,VAJ,DAJ,C,E,ZZ,"FALSE") "ELSE" AIRY(ZAK,C,E,VAJ,DAJ,ZZ,"FALSE"); FOUND := ABS(ZAK - ZAJ) < "-14 * ABS(ZAK) "OR" ABS("IF" A "THEN" VAJ "ELSE" DAJ) < "-12; ZAJ := ZAK "END"; VAI[I] := "IF" A "THEN" DAJ "ELSE" VAJ; ZAI[I] := ZAJ; "END"; AIRYZEROS := ZAI[N]; "END" AIRYZEROS; "EOP" 1SECTION : 7.1.1.1.1 (NOVEMBER 1978) PAGE 1 AUTHOR: C.G. VAN DER LAAN CONTRIBUTORS: C.G. VAN DER LAAN, M. VOORINTHOLT INSTITUTE: REKENCENTRUM RIJKSUNIVERSITEIT GRONINGEN RECEIVED: 780601 BRIEF DESCRIPTION: NEWTON CALCULATES THE COEFFICIENTS OF THE NEWTON POLYNOMIAL THROUGH GIVEN INTERPOLATION POINTS AND CORRESPONDING FUNCTION VALUES. KEYWORDS: NEWTON INTERPOLATION, POLYNOMIAL COEFFICIENTS, DIVIDED DIFFERENCES. CALLING SEQUENCE: THE DECLARATION OF THE PROCEDURE IN THE CALLING PROGRAM READS: "PROCEDURE" NEWTON(N,X,F); "VALUE"N;"INTEGER"N;"ARRAY"X,F; "CODE" 36010; THE MEANING OF THE FORMAL PARAMETERS IS: N: <ARITHMETIC EXPRESSION>; THE DEGREE OF THE POLYNOMIAL; X: <ARRAY IDENTIFIER>; "ARRAY"X[0:N]; ENTRY: THE INTERPOLATION POINTS; F: <ARRAY IDENTIFIER>; "ARRAY"F[0:N]; ENTRY: THE FUNCTION VALUES AT THE INTERPOLATION POINTS; EXIT: THE COEFFICIENTS OF THE NEWTON POLYNOMIAL. PROCEDURES USED: NONE. RUNNING TIME: THE NUMBER OF DIVISIONS IS N(N+1)/2. 1SECTION : 7.1.1.1.1 (NOVEMBER 1978) PAGE 2 METHOD AND PERFORMANCE: THE POLYNOMIAL OF DEGREE N IN X IS REPRESENTED AS N K-1 SUM (A[K] * PROD (X-X[L])). K=0 L=0 THE COEFFICIENTS OF THE (NEWTON) POLYNOMIAL, A[0:N], ARE CALCULATED BY INTERPOLATION AT THE GIVEN ARGUMENTS, X[0:N], AND FUNCTION VALUES, F[0:N]; THE RESULTING SET OF EQUATIONS IS SOLVED BY TRANSFORMING THE CORRESPONDING LOWER TRIANGULAR MATRIX TO DIAGONAL FORM. EXAMPLE OF USE: "BEGIN" "ARRAY" X,F[0:2]; X[0]:=0;X[1]:=.5;X[2]:=1; F[0]:=1;F[1]:=F[2]:=0; NEWTON(2,X,F); OUTPUT(61,"("/,"("THE NEWTON COEFF. ARE")", /,3(N)")",F[0],F[1],F[2]); "END"TSTNEWTON THE NEWTON COEFF. ARE +1.0000000000000"+000 -2.0000000000000"+000 +2.0000000000000"+000 1SECTION : 7.1.1.1.1 (NOVEMBER 1978) PAGE 3 SOURCE TEXT(S): "CODE"36010; "PROCEDURE" NEWTON(N,X,F); "VALUE" N; "INTEGER" N; "ARRAY" X,F; "COMMENT" NEWTON DETERMINES THE COEFFICIENTS C[J],J=0,...N, OF THE INTERPOLATION POLYNOMIAL C[0] + C[1] *(X-X[0])+...+ C[N] * (X-X[0])*...*(X-X[N-1]) OUT OF N+1 LIN. EQUAT. THE ARGUMENTS AND FUNCTION VALUES MUST BE GIVEN IN ARRAY X, F[0:N]. THE ARRAY F IS OVERWRITTEN BY THE COEFFICIENTS C[J],J=0,...N; "BEGIN" "INTEGER" K,I,IM1; "REAL" XIM1,FIM1; IM1:=0; "FOR" I:= 1 "STEP" 1 "UNTIL" N "DO" "BEGIN" FIM1:=F[IM1];XIM1:=X[IM1]; "FOR" K:= I "STEP" 1 "UNTIL" N "DO" F[K]:= (F[K]-FIM1)/(X[K]-XIM1); IM1:= I "END" "END" NEWTON; "EOP" 1SECTION : 7.1.3.2.1 (NOVEMBER 1978) PAGE 1 AUTHOR: C.G. VAN DER LAAN CONTRIBUTORS: C.G. VAN DER LAAN, M. VOORINTHOLT INSTITUTE: REKENCENTRUM RIJKSUNIVERSITEIT GRONINGEN RECEIVED: 780601 BRIEF DESCRIPTION: THIS SECTION CONTAINS THREE PROCEDURES: MINMAXPOL: CALCULATES THE COEFFICIENTS OF THE POLYNOMIAL (AS A SUM OF POWERS) WHICH APPROXIMATES A FUNCTION, GIVEN FOR DISCRETE ARGUMENTS, IN SUCH A WAY THAT THE INFINITY NORM OF THE ERROR VECTOR IS MINIMIZED. INI: SELECTS A (SUB)SET OF INTEGERS OUT OF A GIVEN SET OF INTEGERS; SNDREMEZ: EXCHANGES AT MOST N+1 NUMBERS WITH NUMBERS OUT OF A REFERENCE SET; (INI AND SNDREMEZ ARE AUXILIARY PROCEDURES USED IN MINMAXPOL.) KEYWORDS: (SECOND) REMEZ ALGORITHM, MINIMAX POLYNOMIAL APPROXIMATION. REFERENCES: MEINARDUS, G. (1964): APPROXIMATION OF FUNCTION AND THEIR NUMERICAL TREATMENT (GERMAN). SPRINGER TRACTS IN NATURAL PHILOSOPHY, VOL. 4. DEKKER, T.J. (1967): CURSUS WETENSCHAPPELIJK REKENEN A. MATHEMATISCH CENTRUM. 1SECTION : 7.1.3.2.1 (NOVEMBER 1978) PAGE 2 SUBSECTION : MINMAXPOL. CALLING SEQUENCE: THE DECLARATION OF THE PROCEDURE IN THE CALLING PROGRAM READS: "PROCEDURE"MINMAXPOL(N,M,Y,FY,CO,EM); "VALUE"N,M;"INTEGER"N,M;"ARRAY"Y,FY,CO,EM; "CODE" 36022; THE MEANING OF THE FORMAL PARAMETERS IS: N: <ARITHMETIC EXPRESSION>; THE DEGREE OF THE APPROXIMATING POLYNOMIAL (N>=0); M: <ARITHMETIC EXPRESSION>; THE NUMBER OF REFERENCE FUNCTION VALUES VIZ. ARGUMENTS IS M+1; Y,FY: <ARRAY IDENTIFIERS>; "ARRAY"Y,FY[0:M]; ENTRY: FY[I] IS THE FUNCTION VALUE AT Y[I], FOR I=0,...M; CO: <ARRAY IDENTIFIER>; "ARRAY"CO[0:N]; EXIT: THE COEFFICIENTS OF THE APPROXIMATING POLYNOMIAL (CO[N] IS COEFFICIENT OF Y**N); EM: <ARRAY IDENTIFIER>; "ARRAY"EM[0:3]; ENTRY: EM[2]:THE MAXIMUM ALLOWED NUMBER OF ITERATIONS (SAY 10*N+5); EXIT: EM[0]:THE DIFFERENCE OF THE GIVEN FUNCTION AND THE POLYNOMIAL IN THE FIRST APPROXIMATION POINT; EM[1]:THE INFINITY NORM OF THE ERROR OF APPROXIMATION OVER THE DISCRETE INTERVAL; EM[3]:THE NUMBER OF ITERATIONS PERFORMED. PROCEDURES USED: ELMVEC = CP34020, DUPVEC = CP31030, NEWTON = CP36010, POL = CP31040, NEWGRN = CP31050, INI = CP36020, SNDREMEZ = CP36021. REQUIRED CENTRAL MEMORY: AN INTEGER ARRAY AND THREE (REAL) ARRAYS OF N+2 ELEMENTS AS WELL AS A (REAL) ARRAY OF M+1 ELEMENTS ARE INTERNALLY DECLARED. RUNNING TIME: THE SECOND REMEZ ALGORITHM (ON A DISCRETE SET) IS QUADRATIC CONVERGENT;IN EACH ITERATION THE NUMBER OF OPERATIONS (MULTIPLICATIONS AND ADDITIONS) IS PROPORTIONAL TO M*N. 1SECTION : 7.1.3.2.1 (NOVEMBER 1978) PAGE 3 METHOD AND PERFORMANCE: SEE MEINARDUS (1969),CH.7. EXAMPLE OF USE: "BEGIN""INTEGER"N; "PROCEDURE" COMPUTE(N,A,B,F); "VALUE" N,A,B;"INTEGER" N;"REAL" A,B; "REAL" "PROCEDURE" F; "BEGIN" "INTEGER" K,L,M; "REAL"R,T,IDM; "ARRAY" COEF[0:N],EM[0:3]; EM[2]:=10*N+5; M:=100*N+10; "BEGIN" "ARRAY" Y,FY[0:M]; IDM:=(B-A)/M; R:=Y[0]:=A;FY[0]:=F(R); R:=Y[M]:=B;FY[M]:=F(R); L:=M-1; "FOR"K:=1"STEP"1"UNTIL"L"DO" "BEGIN"R:=Y[K]:=A+K*IDM;FY[K]:=F(R) "END"; MINMAXPOL(N,M,Y,FY,COEF,EM); OUTPUT(61,"(""("COEF:")"/")"); "FOR"K:=0"STEP"1"UNTIL"N"DO"OUTPUT(61,"(" ")",COEF[K]); OUTPUT(61,"("/8S/,2(N),2(B+3ZDB),/")","("EM[0:3]")",EM[0], EM[1],EM[2],EM[3]); "END"; "END" COMPUTE; "REAL""PROCEDURE"F(X);"VALUE"X;"REAL"X; F:=1/(X-10); "FOR" N:=1"DO" "BEGIN" OUTPUT(61,"("//,"("DEGREE=")",D//")",N); COMPUTE(N,-1,1,F) "END" "END" DEGREE=1 COEF: -1.0050378153393"-001 -1.0101010101010"-002 EM[0:3] -5.0631947616870"-004 +5.0631947616870"-004 +15 +3 1SECTION : 7.1.3.2.1 (NOVEMBER 1978) PAGE 4 SUBSECTION : INI. CALLING SEQUENCE: THE DECLARATION OF THE PROCEDURE IN THE CALLING PROGRAM READS: "PROCEDURE" INI(N,M,S); "VALUE"N,M;"INTEGER"N,M;"INTEGER""ARRAY"S; "CODE" 36020; THE MEANING OF THE FORMAL PARAMETERS IS: N,M: <ARITHMETIC EXPRESSION>; THE NUMBER OF POINTS TO BE SELECTED EQUALS N+1; THE REFERENCE SET CONTAINS THE NUMBERS 0,1,...,M (M>=N); S: <ARRAY IDENTIFIER>; "INTEGER" "ARRAY" S[0:N]; EXIT: THE SELECTED INTEGERS ARE DELIVERED IN S. PROCEDURES USED: NONE. METHODS AND PERFORMANCE: THE ARGUMENTS FOR WHICH THE CHEBYSHEV POLYNOMIAL OF DEGREE N ATTAINS ITS EXTREME VALUES ON THE INTERVAL [-1,1] ARE TRANSFORMED TO THE INTERVAL [0,M] BY A LINEAR TRANSFORMATION; FINALLY THE NUMBERS ARE PROPERLY ROUNDED. EXAMPLE OF USE: "BEGIN""INTEGER""ARRAY"S[0:2]; INI(2,20,S); OUTPUT(61,"(""("INI SELECTS OUT OF 0,1,...,20 THE NUMBERS:")",/, 3(B-ZDB)")",S[0],S[1],S[2]) "END" INI SELECTS OUT OF 0,1,...,20 THE NUMBERS: 0 10 20 SUBSECTION : SNDREMEZ. CALLING SEQUENCE: THE DECLARATION OF THE PROCEDURE IN THE CALLING PROGRAM READS: "PROCEDURE"SNDREMEZ(N,M,S,G,EM); "VALUE"N,M;"INTEGER"N,M;"INTEGER""ARRAY"S;"ARRAY" G,EM; "CODE" 36021; THE MEANING OF THE FORMAL PARAMETERS IS: N,M: <ARITHMETIC EXPRESSION>; THE NUMBER OF POINTS TO BE EXCHANGED IS SMALLER THAN OR EQUAL TO N+1; THE REFERENCE SET CONTAINS THE NUMBERS 0,1,...,M (M>=N); 1SECTION : 7.1.3.2.1 (NOVEMBER 1978) PAGE 5 S: <ARRAY IDENTIFIER>; "INTEGER" "ARRAY" S[0:N]; ENTRY: IN S ONE MUST GIVE N+1 (STRICTLY) MONOTONE INCREASING NUMBERS OUT OF 0,...,M; EXIT : N+1 (STRICTLY) MONOTONE INCREASING NUMBERS OUT OF THE NUMBERS 0,1,...,M; G: <ARRAY IDENTIFIER>; "ARRAY" G[0:M]; ENTRY: IN ARRAY G[0:M] ONE MUST GIVE FUNCTION VALUES; EM: <ARRAY IDENTIFIER>; "ARRAY" EM[0:1]; ENTRY: 0<EM[0]<=G[I],I=0,...,M; EXIT : EM[1]:=INFINITY NORM OF ARRAY G[0:M]. PROCEDURES USED: INFNRMVEC = CP31061. METHOD AND PERFORMANCE: THE SECOND REMEZ ALGORITHM IS USED (MEINARDUS,G.(1964)). EXAMPLE OF USE: "BEGIN""ARRAY"EM[0:1],G[0:7];"INTEGER""ARRAY"S[0:2]; G[0]:=10;G[1]:=12;G[2]:=-15;G[3]:=-10; G[4]:=-14;G[5]:=15;G[6]:=10;G[7]:=11; EM[0]:=10;S[0]:=0;S[1]:=3;S[2]:=6; OUTPUT(61,"(""("THE NUMBERS:")",/,"("S[J]:")",3(B-D),/, "("G[S[J]]:")",3(B-DD)")", S[0],S[1],S[2],G[S[0]],G[S[1]],G[S[2]]); SNDREMEZ(2,7,S,G,EM); OUTPUT(61,"("//,"("ARE EXCHANGED WITH:")",/,"("S[J]:")",3(B-D),/, "("G[S[J]]:")",3(B-DD),//, "("THE REFERENCE SET OF FUNCTIONVALUES IS:")",/,8(B-DD)")", S[0],S[1],S[2],G[S[0]],G[S[1]],G[S[2]] , G[0],G[1],G[2],G[3],G[4],G[5],G[6],G[7]) "END" THE NUMBERS: S[J]: 0 3 6 G[S[J]]: 10 -10 10 ARE EXCHANGED WITH: S[J]: 0 2 5 G[S[J]]: 10 -15 15 THE REFERENCE SET OF FUNCTIONVALUES IS: 10 12 -15 -10 -14 15 10 11 1SECTION : 7.1.3.2.1 (NOVEMBER 1978) PAGE 6 SOURCE TEXT(S) : 0"CODE"36022; "PROCEDURE" MINMAXPOL(N,M,Y,FY,CO,EM); "VALUE" N,M;"INTEGER" N,M; "ARRAY" Y,FY,CO,EM; "COMMENT" MINMAXPOL CALCULATES THE COEFFICIENTS, CO[I],I=,.....N OF THE POLYNOMIAL P(Y)=CO[0]+CO[1]*Y+...+CO[N]*Y**N, THAT APPROXIMATES THE DISCRETE FUNCTION FY[I],I=0,...M, GIVEN FOR THE ARGUMENTS Y[I],I=0,...M, IN THE MINIMAX NORM. THE ARGUMENTS MUST BE GIVEN IN MONOTONE INCREASING ORDER. IN ARRAY EM[0:3], ONE MUST GIVE THE MAXIMUM ALLOWED NUMBER OF ITERATIONS,EM[2]. MOREOVER, EM[0]:=THE DIFFERENCE OF THE GIVEN FUNCTION AND THE POLYNOMIAL IN THE FIRST APPROXIMATION POINT, EM[1]:=THE MAXIMUM OF ! P(Y[I])-FY[I]! FOR I=0,...M, EM[3]:=THE NUMBER OF ITERATIONS PERFORMED. THE PROCEDURES ELMVEC,DUPVEC,POL,NEWTON,NEWGRN, INI,SNDREMEZ ARE USED. REFERENCE:MEINARDUS,G.(1964,CH.7), APPROXIMATION VON FUNKTIONEN UND IHRE NUMERISCHE BEHANDLUNG; "BEGIN" "INTEGER" NP1,K,POMK,COUNT,CNT,J,MI; "REAL" E,ABSE,ABSEH; NP1:=N+1; "BEGIN" "INTEGER" "ARRAY" S[0:NP1]; "ARRAY" X,B,COEF[0:NP1] ,G[0:M]; "COMMENT" 1SECTION : 7.1.3.2.1 (NOVEMBER 1978) PAGE 7 ; "PROCEDURE" ERRPOL(N,M,E,CO,S,Y,FY,G); "VALUE" N,M,E;"INTEGER" N,M; "REAL" E; "INTEGER" "ARRAY" S;"ARRAY" CO,Y,FY,G; "COMMENT"ERRPOL DELIVERS THE VALUE OF CO[0]+CO[1]*Y[I]+...+CO[N]*Y[I]**N - FY[I] IN G[I] FOR I=0,1,...M AND I NOT EQUAL S[J],J=0,1,...N+1. FOR J=0,1,...N+1 THEN G[S[J]]:=(-1)**J*E. THE INTEGERS S[J],FOR J=0,1,...N+1 ARE A SUBSET OF 0,1,...M; "BEGIN" "INTEGER" J,K,NP1,SJM1,SJ,S0,UP; NP1:=N+1;S0:=SJM1:=S[0]; G[S0]:=E; "FOR" J:=1 "STEP" 1 "UNTIL" NP1 "DO" "BEGIN" SJ:=S[J];UP:=SJ-1; "FOR" K:= SJM1+1 "STEP" 1 "UNTIL" UP "DO" G[K]:=FY[K]-POL(N,Y[K],CO); G[SJ]:=E:=-E; SJM1:=SJ; "END" J; "FOR" K:= S0-1 "STEP"-1 "UNTIL" 0 "DO" G[K]:=FY[K]-POL(N,Y[K],CO); "FOR" K:= SJ+1 "STEP" 1 "UNTIL" M "DO" G[K]:=FY[K]-POL(N,Y[K],CO); "END" ERRPOL; INI(NP1,M,S); MI:=EM[2]; ABSE:= 0; "FOR" COUNT:= 1, COUNT + 1 "WHILE" COUNT <= MI & ABSE > ABSEH "DO" "BEGIN" POMK:=1; "FOR" K:= 0 "STEP" 1 "UNTIL" NP1 "DO" "BEGIN" X[K]:= Y[S[K]]; COEF[K]:= FY[S[K]]; B[K]:= POMK; POMK:=-POMK "END"; NEWTON(NP1,X,COEF); NEWTON(NP1,X,B); EM[0]:= E:= COEF[NP1]/B[NP1]; ELMVEC(0,N,0,COEF,B,-E); NEWGRN(N,X,COEF); ERRPOL(N,M,E,COEF,S,Y,FY,G); SNDREMEZ(NP1,M,S,G,EM); ABSEH:=ABSE; ABSE:=ABS(E); CNT:=COUNT; "END" WHILE COUNT; EM[2]:=MI; EM[3]:=CNT; DUPVEC(0,N,0,CO,COEF); "END"; "END" MINMAXPOL 1SECTION : 7.1.3.2.1 (NOVEMBER 1978) PAGE 8 ; "EOP" "CODE"36020; "PROCEDURE" INI(N,M,S); "VALUE" N,M;"INTEGER" N,M; "INTEGER" "ARRAY" S; "COMMENT" INI DELIVERS (MONOTONE) THE ROUNDED VALUES OF THE ARGUMENTS,WHERE THE CHEBYSHEV POLYNOMIAL OF DEGREE N(TRANSFORMED TO THE INTERVAL [0,M],M>=N) ATTAINS ITS MAXIMUM VALUES, IN INTEGER ARRAY S[0:N]; "BEGIN""INTEGER"I,J,K,L;"REAL"PIN2; PIN2:=ARCTAN(1)*2/N; K:=0;L:=N-1;J:=S[0]:=0;S[N]:=M; "FOR" K:=K+1 "WHILE" K < L "DO" "BEGIN"I:=SIN(K*PIN2)**2*M; J:=S[K]:="IF"I<=J"THEN"J+1"ELSE"I; S[L]:=M-J;L:=L-1 "END"K; "IF"L*2=N"THEN"S[L]:=M/2; "END" INI; "EOP" "CODE"36021; "PROCEDURE" SNDREMEZ(N,M,S,G,EM); "VALUE" N,M;"INTEGER" N,M; "INTEGER" "ARRAY" S; "ARRAY" G,EM; "COMMENT" SNDREMEZ EXCHANGES ATMOST N+1 NUMBERS ,GIVEN IN INTEGER ARRAY S[0:N], WITH NUMBERS OUT OF THE REFERENCE SET 0,...M, UNDER THE CONDITIONS: I. THE ALTERNANCE PROPERTY OF THE FUNCTIONVALUES G[S[J]], J=0,...N IS PRESERVED. II. !G[S[J]]!>=!EM[0]!,J=0,...N. III. THE FIRST INDEX K , WITH G[K]=INFINITY NORM OF G, IS ONE OF THE RESULTING NUMBERS S[0],...S[N]. IN ARRAY G[0:M] ONE MUST GIVE ERROR FUNCTION VALUES. MOREOVER, EM[1]:=INFINITY NORM OF G, THE PROCEDURE INFNRMVEC IS USED; "BEGIN" "INTEGER" S0,SN,SJP1,I,J,K,UP,INDEXMAX,LOW,NM1; "REAL" MAX,MSJP1,HI,HJ,HE,ABSE,H; INDEX MAX:=S0:=SJP1:=S[0]; HE:=EM[0];LOW:=S0+1; MAX:=MSJP1:=ABSE:=ABS(HE); NM1:=N-1; "COMMENT" 1SECTION : 7.1.3.2.1 (NOVEMBER 1978) PAGE 9 ; "FOR" J:= 0 "STEP" 1 "UNTIL" NM1 "DO" "BEGIN" UP:= S[J+1]-1; H:= INFNRMVEC(LOW,UP,I,G); "IF" H > MAX "THEN" "BEGIN" MAX:= H; INDEX MAX:= I "END"; "IF" H > ABSE "THEN" "BEGIN" "IF" HE * G[I] > 0 "THEN" "BEGIN" S[J]:= "IF" MSJP1 < H "THEN" I "ELSE" SJP1; SJP1:= S[J+1]; MSJP1:= ABSE "END" "ELSE" "BEGIN" S[J]:= SJP1; SJP1:= I; MSJP1:= H "END" "END" "ELSE" "BEGIN" S[J]:=SJP1; SJP1:=S[J+1]; MSJP1:= ABSE "END"; HE:=-HE;LOW:=UP+2; "END" FOR J; SN:= S[N]; S[N]:= SJP1; HI:=INFNRMVEC(0,S0-1,I,G); HJ:=INFNRMVEC(SN+1,M,J,G); "IF" J > M "THEN" J:=M; "IF" HI > HJ "THEN" "BEGIN" "IF" HI > MAX "THEN" "BEGIN" MAX:= HI; INDEXMAX:= I "END"; "IF" SIGN(G[I]) = SIGN(G[S[0]]) "THEN" "BEGIN" "IF" HI > ABS(G[S[0]]) "THEN" "BEGIN" S[0]:= I; "IF" G[J]/G[S[N]] > 1 "THEN" S[N]:=J "END" "END" "ELSE" "IF" HI > ABS(G[S[N]]) "THEN" "BEGIN" S[N]:= "IF" G[J]/G[S[NM1]] > 1 "THEN" J "ELSE" S[NM1]; "FOR" K:= NM1 "STEP" -1 "UNTIL" 1 "DO" S[K]:= S[K-1]; S[0]:= I "END" "END" "ELSE" "BEGIN" "IF" HJ > MAX "THEN" "BEGIN" MAX:= HJ; INDEXMAX:= J "END"; "IF" SIGN(G[J]) = SIGN(G[S[N]]) "THEN" "BEGIN" "IF" HJ > ABS(G[S[N]]) "THEN" "BEGIN" S[N]:= J; "IF" G[I]/G[S[0]] > 1 "THEN"S[0]:=I "END" "END" "ELSE" "IF" HJ > ABS(G[S[0]]) "THEN" "BEGIN" S[0]:= "IF" G[I]/G[S[1]] > 1 "THEN" I "ELSE" S[1]; "FOR" K:= 1 "STEP" 1 "UNTIL" NM 1 "DO" S[K]:= S[K+1]; S[N]:= J "END" "END" RANDGEBIEDEN; EM[1]:=MAX; "END" SNDREMEZ; "EOP"