1SECTION : 5.2.1.1.1.2.C (OCTOBER 1974) PAGE 1 AUTHOR: K.DEKKER. INSTITUTE: MATHEMATICAL CENTRE. RECEIVED: 1973/09/01. BRIEF DESCRIPTION: LINIGER1VS SOLVES INITIAL VALUE PROBLEMS , GIVEN AS AN AUTONOMOUS SYSTEM OF FIRST ORDER DIFFERENTIAL EQUATIONS , BY MEANS OF AN IMPLICIT,FIRST ORDER ACCURATE, EXPONENTIALLY FITTED ONESTEP METHOD. AUTOMATIC STEPSIZE CONTROL IS PROVIDED. IN PARTICULAR THIS METHOD IS SUITABLE FOR THE INTEGRATION OF STIFF DIFFERENTIAL EQUATIONS. KEYWORDS: DIFFERENTIAL EQUATIONS, INITIAL VALUE PROBLEMS, STIFF EQUATIONS, EXPONENTIAL FITTING, IMPLICIT ONESTEP METHODS. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE LINIGER1VS READS: "PROCEDURE" LINIGER1VS (X,XE,M,Y,SIGMA,DERIVATIVE,J,JACOBIAN, ITMAX,HMIN,HMAX,AETA,RETA,INFO,OUTPUT); "VALUE" M; "INTEGER" M,ITMAX; "REAL" X,XE,SIGMA,HMIN,HMAX,AETA,RETA; "ARRAY" Y,J,INFO; "PROCEDURE" DERIVATIVE,JACOBIAN,OUTPUT; THE MEANING OF THE FORMAL PARAMETERS IS: X: <VARIABLE>; THE INDEPENDENT VARIABLE X; ENTRY: THE INITIAL VALUE X0; EXIT : THE FINAL VALUE XE; XE: <ARITHMETIC EXPRESSION>; THE FINAL VALUE OF X (XE>=X); M: <ARITHMETIC EXPRESSION>; THE NUMBER OF EQUATIONS; Y: <ARRAY IDENTIFIER>; "ARRAY" Y[1:M]; THE DEPENDENT VARIABLE; ENTRY: THE INITIAL VALUES OF THE SYSTEM OF DIFFERENTIAL EQUATIONS: Y[I] AT X=X0; EXIT : THE FINAL VALUES OF THE SOLUTION: Y[I] AT X=XE; 1SECTION : 5.2.1.1.1.2.C (OCTOBER 1974) PAGE 2 SIGMA: <ARITHMETIC EXPRESSION>; THE MODULUS OF THE POINT AT WHICH EXPONENTIAL FITTING IS DESIRED, FOR EXAMPLE THE LARGEST NEGATIVE EIGENVALUE OF THE JACOBIAN OF THE SYSTEM OF DIFFERENTIAL EQUATIONS; DERIVATIVE: <PROCEDURE IDENTIFIER>; THE HEADING OF THIS PROCEDURE READS: "PROCEDURE" DERIVATIVE(Y); "ARRAY" Y; THIS PROCEDURE SHOULD DELIVER THE RIGHT HAND SIDE OF THE I-TH DIFFERENTIAL EQUATION AT THE POINT (Y) AS Y[I]; J: <ARRAY IDENTIFIER>; "ARRAY" J[1:M,1:M]; THE JACOBIAN MATRIX OF THE SYSTEM; THE ARRAY J SHOULD BE UPDATED IN THE PROCEDURE JACOBIAN; JACOBIAN: <PROCEDURE IDENTIFIER>; THE HEADING OF THIS PROCEDURE READS: "PROCEDURE" JACOBIAN(J,Y); "ARRAY" J,Y; IN THIS PROCEDURE (AN APPROXIMATION OF) THE JACOBIAN HAS TO BE ASSIGNED TO THE ARRAY J; ITMAX: <ARITHMETIC EXPRESSION>; AN UPPERBOUND FOR THE NUMBER OF ITERATIONS IN NEWTON'S PROCESS, USED TO SOLVE THE IMPLICIT EQUATIONS; HMIN: <ARITHMETIC EXPRESSION>; MINIMAL STEPSIZE BY WHICH THE INTEGRATION IS PERFORMED; HMAX: <ARITHMETIC EXPRESSION>; MAXIMAL STEPSIZE BY WHICH THE INTEGRATION IS PERFORMED; AETA: <ARITHMETIC EXPRESSION>; REQUIRED ABSOLUTE PRECISION IN THE INTEGRATION PROCESS; RETA: <ARITHMETIC EXPRESSION>; REQUIRED RELATIVE PRECISION IN THE INTEGRATION PROCESS; IF BOTH AETA AND RETA HAVE NEGATIVE VALUES , INTEGRATION WILL BE PERFORMED WITH A STEPSIZE EQUAL TO HMAX , WHICH MAY BE VARIATED BY USER ; IN THIS CASE THE ABSOLUTE VALUES OF AETA AND RETA WILL CONTROL THE NEWTON ITERATION; INFO: <ARRAY IDENTIFIER>; "ARRAY" INFO[1:9]; DURING INTEGRATION AND UPON EXIT THIS ARRAY CONTAINS THE FOLLOWING INFORMATION: INFO[1]: NUMBER OF INTEGRATION STEPS TAKEN; INFO[2]: NUMBER OF DERIVATIVE EVALUATIONS USED; INFO[3]: NUMBER OF JACOBIAN EVALUATIONS USED; INFO[4]: NUMBER OF INTEGRATION STEPS EQUAL TO HMIN TAKEN ; INFO[5]: NUMBER OF INTEGRATION STEPS EQUAL TO HMAX TAKEN ; INFO[6]: MAXIMAL NUMBER OF ITERATIONS TAKEN IN THE NEWTON PROCESS; INFO[7]: LOCAL ERROR TOLERANCE; INFO[8]: ESTIMATED LOCAL ERROR; INFO[9]: MAXIMUM VALUE OF THE ESTIMATED LOCAL ERROR; OUTPUT: <PROCEDURE IDENTIFIER>; THE HEADING OF THIS PROCEDURE READS; "PROCEDURE" OUTPUT; THIS PROCEDURE IS CALLED AT THE END OF EACH INTEGRATION STEP ; THE USER CAN ASK FOR OUTPUT OF THE PARAMETERS , FOR EXAMPLE X, Y, INFO. 1SECTION : 5.2.1.1.1.2.C (OCTOBER 1974) PAGE 3 DATA AND RESULTS: SEE EXAMPLE OF USE, AND REF[2]. PROCEDURES USED: INIVEC= CP31010, MULVEC= CP31020, MULROW= CP31021, DUPVEC= CP31030, MATVEC= CP34011, ELMVEC= CP34020, VECVEC= CP34010, DEC = CP34300, SOL = CP34051. REQUIRED CENTRAL MEMORY: EXECUTION FIELD LENGTH : CIRCA 20 + M * (5 + M). RUNNING TIME: DEPENDS STRONGLY ON THE DIFFERENTIAL EQUATION TO SOLVE. LANGUAGE: ALGOL 60. METHOD AND PERFORMANCE: LINIGER1VS: INTEGRATES THE SYSTEM OF DIFFERENTIAL EQUATIONS FROM X0 UNTIL XE, BY MEANS OF A FIRST ORDER FORMULA. THE INTEGRATION METHOD IS BASED ON THE F(1) FORMULA DESCRIBED BY LINIGER AND WILLOUGHBY (SEE REF[1]). ERROR ESTIMATES AND A STEPSIZE STRATEGY FOR THIS METHOD ARE DESCRIBED IN [2] , AND A VARIABLE STEP METHOD IS CONSTRUCTED FOR THE CONVENIENCE OF THE USER. HOWEVER, THE STEPSIZE STRATEGY REQUIRES MANY EXTRA ARRAY OPERATIONS. THE USER MAY AVOID THIS EXTRA WORK BY GIVING AETA AND RETA A NEGATIVE VALUE AND PRESCRIBING A STEPSIZE (HMAX) HIMSELF. REFERENCES: [1]. W.LINIGER AND R.A.WILLOUGHBY. EFFICIENT INTEGRATION METHODS FOR STIFF SYSTEMS OF ORDINARY DIFFERENTIAL EQUATIONS. SIAM J. NUM. ANAL. 7 (1970) PAGE 47. [2]. K.DEKKER. ERROR ESTIMATES AND STEPSIZE STRATEGIES FOR THE LINIGER- WILLOUGHBY FORMULAE. (TO APPEAR IN 1974). 1SECTION : 5.2.1.1.1.2.C (OCTOBER 1974) PAGE 4 EXAMPLE OF USE: CONSIDER THE SYSTEM OF DIFFERENTIAL EQUATIONS: DY[1]/DX = -Y[1] + Y[1] * Y[2] + .99 * Y[2] DY[2]/DX = -1000 * ( -Y[1] + Y[1] * Y[2] + Y[2] ) WITH THE INITIAL CONDITIONS AT X = 0: Y[1] = 1 AND Y[2] = 0. THE SOLUTION AT X = 50 IS APPROXIMATELY: Y[1] = .765 878 320 2487 AND Y[2] = .433 710 353 5768. THE FOLLOWING PROGRAM SHOWS INTEGRATION OF THIS PROBLEM WITH VARIABLE AND CONSTANT STEPSIZES: "BEGIN" "COMMENT" TEST LINIGER1VS; "PROCEDURE" LINIGER1VS(X,XE,M,Y,SIGMA,F,J,JACOBIAN, ITMAX,HMIN,HMAX,AETA,RETA,INFO,OUTPUT); "CODE" 33132; "INTEGER" ITMAX; "REAL" X,SIGMA,RETA,TIME; "REAL" "ARRAY" Y[1:2],J[1:2,1:2],INFO[1:9]; "PROCEDURE" F(A); "ARRAY" A; "BEGIN" "REAL" A1,A2; A1:=A[1]; A2:=A[2]; A[1]:=(A1+.99)*(A2-1)+.99; A[2]:=1000*((1+A1)*(1-A2)-1); "END"; "PROCEDURE" JACOBIAN(J,Y); "ARRAY" J,Y; "BEGIN" J[1,1]:=Y[2]-1; J[1,2]:=.99+Y[1]; J[2,1]:=1000*(1-Y[2]); J[2,2]:=-1000*(1+Y[1]); SIGMA:=ABS(J[2,2]+J[1,1]-SQRT((J[2,2]-J[1,1])**2+ 4*J[2,1]*J[1,2]))/2; "END" JACOBIAN; "PROCEDURE" OUT; "IF" X=50 "THEN" OUTPUT(61,"("6(3ZDB),2BD"-ZD,2(2B+.3DB3D),-3ZD.3D,/")", INFO[1],INFO[2],INFO[3],INFO[4],INFO[5],INFO[6],INFO[9],Y[1], Y[2],CLOCK-TIME); "FOR" RETA:="-2,"-4,"-6 "DO" "BEGIN" X:=Y[2]:=0; Y[1]:=1; TIME:=CLOCK; LINIGER1VS(X,50,2,Y,SIGMA,F,J,JACOBIAN,10,.1,50,RETA, RETA,INFO,OUT); "END"; OUTPUT(61,"("//")"); "FOR" RETA:=-"-2,-"-4,-"-6 "DO" "BEGIN" X:=Y[2]:=0; Y[1]:=1; TIME:=CLOCK; LINIGER1VS(X,50,2,Y,SIGMA,F,J,JACOBIAN,10,.1,1,RETA, RETA,INFO,OUT); "END"; "END" 17 21 8 2 0 2 2" -2 +.772 017 +.435 672 0.525 13 25 23 2 0 2 2" -2 +.767 414 +.434 202 0.717 105 210 105 2 0 2 2" -2 +.766 027 +.433 758 4.741 50 52 1 0 50 2 0" 0 +.766 670 +.433 081 0.549 50 104 3 0 50 3 0" 0 +.766 183 +.433 811 1.158 50 152 12 0 50 4 0" 0 +.766 185 +.433 809 1.653 1SECTION : 5.2.1.1.1.2.C (OCTOBER 1974) PAGE 5 SOURCE TEXT(S): "CODE" 33132; "PROCEDURE" LINIGER1VS(X,XE,M,Y,SIGMA,DERIVATIVE,J, JACOBIAN,ITMAX,HMIN,HMAX,AETA,RETA,INFO,OUTPUT); "VALUE" M; "INTEGER" M,ITMAX; "REAL" X,XE,SIGMA,AETA,RETA,HMIN,HMAX; "ARRAY" Y,J,INFO; "PROCEDURE" DERIVATIVE,JACOBIAN,OUTPUT; "BEGIN" "INTEGER" I,ST,LASTJAC; "REAL" H,HNEW,MU,MU1,BETA,P,E,E1,ETA,ETA1,DISCR; "BOOLEAN" LAST,FIRST,EVALJAC,EVALCOEF; "INTEGER" "ARRAY" PI[1:M]; "REAL" "ARRAY" DY,YL,YR,F[1:M],A[1:M,1:M],AUX[1:3]; "PROCEDURE" INIVEC(L,U,A,X); "CODE" 31010; "PROCEDURE" MULVEC(AL,U,SHIFT,A,B,X); "CODE" 31020; "PROCEDURE" MULROW(L,U,I,J,A,B,X); "CODE" 31021; "PROCEDURE" DUPVEC(L,U,SHIFT,A,B); "CODE" 31030; "REAL" "PROCEDURE" VECVEC(L,U,SHIFT,A,B); "CODE" 34010; "REAL" "PROCEDURE" MATVEC(A,B,C,D,E); "CODE" 34011; "PROCEDURE" ELMVEC(L,U,SHIFT,A,B,X); "CODE" 34020; "PROCEDURE" DEC(A,N,AUX,P); "CODE" 34300; "PROCEDURE" SOL(A,N,P,B); "CODE" 34051; "REAL" "PROCEDURE" NORM(A); "ARRAY" A; NORM:=SQRT(VECVEC(1,M,0,A,A)); "PROCEDURE" COEFFICIENT; "BEGIN" "REAL" B,E; B:=ABS(H*SIGMA); "IF" B>40 "THEN" "BEGIN" MU:=1/B; BETA:=1; P:=2+2/(B-2) "END" "ELSE" "IF" B<.04 "THEN" "BEGIN" E:=B*B/30; P:=3-E; MU:=.5-B/12*(1-E/2); BETA:=.5+B/6*(1-E) "END" "ELSE" "BEGIN" E:=EXP(B)-1; MU:=1/B-1/E; BETA:=(1-B/E)*(1+1/E); P:=(BETA-MU)/(.5-MU) "END"; MU1:=H*(1-MU); LUDECOMP "END" COEFFICIENT; "COMMENT" 1SECTION : 5.2.1.1.1.2.C (OCTOBER 1974) PAGE 6 ; "PROCEDURE" LUDECOMP; "BEGIN" "INTEGER" I; "FOR" I:=1 "STEP" 1 "UNTIL" M "DO" "BEGIN" MULROW(1,M,I,I,A,J,-MU1); A[I,I]:=A[I,I]+1 "END"; AUX[2]:=0; DEC(A,M,AUX,PI) "END" LUDECOMP; "PROCEDURE" STEPSIZE; "IF" ETA<0 "THEN" "BEGIN" "REAL" HL; HL:=H; H:=HNEW:=HMAX; INFO[5]:=INFO[5]+1; "IF" 1.1*HNEW>XE-X "THEN" "BEGIN" LAST:="TRUE"; H:=HNEW:=XE-X "END"; EVALCOEF:=H^=HL; "END" "ELSE" "IF" FIRST "THEN" "BEGIN" H:=HNEW:=HMIN; FIRST:="FALSE"; INFO[4]:=INFO[4]+1 "END" "ELSE" "BEGIN" "REAL" B,HL; B:=DISCR/ETA; HL:=H; "IF" B<.01 "THEN" B:=.01; HNEW:= "IF" B>0 "THEN" H*B**(-1/P) "ELSE" HMAX; "IF" HNEW<HMIN "THEN" "BEGIN" HNEW:=HMIN; INFO[4]:=INFO[4]+1 "END" "ELSE" "IF" HNEW>HMAX "THEN" "BEGIN" HNEW:=HMAX; INFO[5]:=INFO[5]+1 "END"; "IF" 1.1*HNEW>=XE-X "THEN" "BEGIN" LAST:="TRUE"; H:=HNEW:=XE-X "END" "ELSE" "IF" ABS(H/HNEW-1)>.1 "THEN" H:=HNEW; EVALCOEF:=H^=HL "END" STEPSIZE; "PROCEDURE" LINEARITY(ERROR); "REAL" ERROR; "BEGIN" "INTEGER" K; "FOR" K:=1 "STEP" 1 "UNTIL" M "DO" DY[K]:=Y[K]-MU1*F[K]; SOL(A,M,PI,DY); ELMVEC(1,M,0,DY,Y,-1); ERROR:=NORM(DY) "END" LINEARITY; "COMMENT" 1SECTION : 5.2.1.1.1.2.C (OCTOBER 1974) PAGE 7 ; "PROCEDURE" ITERATION(I); "INTEGER" I; "IF" RETA<0 "THEN" "BEGIN" "INTEGER" K; "IF" I=1 "THEN" "BEGIN" MULVEC(1,M,0,DY,F,H); "FOR" K:=1 "STEP" 1 "UNTIL" M "DO" YL[K]:=Y[K]+MU*DY[K]; SOL(A,M,PI,DY); E:=1; "END" "ELSE" "BEGIN" "FOR" K:=1 "STEP" 1 "UNTIL" M "DO" DY[K]:=YL[K]-Y[K]+MU1*F[K]; "IF" E*NORM(Y)>E1*E1 "THEN" "BEGIN" EVALJAC:=I>=3; "IF" I>3 "THEN" "BEGIN" INFO[3]:=INFO[3]+1; JACOBIAN(J,Y); LUDECOMP "END"; "END"; SOL(A,M,PI,DY) "END"; E1:=E; E:=NORM(DY); ELMVEC(1,M,0,Y,DY,1); ETA:=NORM(Y)*RETA+AETA; DISCR:=0; DUPVEC(1,M,0,F,Y); DERIVATIVE(F); INFO[2]:=INFO[2]+1; "END" "ELSE" "BEGIN" "INTEGER" K; "IF" I=1 "THEN" "BEGIN" LINEARITY(E); "IF" E*(ST-LASTJAC)>ETA "THEN" "BEGIN" JACOBIAN(J,Y); LASTJAC:=ST; INFO[3]:=INFO[3]+1; H:=HNEW; COEFFICIENT; LINEARITY(E) "END"; EVALJAC:= E*(ST+1-LASTJAC)>ETA; MULVEC(1,M,0,DY,F,H); "FOR" K:=1 "STEP" 1 "UNTIL" M "DO" YL[K]:=Y[K]+MU*DY[K]; SOL(A,M,PI,DY); "FOR" K:=1 "STEP" 1 "UNTIL" M "DO" YR[K]:=H*BETA*MATVEC(1,M,K,J,DY); SOL(A,M,PI,YR); ELMVEC(1,M,0,YR,DY,1); "COMMENT" 1SECTION : 5.2.1.1.1.2.C (OCTOBER 1974) PAGE 8 ; "END" "ELSE" "BEGIN" "FOR" K:=1 "STEP" 1 "UNTIL" M "DO" DY[K]:=YL[K]-Y[K]+MU1*F[K]; "IF" E>ETA1 "AND" DISCR>ETA1 "THEN" "BEGIN" INFO[3]:=INFO[3]+1; JACOBIAN(J,Y); LUDECOMP "END"; SOL(A,M,PI,DY); E:=NORM(DY) "END"; ELMVEC(1,M,0,Y,DY,1); ETA:=NORM(Y)*RETA+AETA; ETA1:=ETA/SQRT(RETA); DUPVEC(1,M,0,F,Y); DERIVATIVE(F); INFO[2]:=INFO[2]+1; "FOR" K:=1 "STEP" 1 "UNTIL" M "DO" DY[K]:=YR[K]-H*F[K]; DISCR:=NORM(DY)/2 "END" ITERATION; FIRST:=EVALJAC:="TRUE"; LAST:=EVALCOEF:="FALSE"; INIVEC(1,9,INFO,0); ETA:=RETA*NORM(Y)+AETA; ETA1:=ETA/SQRT(ABS(RETA)); DUPVEC(1,M,0,F,Y); DERIVATIVE(F); INFO[2]:=1; "FOR" ST:=1,ST+1 "WHILE" ^LAST "DO" "BEGIN" STEPSIZE; INFO[1]:=INFO[1]+1; "IF" EVALJAC "THEN" "BEGIN" JACOBIAN(J,Y); INFO[3]:=INFO[3]+1; H:=HNEW; COEFFICIENT; EVALJAC:="FALSE"; LASTJAC:=ST "END" "ELSE" "IF" EVALCOEF "THEN" COEFFICIENT; "FOR" I:=1,I+1 "WHILE" E>ABS(ETA) "AND" DISCR>1.3*ETA "AND" I<=ITMAX "DO" "BEGIN" ITERATION(I); "IF" I>INFO[6] "THEN" INFO[6]:=I; "END"; INFO[7]:=ETA; INFO[8]:=DISCR; X:=X+H; "IF" DISCR>INFO[9] "THEN" INFO[9]:=DISCR; OUTPUT; "END"; "END" LINIGER1VS; "EOP" 1SECTION : 5.2.1.1.1.2.F � (OCTOBER 1975) PAGE 1 AUTHOR: B.LINDBERG. CONTRIBUTOR: K.DEKKER. INSTITUTE: MATHEMATICAL CENTRE. RECEIVED: 741101. BRIEF DESCRIPTION:� IMPEX SOLVES AN INITIAL VALUE PROBLEM,GIVEN AS AN AUTONOMOUS SYSTEM OF FIRST ORDER DIFFERENTIAL EQUATIONS , BY MEANS OF THE IMPLICIT MIDPOINT RULE WITH SMOOTHING AND EXTRAPOLATION. AUTOMATIC STEPSIZE CONTROL IS PROVIDED. IN PARTICULAR THIS METHOD IS SUITABLE FOR THE INTEGRATION OF STIFF DIFFERENTIAL EQUATIONS. KEYWORDS: DIFFERENTIAL EQUATIONS, INITIAL VALUE PROBLEMS, STIFF EQUATIONS, IMPLICIT MIDPOINT RULE, SMOOTHING, EXTRAPOLATION.� CALLING SEQUENCE: THE HEADING OF THE PROCEDURE IMPEX READS: "PROCEDURE" IMPEX (N, T0, TEND, Y0, DERIV, AVAILABLE, H0, HMAX, PRESCH, EPS, WEIGHTS, UPDATE, FAIL, CONTROL); "VALUE" N; "INTEGER" N; "REAL" T0,TEND,H0,HMAX,EPS; "BOOLEAN" PRESCH,FAIL; "ARRAY" Y0,WEIGHTS; "BOOLEAN" "PROCEDURE" AVAILABLE; "PROCEDURE" DERIV,UPDATE,CONTROL; IMPEX: INTEGRATES THE SYSTEM OF DIFFERENTIAL EQUATIONS , GIVEN AS DY/DT=F(T,Y), FROM T0 UNTIL TEND. THE MEANING OF THE FORMAL PARAMETERS IS: N: <ARITHMETIC EXPRESSION>; THE NUMBER OF EQUATIONS; T0: <ARITHMETIC EXPRESSION>; THE INITIAL VALUE OF THE INDEPENDENT VARIABLE;� 1SECTION : 5.2.1.1.1.2.F � (OCTOBER 1975) PAGE 2 TEND: <ARITHMETIC EXPRESSION>; THE FINAL VALUE OF THE INDEPENDENT VARIABLE; Y0: <ARRAY IDENTIFIER>; "REAL" "ARRAY" Y0[1:N]; ENTRY: THE INITIAL VALUES OF THE SYSTEM OF DIFFERENTIAL EQUATIONS: Y0[I] AT T=T0; DERIV: <PROCEDURE" IDENTIFIER>; THE HEADING OF THIS PROCEDURE READS:� "PROCEDURE" DERIV(T,Y,F,N); "INTEGER" N; "REAL" T; "ARRAY" Y,F; THIS PROCEDURE SHOULD DELIVER THE VALUE OF F(T,Y) IN THE ARRAY F[1:N]; AVAILABLE: <PROCEDURE IDENTIFIER>;� THE HEADING OF THIS PROCEDURE READS:� "BOOLEAN" "PROCEDURE" AVAILABLE(T,Y,A,N); "INTEGER" N; "REAL" T; "ARRAY" Y,A; IF AN ANALYTIC EXPRESSION OF THE JACOBIAN MATRIX AT THE POINT (T,Y) IS NOT AVAILABLE, THIS PROCEDURE SHOULD DELIVER THE VALUE "FALSE"; OTHERWISE THE PROCEDURE SHOULD DELIVER THE VALUE "TRUE", AND THE JACOBIAN MATRIX SHOULD BE ASSIGNED TO THE ARRAY A[1:N,1:N]; H0: <ARITHMETIC EXPRESSION>; THE INITIAL STEPSIZE; HMAX: <ARITHMETIC EXPRESSION>; MAXIMAL STEPSIZE BY WHICH THE INTEGRATION IS PERFORMED; PRESCH: <BOOLEAN EXPRESSION>; INDICATOR FOR CHOICE OF STEPSIZE; THE STEPSIZE IS AUTOMATICALLY CONTROLLED IF PRESCH="FALSE"; OTHERWISE THE STEPSIZE HAS TO BE PRESCRIBED , EITHER ONLY INITIALLY OR ALSO BY THE PROCEDURE CONTROL; EPS: <ARITHMETIC EXPRESSION>; BOUND FOR THE ESTIMATE OF THE LOCAL ERROR; WEIGHTS: <ARRAY IDENTIFIER>; "REAL" "ARRAY" WEIGHTS[1:N]; WEIGHTS FOR THE COMPUTATION OF THE WEIGHTED EUCLIDEAN NORM OF THE ERRORS; ENTRY: INITIAL WEIGHTS; NOTE THAT THE CHOICE WEIGHTS[I] = 1 IMPLIES AN ESTIMATION OF THE ABSOLUTE ERROR , WHEREAS WEIGTHS[I] = Y[I] DEFINES A RELATIVE ERROR; UPDATE: <PROCEDURE IDENTIFIER>; THE HEADING OF THIS PROCEDURE READS:� "PROCEDURE" UPDATE(WEIGHTS,Y2,N); "INTEGER" N; "ARRAY" WEIGHTS,Y2; THIS PROCEDURE MAY CHANGE THE ARRAY WEIGHTS , ACCORDING TO THE VALUE OF AN APPROXIMATION FOR Y(T) , GIVEN IN THE ARRAY Y2[1:N]; 1SECTION : 5.2.1.1.1.2.F � (OCTOBER 1975) PAGE 3 FAIL: <BOOLEAN EXPRESSION>; EXIT : IF THE PROCEDURE FAILS TO SOLVE THE SYSTEM OF EQUATIONS, FAIL WILL HAVE THE VALUE "TRUE" UPON EXIT; THIS MAY OCCUR UPON DIVERGENCE OF THE ITERATION PROCESS, USED IN THE MIDPOINT RULE , WHILE INTEGRATION IS PERFORMED WITH A USER DEFINED PRESCRIBED STEPSIZE; CONTROL: <PROCEDURE IDENTIFIER>; THE HEADING OF THIS PROCEDURE READS:� "PROCEDURE" CONTROL(TPRINT,T,H,HNEW,Y,ERROR,N); "INTEGER" N; "REAL" TPRINT,T,H,HNEW; "ARRAY" Y,ERROR; CONTROL IS CALLED ON ENTRY OF IMPEX, AND FURTHER AS SOON AS THE INEQUALITY TPRINT <= T HOLDS; DURING A CALL OF CONTROL PRINTING OF RESULTS AND CHANGE OF STEPSIZE (IF PRESCH = "TRUE") IS THEN POSSIBLE; THE MEANING OF THE FORMAL PARAMETERS IS: TPRINT: <VARIABLE>; ENTRY: THE VALUE OF THE INDEPENDENT VARIABLE AT WHICH A CALL OF CONTROL WAS DESIRED; EXIT: A NEW VALUE (TPRINT>T) AT WHICH A CALL OF CONTROL IS DESIRED; T: <VARIABLE>; THE ACTUAL VALUE OF THE INDEPENDENT VARIABLE, UP TO WHICH INTEGRATION HAS BEEN PERFORMED; H: <VARIABLE>; HALVE THE ACTUAL STEPSIZE; HNEW: <VARIABLE>; THE NEW STEPSIZE; IF PRESCH="TRUE", THEN THE USER MAY PRESCRIBE A NEW STEPSIZE BY CHANGING HNEW; Y: <ARRAY IDENTIFIER>; "REAL" "ARRAY" Y[1:5,1:N]; THE VALUE OF THE DEPENDENT VARIABLE AND ITS FIRST FOUR DIVIDED DIFFERENCES AT THE POINT T ARE GIVEN IN THIS ARRAY; ERROR: <ARRAY IDENTIFIER>; "REAL" "ARRAY" ERROR[1:3]; THE ELEMENTS OF THIS ARRAY CONTAIN THE FOLLOWING ERRORS: ERROR[1]: THE LOCAL ERROR; ERROR[2]: THE GLOBAL ERROR OF SECOND ORDER IN H;� ERROR[3]: THE GLOBAL ERROR OF FOURTH ORDER IN H;� N: <VARIABLE>; THE NUMBER OF EQUATIONS; EXAMPLE OF USE: SEE EXAMPLE OF USE OF THE PROCEDURE IMPEX; DATA AND RESULTS: FOR DATA, SEE REF[1]. THE RESULTS OF THE INTEGRATION ARE ATTAINABLE THROUGH THE PROCEDURE CONTROL , WHICH IS CALLED AT SPECIFIED, USER DEFINED, VALUES OF THE INDEPENDENT VARIABLE . IN PARTICULAR , THE VALUES OF THE DEPENDENT VARIABLE AT THE ENDPOINT OF INTEGRATION ARE OBTAINED BY A CALL OF CONTROL WITH TPRINT=TEND. 1SECTION : 5.2.1.1.1.2.F � (OCTOBER 1975) PAGE 4 PROCEDURES USED: INIVEC = CP31010, INIMAT = CP31011, MULVEC = CP31020, MULROW = CP31021, DUPVEC = CP31030, DUPROWVEC= CP31032, DUPMAT = CP31035, VECVEC = CP34010, MATVEC = CP34011, MATMAT = CP34013, ELMVEC = CP34020, ELMROW = CP34024, DEC = CP34300, SOL = CP34051. REQUIRED CENTRAL MEMORY: EXECUTION FIELD LENGTH: CIRCA N * ( 23 + 2 * N ) (DECIMAL). RUNNING TIME: DEPENDS STRONGLY ON THE DIFFERENTIAL EQUATION TO SOLVE. LANGUAGE: ALGOL 60. METHOD AND PERFORMANCE: THE INTEGRATION METHOD (REF[1]) IS BASED ON THE COMPUTATION OF TWO INDEPENDENT SOLUTIONS Y(T,H) AND Y(T,H/2) BY THE IMPLICIT MIDPOINT RULE. PASSIVE SMOOTHING AND PASSIVE EXTRAPOLATION IS PERFORMED TO OBTAIN STABILITY AND HIGH ACCURACY . THE ALGORITHM USES FOR EACH STEP AT LEAST THREE FUNCTION EVALUATIONS, AND ON CHANGE OF STEPSIZE OR AT SLOW CONVERGENCE IN THE ITERATION PROCESS AN APPROXIMATION OF THE JACOBIAN MATRIX (COMPUTED BY DIVIDED DIFFERENCES OR EXPLICITLY SPECIFIED BY THE USER) . IF THE COMPUTED LOCAL ERROR EXCEEDS THE TOLERANCE , THE LAST STEP IS REJECTED. MOREOVER , TWO GLOBAL ERRORS ARE COMPUTED. REFERENCES: [1]. B.LINDBERG. IMPEX 2 , A PROCEDURE FOR THE SOLUTION OF SYSTEMS OF STIFF DIFFERENTIAL EQUATIONS. ROYAL INSTITUTE OF TECHNOLOGY,STOCKHOLM. TRITA-NA-7303 (1973). [2]. (TO APPEAR) COLLOQUIUM STIFF DIFFERENTIAL EQUATIONS 3 (DUTCH). M.C. SYLLABUS 15.3 (1974), MATHEMATICAL CENTRE. 1SECTION : 5.2.1.1.1.2.F � (OCTOBER 1975) PAGE 5 EXAMPLE OF USE: CONSIDER THE AUTONOMOUS SYSTEM OF DIFFERNETIAL EQUATIONS: DY[1]/DX = .2 * ( Y[2] - Y[1] ), DY[2]/DX = 10 * Y[1] - ( 60 - Y[3]/8 ) * Y[2] + Y[3]/8, DY[3]/DX = 1, WITH INITIAL CONDITIONS AT X=0 : Y[1]=Y[2]=Y[3]=0 (SEE REF[2]). THE SOLUTION AT SEVERAL POINTS IN THE INTERVAL [0, 400] MAY BE OBTAINED BY THE FOLLOWING PROGRAM:� (THE SOLUTION AT X=400 IS: Y[1]=22.24222011, Y[2]=27.11071335) "BEGIN" "INTEGER" N,NFE,NJE,POINT; "REAL" T,TEND,EPS,HMAX,L,H2,TIME; "ARRAY" Y,SW[1:3],PRINT[1:5]; "BOOLEAN" FAIL; "PROCEDURE" IMPEX(N,T0,TEND,Y0,DERIV,AVAIL,H0,HMAX,PRESCH,EPS, WEIGHTS,UPDATE,FAIL,CONTROL); "CODE" 33135; "PROCEDURE" LIPEST(L,Y,EPS,T,F,N);� "REAL" T,L,EPS; "ARRAY" Y; "INTEGER" N; "PROCEDURE" F;� "BEGIN" "REAL" N1,N2; "INTEGER" I,IT; "ARRAY" F1,F2,Z,X[1:N]; "PROCEDURE" DUPVEC(L,U,SHIFT,A,B); "CODE" 31030; "REAL" "PROCEDURE" VECVEC(L,U,SHIFT,A,B); "CODE" 34010; "PROCEDURE" ELMVEC(L,U,SHIFT,A,B,X); "CODE" 34020;� "REAL" "PROCEDURE" NORM(Y); "ARRAY" Y; NORM:=SQRT(VECVEC(1,N,0,Y,Y));� DUPVEC(1,N,0,Z,Y); "FOR" I:=1 "STEP" 1 "UNTIL" N "DO" X[I]:="IF" Y[I]=0 "THEN" EPS "ELSE" (1+EPS)*Y[I]; N1:=NORM(X)*EPS; F(T,X,F1,N); "FOR" IT:=1 "STEP" 1 "UNTIL" 5 "DO" "BEGIN" F(T,Z,F2,N);� ELMVEC(1,N,0,F2,F1,-1); N2:=N1/NORM(F2);� DUPVEC(1,N,0,Z,X); ELMVEC(1,N,0,Z,F2,N2) "END"; F(T,Z,F2,N); ELMVEC(1,N,0,F2,F1,-1); L:=NORM(F2)/N1 "END" LIPEST; "PROCEDURE" F(T,Y,F1,N); "VALUE" T; "REAL" T; "ARRAY" Y,F1; "INTEGER" N; "BEGIN" NFE:=NFE+1; F1[1]:=0.2*(Y[2]-Y[1]); F1[2]:=10*Y[1]-(60-.125*Y[3])*Y[2]+.125*Y[3]; F1[3]:=1 "END"; "BOOLEAN" "PROCEDURE" AVAILABLE(T,Y,A,N); "INTEGER" N; "REAL" T; "ARRAY" Y,A; "BEGIN" NJE:=NJE+1; AVAILABLE:="TRUE"; A[1,1]:=-.2; A[1,2]:=.2; A[1,3]:=A[3,1]:=A[3,2]:=A[3,3]:=0; A[2,1]:=10; A[2,2]:=.125*Y[3]-60; A[2,3]:=.125*(1+Y[2]) "END" 1SECTION : 5.2.1.1.1.2.F � (OCTOBER 1975) PAGE 6 ; "PROCEDURE" UPDATE(SW,R1,N); "INTEGER" N; "ARRAY" SW,R1; "BEGIN" "REAL" S1,S2; "INTEGER" I;� "FOR" I:=1 "STEP" 1 "UNTIL" N "DO" "BEGIN" S1:=1/SW[I]; S2:=ABS(R1[I]); "IF" S1<S2 "THEN" SW[I]:=1/S2 "END" "END"; "PROCEDURE" CONTROL(TP,T,H,HNEW,Y,ERR,N); "REAL" TP,T,H,HNEW; "ARRAY" Y,ERR; "INTEGER" N; "BEGIN" "INTEGER" I; "ARRAY" C[3:5],X[1:N]; "REAL" S,S2,S3,S4,C1; NEXT: S:=(T-TP)/H; S2:=S*S; S3:=S2*S; S4:=S3*S; C[3]:=(S2-S)/2; C[4]:=-S3/6+S2/2-S/3; C[5]:=S4/24-S3/4+11*S2/24-S/4;� "FOR" I:=1 "STEP" 1 "UNTIL" N "DO" X[I]:=Y[1,I]-S*Y[2,I]+C[3]*Y[3,I]+C[4]*Y[4,I]+C[5]*Y[5,I]; OUTPUT(61,"("3ZD.2D2B,D.D"-D2B,2(+D.8D"-D2B),2(4ZD),3ZD.2D, /")",TP,ERR[3],X[1],X[2],NFE,NJE,CLOCK-TIME); "IF" TP<TEND "THEN" "BEGIN" POINT:=POINT+1; TP:=PRINT[POINT]; "IF" TP<=T "THEN" "GOTO" NEXT "END" "END" CONTROL;� N:=3; NJE:=NFE:=0; T:=0; TEND:=400; EPS:="-5; HMAX:=400; Y[1]:=Y[2]:=Y[3]:=0; SW[1]:=SW[2]:=SW[3]:=1;� PRINT[1]:=.1; PRINT[2]:=1; PRINT[3]:=10; PRINT[4]:=100; PRINT[5]:=400;� LIPEST(L,Y,"-5,T,F,N); H2:=(EPS*320)**(1/5)/(4*L); OUTPUT(61,"(""("EPS=")",D.2D"-D,/,"("INTERVAL OF INTEGRATION=(")", 3ZD,"(",")",3ZD,"(")")",/,"("MAXIMALLY ALLOWED STEPSIZE=")", D.2D"-D,//")",EPS,T,TEND,HMAX); OUTPUT(61,"(""("LIPSCHCONST=")",BD.3D"+D,/,"("STARTING STEPSIZE")" "("=")",BD.2D"+D,/,"("FUNCTIONAL EVAL=")",4ZD,//")",L,H2,NFE); TIME:=CLOCK; OUTPUT(61,"(""(" X ERROR Y[1] Y[2]")" "(" NFE NJE TIME")",/")"); IMPEX(N,T,TEND,Y,F,AVAILABLE,H2,HMAX,"FALSE",EPS,SW,UPDATE,FAIL,� CONTROL); OUTPUT(61,"("/"("NO OF FUNCTIONAL EVALUATIONS= ")",3ZD,/, "("NO OF JACOBEAN EVALUATIONS= ")",3ZD,/")",NFE,NJE) "END" 1SECTION : 5.2.1.1.1.2.F � (OCTOBER 1975) PAGE 7 THIS PROGRAM DELIVERS: EPS=1.00"-5 INTERVAL OF INTEGRATION=( 0, 400) MAXIMALLY ALLOWED STEPSIZE=4.00" 2 LIPSCHCONST= 6.003"+1 STARTING STEPSIZE= 1.32"-3 FUNCTIONAL EVAL= 7 X ERROR Y[1] Y[2] NFE NJE TIME 0.00 0.0" 0 +0.00000000" 0 +0.00000000" 0 7 0 0.01 0.10 6.3"-7 +1.49614151"-6 +1.74013792"-4 46 4 0.72 1.00 1.5"-6 +1.91041887"-4 +2.08361269"-3 85 8 1.48 10.00 8.7"-7 +1.30147663"-2 +2.34487800"-2 119 9 1.99 100.00 1.3"-5 +3.06302487"-1 +3.27552180"-1 225 13 3.47 400.00 1.4"-5 +2.22406546" 1 +2.71090507" 1 556 30 7.51 NO OF FUNCTIONAL EVALUATIONS= 556 NO OF JACOBEAN EVALUATIONS= 30 1SECTION : 5.2.1.1.1.2.F (OCTOBER 1975) PAGE 8 SOURCE TEXT(S): 0"CODE" 33135; "PROCEDURE" IMPEX (N, T0, TEND, Y0, DERIV, AVAILABLE, H0, HMAX, PRESCH, EPS, WEIGHTS, UPDATE, FAIL, CONTROL); "VALUE" N; "INTEGER" N; "REAL" T0,TEND,H0,HMAX,EPS; "BOOLEAN" PRESCH,FAIL; "ARRAY" Y0,WEIGHTS; "BOOLEAN" "PROCEDURE" AVAILABLE; "PROCEDURE" DERIV,UPDATE,CONTROL; "BEGIN" "INTEGER" I,K,ECI; "REAL" T,T1,T2,T3,TP,H,H2,HNEW,ALF,LQ; "ARRAY" Y,Z,S1,S2,S3,U1,U3,W1,W2,W3,EHR[1:N],R,RF[1:5,1:N], ERR[1:3],A1,A2[1:N,1:N]; "INTEGER" "ARRAY" PS1,PS2[1:N]; "BOOLEAN" START,TWO,HALV; "PROCEDURE" INIVEC(L,U,A,X); "CODE" 31010; "PROCEDURE" INIMAT(LR,UR,LC,UC,A,X); "CODE" 31011; "PROCEDURE" MULVEC(L,U,SHIFT,A,B,X); "CODE" 31020; "PROCEDURE" MULROW(L,U,I,J,A,B,X); "CODE" 31021; "PROCEDURE" DUPVEC(L,U,SHIFT,A,B); "CODE" 31030; "PROCEDURE" DUPROWVEC(L,U,I,A,B); "CODE" 31032; "PROCEDURE" DUPMAT(L,U,I,J,A,B); "CODE" 31035; "REAL" "PROCEDURE" VECVEC(L,U,SHIFT,A,B);"CODE" 34010; "REAL" "PROCEDURE" MATVEC(L,U,I,A,B); "CODE" 34011; "REAL" "PROCEDURE" MATMAT(L,U,I,J,A,B); "CODE" 34013; "PROCEDURE" ELMVEC(L,U,SHIFT,A,B,X); "CODE" 34020; "PROCEDURE" ELMROW(L,U,I,J,A,B,X); "CODE" 34024; "PROCEDURE" DEC(A,N,AUX,P); "CODE" 34300; "PROCEDURE" SOL(A,N,P,B); "CODE" 34051; "PROCEDURE" DFDY(T,Y,A); "REAL" T; "ARRAY" Y,A; "BEGIN" "INTEGER" I,J; "REAL" SL; "ARRAY" F1,F2[1:N]; DERIV(T,Y,F1,N); "FOR" I:=1 "STEP" 1 "UNTIL" N "DO" "BEGIN" SL:="-6*Y[I]; "IF" ABS(SL)<"-6 "THEN" SL:="-6; Y[I]:=Y[I]+SL; DERIV(T,Y,F2,N); "FOR" J:=1 "STEP" 1 "UNTIL" N "DO" A[J,I]:=(F2[J]-F1[J])/SL; Y[I]:=Y[I]-SL; "END" "END" DFDY; "PROCEDURE" STARTV(Y,T); "VALUE" T; "REAL" T; "ARRAY" Y; "BEGIN" "REAL" A,B,C; A:=(T-T1)/(T1-T2); B:=(T-T2)/(T1-T3); C:=(T-T1)/(T2-T3)*B; B:=A*B; A:=1+A+B; B:=A+C-1; MULVEC(1,N,0,Y,S1,A); ELMVEC(1,N,0,Y,S2,-B); ELMVEC(1,N,0,Y,S3,C) "END" STARTV; 1SECTION : 5.2.1.1.1.2.F (OCTOBER 1975) PAGE 9 ; "PROCEDURE" ITERATE(Z,Y,A,H,T,WEIGHTS,FAIL,PS); "ARRAY" Z,Y,A,WEIGHTS; "REAL" H,T; "LABEL" FAIL; "INTEGER" "ARRAY" PS; "BEGIN" "INTEGER" IT,LIT; "REAL" MAX,MAX1,CONV; "ARRAY" DZ,F1[1:N]; "FOR" I:=1 "STEP" 1 "UNTIL" N "DO" Z[I]:=(Z[I]+Y[I])/2; IT:=LIT:=1; CONV:=1; ATER: DERIV(T,Z,F1,N); "FOR" I:=1 "STEP" 1 "UNTIL" N "DO" F1[I]:=DZ[I]:=Z[I]-H*F1[I]/2-Y[I]; SOL(A,N,PS,DZ); ELMVEC(1,N,0,Z,DZ,-1); MAX:=0; "FOR" I:=1 "STEP" 1 "UNTIL" N "DO" MAX:=MAX+(WEIGHTS[I]*DZ[I])**2; MAX:=SQRT(MAX); "IF" MAX*CONV<EPS/10 "THEN" "GOTO" OUT; IT:=IT+1; "IF" IT=2 "THEN" "GOTO" ASS; CONV:=MAX/MAX1; "IF" CONV>.2 "THEN" "BEGIN" "IF" LIT=0 "THEN" "GOTO" FAIL; LIT:=0; CONV:=1; IT:=1; RECOMP(A,H,T,Z,FAIL,PS); "END"; ASS: MAX1:=MAX; "GOTO" ATER; OUT: "FOR" I:=1 "STEP" 1 "UNTIL" N "DO" Z[I]:=2*Z[I]-Y[I]; "END" ITERATE; "PROCEDURE" RECOMP(A,H,T,Y,FAIL,PS); "REAL" H,T; "ARRAY" A,Y; "LABEL" FAIL; "INTEGER" "ARRAY" PS; "BEGIN" "REAL" SL; "ARRAY" AUX[1:3]; SL:=H/2; "IF" "NOT" AVAILABLE(T,Y,A,N) "THEN" DFDY(T,Y,A); "FOR" I:=1 "STEP" 1 "UNTIL" N "DO" "BEGIN" MULROW(1,N,I,I,A,A,-SL); A[I,I]:=1+A[I,I] "END"; AUX[2]:="-14; DEC(A,N,AUX,PS); "IF" AUX[3]<N "THEN" "GOTO" FAIL "END" RECOMP; "PROCEDURE" INITIALIZATION; "BEGIN" H2:=HNEW; H:=H2/2; DUPVEC(1,N,0,S1,Y0); DUPVEC(1,N,0,S2,Y0); DUPVEC(1,N,0,S3,Y0); DUPVEC(1,N,0,W1,Y0); DUPROWVEC(1,N,1,R,Y0); INIVEC(1,N,U1,0); INIVEC(1,N,W2,0); INIMAT(2,5,1,N,R,0); INIMAT(1,5,1,N,RF,0); T:=T1:=T0; T2:=T0-2*H-"6; T3:=2*T2+1; RECOMP(A1,H,T,S1,MISS,PS1);RECOMP(A2,H2,T,W1,MISS,PS2); "END" 1SECTION : 5.2.1.1.1.2.F (OCTOBER 1975) PAGE 10 ; "PROCEDURE" ONE LARGE STEP; "BEGIN" STARTV(Z,T+H); ITERATE(Z,S1,A1,H,T+H/2,WEIGHTS,MISS,PS1); DUPVEC(1,N,0,Y,Z); STARTV(Z,T+H2); ITERATE(Z,Y,A1,H,T+3*H/2,WEIGHTS,MISS,PS1); DUPVEC(1,N,0,U3,U1); DUPVEC(1,N,0,U1,Y); DUPVEC(1,N,0,S3,S2); DUPVEC(1,N,0,S2,S1); DUPVEC(1,N,0,S1,Z); ELMVEC(1,N,0,Z,W1,1); ELMVEC(1,N,0,Z,S2,-1); ITERATE(Z,W1,A2,H2,T+H,WEIGHTS,MISS,PS2); T3:=T2; T2:=T1; T1:=T+H2; DUPVEC(1,N,0,W3,W2); DUPVEC(1,N,0,W2,W1); DUPVEC(1,N,0,W1,Z); "END"; "PROCEDURE" CHANGE OF INFORMATION; "BEGIN" "REAL" ALF1,C1,C2,C3; "ARRAY" KOF[2:4,2:4],E,D[1:4]; C1:=HNEW/H2; C2:=C1*C1; C3:=C2*C1; KOF[2,2]:=C1; KOF[2,3]:=(C1-C2)/2; KOF[2,4]:=C3/6-C2/2+C1/3; KOF[3,3]:=C2; KOF[3,4]:=C2-C3; KOF[4,4]:=C3; "FOR" I:=1 "STEP" 1 "UNTIL" N "DO" U1[I]:=R[2,I]+R[3,I]/2+R[4,I]/3; ALF1:=MATVEC(1,N,1,RF,U1)/VECVEC(1,N,0,U1,U1); ALF:=(ALF+ALF1)*C1; "FOR" I:=1 "STEP" 1 "UNTIL" N "DO" "BEGIN" E[1]:=RF[1,I]-ALF1*U1[I]; E[2]:=RF[2,I]-ALF1*2*R[3,I]; E[3]:=RF[3,I]-ALF1*4*R[4,I]; E[4]:=RF[4,I]; D[1]:=R[1,I]; RF[1,I]:=E[1]:=E[1]*C2; "FOR" K:=2 "STEP" 1 "UNTIL" 4 "DO" "BEGIN" R[K,I]:=D[K]:=MATMAT(K,4,K,I,KOF,R); RF[K,I]:=E[K]:=C2*MATVEC(K,4,K,KOF,E) "END" K; S1[I]:=D[1]+E[1];W1[I]:=D[1]+4*E[1]; S2[I]:=S1[I]-(D[2]+E[2]/2); S3[I]:=S2[I]-(D[2]+E[2])+(D[3]+E[3]/2); "END" I; T3:=T-HNEW; T2:=T-HNEW/2; T1:=T; H2:=HNEW; H:=H2/2; ERR[1]:=0; "IF" HALV "THEN" "BEGIN" DUPVEC(1,N,0,PS2,PS1); DUPMAT(1,N,1,N,A2,A1) "END"; "IF" TWO "THEN" "BEGIN" DUPVEC(1,N,0,PS1,PS2); DUPMAT(1,N,1,N,A1,A2) "END" "ELSE" RECOMP(A1,HNEW/2,T,S1,MISS,PS1); "IF" ^HALV "THEN" RECOMP(A2,HNEW,T,W1,MISS,PS2); "END"; 1SECTION : 5.2.1.1.1.2.F (OCTOBER 1975) PAGE 11 ; "PROCEDURE" BACKWARD DIFFERENCES; "FOR"I:=1 "STEP" 1 "UNTIL" N "DO" "BEGIN" "REAL" B0,B1,B2,B3; B1:=(U1[I]+2*S2[I]+U3[I])/4; B2:=(W1[I]+2*W2[I]+W3[I])/4; B3:=(S3[I]+2*U3[I]+S2[I])/4; B2:=(B2-B1)/3; B0:=B1-B2; B2:=B2-(S1[I]-2*S2[I]+S3[I])/16; B1:=2*B3-(B2+RF[1,I])-(B0+R[1,I])/2; B3:=0; "FOR" K:=1 "STEP" 1 "UNTIL" 4 "DO" "BEGIN" B1:=B1-B3; B3:=R[K,I]; R[K,I]:=B0; B0:=B0-B1 "END"; R[5,I]:=B0; "FOR" K:=1 "STEP" 1 "UNTIL" 4 "DO" "BEGIN" B3:=RF[K,I]; RF[K,I]:=B2; B2:=B2-B3 "END"; RF[5,I]:=B2; "END"; "PROCEDURE" ERROR ESTIMATES; "BEGIN" "REAL" C0,C1,C2,C3,B0,B1,B2,B3,W,SL1,SN,LR; C0:=C1:=C2:=C3:=0; "FOR" I:=1 "STEP" 1 "UNTIL" N "DO" "BEGIN" W:=WEIGHTS[I]**2; B0:=RF[4,I]/36; C0:=C0+B0*B0*W; LR:=ABS(B0); B1:=RF[1,I]+ALF*R[2,I]; C1:=C1+B1*B1*W; B2:=RF[3,I]; C2:=C2+B2*B2*W; SL1:=ABS(RF[1,I]-RF[2,I]); SN:="IF" SL1<"-10 "THEN"1"ELSE"ABS(RF[1,I]-R[4,I]/6)/SL1; "IF" SN>1 "THEN" SN:=1; "IF" START "THEN" "BEGIN" SN:=SN**4; LR:=LR*4 "END"; EHR[I]:=B3:=SN*EHR[I]+LR; C3:=C3+B3*B3*W; "END" I; B0:=ERR[1]; ERR[1]:=B1:=SQRT(C0); ERR[2]:=SQRT(C1); ERR[3]:=SQRT(C3)+SQRT(C2)/2; LQ:=EPS/("IF" B0<B1 "THEN" B1"ELSE" B0); "IF" B0<B1 "AND" LQ>=80 "THEN" LQ:=10; "END"; "PROCEDURE" REJECT; "IF" START "THEN" "BEGIN" HNEW:=LQ**(1/5)*H/2; "GOTO" INIT "END" "ELSE" "BEGIN" "FOR" K:=1,2,3,4,1,2,3 "DO" ELMROW(1,N,K,K+1,R,R,-1); "FOR" K:=1,2,3,4 "DO" ELMROW(1,N,K,K+1,RF,RF,-1); T:=T-H2; HALV:="TRUE"; HNEW:=H; "GOTO" MSTP "END"; 1SECTION : 5.2.1.1.1.2.F (OCTOBER 1975) PAGE 12 ; "PROCEDURE" STEPSIZE; "IF" LQ<2 "THEN" "BEGIN" HALV:="TRUE"; HNEW:=H "END" "ELSE" "BEGIN" "IF" LQ>80 "THEN" HNEW:=("IF" LQ>5120 "THEN" (LQ/5)**(1/5) "ELSE" 2)*H2; "IF" HNEW>HMAX "THEN" HNEW:=HMAX; "IF" TEND>T "AND" TEND-T<HNEW "THEN" HNEW:=TEND-T; TWO:=HNEW=2*H2; "END"; "IF" PRESCH "THEN" H:=H0 "ELSE" "BEGIN" "IF" H0>HMAX "THEN" H:=HMAX "ELSE" H:=H0; "IF" H>(TEND-T0)/4 "THEN" H:=(TEND-T0)/4; "END"; HNEW:=H; ALF:=0; T:=TP:=T0; INIVEC(1,3,ERR,0); INIVEC(1,N,EHR,0); DUPROWVEC(1,N,1,R,Y0); CONTROL(TP,T,H,HNEW,R,ERR,N); INIT: INITIALIZATION; START:="TRUE"; "FOR" ECI:=0,1,2,3 "DO" "BEGIN" ONE LARGE STEP; T:=T+H2; "IF" ECI>0 "THEN" "BEGIN" BACKWARD DIFFERENCES; UPDATE(WEIGHTS,S2,N) "END" "END"; ECI:=4; MSTP: "IF" HNEW^=H2 "THEN" "BEGIN" ECI:=1; CHANGE OF INFORMATION; ONE LARGE STEP; T:=T+H2; ECI:=2; "END"; ONE LARGE STEP; BACKWARD DIFFERENCES; UPDATE(WEIGHTS,S2,N); ERROR ESTIMATES; "IF" ECI<4 "AND" LQ>80 "THEN" LQ:=20; HALV:=TWO:="FALSE"; "IF" PRESCH "THEN" "GOTO" TRYCK; "IF" LQ<1 "THEN" REJECT "ELSE" STEPSIZE; TRYCK: "IF" TP<=T "THEN" CONTROL(TP,T,H,HNEW,R,ERR,N); "IF" START "THEN" START:="FALSE"; "IF" HNEW=H2 "THEN" T:=T+H2; ECI:=ECI+1; "IF" T<TEND+H2 "THEN" "GOTO" MSTP "ELSE" "GOTO" END; MISS: FAIL:=PRESCH; "IF" ^ FAIL "THEN" "BEGIN" "IF" ECI>1 "THEN" T:=T-H2; HALV:=TWO:="FALSE"; HNEW:=H2/2; "IF" START "THEN" "GOTO" INIT "ELSE" "GOTO" TRYCK "END"; END: "END" IMPEX; "EOP" 1SECTION : 5.2.1.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 CORSPONDING 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,DOMIGVAL; "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" RICHARDSON(U,LJ,UJ,LL,UL,INAP,RESIDUAL,A,B,N,DISCR,K, RATECONV,DOMEIGVAL,OUT); "CODE"33170; "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")"/")"); INPUT(60,"("")",LJ); INPUT(60,"("")",UJ); INPUT(60,"("")",LL); INPUT(60,"("")",UL); INPUT(60,"("")",N); INPUT(60,"("")",A); INPUT(60,"("")",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,DOMIGVAL; "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" RICHARDSON(U,LJ,UJ,LL,UL,INAP,RESIDUAL,A,B,DISCR,K, RATECONV,DOMEIGVAL,OUT); "CODE"33170; "PROCEDURE" ELIMINATION(U,LJ,UJ,LL,UL,RESIDUAL,A,B,DISCR,K, RATECONV,DOMEIGVAL,OUT); "CODE"33171; "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] R TECONV")",//,+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**(-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")"/")"); INPUT(60,"("")",LJ); INPUT(60,"("")",UJ); INPUT(60,"("")",LL); INPUT(60,"("")",UL); INPUT(60,"("")", N); INPUT(60,"("")", Q); INPUT(60,"("")", A); INPUT(60,"("")", 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): "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; "EOP" 1SECTION : 5.2.1.2.2.1.2 (OCTOBER 1974) PAGE 14 "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" ARCCOS(X); "CODE" 35122; "REAL" "PROCEDURE" TAN(X); "CODE" 35120; "REAL" "PROCEDURE" TANH(X); "CODE" 35113; "PROCEDURE" RICHARDSON(U,LJ,UJ,LL,UL,INAP,RESIDUAL,A,B,N,DISCR, K,RATECONV,DOMEIGVAL,OUT); "CODE"33170; "BOOLEAN" "PROCEDURE" ZEROIN(X,Y,FX,TOLX); "CODE"34150; "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 : 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; 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; 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.5416 13782 89843 2905"-2; "BEGIN" "PROCEDURE" ERRORFUNCTION(X, ERF, ERFC); "CODE" 35021; "REAL" "PROCEDURE" NONEXPERFC(X); "CODE" 35022; "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 49710 ERFC(1) = +0.15729 92070 50280 NONEXPERFC(100) = +.56416 13782 98940"-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; 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: CHEPOLSER = CP31046. 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" "PROCEDURE" INVERSE ERROR FUNCTION(X, ONEMINX, INVERF); "CODE" 35023; "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; 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; 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" "PROCEDURE" FRESNEL(X, C, S); "CODE" 35027; "PROCEDURE" FG(X, F, G); "CODE" 35028; "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; "REAL" "PROCEDURE" NONEXPERFC(X); "CODE" 35022; 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]; "REAL" "PROCEDURE" CHEPOLSER(N, X, A); "CODE" 31046; 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:= CHEPOLSER(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:= CHEPOLSER(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:= CHEPOLSER(23, P, A); INVERF:= "IF" X < 0 "THEN" - BETAX * P "ELSE" BETAX * P "END" "ELSE" "IF" ONEMINX >= 3.13 "-294 "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:= CHEPOLSER(12, P, A); INVERF:= "IF" X < 0 "THEN" - BETAX * P "ELSE" BETAX * P "END" "ELSE" INVERF:= SIGN(X) * 26 "END" INVERSE ERROR FUNCTION; "EOP" 1SECTION : 6.7 (OCTOBER 1974) PAGE 13 0"CODE" 35022; "REAL" "PROCEDURE" NONEXPERFC(X); "VALUE" X; "REAL" X; "BEGIN" "REAL" ABSX, ERF, ERFC, C, P, Q; "PROCEDURE" ERRORFUNCTION(X, ERF, ERFC); "CODE" 35021; ABSX:= ABS(X); "IF" ABSX <= 0.5 "THEN" "BEGIN" ERRORFUNCTION(X, ERF, ERFC); NONEXPERFC:= EXP(X * X) * ERFC "END" "ELSE" "IF" ABSX < 4 "THEN" "BEGIN" C:= ABSX; P:= ((((((-0.13686 48573 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; "PROCEDURE" FG(X, F, G); "CODE" 35028; ABSX:= ABS(X); "IF" ABSX <= 1.2 "THEN" "BEGIN" A:= X * X; X3:= A * X; X4:= A * A; P:= (((5.47711 38568 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; "PROCEDURE" FRESNEL(X, C, S); "CODE" 35027; ABSX:= ABS(X); "IF" ABSX <= 1.6 "THEN" "BEGIN" FRESNEL(X, C, S); A:= X * X * 1.57079 63267 9490; C1:= COS(A); S1:= SIN(A); A:= "IF" X < 0 "THEN" -0.5 "ELSE" 0.5; P:= A - C; Q:= A - S; F:= Q * C1 - P * S1; G:= P * C1 + Q * S1 "END" "ELSE" "IF" ABSX <= 1.9 "THEN" "BEGIN" XINV:= 1 / X; A:= XINV * XINV; X3INV:= A * XINV; C4:= A * A; "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 : 2.2.2.2 (DECEMBER 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 FOUR PROCEDURES ABOUT CHEBYSHEV POLYNOMIALS OF THE FIRST KIND: CHEPOLSUM: EVALUATES A (FINITE) SUM OF CHEBYSHEV POLYNOMIALS, ODDCHEPOLSUM: EVALUATES A (FINITE) SUM OF CHEBYSHEV POLYNOMIALS OF ODD DEGREE, CHEPOL: EVALUATES A CHEBYSHEV POLYNOMIAL, ALLCHEPOL: EVALUATES ALL CHEBYSHEV POLYNOMIALS WITH DEGREE LESS THAN A GIVEN POSITIVE INTEGER. KEYWORDS: (FINITE) SUM OF (SHIFTED) CHEBYSHEV POLYNOMIALS OF THE FIRST KIND, GOERTZEL,WATT,CLENSHAW,GENERALIZED HORNER ALGORITHM, LINEAR THREE TERM (INHOMOGENEOUS) RECURRENCE RELATION. REFERENCES: CLENSHAW, C.W. (1962): CHEBYSHEV SERIES FOR MATHEMATICAL FUNCTIONS. MATH. TAB. NAT. PHYS. LAB. 5, LONDON. HMO. FOX, L. & I.B. PARKER (1972): CHEBYSHEV POLYNOMIALS IN NUMERICAL ANALYSIS. OXFORD UNIVERSITY PRESS. RIVLIN, T.J. (1974): THE CHEBYSHEV POLYNOMIALS. WILEY. STOER,J.(1972): EINFUEHRUNG IN DIE NUMERISCHE MATHEMATIK 1. HEIDELBERGER TASCHENBUECHER 105,SPRINGER-VERLAG. 1SECTION : 2.2.2.2 (DECEMBER 1978) PAGE 2 SUBSECTION: CHEPOLSUM. CALLING SEQUENCE: THE DECLARATION OF THE PROCEDURE IN THE CALLING PROGRAM READS: "REAL""PROCEDURE"CHEPOLSUM(N,X,A); "VALUE"N,X;"INTEGER"N;"REAL"X;"ARRAY"A; "CODE"31046; CHEPOLSUM:=THE VALUE OF THE CHEBYSHEV SUM A[0] + A[1]*T[1](X) + .... + A[N]*T[N](X), WHERE T[1](X),....,T[N](X) ARE CHEBYSHEV POLYNOMIALS OF THE FIRST KIND, OF DEGREE 1,....,N, RESPECTIVELY. THE MEANING OF THE FORMAL PARAMETERS IS : N : <ARITHMETIC EXPRESSION>; ENTRY: THE DEGREE OF THE POLYNOMIAL REPRESENTED BY THE CHEBYSHEV SUM (N>=0); X : <ARITHMETIC EXPRESSION>; ENTRY: THE ARGUMENT OF THE CHEBYSHEV POLYNOMIALS , ABS(X)<=1; A : <ARRAY IDENTIFIER>; "ARRAY" A[0:N]; ENTRY: THE COEFFICIENTS OF THE CHEBYSHEV SUM MUST BE GIVEN IN ARRAY A, WHERE A[K] IS THE COEFFICIENT OF THE CHEBYSHEV POLYNOMIAL OF DEGREE K, 0<=K<=N. PROCEDURES USED: NONE. RUNNING TIME: PROPORTIONAL TO N. METHOD AND PERFORMANCE: N N / 2*X 1 \ K / A[K] \ SUM A[K]*T[K](X) = (1,X) * SUM [ ] * [ ] K=0 K=0 \ -1 0 / \ 0 / WE USE THE CLENSHAW OR GENERALIZED HORNER ALGORITHM: N SUM A[K]*T[K](X) = (1,X) * K=0 / / A[0] \ / 2*X 1 \ / / A[1] \ / 2*X 1 \ / A[N] \ \ \ [ [ ] + [ ] * [ [ ] +..+ [ ] * [ ] ]..]. \ \ 0 / \ -1 0 / \ \ 0 / \ -1 0 / \ 0 / / / 1SECTION 2.2.2.2 (DECEMBER 1978) PAGE 3 THIS PROCEDURE MAY BE USED: - TO EVALUATE THE SUM OF CHEBYSHEV POLYNOMIALS OF EVEN DEGREE N SUM A[K]*T[2*K](X) , K=0 BY THE CALL OF CHEPOLSUM(N,"IF" ABS(X)<ARREB "THEN" -1 "ELSE" 2*X*X-1,A) BECAUSE OF T[2*K](X) = T[K](T[2](X)); (ARREB DENOTES THE MACHINE PRECISION) - TO EVALUATE THE SUM OF SHIFTED CHEBYSHEV POLYNOMIALS FOR 0<=X<=1 N SUM A[K]*T'[K](X) , K=0 BY THE CALL OF CHEPOLSUM(N,2*X-1,A) BECAUSE OF T'[K](X) = T[K](2*X-1). EXAMPLE OF USE : THE POLYNOMIAL : 1 + 1/2*T[1](X) + 1/4*T[2](X) IS EVALUATED FOR X = -1,0,1, WHERE T[1](X) AND T[2](X) ARE THE CHEBYSHEV POLYNOMIALS OF FIRST AND SECOND DEGREE, RESPECTIVELY. "BEGIN""ARRAY"A[0:2]; "REAL""PROCEDURE"CHEPOLSUM(N,X,A); "VALUE"N,X;"INTEGER"N;"REAL"X;"ARRAY"A; "CODE"31046; A[2]:=.25;A[1]:=.5;A[0]:=1; OUTPUT(61,"("3(BZ.DD)")",CHEPOLSUM(2,-1,A),CHEPOLSUM(2,0,A), CHEPOLSUM(2,1,A)) "END" .75 .75 1.75 SUBSECTION: ODDCHEPOLSUM. CALLING SEQUENCE: THE DECLARATION OF THE PROCEDURE IN THE CALLING PROGRAM READS: "REAL""PROCEDURE" ODDCHEPOLSUM(N,X,A); "VALUE"N,X;"INTEGER"N;"REAL"X;"ARRAY"A; "CODE"31059; 1SECTION : 2.2.2.2 (DECEMBER 1978) PAGE 4 ODDCHEPOLSUM:= THE VALUE OF THE CHEBYSHEV SUM A[1]*T[1](X) + .... + A[N]*T[2*N+1](X), WHERE T[1](X),....,T[2*N+1](X) ARE CHEBYSHEV POLYNOMIALS OF THE FIRST KIND, OF (ODD) DEGREE 1,....,2*N+1. THE MEANING OF THE FORMAL PARAMETERS IS: N : <ARITHMETIC EXPRESSION>; ENTRY: THE DEGREE OF THE POLYNOMIAL REPRESENTED BY THE CHEBYSHEV SUM IS 2*N+1 (N>=0); X : <ARITHMETIC EXPRESSION>; ENTRY: THE ARGUMENT OF THE CHEBYSHEV POLYNOMIALS, ABS(X)<=1; A : <ARRAY IDENTIFIER>; "ARRAY" A[0:N]; ENTRY: THE COEFFICIENTS OF THE CHEBYSHEV SUM MUST BE GIVEN IN ARRAY A, WHERE A[K] IS THE COEFFICIENT OF THE CHEBYSHEV POLYNOMIAL OF DEGREE 2*K+1, 0<=K<=N. PROCEDURES USED: NONE. RUNNING TIME: PROPORTIONAL TO N. METHOD AND PERFORMANCE: FROM THE REPRESENTATION, FOR ABS(X)<=1, N N / 2*T[2](X) -1 \ K /A[K] \ SUM A[K]*T[2*K+1](X) = X * (1,-1) * SUM [ ] * [ ] K=0 K=0 \ 1 0 / \ 0 / WE USE THE CLENSHAW OR GENERALIZED HORNER ALGORITHM: N / / A[0] \ SUM A[K]*T[2*K+1](X) = X * (1,-1) * [ [ ] + K=0 \ \ 0 / / 2*T[2](X) -1 \ / / A[1] \ / 2*T[2](X) -1 \ / A[N] \ \ \ [ ] * [ [ ]+...+[ ] * [ ] ]..]. \ 1 0 / \ \ 0 / \ 1 0 / \ 0 / / / THIS PROCEDURE MAY BE USED TO EVALUATE THE SUM OF SHIFTED CHEBYSHEV POLYNOMIALS OF ODD DEGREE FOR 0<=X<=1, N SUM A[K]*T'[2*K+1](X) , K=0 BY THE CALL OF ODDCHEPOLSUM(N,2*X-1,A) BECAUSE OF T'[K](X) = T[K](2*X-1). 1SECTION : 2.2.2.2 (DECEMBER 1978) PAGE 5 EXAMPLE OF USE: THE POLYNOMIAL 1/2*T[1](X) + 1/5*T[3](X) IS EVALUATED FOR X=-1,0,1, WHERE T[1](X) AND T[3](X) ARE CHEBYSHEV POLYNOMIALS OF THE FIRST AND THIRD DEGREE, RESPECTIVELY. "BEGIN" "ARRAY"A[0:1]; "REAL""PROCEDURE"ODDCHEPOLSUM(N,X,A); "VALUE"N,X;"INTEGER"N;"REAL"X;"ARRAY"A; "CODE"31049; A[1]:=.2;A[0]:=.5; OUTPUT(61,"("/,3(B,-Z.DD)")",ODDCHEPOLSUM(1,-1,A), ODDCHEPOLSUM(1,0,A), ODDCHEPOLSUM(1,1,A)); "END" -.70 .00 .70 SUBSECTION: CHEPOL. CALLING SEQUENCE: THE DECLARATION OF THE PROCEDURE IN THE CALLING PROGRAM READS: "REAL""PROCEDURE"CHEPOL(N,X); "VALUE"N,X;"INTEGER"N;"REAL"X; "CODE"31042; CHEPOL:=THE VALUE OF THE CHEBYSHEV POLYNOMIAL OF THE FIRST KIND OF DEGREE N FOR THE ARGUMENT X. THE MEANING OF THE FORMAL PARAMETERS IS: N : <ARITHMETIC EXPRESSION>; ENTRY: THE DEGREE OF THE POLYNOMIAL (N>=0); X : <ARITHMETIC EXPRESSION>; ENTRY: THE ARGUMENT OF THE CHEBYSHEV POLYNOMIAL, ABS(X)<=1. PROCEDURES USED: NONE. RUNNING TIME: PROPORTIONAL TO N. METHOD AND PERFORMANCE: SEE ALLCHEPOL (NEXT SUBSECTION). EXAMPLE OF USE: SEE NEXT SUBSECTION. 1SECTION : 2.2.2.2 (DECEMBER 1978) PAGE 6 SUBSECTION: ALLCHEPOL. CALLING SEQUENCE: THE DECLARATION OF THE PROCEDURE IN THE CALLING PROGRAM READS: "PROCEDURE"ALLCHEPOL(N,X,T); "VALUE"N,X;"INTEGER"N;"REAL"X;"REAL""ARRAY"T; "CODE"31043; THE MEANING OF THE FORMAL PARAMETERS IS: N : <ARITHMETIC EXPRESSION>; ENTRY: THE DEGREE OF THE LAST POLYNOMIAL (N>=0); X : <ARITHMETIC EXPRESSION>; ENTRY: THE ARGUMENT OF THE CHEBYSHEV POLYNOMIALS, ABS(X)<=1; T : <ARRAY IDENTIFIER>; "ARRAY" T[0:N]; EXIT: THE VALUES OF THE CHEBYSHEV POLYNOMIALS OF THE FIRST KIND OF DEGREES 0,1,...,N , FOR THE ARGUMENT X, ARE DELIVERED IN T[0],T[1],...,T[N], RESPECTIVELY. PROCEDURES USED: NONE. RUNNING TIME: PROPORTIONAL TO N. METHOD AND PERFORMANCE: FOR A DESCRIPTION OF THE ALGORITHM SEE STOER,1972,P.21. THE MAXIMUM (ABSOLUTE) VALUE OF THE CHEBYSHEV POLYNOMIAL EQUALS 1 AS A NORMALIZATION. AN UPPER BOUND FOR THE (ABSOLUTE) ERROR IS A QUADRATIC FUNCTION OF THE DEGREE OF THE CHEBYSHEV POLYNOMIAL.THIS UPPER BOUND IS A ROUGH OVER-ESTIMATE FOR THE SPECIAL CASE ABS(X)<.5 (STOER,1972, P. 21-24). EXAMPLE OF USE : BY THE PROCEDURE (ALL)CHEPOL THE CHEBYSHEV POLYNOMIALS OF THE FIRST KIND OF DEGREES 0,1,2 ARE EVALUATED AT -1,0,1. 1SECTION : 2.2.2.2 (DECEMBER 1978) PAGE 7 "BEGIN" "ARRAY"T[0:2]; "REAL""PROCEDURE"CHEPOL(N,X); "VALUE"N,X;"INTEGER"N;"REAL"X; "CODE"31042; "PROCEDURE"ALLCHEPOL(N,X,T); "VALUE"N,X;"INTEGER"N;"REAL"X;"REAL""ARRAY"T; "CODE"31043; ALLCHEPOL(2,-1,T);OUTPUT(61,"("/,3(-DB)")",T[0],T[1],T[2]); ALLCHEPOL(2, 0,T);OUTPUT(61,"("/,3(-DB)")",T[0],T[1],T[2]); ALLCHEPOL(2, 1,T);OUTPUT(61,"("/,3(-DB)")",T[0],T[1],T[2]); OUTPUT(61,"("/,3(/,-D)")",CHEPOL(2,-1),CHEPOL(2,0),CHEPOL(2,1)) "END" 1 -1 1 1 0 -1 1 1 1 1 -1 1 SOURCE TEXT(S): "CODE"31046; "REAL" "PROCEDURE" CHEPOLSUM(N,X,A); "VALUE" N,X;"INTEGER" N;"REAL" X;"ARRAY" A; "IF" N=0 "THEN" CHEPOLSUM:=A[0] "ELSE" "IF" N=1 "THEN" CHEPOLSUM:=A[0]+A[1]*X "ELSE" "BEGIN" "INTEGER" K;"REAL" H,R,S,TX; TX:=X+X;R:=A[N]; H:=A[N-1]+R*TX; "FOR" K:=N-2 "STEP" -1 "UNTIL" 1 "DO" "BEGIN" S:=R;R:=H; H:=A[K]+R*TX-S "END"K; CHEPOLSUM:=A[0]-R+H*X "END" CHEPOLSUM; "EOP" 1SECTION : 2.2.2.2 (DECEMBER 1978) PAGE 8 "CODE"31059; "REAL""PROCEDURE"ODDCHEPOLSUM(N,X,A); "VALUE"N,X;"INTEGER"N;"REAL"X;"ARRAY"A; "COMMENT" ODDCHEPOLSUM:=A[0]T[1](X)+A[1]T[3](X)+....+A[N]T[2N+1](X); "IF" N=0 "THEN" ODDCHEPOLSUM:=X*A[0] "ELSE" "IF" N=1 "THEN" ODDCHEPOLSUM:=X*(A[0]+A[1]*(4*X*X-3)) "ELSE" "BEGIN" "INTEGER" K; "REAL" H,R,S,Y; Y:=4*X*X-2; R:=A[N]; H:=A[N-1]+R*Y; "FOR" K:=N-2 "STEP" -1 "UNTIL" 0 "DO" "BEGIN" S:=R; R:=H; H:=A[K]+R*Y-S; "END" K; ODDCHEPOLSUM:=X*(H-R); "END" ODDCHEPOLSUM; "EOP" "CODE"31042; "REAL""PROCEDURE"CHEPOL(N,X); "VALUE"N,X;"INTEGER"N;"REAL"X; "IF" N = 0 "THEN" CHEPOL :=1 "ELSE" "IF" N = 1 "THEN" CHEPOL :=X "ELSE" "BEGIN""INTEGER"I;"REAL"T1,T2,H,X2; T2:=X;T1:=1;X2:=X+X; "FOR"I:=2"STEP"1"UNTIL"N"DO" "BEGIN"H:=X2*T2-T1;T1:=T2;T2:=H"END"; CHEPOL:=H "END"CHEPOL; "EOP" "CODE"31043; "PROCEDURE"ALLCHEPOL(N,X,T); "VALUE"N,X;"INTEGER"N;"REAL"X;"REAL""ARRAY"T; "IF" N = 0 "THEN" T[0] :=1 "ELSE" "IF" N = 1 "THEN" "BEGIN" T[0] := 1; T[1] := X "END" "ELSE" "BEGIN""INTEGER"I;"REAL"T1,T2,H,X2; T[0]:=T1:=1;T[1]:=T2:=X;X2:=X+X; "FOR"I:=2"STEP"1"UNTIL"N"DO" "BEGIN"T[I]:=H:=X2*T2-T1;T1:=T2;T2:=H"END" "END"ALLCHEPOL; "EOP" 1SECTION : 5.2.1.1.1.2.E (OCTOBER 1974) PAGE 1 AUTHOR: J.G. VERWER. INSTITUTE: MATHEMATICAL CENTRE. RECEIVED: 740809. BRIEF DESCRIPTION: GMS SOLVES AN INITIAL VALUE PROBLEM, GIVEN AS AN AUTONOMOUS SYSTEM OF FIRST ORDER DIFFERENTIAL EQUATIONS DY/DX = F(Y), BY MEANS OF A THIRD ORDER GENERALIZED LINEAR MULTISTEP METHOD; IN PARTICULAR THIS PROCEDURE IS SUITABLE FOR THE INTEGRATION OF STIFF EQUATIONS. KEYWORDS: DIFFERENTIAL EQUATIONS, INITIAL VALUE PROBLEM, AUTONOMOUS SYSTEM, STIFF EQUATIONS, GENERALIZED LINEAR MULTISTEP METHOD. CALLING SEQUENCE: THE HEADING OF THE PROCEDURE READS: "PROCEDURE" GMS(X, XE, R, Y, H, HMIN, HMAX, DELTA, DERIVATIVE, JACOBIAN, AETA, RETA, N, JEV, LU, NSJEV, LINEAR, OUT); "VALUE" R; "REAL" X, XE, H, HMIN, HMAX, DELTA, AETA, RETA; "INTEGER" R, N, JEV, NSJEV, LU; "BOOLEAN" LINEAR; "ARRAY" Y; "PROCEDURE" DERIVATIVE, JACOBIAN, OUT; GMS INTEGRATES THE SYSTEM OF DIFFERENTIAL EQUATIONS DY/DX = F(Y) FROM X = X0 TO X = XE; THE MEANING OF THE FORMAL PARAMETERS IS: X: <VARIABLE>; THE INDEPENDENT VARIABLE X; ENTRY: THE INITIAL VALUE OF X; EXIT : THE END VALUE OF X; XE: <ARITHMETIC EXPRESSION>; ENTRY: THE END VALUE OF X; R: <ARITHMETIC EXPRESSION>; ENTRY: THE NUMBER OF DIFFERENTIAL EQUATIONS; 1SECTION : 5.2.1.1.1.2.E (MARCH 1977) PAGE 2 Y: <ARRAY IDENTIFIER>; "ARRAY" Y[1:R]; THE DEPENDENT VARIABLE; ENTRY: THE INITIAL VALUE OF Y; EXIT : THE SOLUTION Y AT THE POINT X AFTER EACH INTEGRATION STEP; H: <ARITHMETIC EXPRESSION>; ENTRY: THE STEPLENGTH WHEN THE INTEGRATION HAS TO BE PERFORMED WITHOUT THE STEPSIZE MECHANISM, OTHER- WISE THE INITIAL STEPLENGTH (SEE THE PARAMETERS HMIN AND HMAX); HMIN, HMAX: <ARITHMETIC EXPRESSION>; ENTRY: MINIMAL AND MAXIMAL STEPLENGTH BY WHICH THE INTE- GRATION IS ALLOWED TO BE PERFORMED; BY PUTTING HMIN = HMAX THE STEPSIZE MECHANISM IS ELIMINATED; IN THIS CASE THE GIVEN VALUES FOR HMIN AND HMAX ARE IRRELEVANT, WHILE THE INTEGRATION IS PERFORMED WITH THE STEPLENGTH GIVEN BY H; DELTA: <ARITHMETIC EXPRESSION>; ENTRY: THE REAL PART OF THE POINT AT WHICH EXPONENTIAL FITTING IS DESIRED; (SEE METHOD AND PERFORMANCE); ALTERNATIVES: DELTA = (AN ESTIMATE OF) THE REAL PART OF THE LARGEST EIGENVALUE IN MODULUS OF THE JACOBIAN MATRIX OF THE SYSTEM; DELTA <= -10**15, IN ORDER TO OBTAIN ASYMPTOTIC STABILITY; DELTA = 0, IN ORDER TO OBTAIN A HIGHER ORDER OF ACCURACY IN CASE OF LINEAR EQUATIONS; DERIVATIVE: <PROCEDURE IDENTIFIER>; "PROCEDURE" DERIVATIVE(Y); "ARRAY" Y; <REPLACEMENT OF THE I-TH COMPONENT OF THE SOLUTION Y BY THE I-TH COMPONENT OF THE DERIVATIVE F(Y), I = 1,..., R>; JACOBIAN: <PROCEDURE IDENTIFIER>; "PROCEDURE" JACOBIAN(J, Y); "ARRAY" J, Y; WHEN IN GMS JACOBIAN IS CALLED THE ARRAY Y CONTAINS THE VALUES OF THE DEPENDENT VARIABLE; UPON COMPLETION OF A CALL OF JACOBIAN THE ARRAY J SHOULD CONTAIN THE VALUES OF THE JACOBIAN MATRIX OF F(Y); AETA, RETA: <ARITHMETIC EXPRESSION>; ENTRY: MEASURE OF THE ABSOLUTE AND RELATIVE LOCAL ACCURACY REQUIRED; THESE VALUES ARE IRRELEVANT WHEN THE INTEGRATION IS PER- FORMED WITHOUT THE STEPSIZE MECHANISM; N: <VARIABLE>; EXIT : THE NUMBER OF INTEGRATION STEPS; JEV: <VARIABLE>; EXIT: THE NUMBER OF JACOBIAN EVALUATIONS; LU: <VARIABLE>; EXIT: THE NUMBER OF LU-DECOMPOSITIONS; 1SECTION : 5.2.1.1.1.2.E (OCTOBER 1974) PAGE 3 NSJEV: <VARIABLE>; ENTRY: NUMBER OF INTEGRATION STEPS PER JACOBIAN EVALUATION; THE VALUE OF NSJEV IS RELEVANT ONLY WHEN THE INTEGRATION IS PERFORMED WITHOUT THE STEPSIZE MECHANISM AND THE SYSTEM TO BE SOLVED IS NON-LINEAR; LINEAR: <BOOLEAN EXPRESSION>; ENTRY: TRUE WHEN THE SYSTEM TO BE INTEGRATED IS LINEAR, OTHERWISE FALSE; IF LINEAR IS TRUE THE STEPSIZE MECHANISM IS AUTOMATICALLY ELIMINATED; OUT: <PROCEDURE IDENTIFIER>; "PROCEDURE" OUT; <BY MEANS OF OUT ONE MAY PRINT THE VALUES OF THE RELEVANT PARAMETERS OCCURRING IN THE PARAMETERLIST; OUT IS CALLED AFTER EACH INTEGRATION STEP>; DATA AND RESULTS: SEE REF[2]. PROCEDURES USED: VECVEC = CP34010, MATVEC = CP34011, MATMAT = CP34013, ELMROW = CP34024, ELMVEC = CP34020, DUPVEC = CP31030, GSSELM = CP34231, SOLELM = CP34061, COLCST = CP31131, MULVEC = CP31020. REQUIRED CENTRAL MEMORY: EXECUTION FIELD LENGTH: 8 * R + 3 * R * R; RUNNING TIME: DEPENDS STRONGLY ON THE DIFFERENTIAL EQUATION TO BE SOLVED. LANGUAGE: ALGOL 60. 1SECTION : 5.2.1.1.1.2.E (MARCH 1977) PAGE 4 METHOD AND PERFORMANCE: THE PROCEDURE GMS DESCRIBES AN IMPLEMENTATION OF A THIRD ORDER THREE-STEP GENERALIZED LINEAR MULTISTEP METHOD WITH QUASI-ZERO PARASITIC ROOTS AND QUASI-ADAPTIVE STABILITY FUNCTION. IN PARTI- CULAR THE ALGORITHM IS DEVELOPED FOR THE INTEGRATION OF STIFF SYSTEMS OF ORDINARY DIFFERENTIAL EQUATIONS. THE PROCEDURE SUPPLIES THE ADDITIONAL STARTING VALUES AND PERFORMS A STEPSIZE CONTROL WHICH IS BASED ON THE NON-LINEARITY OF THE DIFFERENTIAL EQUATION. BY THIS CONTROL THE JACOBIAN MATRIX IS INCIDENTALLY EVALUATED. IT IS POSSIBLE TO ELIMINATE THE STEPSIZE CONTROL. THEN, ONE HAS TO GIVE THE NUMBER OF INTEGRATION STEPS PER JACOBIAN EVALUATION. FOR LINEAR EQUATIONS THE STEPSIZE CONTROL IS AUTOMATICALLY ELIMIN- ATED, WHILE THE PROCEDURE PERFORMS ONE EVALUATION OF THE JACOBIAN. MOREOVER, IN THIS CASE THE THREE-STEP SCHEME IS REDUCED TO A ONE- STEP SCHEME. THE PROCEDURE USES ONE FUNCTION EVALUATION PER INTE- GRATION STEP AND IT DOES NOT REJECT INTEGRATION STEPS. EACH CHANGE IN THE STEPLENGTH OR EACH REEVALUATION OF THE JACOBIAN COSTS ONE LU-DECOMPOSITION. IT IS POSSIBLE TO FIT EXPONENTIALLY, THIS FIT- TING IS EQUIVALENT TO FITTING IN THE SENSE OF LINIGER AND WILLOUGHBY, ONLY WHEN THE JACOBIAN MATRIX IS EVALUATED AT EACH IN- TEGRATION STEP. WHEN THE SYSTEM TO BE INTEGRATED IS NON-LINEAR AND THE JACOBIAN MATRIX IS NOT EVALUATED AT EACH INTEGRATION STEP, IT IS RECOMMENDED TO FIT AT INFINITY (DELTA <= -10**15). DETAILS ARE GIVEN IN REFERENCE 2. REFERENCES: [1] HOUWEN, P. J. VAN DER AND VERWER, J. G., GENERALIZED LINEAR MULTISTEP METHODS 1, DEVELOPMENT OF ALGO- RITHMS WITH ZERO-PARASITIC ROOTS, REPORT NW 10/74, MATHEMATISCH CENTRUM, AMSTERDAM 1974. [2] VERWER, J. G., GENERALIZED LINEAR MULTISTEP METHODS 2, NUMERICAL APPLICATIONS, REPORT NW 12/74, MATHEMATISCH CENTRUM, AMSTERDAM, 1974. EXAMPLE OF USE: WE CONSIDER THE DIFFERENTIAL EQUATION DY1/DX = -1000 * Y1 * (Y1 + Y2 -1.999987), DY2/DX = -2500 * Y2 * (Y1 + Y2 - 2), ON THE INTERVAL [0,50], WITH INITIAL VALUE Y1(0) = Y2(0) = 1. THE REFERENCE SOLUTION AT X = 50 IS GIVEN BY: Y1(50) = .5976546988, Y2(50) = 1.4023434075. 1SECTION : 5.2.1.1.1.2.E (MARCH 1977) PAGE 5 "BEGIN" "PROCEDURE" DER(Y); "ARRAY" Y; "BEGIN" "REAL" Y1, Y2; Y1:= Y[1]; Y2:= Y[2]; Y[1]:= -1000 * Y1 * (Y1 + Y2 - 1.999987); Y[2]:= -2500 * Y2 * (Y1 + Y2 - 2) "END" DER; "PROCEDURE" JAC(J, Y); "ARRAY" J, Y; "BEGIN" "REAL" Y1, Y2; Y1:= Y[1]; Y2:= Y[2]; J[1,1]:= 1999.987 - 1000 * (2 * Y1 + Y2); J[1,2]:= -1000 * Y1; J[2,1]:= -2500 * Y2; J[2,2]:= 2500 * (2 - Y1 - 2 * Y2) "END" JAC; "PROCEDURE" OUTP; "IF" X = 50 "THEN" "BEGIN" "REAL" YE1, YE2; YE1:= .5976546988; YE2:= 1.4023434075; OUTPUT(61, "(" "("X = ")", 2D2B, "("N = ")", 3ZD2B, "("JEV = ")", 3ZD2B, "("LU = ")", 3ZD, 2/, "("Y1 = ")", +.13D"+2D2B, "("REL. ERR. = ")", .2D"+2D, /, "("Y2 = ")", +.13D"+2D2B, "("REL. ERR. = ")", .2D"+2D")", X, N, JEV, LU, Y[1], ABS((Y[1] - YE1) / YE1), Y[2], ABS((Y[2] - YE2) / YE2)) "END" OUTP; "INTEGER" N, JEV, LU; "REAL" X; "ARRAY" Y[1:2]; "PROCEDURE" GMS(X, XE, R, Y, H, HMIN, HMAX, DELTA, DERIVATIVE, JACOBIAN, AETA, RETA, N, JEV, LU, NSJEV, LINEAR, OUT); "CODE" 33191; GMS(X, 50, 2, Y, .01, .001, .5, -"15, DER, JAC, "-5, "-5, N, JEV, LU, 0, "FALSE", OUTP) "END" THIS PROGRAM DELIVERS: X = 50 N = 109 JEV = 3 LU = 12 Y1 = +.5976547958004"+00 REL. ERR. = .16"-06 Y2 = +.1402343310813"+01 REL. ERR. = .69"-07 1SECTION : 5.2.1.1.1.2.E (MARCH 1977) PAGE 6 SOURCE TEXT: "CODE" 33191; "PROCEDURE" GMS(X, XE, R, Y, H, HMIN, HMAX, DELTA, DERIVATIVE, JACOBIAN, AETA, RETA, N, JEV, LU, NSJEV, LINEAR, OUT); "VALUE" R; "REAL" X, XE, H, HMIN, HMAX, DELTA, AETA, RETA; "INTEGER" R, N, JEV, NSJEV, LU; "BOOLEAN" LINEAR; "ARRAY" Y; "PROCEDURE" DERIVATIVE, JACOBIAN, OUT; "BEGIN" "INTEGER" I, J, K, L, NSJEV1, COUNT, COUNT1, KCHANGE; "REAL" A, A1, ALFA, E, S1, S2, Z1, X0, XL0, XL1, XL2, ETA, H0, H1, Q, Q1, Q2, Q12, Q22, Q1Q2, DISCR; "BOOLEAN" UPDATE, CHANGE, REEVAL, STRATEGY; "INTEGER" "ARRAY" RI, CI[1:R]; "ARRAY" AUX[1:9], BD1, BD2[1:3,1:3], Y1, Y0[1:R], HJAC, H2JAC2, RQZ[1:R,1:R], YL, FL[1:3 * R]; "REAL" "PROCEDURE" VECVEC(L, U, SHIFT, A, B); "CODE" 34010; "REAL" "PROCEDURE" MATVEC(L, U, I, A, B); "CODE" 34011; "REAL" "PROCEDURE" MATMAT(L, U, I, J, A, B); "CODE" 34013; "PROCEDURE" ELMROW(L, U, I, J, A, B, X); "CODE" 34024; "PROCEDURE" ELMVEC(L, U, SHIFT, A, B, X); "CODE" 34020; "PROCEDURE" DUPVEC(L, U, SHIFT, A, B); "CODE" 31030; "PROCEDURE" GSSELM(A, N, AUX, RI, CI); "CODE" 34231; "PROCEDURE" SOLELM(A, N, RI, CI, B); "CODE" 34061; "PROCEDURE" COLCST(L, U, J, A, X); "CODE" 31131; "PROCEDURE" MULVEC(L, U, SHIFT, A, B, X); "CODE" 31020; "PROCEDURE" INITIALIZATION; "BEGIN" LU:= JEV:= N:= NSJEV1:= KCHANGE:= 0; X0:= X; DISCR:= 0; K:=1; H1:= H0:= H; COUNT:= -2; AUX[2]:= "-14; AUX[4]:= 8; DUPVEC(1, R, 0, YL, Y); REEVAL:= CHANGE:= "TRUE"; STRATEGY:= HMIN ^= HMAX "AND" ^LINEAR; Q1:= -1; Q2:= -2; COUNT1:= 0; XL0:= XL1:= XL2:= 0 "END" INITIALIZATION; "COMMENT" 1SECTION : 5.2.1.1.1.2.E (OCTOBER 1974) PAGE 7 ; "PROCEDURE" COEFFICIENT; "BEGIN" XL2:= XL1; XL1:= XL0; XL0:= X0; "IF" CHANGE "THEN" "BEGIN" "IF" N > 2 "THEN" "BEGIN" Q1:= (XL1 - XL0) / H1; Q2:= (XL2 - XL0) / H1 "END"; Q12:= Q1 * Q1; Q22:= Q2 * Q2; Q1Q2:= Q1 * Q2; A:= -(3 * ALFA + 1) / 12; BD1[1,3]:= 1 + (1 / 3 - (Q1 + Q2) * .5) / Q1Q2; BD1[2,3]:= (1 / 3 - Q2 * .5) / (Q12 - Q1Q2); BD1[3,3]:= (1 / 3 - Q1 * .5) / (Q22 - Q1Q2); BD2[1,3]:= -ALFA * .5 + A * (1 - Q1 - Q2) / Q1Q2; BD2[2,3]:= A * (1 - Q2) / (Q12 - Q1Q2); BD2[3,3]:= A * (1 - Q1) / (Q22 - Q1Q2); "IF" STRATEGY "OR" N <= 2 "THEN" "BEGIN" BD1[2,2]:= 1 / (2 * Q1); BD1[1,2]:= 1 - BD1[2,2]; BD2[2,2]:= -(3 * ALFA + 1) / (12 * Q1); BD2[1,2]:= -BD2[2,2] - ALFA * .5 "END" "END" "END" COEFFICIENT; "PROCEDURE" OPERATOR CONSTRUCTION; "BEGIN" "IF" REEVAL "THEN" "BEGIN" JACOBIAN(HJAC, Y); JEV:= JEV + 1; NSJEV1:= 0; "IF" DELTA <= -"15 "THEN" ALFA:= 1 / 3 "ELSE" "BEGIN" Z1:= H1 * DELTA; A:= Z1 * Z1 + 12; A1:= 6 * Z1; "IF" ABS(Z1) < .1 "THEN" ALFA:= (Z1 * Z1 / 140 - 1) * Z1 / 30 "ELSE" "IF" Z1 < -33 "THEN" ALFA:= (A + A1) / (3 * Z1 * (2 + Z1)) "ELSE" "BEGIN" E:= EXP(Z1); ALFA:= ((A - A1) * E - A - A1) / (((2 - Z1) * E - 2 - Z1) * Z1 * 3) "END" "END"; S1:= -(1 + ALFA) * .5; S2:= (ALFA * 3 + 1) / 12 "END"; "COMMENT" 1SECTION : 5.2.1.1.1.2.E (OCTOBER 1974) PAGE 8 ; A:= H1 / H0; A1:= A * A; "IF" REEVAL "THEN" A:= H1; "IF" A ^= 1 "THEN" "FOR" J:= 1 "STEP" 1 "UNTIL" R "DO" COLCST(1, R, J, HJAC, A); "FOR" I:= 1 "STEP" 1 "UNTIL" R "DO" "BEGIN" "FOR" J:= 1 "STEP" 1 "UNTIL" R "DO" "BEGIN" Q:= H2JAC2[I,J]:= "IF" REEVAL "THEN" MATMAT(1, R, I, J, HJAC, HJAC) "ELSE" H2JAC2[I,J] * A1; RQZ[I,J]:= S2 * Q "END"; RQZ[I,I]:= RQZ[I,I] + 1; ELMROW(1, R, I, I, RQZ, HJAC, S1) "END"; GSSELM(RQZ, R, AUX, RI, CI); LU:= LU + 1; REEVAL:= UPDATE:= "FALSE" "END" OPERATOR CONSTRUCTION; "PROCEDURE" DIFFERENCE SCHEME; "BEGIN" "IF" COUNT ^= 1 "THEN" "BEGIN" DUPVEC(1, R, 0, FL, YL); DERIVATIVE(FL); N:= N + 1; NSJEV1:= NSJEV1 + 1 "END"; MULVEC(1, R, 0, Y0, YL, (1 - ALFA) / 2 - BD1[1,K]); "FOR" L:= 2 "STEP" 1 "UNTIL" K "DO" ELMVEC(1, R, R * (L - 1), Y0, YL, -BD1[L,K]); "FOR" L:= 1 "STEP" 1 "UNTIL" K "DO" ELMVEC(1, R, R * (L - 1), Y0, FL, H1 * BD2[L,K]); "FOR" I:= 1 "STEP" 1 "UNTIL" R "DO" Y[I]:= MATVEC(1, R, I, HJAC, Y0); MULVEC(1, R, 0, Y0, YL, (1 - 3 * ALFA) / 12 - BD2[1,K]); "FOR" L:= 2 "STEP" 1 "UNTIL" K "DO" ELMVEC(1, R, R * (L - 1), Y0, YL, -BD2[L,K]); "FOR" I:= 1 "STEP" 1 "UNTIL" R "DO" Y[I]:= Y[I] + MATVEC(1, R, I, H2JAC2, Y0); DUPVEC(1, R, 0, Y0, YL); "FOR" L:= 1 "STEP" 1 "UNTIL" K "DO" ELMVEC(1, R, R * (L - 1), Y0, FL, H1 * BD1[L,K]); ELMVEC(1, R, 0, Y, Y0, 1); SOLELM(RQZ, R, RI, CI, Y) "END" DIFFERENCE SCHEME; "PROCEDURE" NEXT INTEGRATION STEP; "BEGIN" "FOR" L:= 2, 1 "DO" "BEGIN" DUPVEC(L * R + 1, (L + 1) * R, -R, YL, YL); DUPVEC(L * R + 1, (L + 1) * R, -R, FL, FL) "END"; DUPVEC(1, R, 0, YL, Y) "END" NEXT INTEGRATION STEP; "COMMENT" 1SECTION : 5.2.1.1.1.2.E (OCTOBER 1974) PAGE 9 ; "PROCEDURE" TEST ACCURACY; "BEGIN" K:= 2; DUPVEC(1, R, 0, Y1, Y); DIFFERENCE SCHEME; K:= 3; ETA:= AETA + RETA * SQRT(VECVEC(1, R, 0, Y1, Y1)); ELMVEC(1, R, 0, Y, Y1, -1); DISCR:= SQRT(VECVEC(1, R, 0, Y, Y)); DUPVEC(1, R, 0, Y, Y1) "END" TEST ACCURACY; "PROCEDURE" STEPSIZE; "BEGIN" X0:= X; H0:= H1; "IF" N <= 2 "AND" ^LINEAR "THEN" K:= K + 1; "IF" COUNT = 1 "THEN" "BEGIN" A:= ETA / (.75 * (ETA + DISCR)) + .33; H1:= "IF" A <= .9 "OR" A >= 1.1 "THEN" A * H0 "ELSE" H0; COUNT:= 0; REEVAL:= A <= .9 "AND" NSJEV1 ^= 1; COUNT1:= "IF" A >= 1 "OR" REEVAL "THEN" 0 "ELSE" COUNT1 + 1; "IF" COUNT1 = 10 "THEN" "BEGIN" COUNT1:= 0; REEVAL:= "TRUE"; H1:= A * H0 "END" "END" "ELSE" "BEGIN" H1:= H; REEVAL:= NSJEV = NSJEV1 "AND" ^STRATEGY "AND" ^LINEAR "END"; "IF" STRATEGY "THEN" H1:= "IF" H1 > HMAX "THEN" HMAX "ELSE" "IF" H1 < HMIN "THEN" HMIN "ELSE" H1; X:= X + H1; "IF" X >= XE "THEN" "BEGIN" H1:= XE - X0; X:= XE "END"; "IF" N <= 2 "AND" ^LINEAR "THEN" REEVAL:= "TRUE"; "IF" H1 ^= H0 "THEN" "BEGIN" UPDATE:= "TRUE"; KCHANGE:= 3 "END"; "IF" REEVAL "THEN" UPDATE:= "TRUE"; CHANGE:= KCHANGE > 0 "AND" ^LINEAR; KCHANGE:= KCHANGE - 1 "END" STEPSIZE; INITIALIZATION; OUT; X:= X + H1; OPERATOR CONSTRUCTION; BD1[1,1]:= 1; BD2[1,1]:= -ALFA * .5; "IF" ^LINEAR "THEN" COEFFICIENT; NEXT STEP: DIFFERENCE SCHEME; "IF" STRATEGY "THEN" COUNT:= COUNT + 1; "IF" COUNT = 1 "THEN" TEST ACCURACY; OUT; "IF" X >= XE "THEN" "GOTO" END; STEPSIZE; "IF" UPDATE "THEN" OPERATOR CONSTRUCTION; "IF" ^LINEAR "THEN" COEFFICIENT; NEXT INTEGRATION STEP; "GOTO" NEXT STEP; END: "END" GMS; "EOP" 1SECTION : 5.1.1.1.2 � (OCTOBER 1975) PAGE 1 AUTHOR: T.J. DEKKER. CONTRIBUTORS: T.J. DEKKER AND T.H.P. REYMER. INSTITUTE: UNIVERSITY OF AMSTERDAM. RECEIVED: 750615. BRIEF DESCRIPTION: THIS SECTION CONTAINS ONE PROCEDURE FOR FINDING A ZERO OF A GIVEN DIFFERENTIABLE FUNCTION IN A GIVEN INTERVAL; ZEROINDER APPROXIMATES A ZERO MAINLY BY MEANS OF CONFLUENT 3-POINT RATIONAL INTERPOLATION USING NOT ONLY VALUES OF THE GIVEN FUNCTION BUT ALSO OF ITS DERIVATIVE. ZEROINDER IS TO PREFER TO ZEROIN OR ZEROINRAT (SECTION 5.1.1.1.1), IF THE DERIVATIVE IS (MUCH) CHEAPER TO EVALUATE THAN THE FUNCTION. KEYWORDS: ZERO SEARCHING, ANALYTIC EQUATIONS, SINGLE NONLINEAR EQUATION, DERIVATIVE AVAILABLE. CALLING SEQUENCE: THE HEADING OF THIS PROCEDURE READS: "BOOLEAN" "PROCEDURE" ZEROINDER(X, Y, FX, DFX, TOLX); "REAL" X, Y, FX, DFX, TOLX; ZEROINDER SEARCHES FOR A ZERO OF A DIFFERENTIABLE REAL FUNCTION F DEFINED ON A CERTAIN INTERVAL J; ZEROINDER := "TRUE" WHEN A (SUFFICIENTLY SMALL) SUBINTERVAL OF J CONTAINING A ZERO OF F HAS BEEN FOUND; OTHERWISE, ZEROINDER := "FALSE"; LET DF AND T DENOTE REAL FUNCTIONS DEFINED ON J, WHERE DF IS THE DERIVATIVE OF F AND T A TOLERANCE FUNCTION DEFINING THE REQUIRED PRECISION OF THE ZERO; ( FOR INSTANCE T(X) = ABS(X) * RE + AE, WHERE RE AND AE ARE THE REQUIRED RELATIVE AND ABSOLUTE PRECISION RESPECTIVELY); 1SECTION : 5.1.1.1.2 � (OCTOBER 1975) PAGE 2 THE MEANING OF THE FORMAL PARAMETERS IS: X: <REAL VARIABLE>; A JENSEN VARIABLE; THE ACTUAL PARAMETERS FOR FX, DFX AND TOLX (MAY) DEPEND ON THE ACTUAL PARAMETER FOR X; ENTRY: ONE ENDPOINT OF INTERVAL J IN WHICH A ZERO IS SEARCHED FOR; EXIT: A VALUE APPROXIMATING THE ZERO WITHIN THE TOLERANCE 2 * T(X) WHEN ZEROINDER HAS THE VALUE "TRUE", AND A PRESUMABLY WORTHLESS ARGUMENT VALUE OTHERWISE; Y: <REAL VARIABLE>; ENTRY: THE OTHER ENDPOINT OF INTERVAL J IN WHICH A ZERO IS SEARCHED FOR; UPON ENTRY X < Y AS WELL AS Y < X IS ALLOWED; EXIT: THE OTHER STRADDLING APPROXIMATION OF THE ZERO, I.E. UPON EXIT THE VALUES OF Y AND X SATISFY 1. F(X) * F(Y) <= 0, 2. ABS(X - Y) <= 2 * T(X) AND 3. ABS(F(X)) <= ABS(F(Y)) WHEN ZEROINDER HAS THE VALUE "TRUE", AND A PRESUMABLY WORTHLESS ARGUMENT VALUE SATISFYING CONDITIONS 2 AND 3 BUT NOT 1 OTHERWISE; FX: <ARITHMETIC EXPRESSION>; DEFINES FUNCTION F AS A FUNCTION DEPENDING ON THE ACTUAL PARAMETER FOR X; DFX: <ARITHMETIC EXPRESSION>; DEFINES THE DERIVATIVE DF OF F AS A FUNCTION DEPENDING ON THE ACTUAL PARAMETER FOR X; TOLX: <ARITHMETIC EXPRESSION>; DEFINES THE TOLERANCE FUNCTION T WHICH MAY DEPEND ON THE ACTUAL PARAMETER FOR X; ONE SHOULD CHOOSE TOLX POSITIVE AND NEVER SMALLER THAN THE PRECISION OF THE MACHINE'S ARITHMETIC AT X, I.E. IN THIS ARITHMETIC X + TOLX AND X - TOLX SHOULD ALWAYS YIELD VALUES DISTINCT FROM X; OTHERWISE THE PROCEDURE MAY GET INTO A LOOP. PROCEDURES USED: DWARF = CP30003; REQUIRED CENTRAL MEMORY: NO AUXILIARY ARRAYS ARE DECLARED IN ZEROINDER. RUNNING TIME: SEE METHOD AND PERFORMANCE. LANGUAGE: ALGOL 60. 1SECTION : 5.1.1.1.2 � (OCTOBER 1975) PAGE 3 METHOD AND PERFORMANCE: THE METHOD USED IS CONFLUENT 3-POINT RATIONAL INTERPOLATION, I.E. THE INTERPOLATION FUNCTION OF THE FORM (X - A) / (BX + C) IS FITTED EXACTLY AT 3 POINTS 2 OF WHICH ARE COINCIDING; MOREOVER, IN ORDER TO IMPROVE THE GLOBAL BEHAVIOUR OF THE PROCESS, LINEAR INTERPOLATION ON THE FUNCTION F / DF OR BISECTION ARE INCLUDED IN SOME STEPS; THE PERFORMANCE IS AS FOLLOWS: THE NUMBER OF EVALUATIONS OF FX, DFX AND TOLX IS AT MOST 4 LOG(ABS(X - Y)) / TAU, WHERE X AND Y ARE THE ARGUMENT VALUES GIVEN UPON ENTRY, LOG DENOTES THE BASE 2 LOGARITHM, AND TAU IS THE MINIMUM OF THE TOLERANCE FUNCTION ON J (I.E. ZEROINDER REQUIRES AT MOST 4 TIMES THE NUMBER OF STEPS REQUIRED FOR BISECTION); IF UPON ENTRY X AND Y SATISFY F(X) * F(Y) <= 0, THEN CONVERGENCE TO A ZERO IS GUARANTEED, SO THAT UPON EXIT X AND Y SATISFY CONDITION 1 TO 3 MENTIONED ABOVE (SEE PARAMETER Y) AND ZEROINDER HAS THE VALUE "TRUE"; FOR A SIMPLE ZERO OF F, THE ASYMPTOTIC ORDER OF CONVERGENCE APPROXIMATELY EQUALS 2.414. EXAMPLE OF USE: THE ZERO OF THE FUNCTION EXP(-X * 3) * (X - 1) + X ** 3, IN THE INTERVAL [0, 1], MAY BE CALCULATED BY THE FOLLOWING PROGRAM: "BEGIN" "REAL" X, Y; "BOOLEAN" "PROCEDURE" ZEROINDER(X,Y,FX,DFX,TOLX); "CODE" 34453; "REAL" "PROCEDURE" F(X); "VALUE" X; "REAL" X; F:= EXP(-X * 3) * ( X - 1) + X ** 3; "REAL" "PROCEDURE" DF(X); "VALUE" X; "REAL" X; DF:= EXP(-X * 3) * (-3 * X + 4) + 3 * X ** 2; X:= 0; Y:= 1; "IF" ZEROINDER(X, Y, F(X), DF(X), ABS(X) * "-14 + "-14) "THEN" OUTPUT(71, "("/4B,"("CALCULATED ZERO AND FUNCTION VALUE:")", /8B, 2(B+.15D"+3D4B), /4B, "("OTHER STRADDLING APPROXIMATION AND FUNCTION VALUE:")", /8B, 2(B+.15D"+3D4B)")", X, F(X), Y, F(Y)) "ELSE" OUTPUT(71, "("/4B, "("NO ZERO FOUND")"")") "END" RESULT: CALCULATED ZERO AND FUNCTION VALUE: +.489702748548240"+000 -.444089209850060"-015 OTHER STRADDLING APPROXIMATION AND FUNCTION VALUE: +.489702748548250"+000 +.177635683940030"-013 1SECTION : 5.1.1.1.2 � (OCTOBER 1975) PAGE 4 REFERENCES: [1]: BUS, J.C.P. AND DEKKER, T.J., TWO EFFICIENT ALGORITHMS WITH GUARANTEED CONVERGENCE FOR FINDING A ZERO OF A FUNCTION. MATHEMATICAL CENTRE, REPORT NW 13/74, AMSTERDAM (1974), (ALSO TO APPEAR IN TOMS 1975). [2]: OSTROWSKI, A.M., SOLUTION OF EQUATIONS AND SYSTEMS OF EQUATIONS. ACADEMIC PRESS 1966. CHAPTERS 3 AND 11. SOURCE TEXT(S): 0"CODE" 34453; "BOOLEAN" "PROCEDURE" ZEROINDER(X, Y, FX, DFX, TOLX); "REAL" X, Y, FX, DFX, TOLX; "BEGIN" "INTEGER" EXT; "REAL" B, FB, DFB, A, FA, DFA, C, FC, DFC, D, W, MB, TOL, M, P, Q, DW; "REAL" "PROCEDURE" DWARF; "CODE" 30003; DW:= DWARF; B:= X; FB:= FX; DFB:= DFX; A:= X:= Y; FA:= FX; DFA:= DFX; INTERPOLATE: C:= A; FC:= FA; DFC:= DFA; EXT:= 0; EXTRAPOLATE: "IF" ABS(FC) < ABS(FB) "THEN" "BEGIN" A:= B; FA:= FB; DFA:= DFB; B:= X:= C; FB:= FC; DFB:= DFC; C:= A; FC:= FA; DFC:= DFA "END" INTERCHANGE; TOL:= TOLX; M:= (C + B) * 0.5; MB:= M - B; "IF" ABS(MB) > TOL "THEN" "BEGIN" "IF" EXT > 2 "THEN" W:= MB "ELSE" "BEGIN" TOL:= TOL * SIGN(MB); D:= "IF" EXT = 2 "THEN" DFA "ELSE" (FB - FA) / (B - A); P:= FB * D * (B - A); Q:= FA * DFB - FB * D; "IF" P < 0 "THEN" "BEGIN" P:= -P; Q:= -Q "END"; W:= "IF" P < DW "OR" P <= Q * TOL "THEN" TOL "ELSE" "IF" P < MB * Q "THEN" P / Q "ELSE" MB; "END"; A:= B; FA:= FB; DFA:= DFB; X:= B:= B + W; FB:= FX; DFB:= DFX; "IF" ("IF" FC >= 0 "THEN" FB >= 0 "ELSE" FB <= 0) "THEN" "GOTO" INTERPOLATE "ELSE" "BEGIN" EXT:= "IF" W = MB "THEN" 0 "ELSE" EXT + 1; "GOTO" EXTRAPOLATE "END" "END"; Y:= C; ZEROINDER:= "IF" FC >= 0 "THEN" FB <= 0 "ELSE" FB >= 0 "END" ZEROINDER; "EOP" 1SECTION : 5.1.2.1.1 ( DECEMBER 1978 ) PAGE 1 AUTHOR : J. C. P. BUS INSTITUTE : MATHEMATICAL CENTRE. RECEIVED : 741101. BRIEF DESCRIPTION : THIS SECTION CONTAINS THE PROCEDURE MININ, FOR MINIMIZING A FUNCTION OF ONE VARIABLE IN A GIVEN INTERVAL; KEYWORDS : MINIMIZATION, FUNCTIONS OF ONE VARIABLE. CALLING SEQUENCE : THE HEADING OF THIS PROCEDURE IS : "REAL" "PROCEDURE" MININ(X, A, B, FX, TOLX); "REAL" X, A, B, FX, TOLX; "CODE" 34433; MININ DELIVERS THE CALCULATED MINIMUM VALUE OF THE FUNCTION, DEFINED BY FX, ON THE INTERVAL WITH ENDPOINTS A AND B. THE MEANING OF THE FORMAL PARAMETERS IS : X : <REAL VARIABLE>; A JENSEN VARIABLE; THE ACTUAL PARAMETERS FOR FX AND TOLX DEPEND ON X; EXIT : THE CALCULATED APPROXIMATION OF THE POSITION OF THE MINIMUM; A, B : <REAL VARIABLE>; ENTRY : THE ENDPOINTS OF THE INTERVAL ON WHICH A MINIMUM IS SEARCHED FOR; EXIT : THE ENDPOINTS OF THE INTERVAL WITH LENGTH LESS THAN 4 * TOL(X) SUCH THAT A < X < B; FX : <ARITHMATIC EXPRESSION>; THE FUNCTION ISGIVEN BY THE ACTUAL PARAMETER FX, WHICH DEPENDS ON X; TOLX : <ARITHMETIC EXPRESSION>; THE TOLERANCE IS GIVEN BY THE ACTUAL PARAMETER TOLX, WHICH MAY DEPEND ON X; A SUITABLE TOLERANCE FUNCTION IS : ABS(X)*RE + AE, WHERE RE IS THE RELATIVE PRECISION DESIRED AND AE IS AN ABSOLUTE PRECISION WHICH SHOULD NOT BE CHOSEN EQUAL TO ZERO. 1SECTION : 5.1.2.1.1 ( DECEMBER 1978 ) PAGE 2 DATA AND RESULTS : THE USER SHOULD BE AWARE OF THE FACT THAT THE CHOICE OF TOLX MAY HIGHLY AFFECT THE BEHAVIOUR OF THE ALGORITHM, ALTHOUGH CONVERGENCE TO A POINT FOR WHICH THE GIVEN FUNCTION IS MINIMAL ON THE INTERVAL IS ASSURED; THE ASYMPTOTIC BEHAVIOUR WILL USUALLY BE FINE AS LONG AS THE NUMERICAL FUNCTION IS STRICTLY DELTA-UNIMODAL ON THE GIVEN INTERVAL (SEE [1]) AND THE TOLERANCE FUNCTION SATISFIES TOL(X)>=DELTA, FOR ALL X IN THE GIVEN INTERVAL. PROCEDURES USED : NONE. REQUIRED CENTRAL MEMORY : NO AUXILIARY ARRAYS ARE DECLARED IN MININ. METHOD AND PERFORMANCE : MININ IS A SLIGHTLY MODIFIED VERSION OF THE ALGORITHM GIVEN IN [1]. EXAMPLE OF USE: THE FOLLOWING PROGRAM MAY BE USED TO CALCULATE THE MINIMUM OF THE FUNCTION F(X) = SUM(((I * 2 - 5)/(X - I ** 2)) ** 2; I = 1 (1) 20) ON THE INTERVAL [1 + TOL, 4 - TOL] (SEE [1]). "BEGIN" "REAL" "PROCEDURE" MININ(X, A, B, FX, TOLX); "CODE" 34433; "REAL" M, X, A, B; "INTEGER" CNT; "REAL" "PROCEDURE" F(X); "VALUE" X; "REAL" X; "BEGIN" "INTEGER" I; "REAL" S; S:= 0; "FOR" I:= 1 "STEP" 1 "UNTIL" 20 "DO" S:= S + ((I * 2 - 5) / (X - I ** 2)) ** 2; CNT:= CNT + 1; F:= S "END" F; "REAL" "PROCEDURE" TOL(X); "VALUE" X; "REAL" X; TOL:= ABS(X) * "-7 + "-7; A:= 1 + TOL(1); B:= 4 - TOL(4); CNT:= 0; M:= MININ(X, A, B, F(X), TOL(X)); OUTPUT(61, "("4B,"("MINIMUM IS ")",N,/4B, "("FOR X IS ")",N,/4B, "("IN THE INTERVAL WITH ENDPOINTS ")",/8B,2(N),/4B, "("THE NUMBER OF FUNCTION EVALUATIONS NEEDED IS ")",2ZD,/")", M, X, A, B, CNT) "END" 1SECTION : 5.1.2.1.1 ( DECEMBER 1978 ) PAGE 3 RESULTS : MINIMUM IS +3.6766990169019"+000 FOR X IS +3.0229153387991"+000 IN THE INTERVAL WITH ENDPOINTS +3.0229149365075"+000 +3.0229157410906"+000 THE NUMBER OF FUNCTION EVALUATIONS NEEDED IS 13 SOURCE TEXT: "CODE" 34433; "REAL" "PROCEDURE" MININ(X, A, B, FX, TOLX); "REAL" X, A, B, FX, TOLX; "BEGIN" "COMMENT" SEE BRENT, 1973, P79; "REAL" Z, C, D, E, M, P, Q, R, TOL, T, U, V, W, FU, FV, FW, FZ; C:= (3 - SQRT(5)) / 2; "IF" A > B "THEN" "BEGIN" Z:= A; A:= B; B:= Z "END"; W:= X:= A; FW:= FX; Z:= X:= B; FZ:= FX; "IF" FZ > FW "THEN" "BEGIN" Z:= W; W:= X; V:= FZ; FZ:= FW; FW:= V "END"; V:= W; FV:= FW; E:= 0; LOOP: M:= (A + B) * 0.5; TOL:= TOLX; T:= TOL * 2; "IF" ABS(Z - M) > T - (B - A) * 0.5 "THEN" "BEGIN" P:= Q:= R:= 0; "IF" ABS(E) > TOL "THEN" "BEGIN" R:= (Z - W) * (FZ - FV); Q:= (Z - V) * (FZ - FW); P:= (Z - V) * Q - (Z - W) * R; Q:= (Q - R) * 2; "IF" Q>0 "THEN" P:= -P "ELSE" Q:= -Q; R:= E; E:= D "END"; "IF" ABS(P) < ABS(Q * R * 0.5) "AND" P > (A - Z) * Q "AND" P < (B - Z) * Q "THEN" "BEGIN" D:= P / Q; U:= Z + D; "IF" U - A < T "OR" B - U < T "THEN" D:= "IF" Z < M "THEN" TOL "ELSE" -TOL "END" "ELSE" "BEGIN" E:= ("IF" Z < M "THEN" B "ELSE" A) - Z; D:= C * E "END"; U:= X:= Z + ("IF" ABS(D) >= TOL "THEN" D "ELSE" "IF" D > 0 "THEN" TOL "ELSE" -TOL); FU:= FX; "IF" FU <= FZ "THEN" "BEGIN" "IF" U < Z "THEN" B:= Z "ELSE" A:= Z; V:= W; FV:= FW; W:= Z; FW:= FZ; Z:= U; FZ:= FU "END" "ELSE" "BEGIN" "IF" U < Z "THEN" A:= U "ELSE" B:= U; "IF" FU <= FW "THEN" "BEGIN" V:= W; FV:= FW; W:= U; FW:= FU "END" "ELSE" "IF" FU <= FV "OR" V = W "THEN" "BEGIN" V:= U; FV:= FU "END" "END"; "GOTO" LOOP "END"; X:= Z; MININ:= FZ "END" MININ; 1SECTION : 5.1.2.1.2 � (OCTOBER 1975) PAGE 1 AUTHOR: J. C. P. BUS. INSTITUTE: MATHEMATICAL CENTRE. RECEIVED: 741101. BRIEF DESCRIPTION:� THIS SECTION CONTAINS THE PROCEDURE MININDER, FOR MINIMIZING A FUNCTION OF ONE VARIABLE IN A GIVEN INTERVAL, WHEN THE ANALYTICAL DERIVATIVE OF THE FUNCTION IS AVAILABLE. KEYWORDS : MINIMIZATION, FUNCTIONS OF ONE VARIABLE. CALLING SEQUENCE: THE HEADING OF THIS PROCEDURE IS: "REAL" "PROCEDURE" MININDER(X, Y, FX, DFX, TOLX); "REAL" X, Y, FX, DFX, TOLX; MININDER DELIVERS THE CALCULATED MINIMUM VALUE OF THE FUNCTION, DEFINED BY FX, ON THE INTERVAL WITH END POINTS A AND B. THE MEANING OF THE FORMAL PARAMETERS IS: X: <REAL VARIABLE>;� A JENSEN VARIABLE; THE ACTUAL PARAMETERS FOR FX, DFX AND� TOLX DEPEND ON X; ENTRY: ONE OF THE END POINTS OF THE INTERVAL ON WHICH THE FUNCTION HAS TO BE MINIMIZED; EXIT: THE CALCULATED APPROXIMATION OF THE POSITION OF THE MINIMUM;� Y: <REAL VARIABLE>;� ENTRY: THE OTHER END POINT OF THE INTERVAL ON WHICH THE� FUNCTION HAS TO BE MINIMIZED; EXIT: A VALUE SUCH THAT ABS(X - Y) <= TOL(X) * 3; FX: <ARITHMETIC EXPRESSION>; THE FUNCTION IS GIVEN BY THE ACTUAL PARAMETER FX WHICH DEPENDS ON X; DFX: <ARITHMETIC EXPRESSION>; THE DERIVATIVE OF THE FUNCTION IS GIVEN BY THE ACTUAL PARAMETER DFX WHICH DEPENDS ON X; FX AND DFX ARE EVALUATED SUCCESSIVELY FOR A CERTAIN VALUE OF X; TOLX: <ARITHMETIC EXPRESSION>; THE TOLERANCE IS GIVEN BY THE ACTUAL PARAMETER TOLX, WHICH MAY DEPEND ON X; A SUITABLE TOLERANCE FUNCTION IS: ABS(X) * RE + AE, WHERE RE IS THE RELATIVE PRECISION DESIRED AND AE IS AN ABSOLUTE PRECISION WHICH SHOULD NOT BE CHOSEN EQUAL TO ZERO. 1SECTION : 5.1.2.1.2 � (OCTOBER 1975) PAGE 2 DATA AND RESULTS: THE USER SHOULD BE AWARE OF THE FACT THAT THE CHOICE OF TOLX MAY HIGHLY AFFECT THE BEHAVIOUR OF THE ALGORITHM, ALTHOUGH CONVERGENCE TO A POINT FOR WHICH THE GIVEN FUNCTION IS MINIMAL ON THE GIVEN INTERVAL IS ASSURED; THE ASYMPTOTIC BEHAVIOUR WILL USUALLY BE FINE AS LONG AS THE NUMERICAL FUNCTION IS STRICTLY DELTA-UNIMODAL ON THE GIVEN INTERVAL (SEE [1]) AND THE TOLERANCE FUNCTION SATISFIES TOL(X) >= DELTA, FOR ALL X IN THE GIVEN INTERVAL; LET THE VALUE OF DFX AT THE BEGIN AND END POINT OF THE INITIAL INTERVAL BE DENOTED BY DFA AND DFB, RESPECTIVELY, THEN, FINDING A GLOBAL MINIMUM IS ONLY GUARANTEED IF THE FUNCTION IS CONVEX AND DFA <= 0 AND DFB >= 0; IF THESE CONDITIONS ARE NOT SATISFIED, THEN A LOCAL MINIMUM OR A MINIMUM AT ONE OF THE END POINTS MIGHT BE FOUND. PROCEDURES USED: NONE. REQUIRED CENTRAL MEMORY: NO AUXILIARY ARRAYS ARE DECLARED IN MININDER. LANGUAGE: ALGOL 60. METHOD AND PERFORMANCE: MININDER HAS ALMOST THE SAME STRUCTURE AS THE PROCEDURE GIVEN IN� [1]; HOWEVER, CUBIC INTERPOLATION (SEE [2]) IS USED INSTEAD OF QUADRATIC INTERPOLATION TO APPROXIMATE THE MINIMIUM. REFERENCES: [1]: BRENT, R.P. ALGORITHMS FOR MINIMIZATION WITHOUT DERIVATIVES. CH.5. PRENTICE HALL, 1973. [2]: DAVIDON, W.C. VARIABLE METRIC METHODS FOR MINIMIZATION. REP. A.N.L. 5990, 1959. 1SECTION : 5.1.2.1.2 � (OCTOBER 1975) PAGE 3 EXAMPLE OF USE: THE FOLLOWING PROGRAM MAY BE USED TO CALCULATE THE MINIMUM OF THE FUNCTION F(X) = SUM(((I * 2 - 5)/(X - I ** 2)) ** 2; I = 1 (1) 20) ON THE INTERVAL [1.01,3.99] (SEE [1]). "BEGIN" "REAL" "PROCEDURE" MININDER(X, Y, FX, DFX, TOLX); "CODE" 34435; "REAL" M, X, Y; "INTEGER" CNT;� "REAL" "PROCEDURE" F(X); "VALUE" X; "REAL" X; "BEGIN" "INTEGER" I; "REAL" S;� S:= 0; "FOR" I:= 1 "STEP" 1 "UNTIL" 20 "DO" S:= S + ((I * 2 - 5) / (X - I ** 2)) ** 2; CNT:= CNT + 1; F:= S "END" F; "REAL" "PROCEDURE" DF(X); "VALUE" X; "REAL" X; "BEGIN" "INTEGER" I; "REAL" S;� S:= 0; "FOR" I:= 1 "STEP" 1 "UNTIL" 20 "DO" S:= S + (I * 2 - 5) ** 2 / (X - I ** 2) ** 3; DF:= -S * 2 "END" DF; "REAL" "PROCEDURE" TOL(X); "VALUE" X; "REAL" X; TOL:= ABS(X) * "-7 + "-7; X:= 1.01; Y:= 3.99; CNT:= 0; M:= MININDER(X, Y, F(X), DF(X),TOL(X)); OUTPUT(61 ,"("4B,"("MINIMUM IS ")",N,/4B, "("FOR X IS ")",N,/4B, "("AND Y IS ")",N,/4B, "("THE NUMBER OF FUNCTION EVALUATIONS NEEDED IS ")",2ZD,/")", M, X, Y, CNT) "END" RESULTS: MINIMUM IS +3.6766990169021"+000 FOR X IS +3.0229155250302"+000 AND Y IS +3.0229151227386"+000 THE NUMBER OF FUNCTION EVALUATIONS NEEDED IS 9 1SECTION : 5.1.2.1.2 (NOVEMBER 1976) PAGE 4 SOURCE TEXT(S): "CODE"34435; "REAL" "PROCEDURE" MININDER(X, Y, FX, DFX, TOLX); "REAL" X, Y, FX, DFX, TOLX; "BEGIN" "COMMENT" THE FUNCTION IS APPROXIMATED BY A CUBIC AS NIVEN BY DAVIDON, 1958, THE STRUCTURE IS SIMILAR TO THE STRUCTURE OF THE PROGRAM GIVEN BY BRENT, 1973, THIS IS A REVISION OF 760407; "INTEGER" SGN; "REAL" A, B, C, FA, FB, FU, DFA, DFB, DFU, E, D, TOL, BA, Z, P, Q, S; "IF" X <= Y "THEN" "BEGIN" A:= X; FA:= FX; DFA:= DFX; B:= X:= Y; FB:= FX; DFB:= DFX "END" "ELSE" "BEGIN" B:= X; FB:= FX; DFB:= DFX; A:= X:= Y; FA:= FX; DFA:= DFX "END"; C:= (3 - SQRT(5)) / 2; D:= B - A; E:= D * 2; Z:= E * 2; LOOP: BA:= B - A; TOL:= TOLX; "IF" BA >= TOL * 3 "THEN" "BEGIN" "IF" ABS(DFA) <= ABS(DFB) "THEN" "BEGIN" X:=A; SGN:= 1 "END" "ELSE" "BEGIN" X:= B; SGN:= -1 "END"; "IF" DFA <= 0 "AND" DFB >= 0 "THEN" "BEGIN" Z:= (FA - FB) * 3 / BA + DFA + DFB; S:= SQRT(Z ** 2 - DFA * DFB); P:= "IF" SGN = 1 "THEN" DFA - S - Z "ELSE" DFB + S - Z; P:= P * BA; Q:= DFB - DFA + S * 2; Z:= E; E:= D; D:= "IF" ABS(P) <= ABS(Q) * TOL "THEN" TOL * SGN "ELSE" -P / Q "END" "ELSE" D:= BA; "IF" ABS(D) >= ABS(Z * 0.5) "OR" ABS(D) > BA * 0.5 "THEN" "BEGIN" E:= BA; D:= C * BA * SGN "END"; X:= X + D; FU:= FX; DFU:= DFX; "IF" DFU >= 0 "OR" (FU >= FA "AND" DFA <= 0) "THEN" "BEGIN" B:= X; FB:= FU; DFB:= DFU "END" "ELSE" "BEGIN" A:= X; FA:= FU; DFA:= DFU "END"; "GOTO" LOOP "END"; "IF" FA <= FB "THEN" "BEGIN" X:= A; Y:= B; MININDER:= FA "END" "ELSE" "BEGIN" X:= B; Y:= A; MININDER:= FB "END" "END" MININDER; "EOP" 1SECTION : 5.1.2.2.2 (DECEMBER 1979) PAGE 1 AUTHOR: J.C.P. BUS. INSTITUTE: MATHEMATICAL CENTRE. RECEIVED: 741101. BRIEF DESCRIPTION: THIS SECTION CONTAINS THE PROCEDURE PRAXIS; PRAXIS MINIMIZES A FUNCTION OF SEVERAL VARIABLES. KEYWORDS: MINIMIZATION, FUNCTION OF SEVERAL VARIABLES. CALLING SEQUENCE: THE HEADING OF THIS PROCEDURE IS: "PROCEDURE" PRAXIS(N, X, FUNCT, IN, OUT); "VALUE" N; "INTEGER" N; "ARRAY" X, IN, OUT; "REAL" "PROCEDURE" FUNCT;"CODE" 34432; THE MEANING OF THE FORMAL PARAMETERS IS: N: <ARITHMETIC EXPRESSION>; THE NUMBER OF VARIABLES OF THE FUNCTION TO BE MINIMIZED; X: <ARRAY IDENTIFIER>; "ARRAY" X[1 : N]; THE VARIABLES OF THE FUNCTION; ENTRY: AN APPROXIMATION OF THE POSITION OF THE MINIMUM; EXIT: THE CALCULATED POSITION OF THE MINIMUM; FUNCT: <PROCEDURE IDENTIFIER>; THE HEADING OF THIS PROCEDURE SHOULD BE: "REAL" "PROCEDURE" FUNCT(N, X); "VALUE" N; "INTEGER" N; "ARRAY" X; FUNCT SHOULD DELIVER THE VALUE OF THE FUNCTION TO BE MINIMIZED, AT THE POINT GIVEN BY X[1:N]; THE MEANING OF THE FORMAL PARAMETERS IS: N: <ARITHMETIC EXPRESSION>; THE NUMBER OF VARIABLES; X: <ARRAY IDENTIFIER>; "ARRAY" X[1:N]; THE VALUES OF THE VARIABLES FOR WHICH THE FUNCTION HAS TO BE EVALUATED; IN: <ARRAY IDENTIFIER>; "ARRAY" IN[0:9]; ENTRY: IN[0]: THE MACHINE PRECISION; FOR THE CYBER 73 A SUITABLE VALUE IS "-14; 1SECTION : 5.1.2.2.2 � (OCTOBER 1975) PAGE 2 IN[1], IN[2]: RELATIVE AND ABSOLUTE TOLERANCE, RESPECTIVELY, FOR THE STEPVECTOR (RELATIVE TO THE CURRENT ESTIMATES OF THE VARIABLES); THE PROCESS IS TERMINATED WHEN IN IN[8] + 1 SUCCESSIVE ITERATION STEPS THE EUCLIDEAN NORM OF THE STEP VECTOR IS LESS THAN (IN[1] * NORM(X) + IN[2]) * 0.5; IN[1] SHOULD BE CHOSEN IN AGREEMENT WITH THE PRECISION IN WHICH THE FUNCTION IS CALCULATED; USUALLY IN[1] SHOULD BE CHOSEN SUCH THAT IN[1] >= SQRT(IN[0]); IN[0] SHOULD BE CHOSEN DIFFERENT FROM ZERO. IN[3], IN[4] ARE NEITHER USED NOR CHANGED; IN[5]: THE MAXIMUM NUMBER OF FUNCTION EVALUATIONS ALLOWED (I.E. CALLS OF FUNCT); IN[6]: THE MAXIMUM STEP SIZE; IN[6] SHOULD BE EQUAL TO THE MAXIMUM EXPECTED DISTANCE BETWEEN THE GUESS AND THE MINIMUM; IF IN[6] IS TOO SMALL OR TOO LARGE, THEN THE INITIAL RATE OF CONVERGENCE WILL BE SLOW; IN[7]: THE MAXIMUM SCALING FACTOR; THE VALUE OF IN[7] MAY BE USED TO OBTAIN AUTOMATIC SCALING OF THE VARIABLES; HOWEVER, THIS SCALING IS WORTHWHILE BUT MAY BE UNRELIABLE; THEREFORE, THE USER SHOULD TRY TO SCALE HIS PROBLEM HIMSELF AS WELL AS POSSIBLE AND SET IN[7]:= 1; IN EITHER CASE, IN[7] SHOULD NOT BE CHOSEN GREATER THAN 10; IN[8]: THE PROCESS TERMINATES IF NO SUBSTANTIAL IMPROVEMENT OF THE VALUES OF THE VARIABLES IS OBTAINED IN IN[8] + 1 SUCCESSIVE ITERATION STEPS (SEE IN[1], IN[2]); IN[8] = 4 IS VERY CAUTIOUS; USUALLY, IN[8] = 1 IS SATISFACTORY; IN[9]: IF THE PROBLEM IS KNOWN TO BE ILL-CONDITIONED (SEE [1]), THEN THE VALUE OF IN[9] SHOULD BE NEGATIVE, OTHERWISE IN[9] >= 0; OUT: <ARRAY IDENTIFIER>; "ARRAY" OUT[1:6]; EXIT: OUT[1]: THIS VALUE GIVES INFORMATION ABOUT THE TERMINATION OF THE PROCESS; OUT[1] = 0: NORMAL TERMINATION; OUT[1] = 1: THE PROCESS IS BROKEN OFF, BECAUSE, AT THE END OF AN ITERATION STEP, THE NUMBER OF CALLS OF FUNCT EXCEEDED THE VALUE GIVEN IN IN[5]; OUT[1] = 2: THE PROCESS IS BROKEN OFF, BECAUSE THE CONDITION OF THE PROBLEM IS TOO BAD; OUT[2]: THE CALCULATED MINIMUM OF THE FUNCTION; OUT[3]: THE VALUE OF THE FUNCTION AT THE INITIAL GUESS; OUT[4]: THE NUMBER OF FUNCTION EVALUATIONS NEEDED TO OBTAIN THIS RESULT; OUT[5]: THE NUMBER OF LINE SEARCHES (SEE [1]); OUT[6]: THE STEP SIZE IN THE LAST ITERATION STEP. 1SECTION : 5.1.2.2.2 (DECEMBER 1979) PAGE 3 PROCEDURES USED: INIVEC = CP31010, INIMAT = CP31011, DUPVEC = CP31030, DUPMAT = CP31035, DUPCOLVEC = CP31034, MULROW = CP31021, MULCOL = CP31022, VECVEC = CP34010, TAMMAT = CP34014, MATTAM = CP34015, ICHROWCOL = CP34033, ELMVECCOL = CP34021, QRISNGVALDEC = CP34273, SETRANDOM = CP11014, RANDOM = CP11015, DWARF = CP30003. REQUIRED CENTRAL MEMORY: EXECUTION FIELD LENGTH: ONE ARRAY OF LENGTH N SQUARED AND FIVE ARRAYS OF LENGTH N ARE DECLARED; RUNNING TIME: THE NUMBER OF ITERATION STEPS DEPENDS STRONGLY ON THE PROBLEM TO BE SOLVED. METHOD AND PERFORMANCE: THIS PROCEDURE IS ADOPTED FROM [1]. REFERENCES: [1] R. P. BRENT, ALGORITHMS FOR MINIMIZATION WITHOUT DERIVATIVES, CH. 7. PRENTICE HALL, 1973. 1SECTION : 5.1.2.2.2 (DECEMBER 1979) PAGE 4 EXAMPLE OF USE: THE FOLLOWING PROGRAM MAY BE USED TO CALCULATE THE MINIMUM OF THE FUNCTION F(X) = 100 * (X[2] - X[1] ** 2) ** 2 + (1 - X[1]) ** 2, USING (-1.2, 1) AS AN INITIAL ESTIMATE. "BEGIN" "PROCEDURE" PRAXIS(N, X, FUNCT, IN, OUT); "CODE" 34432; "ARRAY" X[1:2], IN[0:9], OUT[1:6]; "REAL" "PROCEDURE" F(N, X); "VALUE" N; "INTEGER" N; "ARRAY" X; F:= (X[2] - X[1] ** 2) ** 2 * 100 + (1 - X[1]) ** 2; IN[0]:= "-14; IN[1]:= IN[2]:= "-6; IN[5]:= 250; IN[6]:= 1; IN[7]:= 1; IN[8]:= 1; IN[9]:= 1; X[1]:= -1.2; X[2]:= 1; PRAXIS(2, X, F, IN, OUT); "IF" OUT[1] = 0 "THEN" OUTPUT(61,"(""(" NORMAL TERMINATION")" ,//")"); OUTPUT(61, "("4B,"("MINIMUM IS ")",N,/,4B, "("FOR X IS ")", 2(N),/,4B, "("THE INITIAL FUNCTION VALUE WAS ")" ,N,/,4B, "("THE NUMBER OF FUNCTION EVALUATIONS NEEDED WAS ")",3ZD,/,4B, "("THE NUMBER OF LINE SEARCHES WAS ")",3ZD,/,4B, "("THE STEP SIZE IN THE LAST ITERATION STEP WAS ")", N,/")", OUT[2], X[1], X[2], OUT[3], OUT[4], OUT[5], OUT[6]) "END" RESULTS: NORMAL TERMINATION MINIMUM IS +1.5694986738789"-021 FOR X IS +1.0000000000389"+000 +1.0000000000785"+000 THE INITIAL FUNCTION VALUE WAS +2.4200000000001"+001 THE NUMBER OF FUNCTION EVALUATIONS NEEDED WAS 189 THE NUMBER OF LINE SEARCHES WAS 72 THE STEP SIZE IN THE LAST ITERATION STEP WAS +5.3830998470105"-009 1SECTION : 5.1.2.2.2 (DECEMBER 1979) PAGE 5 SOURCE TEXT(S): 0"CODE" 34432; "PROCEDURE" PRAXIS(N, X, FUNCT, IN, OUT); "VALUE" N; "INTEGER" N; "ARRAY" X, IN, OUT; "REAL" "PROCEDURE" FUNCT; "BEGIN" "COMMENT"THIS PROCEDURE MINIMIZES FUNCT(N,X),WITH THE PRINCIPAL AXIS METHOD (SEE BRENT,R.P, 1973, ALGORITHMS FOR MINIMIZATION WITHOUT DERIVATIVES,CH.7); "PROCEDURE" INIVEC(L, U, A, X); "CODE" 31010; "PROCEDURE" INIMAT(L, U, K, V, A, X); "CODE" 31011; "PROCEDURE" DUPVEC(L, U, K, A, X); "CODE" 31030; "PROCEDURE" DUPMAT(L, U, K, V, A, B); "CODE" 31035; "PROCEDURE" DUPCOLVEC(L, U, K, A, B); "CODE" 31034; "PROCEDURE" MULROW(L, U, I, J, A, B, X); "CODE" 31021; "PROCEDURE" MULCOL(L, U, I, J, A, B, X); "CODE" 31022; "REAL" "PROCEDURE" VECVEC(L, U, S, A, B); "CODE" 34010; "REAL" "PROCEDURE" TAMMAT(L, U, I, J, A, B); "CODE" 34014; "REAL" "PROCEDURE" MATTAM(L, U, I, J, A, B); "CODE" 34015; "PROCEDURE" ICHROWCOL(L, U, I, J, A); "CODE" 34033; "PROCEDURE" ELMVECCOL(L, U, I, A, B, X); "CODE" 34021; "INTEGER" "PROCEDURE" QRISNGVALDEC(A,M,N,VAL,V,EM); "CODE" 34273; "PROCEDURE" SETRANDOM(X); "CODE" 11014; "REAL" "PROCEDURE" RANDOM; "CODE" 11015; "REAL" "PROCEDURE" DWARF; "CODE" 30003; "PROCEDURE" SORT; "BEGIN" "INTEGER" I, J, K; "REAL" S; "FOR" I:= 1 "STEP" 1 "UNTIL" N - 1 "DO" "BEGIN" K:= I; S:= D[I]; "FOR" J:= I+1 "STEP" 1 "UNTIL" N "DO" "IF" D[J]>S "THEN" "BEGIN" K:= J; S:= D[J] "END"; "IF" K>I "THEN" "BEGIN" D[K]:= D[I]; D[I]:= S; "FOR" J:= 1 "STEP" 1 "UNTIL" N "DO" "BEGIN" S:=V[J,I]; V[J,I]:= V[J,K]; V[J,K]:= S "END" "END" "END" "END" SORT; 1SECTION : 5.1.2.2.2 � (OCTOBER 1975) PAGE 6 ; "PROCEDURE" MIN(J, NITS, D2, X1, F1, FK); "VALUE" J, NITS, FK; "INTEGER" J, NITS; "REAL" D2, X1, F1; "BOOLEAN" FK; "BEGIN" "REAL" "PROCEDURE" FLIN(L); "VALUE" L; "REAL" L; "BEGIN" "INTEGER" I; "ARRAY" T[1:N]; "IF" J > 0 "THEN" "BEGIN" "FOR" I:= 1 "STEP" 1 "UNTIL" N "DO" T[I]:= X[I] + L * V[I,J] "END" "ELSE" "BEGIN" "COMMENT" SEARCH ALONG PARABOLIC SPACE CURVE; QA:= L * (L - QD1) / (QD0 * (QD0 + QD1)); QB:= (L + QD0) * (QD1 - L) /(QD0 * QD1); QC:= L * (L + QD0) / (QD1 * (QD0 + QD1)); "FOR" I:= 1 "STEP" 1 "UNTIL" N "DO" T[I]:= QA * Q0[I] +QB * X[I] + QC * Q1[I] "END"; NF:= NF + 1; FLIN:= FUNCT(N, T) "END" FLIN; "INTEGER" K; "BOOLEAN" DZ; "REAL" X2, XM, F0, F2, FM, D1, T2, S, SF1, SX1; SF1:= F1; SX1:= X1; K:= 0; XM:= 0; F0:= FM:= FX; DZ:= D2 < RELTOL; S:= SQRT(VECVEC(1,N,0,X,X)); T2:= M4 * SQRT(ABS(FX) / ("IF" DZ "THEN" DMIN "ELSE" D2) + S * LDT) + M2 * LDT; S:= S * M4 + ABSTOL; "IF" DZ "AND" T2 > S "THEN" T2:= S; "IF"T2<SMALL"THEN"T2:= SMALL; "IF"T2>0.01*H "THEN"T2:= 0.01*H; "IF"FK"AND"F1<=FM "THEN" "BEGIN"XM:=X1; FM:= F1 "END"; "IF" ^ FK"OR"ABS(X1)<T2"THEN" "BEGIN"X1:="IF"X1>0 "THEN"T2"ELSE"-T2; F1:= FLIN(X1) "END"; "IF"F1<= FM"THEN" "BEGIN"XM:= X1; FM:= F1 "END"; L0: "IF" DZ "THEN" "BEGIN" "COMMENT"EVALUATE FLIN AT ANOTHER POINT AND ESTIMATE THE SECOND DERIVATIVE; X2:= "IF" F0 < F1 "THEN" -X1 "ELSE" X1 * 2; F2:= FLIN(X2); "IF"F2 <= FM "THEN" "BEGIN" XM:= X2; FM:= F2 "END"; D2:=(X2*(F1-F0)-X1*(F2-F0))/(X1*X2*(X1-X2)) "END"; "COMMENT"ESTIMATE FIRST DERIVATIVE AT 0; D1:=(F1-F0)/X1-X1*D2; DZ:="TRUE"; X2:= "IF"D2<=SMALL"THEN" ("IF"D1<0"THEN"H"ELSE"-H) "ELSE"-0.5*D1/D2; "IF"ABS(X2)>H"THEN"X2:="IF"X2>0"THEN"H"ELSE"-H; "COMMENT" 1SECTION : 5.1.2.2.2 (DECEMBER 1979) PAGE 7 ; L1: F2:=FLIN(X2); "IF"K<NITS"AND"F2>F0"THEN" "BEGIN"K:=K+1; "IF"F0<F1"AND"X1*X2>0"THEN" "GOTO"L0; X2:= 0.5*X2; "GOTO"L1 "END"; NL:= NL+1; "IF"F2>FM"THEN"X2:=XM"ELSE"FM:=F2; D2:="IF"ABS(X2*(X2-X1))>SMALL"THEN" (X2*(F1-F0)-X1*(FM-F0))/(X1*X2*(X1-X2)) "ELSE" "IF"K>0"THEN"0"ELSE"D2; "IF"D2<=SMALL"THEN"D2:=SMALL; X1:=X2; FX:=FM; "IF"SF1<FX"THEN" "BEGIN" FX:=SF1; X1:=SX1 "END"; "IF"J>0"THEN"ELMVECCOL(1,N,J,X,V,X1) "END" MIN; "PROCEDURE"QUAD; "BEGIN" "INTEGER" I; "REAL" L, S; S:= FX; FX:= QF1; QF1:= S; QD1:= 0; "FOR" I:= 1 "STEP" 1 "UNTIL" N "DO" "BEGIN"S:=X[I]; X[I]:= L:= Q1[I]; Q1[I]:= S; QD1:= QD1 + (S - L) ** 2 "END"; L:=QD1:=SQRT(QD1); S:= 0; "IF"(QD0*QD1>DWARF)"AND"NL>=3*N*N"THEN" "BEGIN"MIN(0,2,S,L,QF1,"TRUE"); QA:= L*(L-QD1)/(QD0*(QD0+QD1)); QB:=(L+QD0)*(QD1-L)/(QD0*QD1); QC:= L*(L+QD0)/(QD1*(QD0+QD1)) "END" "ELSE" "BEGIN" FX:= QF1; QA:= QB:= 0; QC:= 1 "END"; QD0:= QD1;"FOR"I:= 1"STEP"1"UNTIL"N"DO" "BEGIN"S:=Q0[I]; Q0[I]:=X[I]; X[I]:= QA*S + QB*X[I]+QC*Q1[I] "END" "END" QUAD; "BOOLEAN" ILLC; "INTEGER" I, J, K, K2, NL, MAXF, NF, KL, KT, KTM; "REAL" S, SL, DN, DMIN, FX, F1, LDS, LDT, SF, DF, QF1, QD0, QD1, QA, QB, QC, M2, M4, SMALL, VSMALL, LARGE, VLARGE, SCBD, LDFAC,T2, MACHEPS, RELTOL, ABSTOL, H; "ARRAY" V[1:N,1:N], D, Y, Z, Q0, Q1[1:N]; MACHEPS:= IN[0]; RELTOL:= IN[1]; ABSTOL:= IN[2]; MAXF:= IN[5]; H:= IN[6]; SCBD:= IN[7]; KTM:= IN[8]; ILLC:= IN[9] < 0; SMALL:= MACHEPS ** 2; VSMALL:= SMALL ** 2; LARGE:= 1/SMALL; VLARGE:= 1/VSMALL; M2:= RELTOL; M4:= SQRT(M2); SETRANDOM(0.5); LDFAC:= "IF" ILLC "THEN" 0.1 "ELSE" 0.01; KT:=NL:=0; NF:=1; OUT[3]:= QF1:=FX:=FUNCT(N,X); "COMMENT" 1SECTION : 5.1.2.2.2 (DECEMBER 1979) PAGE 8 ; ABSTOL:=T2:= SMALL+ABS(ABSTOL); DMIN:= SMALL; "IF" H<ABSTOL*100"THEN"H:=ABSTOL*100; LDT:=H; INIMAT(1,N,1,N,V,0); "FOR"I:=1"STEP"1"UNTIL"N"DO"V[I,I]:= 1; D[1]:= QD0:= 0; DUPVEC(1,N,0,Q1,X); INIVEC(1,N,Q0,0); "COMMENT"MAIN LOOP; L0: SF:=D[1]; D[1]:= S:= 0; MIN(1,2,D[1],S,FX,"FALSE"); "IF" S <= 0 "THEN" MULCOL(1, N, 1, 1, V, V, -1); "IF" SF <= 0.9 * D[1] "OR" 0.9 * SF >= D[1] "THEN" INIVEC(2,N,D,0); "FOR" K:= 2"STEP"1"UNTIL"N"DO" "BEGIN" DUPVEC(1,N,0,Y,X); SF:=FX; ILLC:= ILLC "OR" KT>0; L1: KL:=K; DF:= 0; "IF" ILLC "THEN" "BEGIN" "COMMENT"RANDOM STOP TO GET OFF RESULTION VALLEY; "FOR"I:= 1 "STEP"1"UNTIL"N"DO" "BEGIN"S:=Z[I]:=(0.1*LDT+T2*10**KT) *(RANDOM-0.5); ELMVECCOL(1,N,I,X,V,S) "END"; FX:= FUNCT(N,X); NF:= NF+1 "END"; "FOR"K2:= K "STEP" 1 "UNTIL" N "DO" "BEGIN" SL:=FX; S:= 0; MIN (K2, 2, D[K2], S, FX, "FALSE"); S:="IF" ILLC "THEN" D[K2] * (S + Z[K2]) ** 2 "ELSE"SL-FX;"IF"DF<S"THEN" "BEGIN"DF:=S;KL:= K2"END"; "END"; "IF" ^ILLC "AND" DF < ABS(100 * MACHEPS * FX) "THEN" "BEGIN" ILLC:= "TRUE"; "GOTO" L1 "END"; "FOR" K2:= 1"STEP" 1"UNTIL"K-1"DO" "BEGIN" S:= 0; MIN(K2, 2, D[K2], S, FX, "FALSE") "END"; F1:= FX; FX:= SF; LDS:= 0; "FOR" I:= 1 "STEP" 1 "UNTIL" N "DO" "BEGIN" SL:= X[I]; X[I]:= Y[I]; SL:= Y[I]:= SL - Y[I]; LDS:= LDS + SL * SL "END"; LDS:= SQRT(LDS); "IF" LDS > SMALL "THEN" "BEGIN" "FOR" I:= KL - 1 "STEP" -1 "UNTIL" K "DO" "BEGIN" "FOR" J:= 1 "STEP" 1 "UNTIL" N "DO" V[J, I + 1]:= V[J,I]; D[I + 1]:= D[I] "END"; D[K]:= 0; DUPCOLVEC(1, N, K, V, Y); MULCOL(1, N, K, K, V, V, 1 / LDS); MIN(K, 4, D[K], LDS, F1, "TRUE"); "IF" LDS <= 0 "THEN" "BEGIN" LDS:= LDS; MULCOL(1, N, K, K, V, V, -1) "END" "END"; LDT:= LDFAC * LDT; "IF" LDT < LDS "THEN" LDT:= LDS; T2:= M2 * SQRT(VECVEC(1, N, 0, X, X)) + ABSTOL; "COMMENT" 1SECTION : 5.1.2.2.2 � (OCTOBER 1975) PAGE 9 ; KT:= "IF" LDT > 0.5 * T2 "THEN" 0 "ELSE" KT + 1; "IF" KT > KTM "THEN" "BEGIN" OUT[1]:= 0; "GOTO" L2 "END" "END"; QUAD; DN:= 0;"FOR"I:= 1"STEP"1"UNTIL"N"DO" "BEGIN"D[I]:= 1/SQRT(D[I]); "IF"DN<D[I]"THEN"DN:=D[I] "END"; "FOR"J:= 1"STEP"1"UNTIL"N"DO" "BEGIN"S:= D[J]/DN; MULCOL(1,N,J,J,V,V,S)"END"; "IF"SCBD>1"THEN" "BEGIN"S:=VLARGE; "FOR"I:=1 "STEP"1"UNTIL"N"DO" "BEGIN" SL:= Z[I]:= SQRT(MATTAM(1, N, I, I, V, V)); "IF"SL<M4"THEN"Z[I]:= M4; "IF" S>SL "THEN" S:= SL "END"; "FOR"I:=1"STEP"1"UNTIL"N"DO" "BEGIN"SL:=S/Z[I];Z[I]:= 1/SL; "IF"Z[I]>SCBD"THEN" "BEGIN"SL:=1/SCBD; Z[I]:= SCBD"END"; MULROW(1, N, I, I, V, V, SL) "END" "END"; "FOR" I:= 1 "STEP" 1 "UNTIL" N "DO" ICHROWCOL(I + 1, N, I, I, V); "BEGIN" "ARRAY" A[1:N,1:N], EM[0:7]; EM[0]:= EM[2]:= MACHEPS; EM[4]:= 10 * N; EM[6]:= VSMALL; DUPMAT(1, N, 1, N, A, V); "IF" QRISNGVALDEC(A, N, N, D, V, EM) ^= 0 "THEN" "BEGIN" OUT[1]:= 2; "GOTO" L2 "END"; "END"; "IF"SCBD>1"THEN" "BEGIN" "FOR"I:=1"STEP"1"UNTIL"N"DO" MULROW(1,N,I,I,V,V,Z[I]); "FOR"I:= 1"STEP"1"UNTIL"N"DO" "BEGIN"S:= SQRT(TAMMAT(1,N,I,I,V,V)); D[I]:= S*D[I]; S:= 1/S; MULCOL(1,N,I,I,V,V,S) "END" "END"; "FOR" I:= 1 "STEP" 1 "UNTIL" N "DO" "BEGIN" S:= DN * D[I]; D[I]:= "IF" S > LARGE "THEN" VSMALL "ELSE" "IF" S < SMALL "THEN" VLARGE "ELSE" S ** (-2) "END"; SORT; DMIN:= D[N]; "IF" DMIN < SMALL "THEN" DMIN:= SMALL; ILLC:= (M2 * D[1]) > DMIN; "IF" NF < MAXF "THEN" "GOTO" L0 "ELSE" OUT[1]:= 1; L2: OUT[2]:= FX; OUT[4]:= NF; OUT[5]:= NL; OUT[6]:= LDT "END"PRAXIS; "EOP"