REM foscb.bas - jackord@kw.igs.net - revised 25 Feb 2011 - BBC Basic 5.92a REM phase diagram for the damped oscillator REM - underdamped: Q = 1 REM - critically damped: Q = 1/2 REM - overdamped: Q = 1/3 *FLOAT 64 INSTALL @lib$+ "WINLIB5" b1% = FN_button("Plot", 80, 5, 55, 25, FN_setproc(PROCq1), 0) c1% = FN_combobox("", 5, 5, 65, 0, 0, 3) WindowWidth=400: WindowHeight=400 VDU 23, 22, WindowWidth; WindowHeight; 8, 16, 16, 128 SYS "SetWindowText", @hwnd%, "The Damped Oscillator" SYS "SendMessage", c1%, &143, 0, "Q=1" SYS "SendMessage", c1%, &143, 1, "Q=1/2" SYS "SendMessage", c1%, &143, 1, "Q=1/3" SYS "SendMessage", c1%, &14E, 0, 0 z$="Underdamped" dt=.01: n=1000 VDU 5: OFF REPEAT WAIT 1 UNTIL FALSE QUIT DEF PROCq1 SYS "SendMessage", c1%, &147, 0, 0 TO rq: rq=rq+1 CLS: GCOL 0: LINE 0, 400, 800, 400: LINE 400, 0, 400, 800 GCOL 9: CIRCLE 400, 400, 360: GCOL 12 FOR j=0 TO 35 x=COS(j*PI/18): v=SIN(j*PI/18): MOVE 400+360*x, 400+360*v dv=-(rq*v+x)*dt: v=v+dv/2 REM Feynman half-step FOR i=1 TO n x=x+v*dt: dv=-(rq*(v+dv/2)+x)*dt: v=v+dv REM Feynman loop DRAW 400+360*x, 400+360*v NEXT i NEXT j IF rq=2 THEN z$="Critically Damped": GCOL 10: LINE 0, 800, 800, 0 IF rq=3 THEN z$="Overdamped": GCOL 10: s=(3+SQR(5))/2: LINE 400*(1-1/s), 800, 400*(1+1/s), 0 GCOL 0: MOVE 520, 785: PRINT z$; MOVE 0, 0 ENDPROC