7  REM HP CONTRIBUTED LIBRARY, 2/75
9  REM -- GIVE INSTRUCTIONS
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 RESTLTS
131  GOSUB 1200
132  STOP 
300  REM -- GIVE INSTRUCTIONS
310  PRINT "DO YOU WANT INSTRUCTIONS";
311  INPUT V$
312  IF 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 "  EXOGENOUS VARIABLES: G,I"
332  PRINT "IF THERE ARE 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."
343  PRINT "DO NOT BEGIN AN EQUATION WITH A MINUS SIGN."
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
502  DIM Z$[15],W$[30]
505  DIM X$[20],N$[20]
510  PRINT "EXOGENEOUS VARIABLES: ";
511  ENTER X1,X2,X$
512  PRINT 
520  IF X$ <> "NONE" THEN 530
521  X$=""
530  PRINT "ENDOGENEOUS VARIABLES: ";
531  ENTER X1,X2,N$
532  PRINT 
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 W$[I,I]=" " THEN 590
586  IF W$[I,I]="," THEN 590
587  Z1=LEN(Z$)+1
588  Z$[Z1,Z1]=W$[I,I]
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
616  DIM E$[70]
617  X1=255
620  FOR I8=1 TO N9
622  PRINT "EQUATION: ";
623  ENTER X1,X2,E$
624  IF X2>0 THEN 629
625  PRINT "**** TOO MUCH TIME -- START EQUATION OVER"
626  GOTO 622
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 I9
810  REM L$="L" FOR LEFT:HAND SIDE OF EQUATION, "R" FOR RIGHT
811  L$="L"
820  REM -- S9=+1 IF SIGN OF NUMBER IS +, -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 IF NO DECIMAL FOUND, 1 IF FOUND
828  F9=-1
830  REM -- D$ IS SET OF DIGITS
831  DIM D$[10]
832  D$="0123456789"
835  REM -- N1 = NUMBER BEING ACCUMULATED
836  N1=0
840  REM -- V$=VARIABLE IN THE TERM BEING ANALYZED
841  DIM V$[10]
842  V$=""
850  FOR I=1 TO (LEN(E$)+1)
851  IF I=(LEN(E$)+1) THEN 900
852  C$=E$[I,I]
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$=D$[J,J] 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 VARIABLE NAME
896  V9=LEN(V$)+1
897  V$[V9,V9]=C$
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$=N$[J,J] 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$=X$[J,J] 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 N$[I,I];
1222  PRINT TAB(3);"=";
1223  IF R[I,X9+1] <> 0 THEN 1226
1224  PRINT  USING "#,8X"
1225  GOTO 1230
1226  PRINT  USING 1227;R[I,X9+1]
1227  IMAGE #,5D.2D
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 1242;S$,R[I,J],X$[J,J]
1241  GOTO 1250
1242  IMAGE #,X,A,5D.2D,"*",A
1245  PRINT  USING 1246;S$,X$[J,J]
1246  IMAGE #,X,A,8X,"*",A
1247  GOTO 1250
1248  PRINT  USING "#,12X"
1250  NEXT J
1255  PRINT 
1260  NEXT I
1270  RETURN 
9999  END 
