REM nm3bbc.bas - jackord@kw.igs.net - 28 Mar 07 - BBC Basic v5.50b REM string of length 8d, clamped at both ends REM equal point masses at intervals of d REM finite and infinite Fourier Sine Series representations of REM "Pluck" and "Pulse" initial displacements *FLOAT64 INSTALL @lib$+"WINLIB5" REM Initialize Window b1% = FN_button("Pluck FFSS", 10, 5, 90, 20, FN_setproc(PROCp1), 0) b2% = FN_button("Pulse FFSS", 105, 5, 90, 20, FN_setproc(PROCp2), 0) b3% = FN_button("Pluck FSS", 200, 5, 90, 20, FN_setproc(PROCp3), 0) b4% = FN_button("Pulse FSS", 295, 5, 90, 20, FN_setproc(PROCp4), 0) WindowWidth=396 WindowHeight=240 VDU 23,22,WindowWidth;WindowHeight;8,15,16,128 n=8: DIM y(8): DIM b(8) OFF: VDU 5 REPEAT WAIT 1 UNTIL FALSE QUIT DEF PROCp1: kk=1: ff=1 : REM Pluck FFSS DEF PROCp2: kk=2: ff=1 : REM Pulse FFSS DEF PROCp3: kk=1: ff=2 : REM Pluck FSS DEF PROCp4: kk=2: ff=2 : REM Pulse FSS IF kk=1 THEN FOR i=0 TO n/2 y(i)=80*i: y(n-i)=y(i) NEXT i ELSE FOR i=0 TO n: y(i)=0: NEXT i: y(n/2)=320 ENDIF FOR i=1 TO n-1 STEP 2 IF ff=1 THEN b(i)=0 FOR j=1 TO n-1 b(i)=b(i)+2*y(j)/n*SIN(PI*i*j/n) NEXT j ELSE IF kk=1 THEN b(i)=160*(4/PI/i)^2*SIN(i*PI/2) ELSE b(i)=160*(8/PI/i)^2*(SIN(PI*i/2)-SIN(PI*i*3/8)) ENDIF ENDIF NEXT i CLS:GCOL 12: MOVE 8, 90 : REM Displacement FOR i=1 TO n DRAW 12+96*i, 90+y(i) NEXT i FOR i=0 TO n CIRCLE FILL 12+96*i+2, 90+y(i)-2, 12 NEXT i GCOL 10 : REM Components FOR i=1 TO n-1 STEP 2 MOVE 12, 90 FOR j=1 TO 48*n DRAW 12+2*j, 90+INT(b(i)*SIN(PI*i*j/n/48)+1) NEXT j NEXT i GCOL 9: MOVE 12,90 : REM Superposition FOR j=1 TO 48*n z=0 FOR i=1 TO n STEP 2 z=z+b(i)*SIN(PI*i*j/n/48) NEXT i DRAW 12+2*j, 90+INT(z+1) NEXT j ENDPROC