Sei sulla pagina 1di 17

Modeling the Collapse of Galloping Gertie

Bridge Over Troubled Water

Kasen Culler
Roman Drake
Brady Lee
Brett Sleyster

This report is dedicated to Tubby Coatsworth, the lone casualty of the collapse of the Tacoma
Narrows Bridge. The captain goes down with the ship, and so Tubby went down with his
owners car. Tubby was a loyal and fearless companion, his bravery exceeded only by his
ignorance of the mathematical information contained herein.

Introduction
On November 7, 1940, a bridge spanning the Tacoma Narrows in Washington collapsed,
resulting in the death of an innocent cocker spaniel named Tubby. The collapse was a result of
oscillations caused by 42mph winds. By simplifying some of the more complicated details of the
collapse, such as assuming the bridges vertical suspension cables do not move horizontally
during the oscillations or that the roads center of mass does not move vertically, the oscillations
which resulted in the bridges collapse can be modeled using a differential equation. The motion
of a section of the bridge can be modeled by the second-order differential equation:
2
= 2 cos() [esin esin ]
2
Equation 1
where =0.6 is a dimensionless parameter. This equation represents a system with no damping or
externally applied forcing. A variation of the Runge-Kutta method is used to determine the
motion as a function of time for different initial conditions.
The equation representing a cross-section of the bridge with damping and externally applied
forcing is:
2

= 0 (0)
2 () [ ]
2

The goal of this lab is to use MATLAB in conjunction with these equations to simulate the
oscillations of the Tacoma Narrows Bridge on the day it collapsed. Specifically, plots angle of
rotation versus time and angular velocity versus time can be produced, and characteristics of the
bridge such as the period of oscillation can be calculated. Also, the steady-state response curve
of the bridge will be determined for the second differential equation above. In other words,
MATLAB will be used to find the amplitude of the oscillations after all the transients have died
out, or after the bridge has achieved recurring steady oscillations.

Task 1
Equation 1 from the introduction can be rewritten by defining d/dt as (t). The equation then
becomes
(t) = 2 cos() [esin esin ]
Equation 2
The Runge-Kutta method can now be used to solve the system. The code for a program that
solves the system given by Equation 2 (with initial condition 0=/4, 0=0) is included in the
appendix. The program models the system for one period of motion. The program pre-allocates a
vector to be used for theta and omega and gives an error message if the number of computations
exceeds the size of the vector. The period of the motion can be calculated using linear

interpolation, in which the straight line between the final and penultimate values of (t, ) is
calculated and used to find the value for t at which equals 0.

Task 2
The step-size for the Runge-Kutta program needs to be reduced to around 0.00001s to yield a
period that is accurate to 4 decimal places. For 0=/4, T=4.7324s. Figures 1 and 2 display the
graphs of and for this initial condition as a function of time for one period of motion.

Task 3
Figures 3 and 4 display the graphs of and for the initial condition 0=0.99/2. In this case,
compared to the initial condition 0=/4, the period has increased to T=13.9187s. The maximum
is, of course, greater, indicating further tilting of the bridge. The maximum angular velocity
is also greater, indicating more sudden movements. remains near zero for the initial part of the
period. This means that is not changing very much when it is near its maximum value. In other
words, the bridge remains at its most tilted position until suddenly shifting to the same degree of
tilt in the opposite direction. For 0=/2, only ever equals 0, so the bridge is constantly tilted
vertically.

Figure 1: (t) for 0= /4

Figure 2: (t) for 0= /4

Figure 3: (t) for 0=0.99/2

Figure 4: (t) for 0= 0.99/2

Task 4
As 0 increases, the maximum value of obviously increases. For larger values of 0, the
maximum (which occurs at =0) increases. Indeed the at any particular value of increases
as 0 increases. This can be seen in Figure 5, which shows the phase plots of and for 0 from
/16 to 7/16. As 0 nears /2, the phase plot becomes more oblong. For values of 0 close to /2,
an equal shift in does not increase as dramatically compared to phase plots of 0 farther from
/2.

Figure 5: Phase Plots of and

Task 6
As 0 increases from 0 to /2, the period of the motion increases as well. This is consistent with
the results obtained in Tasks 2 and 3 in which T increased as 0 increased. The period is
increasing at an increasing rate until it asymptotes at 0=/2, where the period does not exist
because the bridge is undergoing no motion. This result is shown in Figure 6.

Figure 6: Period vs. Initial Theta from 0=0.01/2 to 0=0.99/2

Task 7
Damping and an external force can be added to Equation 1 so it becomes
2

= 0 (0)
2 () [ ]
2

Equation 3
The MATLAB code from Task 1 can be modified to find the steady state of this equation, with
f0 = 0.1, c = 0.08, and = 0.6. It does so by performing the Runge-Kutta method for a large
amount of time to move the system to its steady state. It then uses the final values from this
computation as the initial condition and solves the system for one period further and computes
the maximum value of . This code is included in the appendix.

Task 8
Using the procedure in Task 7, forcing frequency 0 was varied from 0.8 to 2.0 and then back to
0.8, with the steady state conditions of the previous 0 functioning as initial conditions when
determining the amplitude at each value of 0. This code is included in the appendix. The
changing of 0 models the frequency of the wind velocity increasing and then decreasing. Figure
7 shows a graph of the amplitude of the steady-state response curve at values of 0 from 0.8 to

2.0, as well as the amplitude of the linear oscillation for a given frequency (according to data
from Task 6). According to the graph, when 0 is increasing, the system reaches a resonant case
where its amplitude peaks sharply before gradually decreasing. When 0 is decreasing, the
amplitude increases gradually until it reaches a different resonant case at a lower forcing
frequency and higher amplitude. At this new resonant case, the amplitude decreases sharply to
the same path as the case where frequency was increasing. The most glaring anomaly of the
nonlinear case is the presence of two resonant frequencies.

Figure 7: Amplitude vs. Frequency for Increasing and Decreasing Forcing Frequencies and the Linear System

Conclusion
The MATLAB plots from Task 3, the linear case, indicate that the period of oscillation when 0
is 0.99/2 is greater than that when 0 is /4. However, when the 0 is /2, the cross-section
being examined is completely vertical, and only equals 0. is generally close to 0 during the
beginning and end of the period, indicating that the bridge moves slowly while at its maximum
tilt and then quickly flips to the same degree of tilt in the opposite direction. As 0 increases, the
maximum values of and increase. Also, for values of 0 close to /2, a larger shift in is
required to change the value of some specific amount than for values of 0 farther from /2.
The results of Task 6 confirm that the period of oscillation increases as goes from 0 to /2.

For the nonlinear case, and the simulation in which 0 was varied from 0.8 to 2 and back again to
represent the frequency of the wind velocity increasing and decreasing, the system reaches a
resonant case where its amplitude peaks sharply before gradually decreasing when 0 is
increasing. When 0 is decreasing, the amplitude increases until it reaches a different resonant
case at a lower forcing frequency and higher amplitude. In this case, the amplitude decreases
rapidly and then joins the path of the amplitude when 0 is increasing.
The wind in Tacoma on November 7, 1940, likely increased and decreased in such a way that the
Tacoma Narrows Bridge neared its resonant case, resulting in the galloping effect seen in the
video of its collapse. Eventually, the amplitude of the oscillations was high enough to tear the
bridge apart.

Appendix
Task 2:
theta=pi/4; %theta=0.99*pi/2 for Task 3
t=0;
Wold=0; %this is a variable meaning "omega old" which will be used to stop
the while loop
Wnew=0; %omega new"
nsteps=1;
thetavector=zeros(1,15000000); %arbitrarily large input vector pre-allocated
Wvector=thetavector;
thetavector(1)=theta;
h=0.00001; %this step size calculates the period accurate to four decimal
places (h=0.000001 for Task 3)
while Wold<=0 || Wnew>=0 %this will stop the calculations when omega moves
from positive to negative
Wold=Wnew;
nsteps=nsteps+1;
if nsteps>size(Wvector)
error('number of steps has exceeded the size of the allocated
matrix')
end
%The following Runge-Kutta method must calculate new values for both
omega and theta. W1=W0+h*k, theta1=theta0+h*W
W1=Wold;
k1=-2*cos(theta)*(exp(0.6*sin(theta))-exp(-0.6*sin(theta)));
W2=Wold+h*k1/2;
k2=-2*cos(theta+h/2*W2)*(exp(0.6*sin(theta+h/2*W2))-exp(0.6*sin(theta+h/2*W2)));
W3=Wold+h*k2/2;
k3=-2*cos(theta+h/2*W3)*(exp(0.6*sin(theta+h/2*W3))-exp(0.6*sin(theta+h/2*W3)));
W4=Wold+h*k3;
k4=-2*cos(theta+h*W4)*(exp(0.6*sin(theta+h*W4))-exp(0.6*sin(theta+h*W4)));
Wnew=Wold+h/6*(k1+2*k2+2*k3+k4);
theta=theta+h*Wnew;
thetavector(nsteps)=theta;
Wvector(nsteps)=Wnew;
end
thetavector(nsteps+1:end)=[];
Wvector(nsteps+1:end)=[];
tvector=h*(0:(nsteps-1));
T=tvector(nsteps-1)+h*(Wold/(Wold-Wnew)) %this uses linear interpolation to
find the t-intercept of omega
plot(tvector,Wvector)
title('Omega vs. Time')
xlabel('time')
ylabel('omega')
figure()
plot(tvector,thetavector,'r')
title('Theta vs. Time')
xlabel('time')
ylabel('theta')

Task 4:
for theta=(pi/16:pi/16:7*pi/16);
Wold=0; %this is a variable meaning "omega old" which will be used to stop
the while loop
Wnew=0; %omega new"
nsteps=1;
thetavector=zeros(1,1000000); %arbitrarily large input vector pre-allocated
Wvector=thetavector;
thetavector(1)=theta;
h=0.0001; %step size has been increased to make the program run faster
while Wold<=0 || Wnew>=0 %this will stop the calculations when omega moves
from positive to negative
Wold=Wnew;
nsteps=nsteps+1;
if nsteps>size(Wvector)
error('number of steps has exceeded the size of the allocated
matrix')
end
%The following Runge-Kutta method must calculate new values for both
omega and theta. W1=W0+h*k, theta1=theta0+h*W
W1=Wold;
k1=-2*cos(theta)*(exp(0.6*sin(theta))-exp(-0.6*sin(theta)));
W2=Wold+h*k1/2;
k2=-2*cos(theta+h/2*W2)*(exp(0.6*sin(theta+h/2*W2))-exp(0.6*sin(theta+h/2*W2)));
W3=Wold+h*k2/2;
k3=-2*cos(theta+h/2*W3)*(exp(0.6*sin(theta+h/2*W3))-exp(0.6*sin(theta+h/2*W3)));
W4=Wold+h*k3;
k4=-2*cos(theta+h*W4)*(exp(0.6*sin(theta+h*W4))-exp(0.6*sin(theta+h*W4)));
Wnew=Wold+h/6*(k1+2*k2+2*k3+k4);
theta=theta+h*Wnew;
thetavector(nsteps)=theta;
Wvector(nsteps)=Wnew;
end
thetavector(nsteps+1:end)=[];
Wvector(nsteps+1:end)=[];
%because the programmers are slightly inept, the next 17 lines are devoted
%to plotting the parametric curves in different colors. Because the
%programmers are fabulous, the curves are plotted in as close to rainbow as
%possible.
if thetavector(1)==pi/16
plot(thetavector,Wvector,'r')
elseif thetavector(1)==2*pi/16
plot(thetavector,Wvector,'y')
elseif thetavector(1)==3*pi/16
plot(thetavector,Wvector,'g')
elseif thetavector(1)==4*pi/16
plot(thetavector,Wvector,'c')
elseif thetavector(1)==5*pi/16
plot(thetavector,Wvector,'b')
elseif thetavector(1)==6*pi/16

plot(thetavector,Wvector,'m')
else
plot(thetavector,Wvector,'k')
end
hold on
end
title('Theta vs. Omega for Different Initial Theta')
xlabel('theta')
ylabel('omega')

Task 6:
n=0;
Tvector=zeros(1,99);
for theta=(0.01*pi/2:0.01*pi/2:0.99*pi/2)
n=n+1;
t=0;
Wold=0; %this is a variable meaning "omega old" which will be used to stop
the while loop
Wnew=0; %omega new"
nsteps=1;
thetavector=zeros(1,10000000); %arbitrarily large input vector pre-allocated
Wvector=thetavector;
thetavector(1)=theta;
h=0.0001; %step size has been increased to make the program run faster
while Wold<=0 || Wnew>=0 %this will stop the calculations when omega moves
from positive to negative
Wold=Wnew;
nsteps=nsteps+1;
if nsteps>size(Wvector)
error('number of steps has exceeded the size of the allocated
matrix')
end
%The following Runge-Kutta method must calculate new values for both
omega and theta. W1=W0+h*k, theta1=theta0+h*W
W1=Wold;
k1=-2*cos(theta)*(exp(0.6*sin(theta))-exp(-0.6*sin(theta)));
W2=Wold+h*k1/2;
k2=-2*cos(theta+h/2*W2)*(exp(0.6*sin(theta+h/2*W2))-exp(0.6*sin(theta+h/2*W2)));
W3=Wold+h*k2/2;
k3=-2*cos(theta+h/2*W3)*(exp(0.6*sin(theta+h/2*W3))-exp(0.6*sin(theta+h/2*W3)));
W4=Wold+h*k3;
k4=-2*cos(theta+h*W4)*(exp(0.6*sin(theta+h*W4))-exp(0.6*sin(theta+h*W4)));
Wnew=Wold+h/6*(k1+2*k2+2*k3+k4);
theta=theta+h*Wnew;
thetavector(nsteps)=theta;
Wvector(nsteps)=Wnew;
end
thetavector(nsteps+1:end)=[];
Wvector(nsteps+1:end)=[];
tvector=h*(0:(nsteps-1));

T=tvector(nsteps-1)+h*(Wold/(Wold-Wnew)); %this uses linear interpolation to


find the t-intercept of omega
Tvector(n)=T;
end
plot((0.01*pi/2:0.01*pi/2:0.99*pi/2),Tvector)
title('Period vs. Initial Theta')
xlabel('initial theta')
ylabel('period')

Task 7:
% bridge initially stable
theta = 0;
Wnew = 0;
w0 = 1;
t=0;
tfinal = 100*(2*pi/w0); % long enough for transient to die out
h=0.0001;
while t <= tfinal
% run until transient dies out
Wold = Wnew;
% runge-kutta method
W1 = Wold;
k1 = 0.1*cos(w0*t) - 2*cos(theta)*(exp(0.6*sin(theta)) - exp(0.6*sin(theta))) - 0.08 * W1;
W2 = Wold + h * k1/2;
t = t+h/2;
k2 = 0.1*cos(w0*t) - 2*cos(theta + h/2*W2)*(exp(0.6*sin(theta + h/2*W2))
- exp(-0.6*sin(theta + h/2*W2))) - 0.08 * W2;
W3 = Wold + h * k2/2;
k3 = 0.1*cos(w0*t) - 2*cos(theta + h/2*W3)*(exp(0.6*sin(theta + h/2*W3))
- exp(-0.6*sin(theta + h/2*W3))) - 0.08 * W3;
W4 = Wold + h * k3;
t = t+h/2;
k4 = 0.1*cos(w0*t) - 2*cos(theta + h*W4)*(exp(0.6*sin(theta + h*W4)) exp(-0.6*sin(theta + h*W4))) - 0.08 * W4;
Wnew = Wold + h/6 * (k1 + 2*k2 + 2*k3 + k4);
theta = theta + h * Wnew;
end
t=0;
tfinal = 2*pi/w0; % one period
h=0.00001;
nsteps=1;
thetavector=zeros(1,10000000);
thetavector(1) = theta;
while t <= tfinal
% accurately determine amplitude
Wold=Wnew;

nsteps=nsteps+1;
% runge-kutta method
W1 = Wold;
k1 = 0.1*cos(w0*t) - 2*cos(theta)*(exp(0.6*sin(theta)) - exp(0.6*sin(theta))) - 0.08 * W1;
W2 = Wold + h * k1/2;
t = t+h/2;
k2 = 0.1*cos(w0*t) - 2*cos(theta + h/2*W2)*(exp(0.6*sin(theta + h/2*W2))
- exp(-0.6*sin(theta + h/2*W2))) - 0.08 * W2;
W3 = Wold + h * k2/2;
k3 = 0.1*cos(w0*t) - 2*cos(theta + h/2*W3)*(exp(0.6*sin(theta + h/2*W3))
- exp(-0.6*sin(theta + h/2*W3))) - 0.08 * W3;
W4 = Wold + h * k3;
t = t+h/2;
k4 = 0.1*cos(w0*t) - 2*cos(theta + h*W4)*(exp(0.6*sin(theta + h*W4)) exp(-0.6*sin(theta + h*W4))) - 0.08 * W4;
Wnew = Wold + h/6 * (k1 + 2*k2 + 2*k3 + k4);
theta = theta + h * Wnew;
thetavector(nsteps) = theta;
end
thMax = max(thetavector); % get amplitude

Task 8:
thV = zeros(1,25); % store theta0 for post transient
wV = thV; % store w0 for post transient
wMaxV = thV;
thMaxV = thV;
count = 0;
% bridge initially stable
theta = 0;
Wnew = 0;
for w0 = [0.8:0.05:2.0,1.95:-0.05:0.8]
% theta, w remain from previous loop
count = count + 1; % vector index pointer
t=0;
tfinal = 100*(2*pi/w0); % long enough for transient to die out
h=0.0001;
while t <= tfinal
% run until transient dies out
Wold = Wnew;
% runge-kutta method
W1 = Wold;
k1 = 0.1*cos(w0*t) - 2*cos(theta)*(exp(0.6*sin(theta)) - exp(0.6*sin(theta))) - 0.08 * W1;
W2 = Wold + h * k1/2;

t = t+h/2;
k2 = 0.1*cos(w0*t) - 2*cos(theta + h/2*W2)*(exp(0.6*sin(theta +
h/2*W2)) - exp(-0.6*sin(theta + h/2*W2))) - 0.08 * W2;
W3 = Wold + h * k2/2;
k3 = 0.1*cos(w0*t) - 2*cos(theta + h/2*W3)*(exp(0.6*sin(theta +
h/2*W3)) - exp(-0.6*sin(theta + h/2*W3))) - 0.08 * W3;
W4 = Wold + h * k3;
t = t+h/2;
k4 = 0.1*cos(w0*t) - 2*cos(theta + h*W4)*(exp(0.6*sin(theta + h*W4))
- exp(-0.6*sin(theta + h*W4))) - 0.08 * W4;
Wnew = Wold + h/6 * (k1 + 2*k2 + 2*k3 + k4);
theta = theta + h * Wnew;
end
t=0;
tfinal = 2*pi/w0; % one period
h=0.00001;
nsteps=1;
%Wvector=zeros(1,10000000);
thetavector=zeros(1,10000000);
thetavector(1) = theta;
while t <= tfinal
% accurately determine amplitude
Wold=Wnew;
nsteps=nsteps+1;
if nsteps>size(Wvector)
error('number of steps has exceeded the size of the allocated
matrix')
end
% runge-kutta method
W1 = Wold;
k1 = 0.1*cos(w0*t) - 2*cos(theta)*(exp(0.6*sin(theta)) - exp(0.6*sin(theta))) - 0.08 * W1;
W2 = Wold + h * k1/2;
t = t+h/2;
k2 = 0.1*cos(w0*t) - 2*cos(theta + h/2*W2)*(exp(0.6*sin(theta +
h/2*W2)) - exp(-0.6*sin(theta + h/2*W2))) - 0.08 * W2;
W3 = Wold + h * k2/2;
k3 = 0.1*cos(w0*t) - 2*cos(theta + h/2*W3)*(exp(0.6*sin(theta +
h/2*W3)) - exp(-0.6*sin(theta + h/2*W3))) - 0.08 * W3;
W4 = Wold + h * k3;
t = t+h/2;
k4 = 0.1*cos(w0*t) - 2*cos(theta + h*W4)*(exp(0.6*sin(theta + h*W4))
- exp(-0.6*sin(theta + h*W4))) - 0.08 * W4;
Wnew = Wold + h/6 * (k1 + 2*k2 + 2*k3 + k4);
theta = theta + h * Wnew;
thetavector(nsteps) = theta;
%Wvector(nsteps) = Wnew;
end
%thV(count) = theta;
%wV(count) = Wnew;

%wMaxV(count) = max(Wvector);
thMaxV(count) = max(thetavector); % get amplitude
end
figure();
hold on;
plot(0.8:0.05:2, thMaxV(1:25), '-*b')
plot(2:-0.05:0.8, thMaxV(25:end), '--or')
xlabel('Frequency');
ylabel('Amplitude of Theta');
title('Amplitude vs Frequency');

Potrebbero piacerti anche