3 REM GSIMEQ:SIMULTANEOUS LINEAR EQUATIONS 4 REM ADAPTED BY DSAA 10 DIM A(20,20),B(20,11),R(20,11) 91 GOSUB 300 100 REM -- GET VARIABLE NAMES 101 GOSUB 500 105 REM -- INITIALIZE AND RE-DIMENSION MATRICES 106 MAT A=ZER(N9,N9) 107 MAT B=ZER(N9,X9+1) 110 REM -- GET EQUATIONS 111 GOSUB 600 120 REM -- SOLVE EQUATION SYSTEM 121 GOSUB 1100 130 REM -- PRINT RESULTS 131 GOSUB 1200 132 GOTO 9999 300 REM -- GIVE INSTRUCTIONS 310 PRINT'DO YOU WANT INSTRUCTIONS'; 311 INPUT V$ 312 IF MID(V$,1,1)='Y' THEN 320 313 PRINT 314 RETURN 320 PRINT 322 PRINT'I WILL ASK YOU FOR EXOGENEOUS VARIABLES AND' 324 PRINT'ENDOGENEOUS VARIABLES. EACH VARIABLE CONSISTS' 326 PRINT'OF A SINGLE ALPHABETIC CHARACTER. YOU MAY SEPARATE' 328 PRINT'VARIABLES WITH COMMAS OR BLANKS -- FOR EXAMPLE' 330 PRINT' EXOGENEOUS VARIABLES: G,I' 332 PRINT'IF THERE ARRE NO EXOGENEOUS VARIABLES, ANSWER --' 334 PRINT' EXOGENEOUS VARIABLES: NONE' 336 PRINT'I WILL THEN ASK YOU FOR YOUR EQUATIONS.' 338 PRINT'YOU MAY USE ANY LINEAR EQUATION WITH CONSTANTS.' 340 PRINT'(NOT VARIABLES) AS PARAMETERS.' 342 PRINT'MULTIPLICATION MAY BE EXPLICIT (*) OR IMPLICIT.' 344 PRINT'DO NOT PLACE A MINUS SIGN IMMEDIATELY AFTER "=".' 346 PRINT'HERE ARE SOME EXAMPLES --' 348 PRINT' C+I+G=Y' 350 PRINT' C=.9Y' 352 PRINT' I=100-.2*Y' 354 PRINT'HERE GOES--' 356 PRINT 360 RETURN 500 REM -- SUBROUTINE TO GET VARIABLE NAMES 501 X1=255 510 PRINT'EXOGENEOUS VARIABLES: '; 511 INPUT LINE X$: X$=LEFT(X$,LEN(X$)-2%) 512 PRINT 520 IF X$<>'NONE' THEN 530 521 X$='' 530 PRINT'ENDOGENEOUS VARIABLES: '; 531 INPUT LINE N$: N$=LEFT(N$,LEN(N$)-2%) 540 IF N$<>'NONE' THEN 550 541 N$='' 550 REM -- PRESS OUT COMMAS 551 W$=X$ 552 GOSUB 580 553 X$=Z$ 554 X9=LEN(X$) 555 W$=N$ 556 GOSUB 580 557 N$=Z$ 558 N9=LEN(N$) 560 REM -- X$(I,I) IS THE I'TH EXOGENEOUS VARIABLE 561 REM -- N$(I,I) IS THE I'TH ENDOGENEOUS VARIABLE 562 REM -- THERE ARE X9 EXOGENEOUS VARIABLES 563 REM -- THERE ARE N9 ENDOGENEOUS VARIABLES 570 RETURN 580 REM -- SUBROUTINE TO COPY W$ MINUS COMMAS AND BLANKS TO Z$ 581 Z$='' 584 FOR I=1 TO LEN(W$) 585 IF MID(W$,I,1)=' ' THEN 590 586 IF MID(W$,I,1)=',' THEN 590 587 Z1=LEN(Z$)+1 588 Z$=LEFT(Z$,Z1-1)+MID(W$,I,1)+RIGHT(Z$,Z1+1) 590 NEXT I 591 RETURN 600 REM -- SUBROUTINE TO GET EQUATIONS 610 PRINT 611 PRINT'I AM GOING TO ASK YOU FOR ';N9;' EQUATIONS.' 612 PRINT 615 REM -- E$ IS AN EQUATION 617 X1=255 620 FOR I8=1 TO N9 622 PRINT'EQUATION: '; 623 INPUT E$ 629 PRINT 630 I9=I8 632 GOSUB 800 634 IF I9=-1 THEN 622 640 NEXT I8 650 RETURN 800 REM -- ROUTINE TO PARSE EQUATION IN E$ INTO ROW I9810 REM L$='L' FOR LEFT:HAND SIDE OF EQUATION, 'R' FOR RIGHT 811 L$='L' 820 REM -- S9=+1 IF SIGN OF NUMBER IF +, -1 OTHERWISE 821 S9=+1 825 REM -- D9=NUMBER OF DIGITS SINCE DECIMAL POINT 826 D9=0 827 REM -- F9=-1 IF NO NUMBER, 0 IS NO DECIMAL FOUND, 1 IF FOUND 828 F9=-1 830 REM -- D$ IS SET OF DIGITS 832 D$='0123456789' 835 REM -- V$=VARIABLE IN THE TERM BEING ANALYZED 836 N1=0 842 V$='' 850 FOR I=1 TO (LEN(E$)+1) 851 IF I=(LEN(E$)+1) THEN 900 852 C$=MID(E$,I,1) 860 IF C$=' ' THEN 990 861 IF C$='*' THEN 990 865 IF C$='=' THEN 900 870 IF C$<>'.' THEN 875 871 F9=1 872 GOTO 990 875 IF C$='+' THEN 900 876 IF C$='-' THEN 900 878 FOR J=1 TO 10 879 IF C$=MID(D$,J,1) THEN 885 880 NEXT J 881 GOTO 895 885 N1=(N1*10)+(J-1) 886 IF F9<>-1 THEN 888 887 F9=0 888 IF F9=0 THEN 990 889 D9=D9+1 890 GOTO 990 895 REM -- APPEND CHARACTER TO VARIABLES NAME 896 V9=LEN(V$)+1 897 V$=LEFT(V$,V9-1)+C$+RIGHT(V$,V9+1) 898 GOTO 990 900 REM -- SEPARATOR OR END REACHED 905 REM -- SET UP NUMBER 906 IF F9<>-1 THEN 910 907 N1=1 908 GOTO 913 910 REM -- HANDLE DECIMAL PART 911 IF F9=0 THEN 913 912 N1=N1/(10^D9) 913 N1=S9*N1 920 REM -- CHECK FOR A CONSTANT 921 IF V$<>'' THEN 930 922 IF L$='R' THEN 925 923 N1=-N1 925 B(I9,X9+1)=B(I9,X9+1)+N1 926 GOTO 970 930 REM -- CHECK FOR AN ENDOGENEOUS VARIABLE 932 FOR J=1 TO N9 933 IF V$=MID(N$,J,1) THEN 940 934 NEXT J 935 GOTO 950 940 IF L$='L' THEN 942 941 N1=-N1 942 A(I9,J)=A(I9,J)+N1 943 GOTO 970 950 REM -- CHECK FOR AN EXOGENEOUS VARIABLE 952 FOR J=1 TO X9 953 IF V$=MID(X$,J,1) THEN 960 954 NEXT J 955 REM -- ERROR 956 GOTO 995 960 IF L$='R' THEN 962 961 N1=-N1 962 B(I9,J)=B(I9,J)+N1 970 REM --RESET VALUES 971 V$='' 972 S9=+1 973 IF C$<>"-" THEN 975 974 S9=-1 975 D9=0 976 F9=-1 977 N1=0 980 IF C$<>'=' THEN 990 981 L$='R' 990 NEXT I 991 RETURN 995 REM -- ERROR FOUND 996 PRINT'UNACCEPTABLE EQUATION -- RETYPE IT' 997 I9=-1 998 RETURN 1100 REM -- SUBROUTINE TO SOLVE EQUATION SYSTEM 1110 MAT A=INV(A) 1120 MAT R=ZER(N9,X9+1) 1130 MAT R=A*B 1140 RETURN 1200 REM -- PRINT RESULTS 1201 PRINT 1210 FOR I=1 TO N9 1220 PRINT MID(N$,I,1); 1222 PRINT TAB(3);'='; 1223 IF R(I,X9+1)<>0 THEN 1226 1224 PRINT " " 1225 GOTO 1230 1226 PRINT USING '#####.##',R(I,X9+1); 1230 FOR J=1 TO X9 1232 S$='+' 1234 IF R(I,J)>0 THEN 1237 1236 S$=' ' 1237 IF R(I,J)=1 THEN 1245 1238 IF R(I,J)=0 THEN 1248 1240 PRINT USING " ! #####.## *!",S$,R(I,J),MID(X$,J,1) 1241 GOTO 1250 1245 PRINT USING " ! *!",S$,MID(X$,J,1) 1247 GOTO 1250 1248 PRINT ' ' 1250 NEXT J 1255 PRINT 1260 NEXT I 1270 RETURN 9999 END