% matlab script sho.m % finite difference scheme for simple harmonic oscillator %%%%%% begin global parameters SR = 44100; % sample rate (Hz) f0 = 200; % fundamental frequency (Hz) TF = 0.05; % duration of simulation (s) u0 = 0.1; % initial displacement v0 = 1; % initial velocity %%%%%% end global parameters % check that stability condition is satisfied if(SR<=pi*f0) error('Stability condition violated'); end % derived parameters k = 1/SR; % time step u1 = u0+k*v0; % derive value of time series at n=1; coef = 2-k^2*(2*pi*f0)^2; % scheme update coefficient NF = floor(TF*SR); % duration of simulation (samples) % initialize state of scheme u=0; % current value of time series u_last = u1; % last value of time series u_last2 = u0; % one before last value of time series % initialize readout out = zeros(NF,1); out(1) = u0; out(2) = u1; %%%%% start main loop for n=3:NF u=coef*u_last-u_last2; % difference scheme calculation out(n) = u; % read value to output vector u_last2 = u_last; u_last = u; % update state of difference scheme end %%%%% end main loop % plot output waveform plot([0:NF-1]*k, out, 'k'); xlabel('t'); ylabel('u'); title('SHO: Difference Scheme Output'); axis tight % play sound soundsc(out,SR);