Some simple physics utility programs in BASIC. by Donald E. Simanek BASIC is a neat language, a handy, free (with DOS), calculational tool, which is always readily available on your computer. Many times I'll pop into basic and do a one-liner or few-liner calculation rather than get out my hand calculator. These programs are in vanilla BASIC, with few frills. Feel free to improve/modify them, and be kind enough to send your improvements back to me. Some of these were written for my Tandy 100 portable, which I take to lab with me. All of these programs should be exportable to any computer which runs basic, since they use no fancy screen graphics. These programs resulted from necessity, to avoid drudgery of things done often. Titles, all caps, precede each, and they have a short DOC preceding them. Use a text editor to extract only the numbered lines to a file with a .BAS extension, then run it under BASIC. These may be compiled, but most are so short that that's not necessary. HELMERT's EQUATION FOR g. Helmert's equation may be found in the Handbook of Chemistry and Physics. It gives the value of the acceleration due to gravity as a function of latitude and elevation above sea level. This program carries out the calculation for you. It allows you to enter latitude in degrees and minutes. Or the degree entry may have a decimal form, in which case you simply hit ENTER at the 'minutes' prompt. You are prompted for elevation in meters. If you enter zero, or just hit ENTER, you'll be prompted for elevation in feet. Exercises: See how much difference in g between equator, 45 degrees, 90 degrees (at the poles). See how much difference between sea level and the top of a mountain. How much is g at the height of an orbiting space station (a couple of hundred miles). At line 100 you may wish to supply data for your location. 10 'HELMERT.BAS, calculates acceleration due to gravity 20 'at any latitude and elevation. Written, 6/2/91. 25 PI = 3.1415927 30 SCREEN 2:CLS:LOCATE 1,1,1:'visible cursor 40 PRINT "HELMERT'S EQUATION, program by Donald Simanek. 50 PRINT:PRINT "Helmert's equation for the acceleration due to gravity is:" 60 PRINT " 2 -6 70 PRINT "g = 980.616 - 2.5928cos(2í) + 0.0069cos (2í) - 3.086x10 h 80 PRINT 90 PRINT "where í is the latitude and h is the elevation in centimeters. 100 PRINT:PRINT "Lock Haven U: latitude 41ø8', elevation 580 ft. 110 PRINT:PRINT "Enter degrees and minutes separately, as prompted. 120 PRINT:PRINT "If you enter degrees in decimal form, just hit 'enter' at minutes prompt. 130 PRINT:PRINT "Latitude, í, in degrees"; :INPUT PHI 160 PRINT "Minutes"; :INPUT PHIM 180 PHI = PHI + PHIM/60 :PRINT "í = ";PHI;"ø" :PHI = PHI*2*PI/360 181 PRINT:PRINT "Elevation, h, in meters"; :INPUT H :H=H*100 182 IF H=0 THEN 190 ELSE 215 190 LOCATE 19,1:PRINT " Elevation, h, in feet"; :INPUT H 210 H=H*30.48 :'Elevation above sea level, convert feet to centimeters 215 PRINT "h = ";H/100;" meters" 220 G = 980.616 - 2.5928*COS(2*PHI) + .0069*(COS(2*PHI))^2 - 3.086E-06*H 230 PRINT:PRINT "g =";G;"cm/s^2 =";G/100;"m/s^2" 240 PRINT:PRINT "Another calculation? [Y/n]"; 242 R$=INKEY$:IF R$="" THEN 242 245 IF R$="N" OR R$="n" THEN SYSTEM ELSE GOTO 30 250 'Last line of program. GAUSSIAN PLOT This program generates a pseudo-random number with a particular mean. It makes a histogram as it calculates. Observe the raggedness of the plot, even after many trials have been logged. The distrubution approaches a Gaussian, of course, but the raggedness persists. Note also that the mean, re-calculated each time a new number is generated, doesn't get very close to the pre-determined mean of the number generator until very many values are logged, and it continually fluctuates. 10 'GAUSPLOT, Gaussian distribution plot for t2k 15 SCREEN 2:LOCATE 1,1,0 30 DEFINT I,N 32 defdbl S 35 DIM S(101) 36 SUM=0 :SS=0 40 'initialize rand no on seconds 41 SEC=VAL(RIGHT$(TIME$,2)) 42 FOR I=1 TO SEC 43 DUMMY=RND(1) 44 NEXT I 45 D1=50 :D2=15 46 FOR I=1 TO 100 :S(I)=0 : NEXT 47 CLS 50 FOR I=1 TO 10000 60 GOSUB 9500 70 N=G1*63/100 79 LOCATE 15,1 :PRINT USING "N= #####";I; 80 S(N)=S(N)+1 :NN=S(N) 81 LOCATE 16,1 :PRINT USING "Value= ####";G1; 82 SUM=SUM+G1 :MEAN = SUM/I 84 LOCATE 17,1 :PRINT USING "Mean= ##.#####";MEAN; 85 DS=(G1-MEAN)^2 :SS=SS+DS 86 IF I=1 OR I>50 THEN ID=I ELSE ID=I-1 87 SA=SS/ID :SD=SQR(SA) 89 LOCATE 18,1 :PRINT USING "SD= ##.#####";SD; 90 IF N>63 OR N<0 GOTO 100 95 PSET (NN,N) 96 A$=INKEY$ :IF A$="" THEN 100 97 LOCATE 20,1 :PRINT "Quit";:INPUT R$ 98 IF R$="y" OR R$="Y" THEN 200 99 LOCATE 20,1 :PRINT " "; 100 NEXT I 200 CLS :SYSTEM :'End or program 9500 'generate Gaussian rand. no. 9510 'D1, D2 are desired mean and s.d. 9511 'number returned in G1 9530 S5=0 9540 FOR I2=1 TO 12 9550 S5=S5+RND(1) 9560 NEXT I2 9570 G1=(S5-6)*D2+D1 9580 RETURN :'from Gaussian rand no gen 9999 END 'last line ORBITING EARTH SATELLITE This program calculates the speed and period of a satellite in circular orbit around the earth at a chosen altitude. If you enter zero or just press the 'enter' key at the 'altitude in kilometers' prompt, you'll get an 'altitude in miles' prompt. The program also calculates the value of g, the acceleration due to gravity, at that altitude, helping to convince students that astronauts are *not* weightless, but have a weight not much less than their weight on earth. About 6% less. 10 'ORBITER.BAS Satellite orbits, By Donald Simanek, Dec 5, 1995. 11 PRINT "Period of an earth satellite in circular orbit." 12 PRINT "by Donald E. Simanek, Lock Haven University." 13 PRINT 20 PI=3.1416 30 EM = 5.98E+24 :'Mass of Earth, in kg. 40 ER = 6.38E+06 : 'Radius of Earth, in m. 50 G = 6.6726E-11 :'Universal gravitational constant. 60 MM = 1.99E+30 : 'Mass of moon, in kg. 70 MR = 1.72E+06 : 'Radius of Moon, in m. (In case anyone wants it) 80 INPUT "Enter satellite altitude in kilometers";SA 81 IF SA > 0 GOTO 84 82 INPUT "Enter satellite altitude in miles";SA 83 SA = SA*1.609 :'Miles to kilometers. 84 PRINT "Earth radius is ";ER/1000;"km, or ";ER*6.214E-04;"miles." 85 PRINT "Satellite altitude is ";SA;"km, or ";SA*.6214;"miles." 90 SR = ER/1000 + SA : 'Satellite orbit radius in km. 95 PRINT "Satellite orbit radius is ";SR;"km, or ";SR*.6214;"miles." 100 V = SQR(G*EM/(1000*SR)) : PRINT "Satellite speed is ";V;"m/s" 105 AG = G*EM/((1000*SR)^2 : PRINT "Acceleration due to gravity is ";AG"m/s^2" 110 T = 2*PI*SR*1000/V : TM = T/60 120 PRINT "Satellite period is ";T; "sec, or ";TM;"minutes." 150 END BALLISTIC PENDULUM Here's a little program for doing ballistic pendulum calculations. It follows my philosophy of providing for input of reasonable mixed units. If you don't like the units asked for, just enter zero or hit the enter key and you'll be prompted for the data in different units. You are asked for projectile mass in grams, but if you enter zero, you'll get the prompt for mass in pounds. 10 'BALLIST2.BAS, Program for ballistic pendulum calculations, cgs & English 45 CLS:SCREEN 2:LOCATE 1,1,1:'visible cursor 50 PRINT "BALLISTIC PENDULUM CALCULATION, by Donald Simanek, December 31, 1994. 51 PRINT 52 PRINT " 1/2 53 PRINT "v = (1 + M/m)(2gh) 55 PRINT 60 PRINT "Metric cgs entries assumed. 70 PRINT "If you enter zero, you'll be prompted for English units. 80 PRINT 81 PRINT "Enter projectile mass in grams"; 90 INPUT MP 95 IF MP>0 GOTO 100 96 PRINT "Enter projectile weight in pounds"; ELSE GOTO 100 97 INPUT MP 98 IF MP=0 GOTO 81 ELSE MP = MP*1000/2.2 100 PRINT "Projectile mass is"; MP; "gram" 101 PRINT "Enter catcher mass in grams"; 102 INPUT MC 103 IF MC>0 GOTO 109 104 PRINT "Enter catcher weight in pounds"; 105 INPUT MC 106 IF MC=0 GOTO 101 ELSE MC = MC*1000/2.2 : PRINT "Catcher mass is"; MC; "gm" 109 PRINT "Catcher mass is "; MC ;"gm" 110 PRINT "Enter suspension length in centimeters"; 111 INPUT R 112 IF R>0 GOTO 116 113 PRINT "Enter suspension length in inches"; 114 INPUT R 115 IF R=0 GOTO 110 ELSE R = R*2.54 : PRINT "Suspension length is";R;"cm" 116 INPUT "Did you measure the horizontal displacement of catcher [Y/n]"; A$ 117 IF A$="n" or A$="N" GOTO 130 120 PRINT "Enter horizontal displacement of catcher in centimeters"; 121 INPUT X 122 IF X>0 GOTO 128 123 PRINT "Enter horizontal displacement of catcher in inches"; 124 INPUT X 125 IF X=0 GOTO 120 ELSE X = X*2.54 128 Y = R - SQR(R^2 - X^2) : GOTO 139 :'Quadratic for sagitta 130 PRINT "Enter vertical displacement of catcher in centimeters"; 131 INPUT Y 132 IF Y>0 GOTO 138 133 PRINT "Enter vertical displacement of catcher in inches"; 134 INPUT Y 135 IF Y=0 GOTO 130 ELSE X = X*2.54 138 PRINT "Horizontal displacement of catcher is ";X;"cm" 139 PRINT "Vertical rise of catcher is "; Y ;"cm" 140 'Finally, do the velocity calculation 141 V = (1 + MC/MP)*SQR(2*980*Y) 142 PRINT "The projectile velocity is ";V;"cm/s" 145 PRINT "Enter projectile firing height in centimeters"; 146 INPUT H 147 IF H>0 GOTO 150 148 PRINT "Enter projectile firing height in inches"; 149 INPUT HI: IF HI=0 GOTO 145 ELSE H = HI*2.54 150 RC = V*SQR(2*H/980) : RI = RC/2.54 151 PRINT "Firing horizontally from a height of ";H;"cm," 152 PRINT "the predicted range is ";RC;"cm = ";RI;"inches" 200 INPUT "Quit [Y,n]"; A$ 201 IF A$="n" OR A$ = "N" THEN CLS: GOTO 50 300 SYSTEM COLLLISIONS, ONE DIMENSION Here's a really simple one, for one dimensional collisions, for example, collisions on an air track. 10 'Collide.bas. Calculation of elastic collisions. 20 ' 30 CLS: SCREEN 2 35 PRINT "One-dimensional elastic collision of two bodies. 36 PRINT :INPUT "Mass of first body"; M1 50 INPUT "Velocity of first body"; V1 55 PRINT :INPUT "Mass of second body"; M2 70 INPUT "Velocity of second body"; V2 80 VP2=(M1*(2*V1-V2)+M2*V2)/(M1+M2) 81 VP1=(M1*V1+M2*(2*V2-V1))/(M1+M2) 90 PRINT:PRINT "Final velocity of first body = "; VP1 91 PRINT "Final velocity of second body = "; VP2 92 PRINT :PRINT "Another calculation? [Y/n] 95 Q$=INKEY$ :IF Q$="" THEN 95 99 IF Q$="n" OR Q$="N" GOTO 100 ELSE 30 100 SYSTEM COMPTON SCATTERING 10 'COMPTON.BAS :`Compton scattering calculations. 35 SCREEN 2:CLS:LOCATE 1,1,1:'visible cursor 36 MPA = 1E-10 :'Meter/angstrom. 37 C = 3E8 :'Speed of light, MKS. 38 CW = 2.46E-12 :'Compton wavelength of electron, h/mc. 40 EVPJ = 1.602E-19 :'Electron volts/Joule. 49 H = 6.6257E-34 :'Planck's constant, Joule-second. 50 PRINT "COMPTON SCATTERING CALCULATIONS, by Donald Simanek 51 PRINT 52 PRINT "1 1 h 53 PRINT "- - - = --- (1 - cos à) 54 PRINT "f' f m c 55 PRINT " o 56 PRINT 60 PRINT "Enter scatter angle à in degrees and minutes separately, as prompted. 70 PRINT "If you enter degrees in decimal form, just hit 'enter' at minutes prompt. 80 PRINT:PRINT "Scattering angle, à: degrees [default: 90]"; 90 INPUT A 95 IF A=0 THEN A=90 :'Sets default, and traps for division by zero. 100 PRINT "Minutes"; 110 INPUT AM 120 A = A + AM/60 130 IF A=0 THEN A=60 135 PRINT: PRINT "For other options, wavelength, ev or Angstrom, hit 'enter'." 140 PRINT:PRINT "Frequency of incident photon [in Hz]:"; 150 INPUT F : IF F<>0 goto 194 170 PRINT "Wavelength of incident photon [in meters]:"; 180 INPUT WL : if WL=0 goto 183 182 F = C/WL: goto 194 183 PRINT "Wavelength of incident photon [in Angstrom];"; 184 INPUT WLA : IF WLA=0 goto 187 186 F = WLA*MPA : GOTO 194 187 PRINT "Energy of incident photon [in electron volts]:"; 188 INPUT EV : F = EV/(H*EVPJ) 194 RF = 1/F :'Reciprocal of incident frequency. 196 RFP = RF + CW*(1-cos(A)) : FP = 1/RFP :'Compton calculation. 197 WP = C/FP : EVP = H*FP*EVPJ 198 WPA = WP/MPA 200 PRINT:PRINT "The scattered photon has frequency: "; FP;" Hz" 201 PRINT " wavelength:"; WP;" meter" 202 PRINT " wavelength:"; WPA;" Angstrom" 203 PRINT " energy: "; EVP;" electron volt" 220 PRINT:INPUT "Another calculation [Y/n]";R$ 230 IF R$="N" OR R$="n" THEN 300 ELSE 45 300 SYSTEM THIN LENS CALCULATION During lab, it's nice to be able to check student data quickly. This program asks for: object position, screen position, and lens position with reference to the bench scale. Some student always comes up with data in which the object is at a high number and the screen is at a low number on the scale. This is the opposite of what is usually recommended, which I call an 'inverted' situation. If that's the case, respond to the prompt 'Invert bench scale' with 'yes' and the calculation is done correctly. 10 'Thin lens calculations, By Dr. Donald Simanek, Sept 2001 12 'Vanilla Basic, will work on Tandy 100. 13 Screen 2 :'Remove from T100 version 15 FV = 1 20 CLS : INPUT "Invert bench scale [y/N]"; F$ 30 IF F$ = "Y" OR F$ = "y" THEN FV=-1 40 INPUT "Object position"; O 50 INPUT "Lens position"; L 60 INPUT "Image position"; I 70 P=FV*(L-O) : Q=FV*(I-L) : F=P*Q/(P+Q) 80 PRINT "P ="; P;", Q ="; Q 90 PRINT "F ="; F 100 INPUT "Another calculation [Y/n]"; F$ 110 IF F$ = "N" OR F$ = "n" THEN 120 ELSE 15 120 SYSTEM:'Last line THICK LENS This was written in response to a question on an internet discussion group about the focal length of a perfect sphere, for paraxial rays. It solves the case of a two-surface thick lens, with possibly different refractive indices on either side. 1 'THICKLEN.BAS Thick Lens, by Donald E. Simanek, April 2, 1995. 2 PRINT 3 PRINT " N2 N1 N2-N1 4 PRINT " -- = -- + ----- (Cartesian sign convention) 5 PRINT " Q P R 6 PRINT 7 PRINT "This program solves a two-surface thick lens, using equation above." 8 PRINT "Use cartesian coordinates for positions of vertices and objects." 9 PRINT 10 INPUT "Index of refraction of first medium"; N1 11 INPUT "Index of refraction of second medium"; N2 12 INPUT "Index of refraction of third medium"; N3 13 PRINT 20 INPUT "Position of first surface vertex"; V1 21 INPUT "Position of second surface vertex"; V2 22 PRINT 23 INPUT "Radius of first surface"; R1 24 INPUT "Radius of second surface"; R2 25 PRINT 26 PRINT "Enter zero at the next prompt for an object at infinity." 27 INPUT "Position of object"; OBJ 28 IF OBJ=0 THEN PRINT "Object distance is infinite." : CP1=0 : GOTO 40 30 P1 = OBJ-V1 : CP1 = N1/P1 40 CQ1 = CP1 + (N2-N1)/R1 41 Q1 = N2/CQ1 45 T = V2-V1 46 PRINT :PRINT "RESULTS: 47 PRINT 49 PRINT "Image from first surface is "; Q1 " from the first surface." 50 P2 = Q1-T 51 PRINT "Image from first surface is "; P2 " from the second surface." 52 CP2 = N2/P2 55 CQ2 = CP2 + (N3-N2)/R2 60 Q2 = N3/CQ2 70 PRINT "The final image is at "; V2+Q2 71 PRINT "It is "; Q2+T; " from the first surface." 72 PRINT "It is "; Q2; " from the second surface." 80 END PRISM SPECTROMETER We do the classic prism spectrometer, with American Optical spectrometers, or Ealing spectrometers. This helps check what goes wrong with student data. 10 'SPECTROM.BAS, by Donald Simanek. Calculates n for prism. 40 PI = 3.1415927 45 SCREEN 2:CLS:LOCATE 1,1,1:'visible cursor 50 PRINT "INDEX OF REFRACTION OF A PRISM, by Donald Simanek 51 PRINT 52 PRINT " sin [(A+D)/2] 53 PRINT "n = ------------- 54 PRINT " sin [A/2] 55 PRINT 60 PRINT "Enter degrees and minutes separately, as prompted. 70 PRINT "If you enter degrees in decimal form, just hit 'enter' at minutes prompt. 80 PRINT:PRINT "Prism angle, A: degrees [default: 60]"; 90 INPUT A 95 IF A=0 THEN A=60 :'Sets default, and traps for division by zero. 100 PRINT "Minutes"; 110 INPUT AM 120 A = A + AM/60 130 IF A=0 THEN A=60 140 PRINT:PRINT "Minimum deviation angle, D: degrees"; 150 INPUT D 160 PRINT "Minutes"; 170 INPUT DM 180 D = D + DM/60 190 N = SIN(PI*(A+D)/360)/SIN(PI*A/360) 200 PRINT:PRINT "A = ";A;", D = ";D 210 PRINT "The index of refraction, n = ";N 220 PRINT:INPUT "Another calculation [Y/n]";R$ 230 IF R$="N" OR R$="n" THEN 300 ELSE 45 300 SYSTEM TRAJECTORIES This is a project unfinished. There are far better trajectory programs out there, which take air friction into account. This one doesn't. It does have one interesting feature I'd like to see in other programs. It shows the vectors vo*t and (1/2)at^2 superimposed on the trajectory. One can also toggle on a target and wall, the idea being to hit the target without touching the wall. Each time you invoke the target, the position of target and height of the wall are different. It's kinda fun, and crying out for improvement. Press t to toggle the target on/off. Instructions are in the code at the bottom. It runs on Sanyo, Xerox, and IBM computers up to EGA. 10 'TRAJECT#.BAS, Trajectory simulation, Dr. Donald Simanek, 9/19/87 15 'Lock Haven Univ., Lock Haven, PA. 17745. Phone 717-893-2079 or 2048 16 'Please advise of any improvements you make to this program. 17 RIGHT=77:LEFT=75:UP=72:DOWN=80 :'Cursor keys, all except Sanyo 18 CLS :GOSUB 659 :'Determine computer type 19 CLS :SCREEN SCRN 20 LOCATE 12,5:PRINT "THANK YOU. Would you like instructions? [y/N]" 21 Q$=INKEY$: IF Q$="" THEN 21 22 IF Q$="y"OR Q$="Y" THEN GOSUB 830 40 V0=80:VTY0=V:HF=10:TINT=1:ACC=10:VL0=V0 50 A0=-.65:ASET=A0:ADROP=3.1416/2 :IFLAG=-1 :LFLAG=1 60 RANDOMIZE VAL(RIGHT$(TIME$,2)) 70 ' **** Return point for rerun, start with same initial position and angle. 80 PXL=1:VL=V0:VTX=0:VTY=VTY0:'vl=vl0 90 ' **** Return point for parameter changes 100 IF ABS(ASET) < 3.1416/2 THEN 130 110 LOCATE 5,1:PRINT "This cannon can't be aimed backward." 120 GOTO 270 130 IF VL0 <160 THEN 160 140 LOCATE 4,1:PRINT "This cannon hasn't that much firepower." 150 VL0 = VL0-10:GOTO 240 160 CLS:LOCATE 1,1:PRINT"Cursor keys move and aim the gun, + & - change velocity, f to fire." 170 LINE (0,V-1)-(640,V-1) 180 IF IFLAG<0 GOTO 210:'IFLAG positive draws target and wall 190 LINE (XTARG,YTARG)-(XTARG+20,V),1,B 200 LINE (XWALL,YWALL)-(XWALL,V),1 210 VTY=VTY0:HEIGHT=V-VTY0:VL=VL0 220 GOSUB 610:LOCATE 4,1,0:'Parameter display 230 A=ASET:GOSUB 1180:'Vector subroutine needs VTX,VTY,VL,HF,A,PXL 240 Q$=INKEY$:IF Q$="" THEN 240 250 IF Q$="f" OR Q$="F" THEN 390 260 IF Q$="a" OR Q$="A" THEN 270 ELSE 280 270 LOCATE 4,1:INPUT "Angle (in radians)";AR:ASET=-AR:GOTO 100 280 IF Q$="+" OR Q$="=" THEN VL0=VL0+10:GOTO 100 290 IF Q$="-" THEN VL0=VL0-10:GOTO 100 300 IF Q$="t" OR Q$="T" THEN IFLAG=-IFLAG:GOSUB 1120:GOTO 100 305 IF Q$="`" THEN LFLAG=-LFLAG :'Flag for interrupted display. 310 B=ASC(RIGHT$(Q$,1)) 320 IF B=UP THEN VTY0=VTY0-20:GOTO 100 330 IF B=DOWN THEN VTY0=VTY0+20:GOTO 100 340 IF B=LEFT THEN ASET=ASET-.03:GOTO 100 350 IF B=RIGHT THEN ASET=ASET+.03:GOTO 100 360 IF B=27 THEN 550:'Escape key 370 GOTO 240 380 'Main loop, plot points and draw vector polygon 390 FOR TIME=1 TO 100 STEP TINT 400 VL=TINT*VL0 410 FOR I=1 TO 10 420 T = TIME-1+.1*I 430 XP=VL0*T*COS(ASET) 440 YP=V-HEIGHT +VCOMP*(VL0*T*SIN(ASET) +.5*ACC*(T^2)) 450 IF XP>640 GOTO 550 460 IF YP>V GOTO 550 470 IF YP<1 GOTO 490 480 PSET (XP,YP) 490 NEXT I 491 IF LFLAG>0 GOTO 500 492 R$=INKEY$:IF R$="" THEN 492 493 IF R$= " " GOTO 500 500 A=ASET:GOSUB 1180:'V0T Vector, needs VTX,VTY,VL,HF,A,PXL 510 VTX=VHX:VTY=VHY 520 VL=.5*ACC*(TIME^2) 521 IF LFLAG>0 GOTO 530 522 R$=INKEY$:IF R$="" THEN 522 523 IF R$= " " GOTO 530 530 A=ADROP:GOSUB 1180:'.5AT^2 Vector, needs VTX,VTY,VL,HF,A,PXL 540 NEXT TIME 550 LOCATE 1,1:PRINT " [Q]uit, or [R]un another?" 560 Q$=INKEY$:IF Q$="" GOTO 560 570 IF Q$="q" OR Q$="Q" GOTO 580 ELSE 80 580 CLS:screen 2 :SYSTEM 590 ' 600 ' **** Parameter display subroutine 610 ADEG=-ASET*180/3.1416 620 LOCATE 2,1:PRINT "Velocity,";VL0,"Angle,";ADEG;"degrees." 630 LOCATE 3,1:PRINT "Height,";HEIGHT 640 RETURN 650 ' 658 ' **** Subroutine to set parameters for computers, 9/19/87 659 screen 2 660 PRINT "Select computer and display adaptor from this list: 661 PRINT :PRINT "1 IBM PC, XT, AT and compatibles with CGA. 662 PRINT "2 Same with EGA color graphics card 663 PRINT "3 Xerox 6064 or ATT 6300 monochrome high resolution 664 PRINT "4 Tandy 2000, color high resolution 665 PRINT "5 Sanyo 555 668 PRINT:PRINT: 669 RIGHT=77:LEFT=75:UP=72:DOWN=80 :'Cursor keys, all except Sanyo 555 670 Q$=INKEY$ :IF Q$="" THEN 670 671 ICHOOSE=ASC(Q$)-48 672 ON ICHOOSE GOTO 681, 682, 683, 684, 685 681 V=200 :SCRN=2 :VCOMP=5/12 :RETURN 682 V=350 :SCRN=9 :VCOMP=5/12 :RETURN 683 V=400 :SCRN=3 :VCOMP=.9 :RETURN 684 V=400 :SCRN=4 :VCOMP=.9 :RETURN 685 V=200:SCRN=2:VCOMP=.5:RIGHT=29:LEFT=28:UP=30:DOWN=31:RETURN:'Sanyo 555 789 ' 790 ' **** Instructions for the trajectory simulation 800 LOCATE 12,5:PRINT "THANK YOU. Would you like instructions? [y/N]" 810 Q$=INKEY$: IF Q$="" THEN 810 820 IF Q$="y"OR Q$="Y" THEN 830 ELSE 1090 825 ' **** Instructions 830 CLS: LOCATE 1,1:PRINT "Trajectory simulation program by Dr. Donald E. Simanek." 840 PRINT:PRINT "You will control a cannon at the left of the screen. 850 PRINT"A vector (arrow) shows its position, initial velocity and elevation angle. 860 PRINT:PRINT"The cannon may be moved up or down with the cursor up and down keys. 870 PRINT:PRINT"The cursor left and right keys change its elevation angle, 880 PRINT"in increments of about 2 degrees. 890 PRINT:PRINT"If you press 'a' you may directly enter the value of the angle--in radians! 900 PRINT:PRINT"Keys + and - change the initial velocity, in coarse increments, 910 PRINT"but you are limited to values less than 150. '=' is the same as '+'; 915 PRINT"you needn't shift. 920 PRINT:PRINT"For those who must make a game of everything, t toggles on a target; 930 PRINT"a rectangular 'tower' and a 'wall' protecting it. 940 PRINT:PRINT"Since the velocity and height adjustments are crude, you'll have 950 PRINT"to use direct angle entry for finer elevation angle control. 960 PRINT:PRINT" PRESS ANY KEY TO SEE MORE INSTRUCTIONS 970 IF INKEY$="" GOTO 970 980 CLS: LOCATE 1,1 990 PRINT:PRINT"Use the 'a' direct entry option to make large changes in the angle. 1000 PRINT:PRINT"After firing, press 'q' to quit, or any other key 1010 PRINT"to have another try at the same target. 1020 PRINT:PRINT"Press 't' to erase target, 't' again to display a new target. 1030 PRINT:PRINT"Pedagogical note: The trajectory is plotted with dots at 1040 PRINT"EQUAL time intervals. Vectors V0*T and .5*T^2 are drawn only for 1050 PRINT"every 10th interval. 1060 PRINT:PRINT"During the simulation, press 'escape' to exit. 1070 PRINT:PRINT"End of instructions, press any key to begin the simulation. 1080 IF INKEY$="" GOTO 1080 1090 CLS:RETURN 1100 ' 1110 ' **** Target and wall creation subroutine 1120 XTARG=RND*400 + 200 :YTARG=V-RND*V/3-V/10 1140 XWALL=XTARG-RND*100-H/10 :YWALL=V-RND*V/3 -V/8 1160 RETURN 1170 ' 1180 'Vector drawing subroutine 1/24/87 1190 'Needs VTX,VTY,VL,HF,A:'Angle in radians 1200 VLX=VL*COS(A):VLY=VL*SIN(A):VLYC=VCOMP*VLY:VLXC=VCOMP*VLX 1210 VHX=VTX+VLX :VHY=VTY+VLYC 1220 IF VHX>640 THEN RETURN 1230 IF VTY>V OR VTY<0 THEN RETURN 1240 IF VHY>V OR VHY<0 THEN RETURN 1250 LINE (VTX,VTY)-(VHX,VHY),PXL 1260 H1X=VHX-HF*VLX/VL+HF*VLY/(VL*2) 1270 H1Y=VHY-HF*VLYC/VL-HF*VLXC/(VL*2) 1280 H2X=VHX-HF*VLX/VL-HF*VLY/(VL*2) 1290 H2Y=VHY-HF*VLYC/VL+HF*VLXC/(VL*2) 1300 LINE (VHX,VHY)-(H1X,H1Y),PXL 1310 LINE (VHX,VHY)-(H2X,H2Y),PXL 1320 LINE (H1X,H1Y)-(H2X,H2Y),PXL 1330 RETURN:'Last line of program TRAJECT.BAS WHEATSTONE BRIDGE This is written in "generic" basic so that it may be used with, or adapted to, nearly any computer or basic compiler. It can handle either balanced or unbalanced bridge problems. Units are not a problem. If resistor values are in ohms and potential in volts, the currents are in amperes. If resistor values are assumed to be kilohms, the currents are in milliamperes. This a more convenient, practical system of units for real circuit problems. The circuit is shown on the screen, with the cursor on R1, waiting for you to enter a value for R1. After each value is entered, the cursor moves to the next resistor. You may skip any entry by pressing the `enter' key. You need not enter the galvanometer resistance unless you are particularly interested in how it affects the currents. The program defaults to zero galvanometer resistance if you do not enter a value. The last entry is the working battery voltage. If you press return without entering a value, the program assumes a value of 2 volts, which is typical for such circuits. If you enter values for the resistances in all four bridge arms, the program assumes an unbalanced bridge, and calculates the currents. The currents of the unbalanced bridge depend on the galvanometer resistance. If you did not enter a value for the galvanometer, the program assumes it has zero resistance. If you omit entry of the resistance in one arm, the program assumes you want to calculate a value for it which will balance the bridge. The program does so, calculating the missing value and displaying that value at the lower left of the screen. The currents of the balanced bridge are independent of the galvanometer resistance. This program uses the ASCII screen graphic characters, which can be looked up in any table of ASCII codes. In Europe, resistors are shown in circuit diagrams as simple rectangles, sometimes with the resistor's value within the rectangle. The "zigzag" form you may be used to is _not_ a world-wide standard. Another nice European style is to write resistor (and other component) values in this manner: 6K8, which translates to 6.8 k, that is, 6.8 kilohm. This method neatly avoids using the decimal point, which can often get "lost" in reproduction. When you clip out the program below for use, you may have to remove the hard returns in the long lines. The picture of the circuit on the screen (lines 403-432) contain ASCII graphics characters with codes above 127. These may cause problems when you download this. On request I can e-mail you a unix-encoded version which may translate better. If you want to see how these characters look on your browser, click on the link at the bottom of this document. As a last resort you may have to import the text into a good wordprocessor, set the line lengh long enough so there's no word wrap, and reconstruct the picture to look good. My program used block characters to make solid 'bar' resistors. The wires were single lines, as was the cell. In older versions of BASIC be sure you have GRAPHTABL loaded. 10 'WHEATS, Wheatstone bridge calculation, version 5.1 11 'By Dr. Donald Simanek, Lock Haven University 9/14/89, 2/1/90, 1/23/92 12 'With direct calculation of balanced bridge, input of V. 14 SCREEN 2 :KEY OFF :CLS 15 DEFINT I-N :DEFDBL A-H,O-Z 30 A$="###.####" 60 DIM R(5),C(3),S(3),B(3,3) 65 'Begin the program 70 GOSUB 400 :'Draw the screen 75 LOCATE 22,40:PRINT "Wheatstone Bridge Circuit"; 80 LOCATE 23,40:PRINT "By Donald Simanek, ver 5.1"; 82 GOSUB 500:'Input R subroutine 85 'Check, is the bridge unbalanced? 86 'If no resistance values are zero, use unbalanced bridge routine. 87 NZ=0:'Initialize count of zero values 91 FOR I=1 TO 4 92 IF R(I)=0! THEN NZ=NZ+1:IX=I 93 NEXT I 94 IF NZ=0 GOTO 180:'No zero values, do unbalanced bridge. 95 IF NZ>1 THEN GOTO 96 ELSE 105:'Must balance the bridge if one zero value. 96 LOCATE 24,1:PRINT "You must enter at least 3 resistance values. Press any key to restart."; 97 K$=INKEY$:IF K$="" THEN 97 100 CLS:GOTO 65 105 GOSUB 800 :'Direct calculation to balance the bridge. 110 LOCATE 24,1 :PRINT "R";IX;"=";:PRINT USING A$;R(IX);:PRINT " balances the bridge." 170 ' 180 'Begin calculation of currents in balanced or unbalanced bridge. 183 B(1,1)=R(1)+R(3)+R(5) 184 B(2,2)=R(2)+R(4)+R(5) 185 B(3,3)=R(3)+R(4) 186 B(1,2)=-R(5) :B(2,1)=-R(5) 187 B(2,3)=-R(4) :B(3,2)=-R(4) 188 B(1,3)=-R(3) :B(3,1)=-R(3) 190 GOSUB 5280 :'Cramer's rule subroutine 191 D1=D 192 FOR I=1 TO 3 193 FOR J=1 TO 3 194 S(J)=B(I,J) :B(I,J)=0 195 NEXT J 196 B(I,3)= V 197 GOSUB 5280 :'Cramer's rule 198 C(I)=D/D1 199 FOR K=1 TO 3 :B(I,K)=S(K) :NEXT K 200 NEXT I 305 C1=C(1) :C2=C(2) :C3=C(3)-C(1) :C4=C(3)-C(2) :C5=C(1)-C(2) 306 'LINE 5,10,17, COL 20,40 310 LOCATE 5,20 :PRINT USING A$; C1 311 LOCATE 5,44 :PRINT USING A$; C2 312 LOCATE 10,44:PRINT USING A$; C5 313 LOCATE 17,20:PRINT USING A$; C3 314 LOCATE 17,44:PRINT USING A$; C4 390 'End of calculation of currents 392 LOCATE 23,40 :INPUT "Another calculation [Y/n]";R$ 393 CLS :IF R$="N" OR R$="n" THEN SYSTEM ELSE 65 399 ' 400 'Subroutine to draw the screen graphics 401 ' 403 PRINT" R1= R2= 404 PRINT" 412 PRINT" ÚÄÄÄÄÄÄÛÛÛÛÛÛÛÛÛÛÛÄÄÄÄÄÄÂÄÄÄÄÄÄÛÛÛÛÛÛÛÛÛÛÛÄÄÄÄÄÄ¿ 413 PRINT" ³ ³ ³ 414 PRINT" ³ I1= ³ I2= ³ 415 PRINT" ³ ³ ³ 416 PRINT" ³ ÚÄÄÄÅÄÄÄ¿ ³ 417 PRINT" ³ GALVANOMETER ³ ÛÛÛ ³ R5= ³ 418 PRINT" ÚÄÄÄÄ´ (Null ³ ÛÛÛ ³ ÃÄÄÄÄÄ¿ 419 PRINT" ³ ³ detector) ³ ÛÛÛ ³ I5= ³ ³ 420 PRINT" ³ ³ ÀÄÄÄÅÄÄÄÙ ³ ³ 421 PRINT" ³ ³ ³ ³ ³ 422 PRINT" ³ ³ R3= ³ R4= ³ ³ 423 PRINT" ³ ³ ³ ³ ³ 424 PRINT" ³ ÀÄÄÄÄÄÄÛÛÛÛÛÛÛÛÛÛÛÄÄÄÄÄÄÁÄÄÄÄÄÄÛÛÛÛÛÛÛÛÛÛÛÄÄÄÄÄÄÙ ³ 425 PRINT" ³ ³ 426 PRINT" ³ I3= I4= ³ 427 PRINT" ³ ³ 429 PRINT" ³ + ³ - ³ 430 PRINT" ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ 431 PRINT" ³ 432 PRINT" V = 440 RETURN :'from screen drawing subroutine 500 ' 510 'Data input subroutine, LINE 1,13,18, COL 20,44 520 ' 540 LOCATE 1,20 :INPUT R(1):IF R(1)<>0 THEN LOCATE 1,20 :PRINT USING A$; R(1); 550 LOCATE 1,44 :INPUT R(2):IF R(2)<>0 THEN LOCATE 1,44 :PRINT USING A$; R(2); 555 LOCATE 8,44 :INPUT R(5):LOCATE 8,44 :PRINT USING A$; R(5); 560 LOCATE 13,20:INPUT R(3):IF R(3)<>0 THEN LOCATE 13,20:PRINT USING A$; R(3); 570 LOCATE 13,44:INPUT R(4):IF R(4)<>0 THEN LOCATE 13,44:PRINT USING A$; R(4); 580 LOCATE 22,20:INPUT V :IF V=0 THEN V=2:LOCATE 22,20:PRINT USING A$; V; 610 RETURN :'From data input subroutine 800 ' 801 'Subroutine to balanced the bridge. 802 'Needs IX, the number of the missing resistor. 803 ' 820 ON IX GOTO 830,840,850,860 830 R(1)=R(3)*R(2)/R(4):GOTO 870 840 R(2)=R(1)*R(4)/R(3):GOTO 870 850 R(3)=R(1)*R(4)/R(2):GOTO 870 860 R(4)=R(2)*R(3)/R(1):GOTO 870 870 RETURN :'From direct calculation subroutine 5270 ' 5280 'Find determinant of a 3x3 matrix by Cramers' rule, for unbalanced bridge 5290 ' 5300 D=B(1,1)*(B(2,2)*B(3,3)-B(3,2)*B(2,3)) 5310 D=D-B(1,2)*(B(2,1)*B(3,3)-B(3,1)*B(2,3)) 5320 D=D+B(1,3)*(B(2,1)*B(3,2)-B(3,1)*B(2,2)) 5330 RETURN :'From determinant subroutine 9999 'Last line Enjoy these programs. If you like and use any of them, remember us here at Lock Haven University, Lock Haven, PA. Post some of your own programs to PHYSHARE. -- Donald E. Simanek
To see how characters translate on your browser, look at these: