1 DIM A(37),B(37),C(36),D(36) 2 SIGNIFICANCE 10 4 TOL=.00001 5 ! VALUES PLACED IN THE A() ARRAY ARE LOST DURING EXECUTION 7 PRINT TAB(-1,0) 10 INPUT "WOULD YOU LIKE THE INSTRUCTIONS FOR USING THIS PROGRAM?(YES OR NO)";A$ 15 IF A$="NO" THEN 200 20 IF A$="N" THEN 200 25 ?:?:? 27 REM INSTRUCTIONS FOR USER 30 PRINT "THIS PROGRAM WILL FIND THE ROOTS OF A POLYNOMIAL UP TO 36TH DEGREE":? 35 PRINT "A POLYNOMIAL IS SIMPLY A LINEAR COMBINATION OF VARIOUS POWERS OF" 40 PRINT "A GIVEN VARIALBLE.":?:? " FOR EXAMPLE:":? 45 PRINT "Y = C0 + C1*X + C2*X^2 + C3*X^3 + C4*X^4 + ... + CN*X^N":? 50 PRINT "IN THE ABOVE EXAMPLE, C0 IS THE CONSTANT TERM AND C1,C2,C3,C4,..CN" 55 PRINT "ARE THE COEFFICIENTS OF THE VARIOUS POWERS OF X":? 60 PRINT "THE ORDER OF A POLYNOMIAL IS DEFINED AS THE LARGEST POWER OF X WITH" 65 PRINT "A NON-ZERO COEFFICIENT":? 70 PRINT "THE ORDER OF Y=3 - 2*X + X^4 IS 4 FOR Y=3 + 2*X^10 THE ORDER IS 10":? 75 PRINT "THIS PROGRAM WILL ONLY WORK FOR POLYNOMIALS WITH AN ORDER GREATER" 76 PRINT "THAN, BUT NOT EQUAL TO ZERO, AND LESS THAN 36.":? 80 PRINT TAB(25);"HIT RETURN TO CONTINUE";:INPUT A$ 82 PRINT TAB(-1,0) 85 PRINT "AN NTH ORDER POLYNOMIAL WILL HAVE N ROOTS AND THIS PROGRAM WILL "; 90 PRINT "FIND THEM ALL;":? 95 PRINT "BOTH REAL AND IMAGINARY":? 100 PRINT "ALL THE ROOTS WILL BE RETURNED IN THE FOLLOWING FORM: A+B*I":? 105 PRINT "IF B IS NOT ZERO THE ROOT IS IMAGINARY AND HAS NO PHYSICAL"; 110 PRINT " INTERPRETATION.":? 115 PRINT "HOWEVER, IF B=0 THE ROOT IS REAL AND REPRESENTS THE POINT AT WHICH" 120 PRINT "THE VALUE OF THE FUNCTION IS ZERO." 125 PRINT "(I.E. THE POINT WHERE THE GRAPH CROSSES THE HORIZONTAL OR X AXIS.)" 130 PRINT:? "TO ENTER YOUR POLYNOMIAL JUST ANSWER THE QUESTIONS THAT "; 135 PRINT "THE PROGRAM ASKS":?:?:?:? 140 PRINT "REMEMBER:";TAB(30);"1) THE ORDER OF THE POLYNOMIAL MUST BE >0 "; 142 PRINT "AND <36.":? 145 PRINT TAB(30);"2) THE HIGHEST POWER COEFFICIENT MUST NOT BE ZERO":? 150 PRINT TAB(30);"3) REAL ROOTS ARE THOSE WITH NO IMAGINARY PART" 155 INPUT "HIT RETURN TO CONTINUE";A$ 160 PRINT TAB(-1,0) 165 GOTO 200 190 REM INPUT OF DATA 200 INPUT "ORDER OF THE POLYNOMIAL?";Z 205 I1=Z+1 206 IF I1>36 OR I1<=1 GOSUB 1000 210 INPUT "CONSTANT TERM=?";A(1) 215 FOR I=1 TO Z 220 PRINT "COEFFICENT OF X^";I;:INPUT "TERM = ?";A(I+1) 225 NEXT I 230 PRINT TAB(-1,0) !CLEARS SCREEN AND HOMES CURSOR 235 PRINT TAB(1,1);"Y= "; 240 Z=INT(I1/4+.8) 243 PRINT TAB(5);A(1);" + ";A(2);"*X + ";A(3);"*X^ 2 + ";A(4);"*X^ 3":? 244 IF Z<2 THEN 270 245 FOR I=1 TO Z-1 247 IF I=9 GOTO 266 250 PRINT TAB(5);A(1+4*I);"*X^";4*I;" + ";A(2+4*I);"*X^";4*I+1;" + "; 255 PRINT A(3+4*I)"*X^";4*I+2;" + ";A(4+4*I);"*X^";3+4*I 262 PRINT 263 NEXT I 265 IF I<9 THEN 270 266 PRINT TAB(5);A(1+4*I);"*X^";4*I 270 ?: GOTO 1050: REM ERROR CHECKING SUBROUTINE 1000 IF I1<37 THEN 1010 1003 REM I1 IS THE NUMBER OF COEFFICIENTS ENTERED 1004 REM ER IS THE ERROR MESSAGE CODE 1005 ER=2: GOTO 1980 1010 IF I1>1 THEN 1020 1015 ER=1: GOTO 1980 1020 IF ABS(A(I1))-TOL>0 THEN 1050 1030 ER=4: GOTO 1980 1032 RETURN 1050 N=I1-1 1055 IF N<=0 THEN 1980 1060 N1=N 1070 N2=N+1 1080 N3=1 1090 K=N+1 1100FOR L=1 TO K 1110 M1=K-L+1 1120 B(M1)=A(L) 1130 NEXT L 1135 REM SET INITIAL VALUES 1140 X0=.00500101 1150 Y0=.01000101 1155 REM ZERO INITIAL VALUE COUNTER 1160 I2=0 1170 X2=X0 1175 REM INCREMENT INITIAL VALUES AND COUNTER 1180 X0=-10*Y0 1181 Y0=-10*X2 1182 X2=X0 1183 REM SET X AND Y TO CURRENT VALUES 1190 Y1=Y0 1200 I2=I2+1 1210 GO TO 1250 1220 I3=1 1230 X3=X2 1240 Y3=Y1 1245 REM EVALUATE POLYNOMIAL AND DERIVATIVES 1250 I4=0 1260 U1=0 1270 U2=0 1280 V=0 1290 Y4=0 1300 X4=1 1310 U=B(N+1) 1320 IF U=0 THEN 1770 1330 FOR I=1 TO N STEP 1 1340 L=N-I+1 1350 X5=X2*X4-Y1*Y4 1360 Y5=X2*Y4+Y1*X4 1370 U=U+B(L)*X5 1380 V=V+B(L)*Y5 1390 F=I 1400 U1=U1+F*X4*B(L) 1410 U2=U2-F*Y4*B(L) 1420 X4=X5 1430 Y4=Y5 1440 NEXT I 1450 S=U1*U1+U2*U2 1460 IF S = 0 THEN 1670 1470 D1=(V*U2-U*U1)/S 1480 X2=X2+D1 1490 D2=-(U*U2+V*U1)/S 1500 Y1=Y1+D2 1510 IF ABS(D2)+ABS(D1)-1.0E-05 <0 THEN 1570 1515 REM STEP ITERATION COUNTER 1520 I4=I4+1 1525 REM I4 IS THE ITERATION COUNTER 1530 IF I4-500 <0 THEN 1260 1540 IF I3 <>0 THEN 1570 1545 REM I2 IS THE NUMBER OF DIFFERENT STARTING VALUES USED 1550 IF I2-5 < 0 THEN 1170 1555 ER=3 1560 GO TO 1980 1570 FOR L=1 TO N2 STEP 1 1580 M1=K-L+1 1590 T=A(M1) 1600 A(M1)=B(L) 1610 B(L)=T 1620 NEXT L 1630 T1=N 1640 N=N1 1650 N1=T1 1660 IF I3 = 0 THEN 1220 1661 IF I3 <>0 THEN 1700 1670 IF I3 = 0 THEN 1170 1680 X2=X3 1690 Y1=Y3 1700 I3=0 1710 IF X2 = 0 THEN 1730 1720 IF ABS(Y1)-ABS(X2)*1.0**-4 <0 THEN 1800 1730 A1=X2+X2 1740 S=X2*X2+Y1*Y1 1750 N=N-2 1760 GO TO 1840 1770 X2=0 1780 N1=N1-1 1790 N2=N2-1 1800 Y1=0 1810 S=0 1820 A1=X2 1830 N=N-1 1840 L1=1 1850 L2=2 1860 B(L2)=B(L2)+A1*B(L1) 1870 FOR L=2 TO N STEP 1 1880 B(L+1)=B(L+1)+A1*B(L)-S*B(L-1) 1885 NEXT L 1886 REM ARRAY C() CONTAINS REAL PORTIONS OF ALL ROOTS 1887 REM ARRAY D() CONTAINS IMAGINARY PORTION OF ALL ROOTS 1890 D(N3)=Y1 1900 C(N3)=X2 1910 N3=N3+1 1920 IF S = 0 THEN 1960 1930 Y1=-Y1 1940 S=0 1950 GO TO 1890 1960 IF N <=0 THEN 2010 1970 IF N > 0 THEN 1140 1980 ?:?:? TAB(22);"ERROR...ERROR...ERROR...ERROR...ERROR...ERROR" 1982 ?:? TAB(37);"ERROR = ";ER:?:? 1984 PRINT TAB(35);"ERROR CODE":?:? 1986 PRINT TAB(15);"ERROR = 1 ORDER OF POLYNOMIAL IS LESS THAN ONE":? 1988 PRINT TAB(15);"ERROR = 2 ORDER OF POLYNOMIAL IS GREATER THAN 36":? 1990 PRINT TAB(15);"ERROR = 3 UNABLE TO DETERMINE ROOT WITHIN 500 ITERATIONS" 1992 PRINT TAB(26);"AND 5 STARTING VALUES.":? 1994 PRINT TAB(15);"ERROR = 4 HIGHEST ORDER COEFFICIENT IS LESS THAN";TOL:? 1996 INPUT "HIT RETURN TO CONTINUE";A$ 1998 PRINT TAB(-1,0) !CLEAR SCREEN 2000 GOTO 200 2005 REM OUTPUT OF RESULTS 2010 PRINT TAB(15);".......THE ROOTS TO THE ABOVE POLYNOMIAL ARE AS FOLLOWS........" 2015 FOR I=1 TO I1-1 2020 PRINT TAB(25);C(I);" + ";D(I);"*I" 2025 NEXT I 2030 INPUT "DO YOU HAVE ANOTHER POLYNOMIAL?";A$ 2035 IF A$="NO" THEN 3000 2040 IF A$="N" THEN 3000 2045 PRINT TAB(-1,0) 2050 GOTO 200 2055 REM A PROGRAM BY JACK WARNER AND DON PENLAND 2060 REM SURPRISE VALLEY HIGH SCHOOL, PO BOX 28-F, CEDARVILLE, CA 96104 2065 REM THIS PROGRAM WAS ADAPTED FROM AN IBM FORTRAN PROGRAM 2070 REM SO IT COULD BE USED ON AN ALPHA MICRO SYSTEM 3000 END