% damped_spring_response.m
%
% This MATLAB script file demonstrates the
% form of the response function for a
% damped spring.
%
% K. Beers. MIT ChE. 12/14/2002
% For discrete Fourier transform, use the
% MATLAB convention
epsilon = -1;
% Now, set the spring constants.
zeta = 1; % drag constant
K_s = 1; % spring constant
mass= 1; % mass
% Generate an appropriate time step and
sampling time vector
omega_s = sqrt(K_s/mass); % natural
frequency of spring
P_s = pi/omega_s; % half-period of
spring
if(zeta > sqrt(eps))
lambda = mass/zeta;
else
lambda = mass/sqrt(eps);
end
P_sample = max(P_s, min(lambda,10*P_s));
dt = P_s / 100; % set sufficient
sampling period
t0 = 0; % initial time
t_end = 6*P_s;
t_val = [t0 : dt : t_end];
N = length(t_val); % # of sampling
points
if(~rem(N,2)) % if N is odd
N = N + 1;
t_val = [t_val, t_end +
dt];
end
P_data = N*dt;
% set frequency values for this data set
d_omega = pi/P_data;
omega_max = (N-1)*d_omega;
omega = [0 : d_omega : omega_max];
% calculate Fourier transform of response
function
r_FT_real = zeros(size(omega));
r_FT_imag = zeros(size(omega));
for m=1:length(omega)
omega_m = omega(m);
harmonic = omega_s^2 -
omega_m^2;
viscous = (zeta/mass)*omega_m;
denom = harmonic^2 +
viscous^2;
r_FT_real(m) = harmonic/mass/denom;
r_FT_imag(m) = epsilon*viscous/mass/denom;
end
r_FT = complex(r_FT_real,r_FT_imag); %
construct complex F.T.
% Now, convert to discrete Fourier transform
format.
r_FT = (sqrt(2*pi)/dt)*r_FT;
% calculate response function from inverse
Fourier transform
r = real(ifft(r_FT));
% plot response function in Fourier and time
space
figure;
% power spectrum of response function.
Only plot up to
% a certain magnitude of the characteristic
spring
% frequency.
subplot(2,1,1);
r_PS = real(conj(r_FT).*r_FT);
plot(omega,r_PS);
omega_plot_max = 2*omega_s;
axis([0 omega_plot_max min(r_PS) max(r_PS)]);
xlabel('\omega');
ylabel('|R(\omega)|^2');
phrase_val = ['\zeta = ', num2str(zeta), ...
',
K_s = ', num2str(K_s), ...
',
m = ', num2str(mass)];
title(['Response of damped spring, ',
phrase_val]);
% time plot of response function
subplot(2,1,2);
plot(t_val,r);
xlabel('t');
ylabel('r(t)');