1 REM Eigenvalues and eigenvectors for a symmetric matrix. Eispack algorithm, taken after IMSL's EIGRS (1979) 2 N=5 3 N1=N*(N+1)/2 4 REPS=1 5 IF REPS+1=1 THEN GOTO 8 6 REPS=REPS/2 7 GOTO 5 8 REPS=REPS*2 30 DIM A(121),A1(121),D(11),E(11),Z(11,11) 31 REM The Matrix is for Hueckel's method for the Butadiene molecule Hamiltonian 32 A(1)=1.4 :: A(2)=.6 :: A(5)=.8 :: A(9)=.6 :: A(11)=.6 :: A(14)=.8 100 FOR I=1 TO N1 110 A1(I)=A(I) 120 NEXT I 130 REM 140 REM 150 N9=N1-1 160 N2=N1-N 170 FOR I1=1 TO N 180 I=N+1-I1 190 L=I-1 200 H=0 210 S=0 220 IF L<1 THEN 290 230 N8=N9 240 FOR K=1 TO L 250 S=S+ABS(A(N8)) 260 N8=N8+1 270 NEXT K 280 IF S<>0 THEN 310 290 E(I)=0 300 GOTO 820 310 N8=N9 320 S1=1/S 330 FOR K=1 TO L 340 A(N8)=A(N8)*S1 350 H=H+A(N8)*A(N8) 360 N8=N8-1 370 NEXT K 380 F=A(N9) 390 G=-SQR(H) 400 IF F<0 THEN G=-G 410 E(I)=S*G 420 H=H-F*G 430 A(N9)=F-G 440 IF L=1 THEN 790 450 F=0 460 J2=1 470 FOR J=1 TO L 480 G=0 490 I2=N2+1 500 J1=J2 510 FOR K=1 TO J 520 G=G+A(J1)*A(I2) 530 J1=J1+1 540 I2=I2+1 550 NEXT K 560 J3=J+1 570 IF L=0 THEN D(L)=E(L)/(P+R) 1210 IF P<0 THEN D(L)=E(L)/(P-R) 1220 H=G-D(L) 1230 FOR I=L1 TO N 1240 D(I)=D(I)-H 1250 NEXT I 1260 F=F+H 1270 P=D(M) 1280 C=1 1290 S=0 1300 M1=M-1 1310 M2=M1+L 1320 IF L>M1 THEN 1570 1330 FOR I1=L TO M1 1340 I=M2-I1 1350 G=C*E(I) 1360 H=C*P 1370 IF ABS(P)B THEN 1140 1600 D(L)=D(L)+F 1610 NEXT L 1620 FOR I=1 TO N 1630 K=I 1640 P=D(I) 1650 I3=I+1 1660 IF I3>N THEN 1720 1670 FOR J=I3 TO N 1680 IF D(J)>=P THEN 1710 1690 K=J 1700 P=D(J) 1710 NEXT J 1720 IF K=I THEN 1800 1730 D(K)=D(I) 1740 D(I)=P 1750 FOR J=1 TO N 1760 P=Z(J,I) 1770 Z(J,I)=Z(J,K) 1780 Z(J,K)=P 1790 NEXT J 1800 NEXT I 1810 GOTO 1850 1820 PRINT "error";L 1830 REM 1840 REM 1850 IF N=1 THEN 2020 1860 FOR I=2 TO N 1870 L=I-1 1880 I1=I*L/2 1890 H=A(I1+I) 1900 IF H=0 THEN 2010 1910 FOR J=1 TO N 1920 S=0 1930 FOR K=1 TO L 1940 S=S+A(I1+K)*Z(K,J) 1950 NEXT K 1960 S=S/H 1970 FOR K=1 TO L 1980 Z(K,J)=Z(K,J)-S*A(I1+K) 1990 NEXT K 2000 NEXT J 2010 NEXT I 2020 REM 2050 REM 2080 FOR J=1 TO N 2100 CALL CLEAR :: PRINT "Eigenvalue and eigenvector";J :: PRINT "Eig.val = ",D(J) 2110 !PRINT "Eigenvector" 2120 FOR I=1 TO N :: PRINT Z(I,J) 2130 NEXT I 2140 R=0 2150 FOR I=1 TO N 2160 S=0 2170 FOR K=1 TO N 2180 IF I=K THEN F=A1(I*(I-1)/2+K) 2200 IF I=K THEN F=F-D(J) 2210 S=S+F*Z(K,J) 2220 NEXT K 2230 IF R to finish" 2255 INPUT A$ 2260 NEXT J 2265 GOTO 2080 2270 END