10 REM Program scans a range of values to search for roots, minima, 20 REM and maximum of a function 30 REM Copyright (c) 2012 by Namir Shammas 40 REM Version 1.0.0D Delux Version Requires JPCROM 50 REM Last Update: 60 REM =============== VARIABLE NAMES TABLE ================ 70 REM B0 <==> BMOVEONEEXTRASTEP 80 REM D0 <==> DA 90 REM D1 <==> DB 100 REM D2 <==> DRV2 110 REM F0 <==> FA 120 REM F1 <==> FB 130 REM F2 <==> FTOLER 140 REM F3 <==> FX 150 REM N0 <==> NUMSTEPS 160 REM S0 <==> SDA 170 REM S1 <==> SDB 180 REM S2 <==> SFA 190 REM S3 <==> SFB 200 REM S4 <==> STEPSIZE 210 REM S5 <==> STP 220 REM T0 <==> TOLER 230 REM X0 <==> XA 240 REM X1 <==> XB 250 REM ==================================================== 250 DESTROY ALL 260 RADIANS 270 REM USER-DEFINED FUNCTION 280 DEF FNF(X) = EXP(X) - 3*X^2 290 REM 300 REM CALCULATE FIRST DERIVATIVE 310 DEF FNF1(X,F0) 320 H = 0.001*(1+ABS(X)) 330 FNF1 = (FNF(X+H)-F0)/H 340 END DEF 350 REM 360 REM CALCULATE SECOND DERIVATIVE 370 DEF FNF2(X) 380 H = 0.001*(1+ABS(X)) 390 F0=FNF(X) 400 F1=FNF(X+H) 410 F2=FNF(X-H) 420 FNF2 = (F1-2*F0+F2)/H^2 430 END DEF 440 REM 450 REM CALCULATE ROOT USING NEWTON'S METHOD 460 DEF FNN(X,T0) 470 REPEAT 480 H = 0.001*(1+ABS(X)) 490 F0=FNF(X) 500 D=H*F0/(FNF(X+H)-F0) 510 X=X-D 520 UNTIL ABS(D) F2 THEN 1000 IF D2 > 0 THEN 1010 DISP "ROOT & MINIMUM" @ PAUSE 1020 ELSE 1030 DISP "ROOT & MAXIMUM" @ PAUSE 1040 END IF 1050 ELSE 1060 DISP "ROOT & SADDLE POINT"@ PAUSE 1070 END IF 1080 END IF 1090 B0 = 1 1100 END IF 1110 REM ---------------- 1120 REM ---------------- 1130 REM FOUND A RANGE THAT CONTAINS A ROOT? 1140 IF S3 * S2 < 0 THEN 1150 X = FNN((X0 + X1) / 2, T0) 1160 DISP "X="; X @ PAUSE 1170 DISP "FX="; FNF(X)@ PAUSE 1180 B0 = 1 1190 END IF 1200 REM ---------------- 1210 REM ---------------- 1220 REM LOCATED A RANGE THAT HAS A MINIMUM/MAXIMUM/ROOT? 1230 IF S2 * S3 > 0 AND S0 * S1 < 0 THEN 1240 X = FNO((X0 + X1) / 2, T0) 1250 D2 = FNF2(X) 1260 REM FOUND A ROOT? 1270 DISP "X="; X @ PAUSE 1280 F3=FNF(X) 1290 DISP "FX="; F3 @ PAUSE 1300 B0 = 1 1310 IF ABS(F3) < F2 THEN 1320 DISP "ROOT/"; 1330 ELSE 1340 DISP ""; 1350 END IF 1360 IF D2 > 0 THEN 1370 DISP "MINIMUM" @ PAUSE 1380 ELSE 1390 DISP "MAXIMUM" @ PAUSE 1400 END IF 1410 END IF 1420 REM ---------------- 1430 REM ---------------- 1440 IF B0 = 1 THEN 1450 N0 = N0 + 1 1460 X0 = A + N0 * S4 1470 F0 = FNF(X0) 1480 D0 = FNF1(X0, F0) 1490 S2 = SGN(F0) 1500 S0 = SGN(D0) 1510 ELSE 1520 X0 = X1 1530 F0 = F1 1540 D0 = D1 1550 S2 = S3 1560 S0 = S1 1570 END IF 1580 UNTIL X0 >= B 1590 DISP "DONE!" 1600 END Simple Version -------------- 10 REM Program scans a range of values to search for roots, minima, 20 REM and maximum of a function 30 REM Copyright (c) 2012 by Namir Shammas 40 REM Version 1.0.0R Regular Version 50 REM Last Update: 60 REM =============== VARIABLE NAMES TABLE ================ 70 REM B0 <==> BMOVEONEEXTRASTEP 80 REM D0 <==> DA 90 REM D1 <==> DB 100 REM D2 <==> DRV2 110 REM F0 <==> FA 120 REM F1 <==> FB 130 REM F2 <==> FTOLER 140 REM F3 <==> FX 150 REM N0 <==> NUMSTEPS 160 REM S0 <==> SDA 170 REM S1 <==> SDB 180 REM S2 <==> SFA 190 REM S3 <==> SFB 200 REM S4 <==> STEPSIZE 210 REM S5 <==> STP 220 REM T0 <==> TOLER 230 REM X0 <==> XA 240 REM X1 <==> XB 250 REM ====================================================250 DESTROY ALL 260 RADIANS 270 REM USER-DEFINED FUNCTION 280 DEF FNF(X) = EXP(X) - 3*X^2 290 REM 300 REM CALCULATE FIRST DERIVATIVE 310 DEF FNF1(X,F0) 320 H = 0.001*(1+ABS(X)) 330 FNF1 = (FNF(X+H)-F0)/H 340 END DEF 350 REM 360 REM CALCULATE SECOND DERIVATIVE 370 DEF FNF2(X) 380 H = 0.001*(1+ABS(X)) 390 F0=FNF(X) 400 F1=FNF(X+H) 410 F2=FNF(X-H) 420 FNF2 = (F1-2*F0+F2)/H^2 430 END DEF 440 REM 450 REM CALCULATE ROOT USING NEWTON'S METHOD 460 DEF FNN(X,T0) 470 REM REPEAT 480 H = 0.001*(1+ABS(X)) 490 F0=FNF(X) 500 D=H*F0/(FNF(X+H)-F0) 510 X=X-D 520 IF ABS(D)>=T0 THEN 470 530 FNN=X 540 END DEF 550 REM 560 REM CALCULATE OPTIMUM USING NEWTON'S METHOD 570 DEF FNO(X,T0) 580 REM REPEAT 590 H = 0.001*(1+ABS(X)) 600 F0=FNF(X) 610 F1=FNF(X+H) 620 F2=FNF(X-H) 630 D1=(F1-F2)/2/H 640 D2=(F1-2*F0+F2)/H^2 650 D=D1/D2 660 X=X-D 670 IF ABS(D)>=T0 THEN 580 680 FNO=X 690 END DEF 700 REM 710 REM 720 REM ------------ START ------------- 730 REM 740 INPUT "ENTER A? ";A 750 INPUT "ENTER B? ";B 760 INPUT "ENTER STEP SIZE? ","0.1";S4 770 INPUT "ENTER TOLERANCE? ","1E-8";T0 780 INPUT "ENTER FX TOLERANCE? ","1E-4";F2 790 X0=A 800 F0 = FNF(X0) 810 D0 = FNF1(X0,F0) 820 S2 = SGN(F0) 830 S0 = SGN(D0) 840 N0 = 0 850 REM REPEAT 860 N0 = N0 + 1 870 B0 = 0 880 X1 = A + N0 * S4 890 F1 = FNF(X1) 900 D1 = FNF1(X1, F1) 910 S3 = SGN(F1) 920 S1 = SGN(D1) 925 DISP "X @ ";X1 @ WAIT 1 930 REM LANDED ON A ROOT?? 940 IF ABS(F1) # 0 THEN 1140 950 DISP "X=";X1@ PAUSE 960 DISP "FX=0"@ PAUSE 970 D2 = FNF2(X1) 980 IF S0 * S1 >= 0 THEN 1080 990 IF ABS(D2) <= F2 THEN 1060 1000 IF D2 <= 0 THEN 1030 1010 DISP "ROOT & MINIMUM" @ PAUSE 1020 GOTO 1090 1030 DISP "ROOT & MAXIMUM" @ PAUSE 1040 GOTO 1090 1060 DISP "ROOT & SADDLE POINT"@ PAUSE 1090 B0 = 1 1100 REM END IF 1110 REM ---------------- 1120 REM ---------------- 1130 REM FOUND A RANGE THAT CONTAINS A ROOT? 1140 IF S3 * S2 >= 0 THEN 1230 1150 X = FNN((X0 + X1) / 2, T0) 1160 DISP "X="; X @ PAUSE 1170 DISP "FX="; FNF(X)@ PAUSE 1180 B0 = 1 1190 END IF 1200 REM ---------------- 1210 REM ---------------- 1220 REM LOCATED A RANGE THAT HAS A MINIMUM/MAXIMUM/ROOT? 1230 IF NOT(S2 * S3 > 0 AND S0 * S1 < 0) THEN 1440 1240 X = FNO((X0 + X1) / 2, T0) 1250 D2 = FNF2(X) 1260 REM FOUND A ROOT? 1270 DISP "X="; X @ PAUSE 1280 F3=FNF(X) 1290 DISP "FX="; F3 @ PAUSE 1300 B0 = 1 1310 IF ABS(F3) >= F2 THEN 1360 1320 DISP "ROOT/"; 1330 GOTO 1360 1340 DISP ""; 1360 IF D2 > 0 THEN DISP "MINIMUM" ESLE DISP "MAXIMUM" 1370 PAUSE 1420 REM ---------------- 1430 REM ---------------- 1440 IF B0 = 0 THEN 1520 1450 N0 = N0 + 1 1460 X0 = A + N0 * S4 1470 F0 = FNF(X0) 1480 D0 = FNF1(X0, F0) 1490 S2 = SGN(F0) 1500 S0 = SGN(D0) 1510 GOTO 1580 1520 X0 = X1 1530 F0 = F1 1540 D0 = D1 1550 S2 = S3 1560 S0 = S1 1570 END IF 1580 IF X0 < B THEN 850 1590 DISP "DONE!" 1600 END