C ================================================================= C PROGRAM FOR COMPUTING NEAREST CORRELATION MATRIX BY DIFFERENTIAL C EVOLUTION METHOD OF GLOBAL OPTIMIZATION WRITTEN BY: C PROF. SK MISHRA, DEPARTMENT OF ECONOMICS, NEHU, SHILLONG INDIA C APRIL 2007 : AVAILABLE AT: C http//www.webng.com/economics C AND C http://freewebs.com/nehu_economics C ================================================================= PARAMETER (MX=10)! PRESENTLY SET AT 10. ONE MAY CHANGE IT. C ACCORDINGLY IT HAS TO BE CHANGED IN OTHER SUBROUTINES ALSO. IMPLICIT DOUBLE PRECISION (A-H,O-Z) COMMON /RNDM/IU,IV COMMON /KFF/KF,NFCALL,Q COMMON /EIGENS/VO(MX,MX),WO(MX,MX),WEIGHT(MX,MX),PPROD,PROD,NORM INTEGER IU,IV CHARACTER *70 FTIT,INFIL,INWFIL,OUTFIL DIMENSION Q(MX,MX),QQ(MX,MX),V(MX,MX),W(MX,MX),P(MX),R(MX,MX) CALL FSELECT(KF,M,FTIT) C READ THE Q (INVALID CORRELATION MATRIX) FROM INPUT FILE WRITE(*,*)'FILE THAT STORES Q (INVALID CORRELATION MATRIX) ?' READ(*,*) INFIL OPEN(7,FILE=INFIL) DO I=1,M READ(7,*) (Q(I,J),J=1,M) ! Q IS THE INVALID CORRELATION MATRIX DO J=1,M QQ(I,J)=Q(I,J) ! Q IS STORED IN QQ TO PRESERVE THE ORIGINAL MATRIX ENDDO ENDDO CLOSE(7) WRITE(*,*)'ANY WEIGHT MATRIX ? YES (1/ NON-ZERO), NO (0)' READ(*,*) NW IF(NW.NE.0) THEN WRITE(*,*)'FILE IN WHICH WEIGHT MATRIX HAS BEEN STORED ?' READ(*,*) INWFIL OPEN(7, FILE=INWFIL) DO I=1,M READ(7,*)(WEIGHT(I,J),J=1,M) ENDDO CLOSE(7) ELSE DO I=1,M DO J=1,M WEIGHT(I,J)=1.D0 ENDDO ENDDO ENDIF WRITE(*,*)'CHOOSE THE NORM [ABS(1),FROBENIUS(2),CHEBYSHEV(=>99)]?' READ(*,*) NORM WRITE(*,*)'CHOOSE A SMALL(SUGGESTED 0.01)GUARD DETERMINANT[>ZERO]' WRITE(*,*)'[THIS GUARD DOES NOT ALLOW THE RESULTING NEAREST MATRIX & TO BECOME NEARSINGULAR]' READ(*,*) PPROD WRITE(*,*) 'GIVE AN OUTPUT FILE NAME TO STORE RESULTS' READ(*,*) OUTFIL OPEN(11,FILE=OUTFIL)! OPENS OUTPUT FILE C FIND EIGENVALUES AND EIGENVECTORS OF Q MATRIX CALL EIGEN(Q,VO,WO,M) C----------------------------------------------------------------------- WRITE(*,*)'ORIGINAL MATRIX' WRITE(11,*)'ORIGINAL MATRIX' DO I=1,M WRITE(*,1)(Q(I,J),J=1,M) WRITE(11,1)(Q(I,J),J=1,M) ENDDO 1 FORMAT(15F8.4) ! OUTPUT FORMAT. ONE MAY CHANGE IT AS NEEDED. WRITE(*,*)'EIGENVALUES' WRITE(11,*)'EIGENVALUES' DO I=1,M WRITE(*,2)(WO(I,J),J=1,M) WRITE(11,2)(WO(I,J),J=1,M) ENDDO 2 FORMAT(10F12.7)! OUTPUT FORMAT. ONE MAY CHANGE IT AS NEEDED. C----------------------------------------------------------------------- C CHECK IF ANY EIGENVALUE IS NEGATIVE LNEG=0 DO I=1,M IF(WO(I,I).LT.0) LNEG=1 ! IF ANY EIGENVALUE NEGETIVE LNEG=1 ENDDO IF(LNEG.EQ.1) THEN CALL DE(M,P,FBEST,FTIT) ! P IS THE VECTOR OF EIGENVALUES ENDIF CALL EIGEN(QQ,V,W,M) C----------------------------------------------------------------------- LNEG=0 DO I=1,M IF(W(I,I).LT.0) LNEG=1 ENDDO DO I=1,M W(I,I)=P(I) ENDDO DO J=1,M DO JJ=1,M R(J,JJ)=0.0 DO I=1,M R(J,JJ)=R(J,JJ)+V(J,I)*W(I,JJ) ENDDO ENDDO ENDDO DO J=1,M DO JJ=1,M W(J,JJ)=0.0 DO I=1,M W(J,JJ)=W(J,JJ)+R(J,I)*V(JJ,I) ENDDO ENDDO ENDDO DO I=1,M DO J=1,M R(I,J)=W(I,J) ENDDO R(I,I)=1.0 ENDDO CALL EIGEN(R,V,W,M) F=0 DO I=1,M DO J=1,M DIF=DABS(Q(I,J)-R(I,J)) IF(NORM.LT.99) THEN F=F+WEIGHT(I,J)*DIF**NORM ELSE IF(DIF*WEIGHT(I,J).GT.F) F=DIF*WEIGHT(I,J) ENDIF ENDDO ENDDO IF(LNEG.NE.0) THEN WRITE(*,*)' ' WRITE(*,*)'-----------------------------------------------------' WRITE(*,*)'ESTIMATED MATRIX ------------------------------------' WRITE(*,*)' ' WRITE(11,*)' ' WRITE(11,*)'-----------------------------------------------------' WRITE(11,*)'ESTIMATED MATRIX ------------------------------------' WRITE(11,*)' ' DO I=1,M WRITE(*,3)(R(I,J),J=1,M) WRITE(11,3)(R(I,J),J=1,M) ENDDO 3 FORMAT(12F12.8) ! OUTPUT FORMAT. ONE MAY CHANGE IT AS NEEDED. WRITE(*,*)' ' WRITE(*,*)'MIN NORM WITH PENALTIES (NOT TO BE INTERPRETED)=',F WRITE(11,*)' ' WRITE(11,*)'MIN NORM WITH PENALTIES (NOT TO BE INTERPRETED)=',F SUM=0 DET=1.D0 DO I=1,M SUM=SUM+W(I,I) DET=DET*W(I,I) ENDDO WRITE(*,*)' ' WRITE(*,*)'EIGENVALUES' WRITE(*,2)(W(I,I),I=1,M) WRITE(*,*)' ' WRITE(11,*)' ' WRITE(11,*)'EIGENVALUES' WRITE(11,2)(W(I,I),I=1,M) WRITE(11,*)' ' WRITE(*,*)'SUM AND PRODUCT OF EIGENVALUES=',SUM,DET WRITE(11,*)'SUM AND PRODUCT OF EIGENVALUES=',SUM,DET ENDIF IF(LNEG.EQ.0) THEN WRITE(*,*)'THE GIVEN MATRIX IS VALID (POSITIVE SEMI-DEFINITE).' WRITE(11,*)'THE GIVEN MATRIX IS VALID (POSITIVE SEMI-DEFINITE).' ELSE WRITE(*,*)'THE RESULT MATRIX IS VALID (POSITIVE SEMI-DEFINITE).' WRITE(11,*)'THE RESULT MATRIX IS VALID (POSITIVE SEMI-DEFINITE).' ENDIF CLOSE(11) END C ----------------------------------------------------------------- SUBROUTINE FUNC(X,M,F) C FINDING THE NEAREST CORRELATION MATRIX BY DIFFERENTIAL C EVOLUTION METHOD OF GLOBAL OPTIMIZATION WRITTEN BY C PROF. SK MISHRA, DEPARTMENT OF ECONOMICS, NEHU, SHILLONG INDIA PARAMETER (MX=10)! PRESENTLY SET AT 10. ONE MAY CHANGE IT. C ACCORDINGLY IT HAS TO BE CHANGED IN MAIN/OTHER SUBROUTINES ALSO. C THIS SUBROUTINE IS MEANT FOR USE BY GLOBAL OPTIMIZATION PROGRAM IMPLICIT DOUBLE PRECISION (A-H,O-Z) COMMON /RNDM/IU,IV COMMON /KFF/KF,NFCALL,Q COMMON /EIGENS/VO(MX,MX),WO(MX,MX),WEIGHT(MX,MX),PPROD,PROD,NORM INTEGER IU,IV DIMENSION X(*),Q(MX,MX),W(MX,MX),V(MX,MX),R(MX,MX) NFCALL=NFCALL+1 ! INCREMENT TO NUMBER OF FUNCTION CALLS C KF IS THE CODE OF THE TEST FUNCTION C ----------------------------------------------------------------- LNEG=0 DO I=1,M IF(WO(I,I).LT.0) LNEG=1 ENDDO IF(LNEG.EQ.1) THEN SUM=0 PROD=1.D0 DO I=1,M IF(X(I).LT.0) THEN CALL RANDOM(RAND) X(I)=RAND ENDIF SUM=SUM+X(I) PROD=PROD*X(I) ENDDO DO I=1,M X(I)=X(I)*M/SUM ENDDO DO I=1,M W(I,I)=X(I) ENDDO DO J=1,M DO JJ=1,M R(J,JJ)=0.0 DO I=1,M R(J,JJ)=R(J,JJ)+VO(J,I)*W(I,JJ) ENDDO ENDDO ENDDO DO J=1,M DO JJ=1,M W(J,JJ)=0.0 DO I=1,M W(J,JJ)=W(J,JJ)+R(J,I)*VO(JJ,I) ENDDO ENDDO ENDDO DO I=1,M DO J=1,M R(I,J)=W(I,J) ENDDO R(I,I)=1.0 ENDDO CALL EIGEN(R,V,W,M) PF=0 SUM=0 DO I=1,M SUM=SUM+W(I,I) IF(W(I,I).LT.0) PF=PF+100+(100*(1-W(I,I)))**2 ENDDO F=0 DO I=1,M F=F+100*(1.D0-R(I,I))**2 ENDDO FN=0.0 FX=0 DO I=1,M-1 DO J=I+1,M DIF=DABS(Q(I,J)-R(I,J)) WDIF=DIF*WEIGHT(I,J) IF(WDIF.GT.FX) FX=WDIF IF(NORM.LT.99)FN=FN+WEIGHT(I,J)*DIF**NORM ENDDO ENDDO FNN=2*FN FN=0 DO I=1,M DIF=DABS(Q(I,I)-R(I,I)) WDIF=DIF*WEIGHT(I,I) IF(WDIF.GT.FX) FX=WDIF IF(NORM.LT.99)FN=FN+WEIGHT(I,I)*DIF**NORM ENDDO IF(NORM.LT.99) THEN F=F+FNN+FN+PF+DABS(SUM-M)*100 ELSE F=F+FX+PF+DABS(SUM-M)*100 ENDIF ENDIF IF(PROD.LT.PPROD) F=F+(1000*(PPROD-PROD))**2 RETURN END C ----------------------------------------------------------------- SUBROUTINE DE(M,A,FBEST,FTIT) C PROGRAM: "DIFFERENTIAL EVOLUTION ALGORITHM" OF GLOBAL OPTIMIZATION C THIS METHOD WAS PROPOSED BY R. STORN AND K. PRICE IN 1995. REF -- C "DIFFERENTIAL EVOLUTION - A SIMPLE AND EFFICIENT ADAPTIVE SCHEME C FOR GLOBAL OPTIMIZATION OVER CONTINUOUS SPACES" : TECHNICAL REPORT C INTERNATIONAL COMPUTER SCIENCE INSTITUTE, BERKLEY, 1995. C PROGRAM BY PROF SK MISHRA, DEPT OF ECONOMICS,NEHU,SHILLONG(INDIA) C ----------------------------------------------------------------- C PROGRAM DE : DIFFERENTIAL EVOLUTION OPTIMIZER IMPLICIT DOUBLE PRECISION (A-H, O-Z) ! TYPE DECLARATION C ----------------------------------------------------------------- PARAMETER (MX=10)! PRESENTLY SET AT 10. ONE MAY CHANGE IT. C ACCORDINGLY IT HAS TO BE CHANGED IN MAIN/OTHER SUBROUTINES ALSO. C ----------------------------------------------------------------- PARAMETER(NMAX=1000,MMAX=100) ! MAXIMUM DIMENSION PARAMETERS PARAMETER(RX1=0, RX2=0) ! CROSSOVER SCHEME (NCROSS<=0, 1, =>2) PARAMETER(IPRINT=500,EPS=1.D-08)!FOR WATCHING INTERMEDIATE RESULTS C IT PRINTS THE INTERMEDIATE RESULTS AFTER EACH IPRINT ITERATION AND C EPS DETERMINES ACCURACY FOR TERMINATION. IF EPS= 0, ALL ITERATIONS C WOULD BE UNDERGONE EVEN IF NO IMPROVEMENT IN RESULTS IS THERE. C ULTIMATELY "DID NOT CONVERGE" IS REOPORTED. COMMON /RNDM/IU,IV ! RANDOM NUMBER GENERATION (IU = 4-DIGIT SEED) C INTEGER IU,IV ! FOR RANDOM NUMBER GENERATION COMMON /KFF/KF,NFCALL,Q ! FUNCTION CODE AND NO. OF FUNCTION CALLS COMMON /EIGENS/VO(MX,MX),WO(MX,MX),WEIGHT(MX,MX),PPROD,PROD,NORM CHARACTER *70 FTIT ! TITLE OF THE FUNCTION C ----------------------------------------------------------------- C THE PROGRAM REQUIRES INPUTS FROM THE USER ON THE FOLLOWING ------ C (1) FUNCTION CODE (KF), (2) NO. OF VARIABLES IN THE FUNCTION (M); C (3) N=POPULATION SIZE (SUGGESTED 10 TIMES OF NO. OF VARIABLES, M, C FOR SMALLER PROBLEMS N=100 WORKS VERY WELL); C (4) PCROS = PROB. OF CROSS-OVER (SUGGESTED : ABOUT 0.85 TO .99); C (5) FACT = SCALE (SUGGESTED 0.5 TO .95 OR SO); C (6) ITER = MAXIMUM NUMBER OF ITERATIONS PERMITTED (5000 OR MORE) C (7) RANDOM NUMBER SEED (4 DIGITS INTEGER) C ---------------------------------------------------------------- DIMENSION X(NMAX,MMAX),Y(NMAX,MMAX),A(MMAX),FV(NMAX),Q(MX,MX) DIMENSION IR(3) C ---------------------------------------------------------------- C ------- SELECT THE FUNCTION TO MINIMIZE AND ITS DIMENSION ------- C SPECIFY OTHER PARAMETERS --------------------------------------- WRITE(*,*)'POPULATION SIZE [N] AND NO. OF ITERATIONS [ITER] ?' WRITE(*,*)'SUGGESTED: MAX(100, 10.M); ITER 10000 OR SO' READ(*,*) N,ITER WRITE(*,*)'CROSSOVER PROBABILITY [PCROS] AND SCALE [FACT] ?' WRITE(*,*)'SUGGESTED: PCROS ABOUT 0.9; FACT=.5 OR LARGER BUT <=1' READ(*,*) PCROS,FACT WRITE(*,*)'RANDOM NUMBER SEED ?' WRITE(*,*)'A FOUR-DIGIT POSITIVE ODD INTEGER, SAY, 1171' READ(*,*) IU NFCALL=0 ! INITIALIZE COUNTER FOR FUNCTION CALLS GBEST=1.D30 ! TO BE USED FOR TERMINATION CRITERION C INITIALIZATION : GENERATE X(N,M) RANDOMLY DO I=1,N DO J=1,M CALL RANDOM(RAND) X(I,J)=RAND*M C RANDOM NUMBERS BETWEEN -RRANGE AND +RRANGE (BOTH EXCLUSIVE) ENDDO ENDDO WRITE(*,*)'COMPUTING --- PLEASE WAIT ' IPCOUNT=0 DO 100 ITR=1,ITER ! ITERATION BEGINS C ===================== RANDOMIZATION OF NCROSS =================== C RANDOMIZES NCROSS NCROSS=0 CALL RANDOM(RAND) IF(RAND.GT.RX1) NCROSS=1 IF(RAND.GT.RX2) NCROSS=2 C ------------------------------------------------------------------ C EVALUATE ALL X FOR THE GIVEN FUNCTION DO I=1,N DO J=1,M A(J)=X(I,J) ENDDO CALL FUNC(A,M,F) C STORE FUNCTION VALUES IN FV VECTOR FV(I)=F ENDDO C ---------------------------------------------------------------- C FIND THE FITTEST (BEST) INDIVIDUAL AT THIS ITERATION FBEST=FV(1) KB=1 DO IB=2,N IF(FV(IB).LT.FBEST) THEN FBEST=FV(IB) KB=IB ENDIF ENDDO C BEST FITNESS VALUE = FBEST : INDIVIDUAL X(KB) C ----------------------------------------------------------------- C GENERATE OFFSPRINGS DO I=1,N ! I LOOP BEGINS C INITIALIZE CHILDREN IDENTICAL TO PARENTS; THEY WILL CHANGE LATER DO J=1,M Y(I,J)=X(I,J) ENDDO C SELECT RANDOMLY THREE OTHER INDIVIDUALS 20 DO IRI=1,3 ! IRI LOOP BEGINS IR(IRI)=0 CALL RANDOM(RAND) IRJ=INT(RAND*N)+1 C CHECK THAT THESE THREE INDIVIDUALS ARE DISTICT AND OTHER THAN I IF(IRI.EQ.1.AND.IRJ.NE.I) THEN IR(IRI)=IRJ ENDIF IF(IRI.EQ.2.AND.IRJ.NE.I.AND.IRJ.NE.IR(1)) THEN IR(IRI)=IRJ ENDIF IF(IRI.EQ.3.AND.IRJ.NE.I.AND.IRJ.NE.IR(1).AND.IRJ.NE.IR(2)) THEN IR(IRI)=IRJ ENDIF ENDDO ! IRI LOOP ENDS C CHECK IF ALL THE THREE IR ARE POSITIVE (INTEGERS) DO IX=1,3 IF(IR(IX).LE.0) THEN GOTO 20 ! IF NOT THEN REGENERATE ENDIF ENDDO C THREE RANDOMLY CHOSEN INDIVIDUALS DIFFERENT FROM I AND DIFFERENT C FROM EACH OTHER ARE IR(1),IR(2) AND IR(3) C ---------------------------------------------------------------- C NO CROSS OVER, ONLY REPLACEMENT THAT IS PROBABILISTIC IF(NCROSS.LE.0) THEN DO J=1,M CALL RANDOM(RAND) IF(RAND.LE.PCROS) THEN ! REPLACE IF RAND < PCROS A(J)=X(IR(1),J)+(X(IR(2),J)-X(IR(3),J))*FACT ! CANDIDATE ENDIF ENDDO ENDIF C ----------------------------------------------------------------- C CROSSOVER SCHEME (EXPONENTIAL) SUGGESTED BY KENNETH PRICE IN HIS C PERSONAL LETTER TO THE AUTHOR (DATED SEPTEMBER 29, 2006) IF(NCROSS.EQ.1) THEN CALL RANDOM(RAND) 1 JR=INT(RAND*M)+1 J=JR 2 A(J)=X(IR(1),J)+(X(IR(2),J)-X(IR(3),J))*FACT !CANDIDATE 3 J=J+1 IF(J.GT.M) J=1 4 IF(J.EQ.JR) GOTO 10 5 CALL RANDOM(RAND) IF(PCROS.LE.RAND) GOTO 2 6 A(J)=X(I,J) ! CANDIDATE 7 J=J+1 IF(J.GT.M) J=1 8 IF (J.EQ.JR) GOTO 10 9 GOTO 6 10 CONTINUE ENDIF C ----------------------------------------------------------------- C THE SCHEME SUGGESTED BY KENNETH PRICE IN HIS PERSONAL LETTER TO C THE AUTHOR (DATED OCTOBER 19, 2006) IF(NCROSS.GE.2) THEN CALL RANDOM(RAND) IF(RAND.LE.PCROS) THEN CALL NORMAL(RN) DO J=1,M C CALL NORMAL(RN) A(J)=X(I,J)+(X(IR(1),J)+X(IR(2),J)-2*X(I,J))*RN ! CANDIDATE ENDDO ELSE DO J=1,M A(J)=X(I,J)+(X(IR(1),J)- X(IR(2),J))! FACT ASSUMED AS 1. ENDDO ENDIF ENDIF C ----------------------------------------------------------------- CALL FUNC(A,M,F) ! EVALUATE THE OFFSPRING IF(F.LT.FV(I)) THEN ! IF BETTER, REPLACE PARENTS BY THE CHILD FV(I)=F DO J=1,M Y(I,J)=A(J) ENDDO ENDIF ENDDO ! I LOOP ENDS DO I=1,N DO J=1,M X(I,J)=Y(I,J) ! NEW GENERATION IS A MIX OF BETTER PARENTS AND C BETTER CHILDREN ENDDO ENDDO IPCOUNT=IPCOUNT+1 IF(IPCOUNT.EQ.IPRINT) THEN DO J=1,M A(J)=X(KB,J) ENDDO WRITE(*,*)(X(KB,J),J=1,M),' FBEST UPTO NOW = ',FBEST WRITE(*,*)'TOTAL NUMBER OF FUNCTION CALLS =',NFCALL IF(DABS(FBEST-GBEST).LT.EPS) THEN WRITE(*,*) FTIT WRITE(*,*)'COMPUTATION OVER' RETURN ELSE GBEST=FBEST ENDIF IPCOUNT=0 ENDIF C ---------------------------------------------------------------- 100 ENDDO ! ITERATION ENDS : GO FOR NEXT ITERATION, IF APPLICABLE C ---------------------------------------------------------------- WRITE(*,*)'DID NOT CONVERGE. REDUCE EPS OR RAISE ITER OR DO BOTH' WRITE(*,*)'INCREASE N, PCROS, OR SCALE FACTOR (FACT)' RETURN END C ----------------------------------------------------------------- SUBROUTINE NORMAL(R) C PROGRAM TO GENERATE N(0,1) FROM RECTANGULAR RANDOM NUMBERS C IT USES VARIATE TRANSFORMATION FOR THIS PURPOSE. C ----------------------------------------------------------------- C IF U1 AND U2 ARE UNIFORMLY DISTRIBUTED RANDOM NUMBERS (0,1), C THEN X=[(-2*LN(U1))**.5]*(COS(2*PI*U2) IS N(0,1) C PI = 4*ARCTAN(1.0)= 3.1415926535897932384626433832795 C 2*PI = 6.283185307179586476925286766559 C ----------------------------------------------------------------- IMPLICIT DOUBLE PRECISION (A-H,O-Z) COMMON /RNDM/IU,IV C ----------------------------------------------------------------- CALL RANDOM(RAND) ! INVOKES RANDOM TO GENERATE UNIFORM RAND [0, 1] U1=RAND ! U1 IS UNIFORMLY DISTRIBUTED [0, 1] CALL RANDOM(RAND) ! INVOKES RANDOM TO GENERATE UNIFORM RAND [0, 1] U2=RAND ! U1 IS UNIFORMLY DISTRIBUTED [0, 1] R=DSQRT(-2.D0*DLOG(U1)) C R=R*DCOS(U2*6.283185307179586476925286766559D00) R=R*DCOS(U2*6.28318530718D00) RETURN END C ------------------------------------------------------------------ C RANDOM NUMBER GENERATOR (UNIFORM BETWEEN 0 AND 1 - BOTH EXCLUSIVE) SUBROUTINE RANDOM(RAND) IMPLICIT DOUBLE PRECISION (A-H, O-Z) COMMON /RNDM/IU,IV IV=IU*65539 IF(IV.LT.0) THEN IV=IV+2147483647+1 ENDIF RAND=IV IU=IV RAND=RAND*0.4656613E-09 RETURN END C ----------------------------------------------------------------- SUBROUTINE FSELECT(KF,M,FTIT) C THE PROGRAM REQUIRES INPUTS FROM THE USER ON THE FOLLOWING ------ C (1) FUNCTION CODE (KF), (2) NO. OF VARIABLES IN THE FUNCTION (M); CHARACTER *70 TIT(1),FTIT WRITE(*,*)'----------------------------------------------------' DATA TIT(1)/'NEAREST CORRELATION MATRIX PROBLEM'/ C ----------------------------------------------------------------- KF=1 WRITE(*,*)' THE NEAREST CORRELATION MATRIX PROBLEM' WRITE(*,*)'THE METHOD AND PROGRAM DEVELOPED BY PROF. SK MISHRA' WRITE(*,*)' DEPT. OF ECONOMICS, NORTH-EASTERN HILL UNIVERSITY' WRITE(*,*)' SHILLONG (INDIA)' WRITE(*,*)'----------------------------------------------------' WRITE(*,*)' ' WRITE(*,*)'PLEASE FEED THE INFORMATION AS ASKED FOR' WRITE(*,*)' ' WRITE(*,*)'DIMENSION OF THE INVALID CORRELATION MATRIX [M] ?' READ(*,*) M FTIT=TIT(KF) ! STORE THE NAME OF THE CHOSEN FUNCTION IN FTIT RETURN END C ---------------------------------------------------- SUBROUTINE EIGEN(A,V,W,N) PARAMETER (MX=10)! PRESENTLY SET AT 10. ONE MAY CHANGE IT. C ACCORDINGLY IT HAS TO BE CHANGED IN MAIN/OTHER SUBROUTINES ALSO. C KRISHNAMURTHY, EV AND SK SEN (1976). "COMPUTER-BASED NUMERICAL C ALGORITHMS", AFFILIATED EAST-WEST PRESS, NEW DELHI. C COMPUTES EIGENVALUES AND VECTORS OF A REAL SYMMETRIX MATRIX DOUBLE PRECISION A(MX,MX),V(MX,MX),W(MX,MX),P(MX) DOUBLE PRECISION PMAX,EPLN,TAN,SIN,COS,AI,TT,TA,TB DIMENSION MM(MX) C ------------ INITIALISATION ------------------------- DO 50 I=1,N DO 51 J=1,N V(I,J)=0.0 51 W(I,J)=A(I,J) P(I)=0.0 50 CONTINUE PMAX=0 EPLN=0 TAN=0 SIN=0 COS=0 AI=0 TT=0 NN=1 EPLN=1.0D-99 C ------------------------------------------------------ IF(NN.NE.0) THEN DO 3 I=1,N DO 3 J=1,N V(I,J)=0.0 IF(I.EQ.J) V(I,J)=1.0 3 CONTINUE ENDIF 2 NR=0 5 MI=N-1 DO 6 I=1,MI P(I)=0.0 MJ=I+1 DO 6 J=MJ,N IF(P(I).GT.DABS(A(I,J))) GO TO 6 P(I)=DABS(A(I,J)) MM(I)=J 6 CONTINUE 7 DO 8 I=1,MI IF(I.LE.1) GOTO 10 IF(PMAX.GT.P(I)) GOTO 8 10 PMAX=P(I) IP=I JP=MM(I) 8 CONTINUE IF (PMAX.LE.EPLN) THEN GO TO 12 ENDIF NR=NR+1 13 TA=2.0*A(IP,JP) TB=(DABS(A(IP,IP)-A(JP,JP))+ &DSQRT((A(IP,IP)-A(JP,JP))**2+4.0*A(IP,JP)**2)) TAN=TA/TB IF(A(IP,IP).LT.A(JP,JP)) TAN=-TAN 14 COS=1.0/DSQRT(1.0+TAN**2) SIN=TAN*COS AI=A(IP,IP) A(IP,IP)=(COS**2)*(AI+TAN*(2.0*A(IP,JP)+TAN*A(JP,JP))) A(JP,JP)=(COS**2)*(A(JP,JP)-TAN*(2.0*A(IP,JP)-TAN*AI)) A(IP,JP)=0.0 IF(A(IP,IP).GE.A(JP,JP)) GO TO 15 TT=A(IP,IP) A(IP,IP)=A(JP,JP) A(JP,JP)=TT IF(SIN.GE.0) GO TO 16 TT=COS GO TO 17 16 TT=-COS 17 COS=DABS(SIN) SIN=TT 15 DO 18 I=1,MI IF(I-IP) 19, 18, 20 20 IF(I.EQ.JP)GO TO 18 19 IF(MM(I).EQ.IP) GO TO 21 IF(MM(I).NE.JP) GO TO 18 21 K=MM(I) TT=A(I,K) A(I,K)=0.0 MJ=I+1 P(I)=0.0 DO 22 J=MJ,N IF(P(I).GT.DABS(A(I,J))) GO TO 22 P(I)=DABS(A(I,J)) MM(I)=J 22 CONTINUE A(I,K)=TT 18 CONTINUE P(IP)=0.0 P(JP)=0.0 DO 23 I=1,N IF(I-IP) 24, 23, 25 24 TT=A(I,IP) A(I,IP)=COS*TT+SIN*A(I,JP) IF(P(I).GE.DABS(A(I,IP))) GO TO 26 P(I)=DABS(A(I,IP)) MM(I)=IP 26 A(I,JP)=-SIN*TT+COS*A(I,JP) IF(P(I).GE.DABS(A(I,JP))) GO TO 23 30 P(I)=DABS(A(I,JP)) MM(I)=JP GO TO 23 25 IF(I.LT.JP) GO TO 27 IF(I.GT.JP) GO TO 28 IF(I.EQ.JP) GO TO 23 27 TT=A(IP,I) A(IP,I)=COS*TT+SIN*A(I,JP) IF(P(IP).GE.DABS(A(IP,I))) GO TO 29 P(IP)=DABS(A(IP,I)) MM(IP)=I 29 A(I,JP)=-TT*SIN+COS*A(I,JP) IF(P(I).GE.DABS(A(I,JP))) GO TO 23 GO TO 30 28 TT=A(IP,I) A(IP,I)=TT*COS+SIN*A(JP,I) IF(P(IP).GE.DABS(A(IP,I))) GO TO 31 P(IP)=DABS(A(IP,I)) MM(IP)=I 31 A(JP,I)=-TT*SIN+COS*A(JP,I) IF(P(JP).GE.DABS(A(JP,I))) GO TO 23 P(JP)=DABS(A(JP,I)) MM(JP)=I 23 CONTINUE IF(NN.EQ.0) GOTO 7 DO 32 I=1,N TT=V(I,IP) V(I,IP)=TT*COS+SIN*V(I,JP) V(I,JP)=-TT*SIN+COS*V(I,JP) 32 CONTINUE GO TO 7 12 DO I=1,N DO J=1,N TEMP=A(I,J) A(I,J)=W(I,J) W(I,J)=TEMP ENDDO ENDDO DO I=1,N DO J=1,N IF(I.NE.J) W(I,J)=0.0 ENDDO ENDDO C NOW A STORES THE ORIGINAL MATRIX, W(I,I) STORES WIGENVALUES AND C V STORES EIGENVECTORS RETURN END