REM nm2bbc.bas - jackord@kw.igs.net - revised 3 Feb 08 - BBC Basic v5.50b REM motion of 8-segment string clamped at both ends REM Pluck, Pulse, and Normal Mode initial displacements REM time dependence from Newton's Law REM y(n/4) is plotted versus time for Pluck and Pulse displacements REM dispersion relation plotted for normal modes *FLOAT64 INSTALL @lib$+"WINLIB5" REM Initialize Window b1% = FN_button("Pluck", 61, 5, 60, 20, FN_setproc(PROCp1), 0) b2% = FN_button("Pulse", 131, 5, 60, 20, FN_setproc(PROCp2), 0) b3% = FN_button("Motion", 201, 5, 60, 20, FN_setproc(PROCp3), 0) b4% = FN_button("Nmodes", 271, 5, 60, 20, FN_setproc(PROCp4), 0) WindowWidth=524 WindowHeight=260 VDU 23,22,WindowWidth;WindowHeight;8,15,16,128 SYS "SetWindowText", @hwnd%, "The 8-segment String" DIM y(8): DIM v(8): DIM y2%(128): DIM f%(8) kk=0: plt=0: jt=0: n=8 OFF: VDU 5 REPEAT WAIT 1 UNTIL FALSE QUIT DEF PROCp1: kk=1: jt=0 DEF PROCp2: kk=2: jt=0 DEF PROCp3: IF kk>0 THEN plt=1 ELSE ENDPROC dt=n/768 IF jt=0 THEN FOR i=0 TO n y(i)=0: v(i)=0 NEXT i IF kk=1 THEN FOR i=0 TO n/2 : REM Pluck y(i)=448*i/n: y(n-i)=y(i) NEXT i ELSE FOR i=3*n/8 TO n/2 : REM Pulse y(i)=1792*(i-3*n/8)/n: y(n-i)=y(i) NEXT i ENDIF FOR i=1 TO n-1 : REM Feynman half-step v(i)=v(i)+(y(i-1)+y(i+1)-2*y(i))*dt/2 NEXT i y2%(0)=232+INT(y(2)) ENDIF IF plt=1 THEN * REFRESH OFF tt=TIME WHILE jt=0 OR plt=1 CLS: GCOL 0: MOVE 8, 192: DRAW 8, 272: MOVE 776, 192: DRAW 776, 272 MOVE 784, 232: DRAW 1040, 232 GCOL 12: MOVE 8, 232 FOR i=1 TO n : REM Plot string DRAW 8+96*i, 232+y(i) NEXT i FOR i=0 TO n : REM Plot point masses IF i=2 THEN GCOL 9 ELSE GCOL 12 CIRCLE FILL 10+96*i, 230+y(i), 12 NEXT i GCOL 9: MOVE 784, y2%(0) n2%=INT(jt/12): IF n2%=(jt/12) THEN y2%(n2%)=232+INT(y(2)) FOR i=0 TO n2% : REM Plot y(2) versus time DRAW 784+2*i, y2%(i) NEXT i IF plt=1 THEN * REFRESH jt=jt+1 FOR i=1 TO n-1 y(i)=y(i)+v(i)*dt NEXT i FOR i=1 TO n-1 v(i)=v(i)+(y(i-1)+y(i+1)-2*y(i))*dt NEXT i WHILE (tt>TIME): ENDWHILE: tt=tt+.8 IF jt=1537 plt=0: kk=0: * REFRESH ON ENDWHILE ENDPROC DEFPROCp4 * REFRESH OFF FOR m=1 TO 7 : REM Normal mode loop t=0: tf=0: dt=.1/m/2: tst=1: plt=1: first=0 FOR i=0 TO n : REM Initialize y(i)=216*SIN(PI*m*i/n) NEXT i FOR i=1 TO n-1 v(i)=(y(i-1)+y(i+1)-2*y(i))*dt/2 : REM Feynman half-step NEXT i tt=TIME WHILE plt=1 CLS: GCOL 0: MOVE 8, 192: DRAW 8, 272: MOVE 776, 192: DRAW 776, 272 MOVE 784, 232: DRAW 1040, 232: MOVE 784, 232: DRAW 784, 488: DRAW 800, 488 MOVE 808, 502: PRINT "0.4 Hz": MOVE 888, 192: PRINT "Mode" FOR i=1 TO 7 MOVE 784+32*i-8, 224: PRINT STR$(i) NEXT i IF m>1 THEN FOR i=1 TO m-1 : REM Dispersion plot GCOL 9: CIRCLE FILL 786+32*i, f%(i), 10 NEXT i ENDIF GCOL 13: MOVE 8, 232 FOR i=1 TO 384 : REM Plot displacement curve DRAW 8+2*i, 232+INT(216*SIN(PI*m*i/384)+.5) NEXT i GCOL 12: MOVE 8, 232 FOR i=1 TO n : REM Plot string DRAW 8+96*i, 232+INT(y(i)+.5) NEXT i FOR i=0 TO n : REM Plot point masses CIRCLE FILL 10+96*i, 230+INT(y(i)+.5), 12 NEXT i t=t+dt FOR i=1 TO n-1 : REM F=ma y(i)=y(i)+v(i)*dt NEXT i FOR i=1 TO n-1 v(i)=v(i)+(y(i-1)+y(i+1)-2*y(i))*dt NEXT i IF tst=1 AND y(1)<0 THEN tf=4*(t-y(1)/v(1)): tst=0 WHILE (tt>TIME): ENDWHILE tt=tt+1 IF tst=0 AND t>tf+dt/2 THEN plt=0: f%(m)=230+INT(256/.4/tf) GCOL 9: CIRCLE FILL 786+32*m, f%(m), 10 : REM Dispersion update ENDIF * REFRESH IF first=0 OR plt=0 THEN WAIT 50 first=1 ENDWHILE NEXT m GCOL 12: MOVE 784, 232 FOR i=1 TO 128 : REM Dispersion curve x2=784+2*i: y2=232+INT(256/.4/PI*SIN(i*PI/256)) DRAW x2, y2 NEXT i * REFRESH ON ENDPROC