1  REM  ****  HP BASIC PROGRAM LIBRARY  ******************************
2  REM
3  REM        CXSYSS:  SOLVING SYSTEMS OF COMPLEX LINEAR EQUATIONS
4  REM
5  REM        36262  REV A  --  2/73
6  REM
7  REM  ****  CONTRIBUTED PROGRAM  ***********************************
10  DIM A[20,20],B[20,5],C[1,20],D[20,20]
20  READ M1
30  IF M1=999999. THEN 9998
40  READ N1,L1
50  PRINT "WHAT FREQUENCIES WOULD YOU LIKE THE SYSTEMS SOLVED FOR?"
60  Z=1
65  PRINT " : ";
70  INPUT F[Z]
80  IF F[Z]=999 THEN 110
90  Z=Z+1
100  IF Z <> 11 THEN 65
110  LET Z1=Z-1
115  FOR Z=1 TO Z1
120  MAT A=ZER[2*M1,2*N1]
130  MAT B=ZER[2*M1,L1]
145  PRINT '10'10"FREQUENCY = ";F[Z]
150  FOR C=1 TO M1
160  FOR D=1 TO N1
170  READ A[C,D]
180  A[C+M1,D+N1]=A[C,D]
190  READ A,B
200  IF B=0 OR F[Z]=0 THEN 240
210  A[C,D+N1]=-A*F[Z]-1/B/F[Z]
220  A[C+M1,D]=-A[C,D+N1]
230  GOTO 260
240  A[C,D+N1]=-A*F[Z]
250  GOTO 220
260  NEXT D
270  FOR D=1 TO L1
280  READ B[C,D],B[C+M1,D]
290  NEXT D
300  NEXT C
305  RESTORE 
310  N2=2*N1
320  M2=2*M1
330  N=0
340  MAT C=ZER[1,N2]
350  FOR B=1 TO (N2) MAX (M2)
360  IF B+N=N2+1 THEN 750
370  IF A[B,B+N]#0 THEN 550
390  FOR C=B+1 TO M2
400  IF A[C,B+N]#0 THEN 450
410  NEXT C
420  LET C[1,B+N]=N+1
430  N=N+1
440  GOTO 360
450  FOR D=B+N TO N2
460  K=A[B,D]
470  A[B,D]=A[C,D]
480  A[C,D]=K
490  NEXT D
500  FOR D=1 TO L1
510  K=B[B,D]
520  B[B,D]=B[C,D]
530  B[C,D]=K
540  NEXT D
550  FOR D=1 TO L1
560  LET B[B,D]=B[B,D]/A[B,B+N]
570  NEXT D
580  FOR D=N2 TO B+N STEP -1
590  A[B,D]=A[B,D]/A[B,B+N]
600  NEXT D
610  FOR C=1 TO M2
620  IF C=B THEN 730
630  FOR D=1 TO L1
640  LET B[C,D]=B[C,D]-A[C,B+N]*B[B,D]
650  IF ABS(B[C,D])>ABS(A[C,B+N]*B[B,D]*.000001) THEN 670
660  B[C,D]=0
670  NEXT D
680  FOR D=N2 TO B+N STEP -1
690  A[C,D]=A[C,D]-A[C,B+N]*A[B,D]
700  IF ABS(A[C,D])>ABS(A[C,B+N]*A[B,D]*.000001) THEN 720
710  A[C,D]=0
720  NEXT D
730  NEXT C
740  NEXT B
750  R=B-1
760  REM R=RANK, N=DIMENSION OF NULL SPACE
770  FOR C=R+N+1 TO N2
780  N=N+1
790  C[1,C]=N
800  NEXT C
810  IF N=0 THEN 1350
820  MAT D=ZER[N,N2]
830  C=1
840  IF C[1,C]#0 THEN 870
850  C=C+1
860  GOTO 840
870  B=C[1,C]
880  A=1
890  FOR D=1 TO C-1
900  IF C[1,D] <> 0 THEN 960
910  D[B,D]=A[A,C]
920  A=A+1
960  NEXT D
965  LET D[B,D]=-1
970  IF B<N THEN 850
980  REM ORTHOGONALIZATION
990  FOR B=1 TO N
1010  FOR C=1 TO B-1
1020  E=0
1030  FOR D=1 TO N2
1040  E=E+D[C,D]*D[B,D]
1050  IF ABS(E)>ABS(D[C,D]*D[B,D]*.000001) THEN 1070
1060  E=0
1070  NEXT D
1080  FOR D=1 TO N2
1090  D[B,D]=D[B,D]-E*D[C,D]
1100  IF ABS(D[B,D])>ABS(E*D[C,D]*.000001) THEN 1120
1110  D[B,D]=0
1120  NEXT D
1130  NEXT C
1140  E=0
1150  FOR C=1 TO N1
1160  LET E=E+D[B,C]^2+D[B,C+N1]^2
1170  NEXT C
1180  E=SQR(E)
1190  FOR C=1 TO N2
1200  D[B,C]=D[B,C]/E
1210  NEXT C
1220  NEXT B
1240  FOR B=1 TO N
1250  PRINT '10'10"VECTOR ";B;" OF NULL SPACE."'13'10
1255  PRINT '10"-----"'13'10
1260  FOR C=1 TO N1
1270  PRINT D[B,C],"+";D[B,C+N1];"*J","   ARG =";
1290  LET A1=D[B,C]
1300  B1=D[B,C+N1]
1310  GOSUB 1810
1320  PRINT P1
1330  NEXT C
1335  PRINT '13'10"-----"'13'10
1340  NEXT B
1345  PRINT 
1350  PRINT '10'10"SOLUTIONS"'13'10'10
1360  FOR B=1 TO L1
1370  PRINT TAB(5);"SYSTEM # ";B;
1380  FOR C=R+1 TO M2
1390  IF B[C,B]#0 THEN 1430
1400  NEXT C
1420  GOTO 1440
1430  PRINT " IS INCONSISTENT."'13'10'10"-----"'13'10
1435  GOTO 1750
1440  MAT E=ZER[1,N2]
1445  PRINT '13'10'10"-----"'13'10
1450  A=0
1460  FOR C=1 TO N2
1470  IF C[1,C]#0 THEN 1490
1480  E[1,C]=B[A+1,B]
1490  A=A+1
1500  NEXT C
1510  FOR C=1 TO N
1520  A=0
1530  FOR D=1 TO N2
1540  A=A+E[1,D]*D[C,D]
1550  IF ABS(A)>ABS(E[1,D]*D[C,D]*.000001) THEN 1570
1560  A=0
1570  NEXT D
1580  FOR D=1 TO N2
1590  E[1,D]=E[1,D]-A*D[C,D]
1600  IF ABS(E[1,D])>ABS(A*D[C,D]*.000001) THEN 1620
1610  E[1,D]=0
1620  NEXT D
1630  NEXT C
1650  FOR C=1 TO N1
1660  PRINT E[1,C],"+";E[1,C+N1];"*J  ARG =";
1700  A1=E[1,C]
1710  B1=E[1,C+N1]
1720  GOSUB 1810
1730  PRINT P1;" MOD =";R1
1740  NEXT C
1745  PRINT '10"-----"'13'10
1750  NEXT B
1760  FOR B=1 TO 65
1770  PRINT "*";
1780  NEXT B
1790  NEXT Z
1795  PRINT '13'10
1800  END 
1810  R1=SQR(A1^2+B1^2)
1820  P1=0
1830  IF R1=0 THEN 1940
1840  IF A1=0 THEN 1930
1850  P1=ATN(B1/A1)
1860  IF P1 >= 0 THEN 1880
1870  P1=P1+4*ATN(1)
1880  IF B1 >= 0 THEN 1900
1890  P1=P1+4*ATN(1)
1900  IF A1>0 OR B1#0 THEN 1920
1910  P1=P1+4*ATN(1)
1920  GOTO 1940
1930  P1=(2-SGN(B1))*2*ATN(1)
1940  RETURN 
1950  IF A1=0 THEN 1930
8900  DATA 2,2,2
8901  DATA 1,1,0,3,5,0,1,-3,3,9
8902  DATA -1,1,0,-5,3,0,3,1,2,1
9998  PRINT "YOU FORGOT TO ENTER THE DATA..."
9999  END 
