You are on page 1of 14

# A&AE 421 Dynamic Analysis of a Simple Pendulum

(with corrected damping term, 1/12/01)

Assume that a simple pendulum consists of a ball on a string. Gravity tends to make the pendulum (ball) return to the vertical position. If the ball is given an initial angle, θ, and let go it will oscillate. The aerodynamic drag on the ball tends to make the ball slow down and eventually stop.

θ l

Pendulum differential equation
where g is the acceleration of gravity, l is the length of the pendulum, ρ is the air density, S is the cross-sectional area of the ball of the pendulum, m is the mass of the ball, and CD is the drag coefficient of the ball. Motion variable θ is the angle that the pendulum makes with a vertical line. The sign function is required to insure that the drag force always resists the motion due to the rate of change of angle θ.

g ˙˙ ˙ 2 [sign(θ ˙ )] / m θ = − sin(θ) − .5ρSC D lθ l

Pendulum state space model

 g 1 ( x 1 , x 2 ) ˙  ˙ 1  θ x ˙ = x= = = g − sin( x 1 ) − .5ρSC D lx 2 2 sign( x 2 ) / m   ˙ 2  ˙˙ g ( x , x ) θ  x  l   2 1 2 

 x 1  θ x =   = ˙ x 2  θ x2

One time history s for θ and the other is for the rate of change of θ. Comparisons of the nonlinear and linear simulations are plotted.1]T.mdl to view the graphical representation of the pendulum model.0]T. x1 and x2 were defined earlier for the pendulum. PART 2 The script PendAnal. These can be found on the class web site at http://roger.Student Assignment (Due Thursday. Open the file pendulum. A linear simulation will be created and executed from the nonlinear Simulink model. Analytically generate these Jacobian matrices by taking the indicated partial derivatives and evaluating the partials at the reference conditions. Specifically find  ∂g 1 ∂g  ∂x 1 Jacobian = a matrix = = ∂x  ∂g 2   ∂x 1 ∂g 1  ∂x 2   ∂g 2  ∂x 2   where g1. 1/18/01) PART 1 Running Simulink for the Pendulum Find a computer that can run MATLAB 5 and Simulink.m and the MATLAB script called PendAnal. g2. With the model window active. The time histories of θ. and time are saved in the MATLAB workspace in matrices ynlsim and tnlsim.ecn.purdue. Type simulink form the MATLAB command window. The time history of the pendulum should appear on the Scope window. The first is for xR=[0. Click on the scope to bring up a window that will contain the plots of the dynamic response of the pendulum. Copy to that computer the Simulink model file pendulum. We will use these later. Then evaluate the Jacobian at for xR=[0. select the Start option from the Simulation menu. . From the MATLAB command window run the script PendAnal.m to include your name in the titles of the two figures and hand them in to verify that you have done all this.mdl. the m-file pendeom. and the second is for xR=[0.m generates Jacobian matrices (a matrix) for two reference conditions.m by typing PendAnal.0]T. and at xR=[0. the rate of change of θ.m.1]T.htm l Start MATLAB. Compare these two results to the a matrices computed by the script PendAnal.edu/~andrisan/Courses/AAE421_S2001/Docs_Out/Docs_Out. Modify the script PendAnal.m.

Simulink Block Diagram to Analyze the Nonlinear Behavior of the Simple Pendulum Out1 Scope Pendulum Subsystem ynlsim To Workspace tnlsim Clock With corrected damping term (1/12/01) To Workspace1 .

m which is writen using in S-function protocol.file called pendeom.Simulink Subsystem containing an S-function called pendeom which has the nonlinear differential equations for the the Simple Pendulum pendeom S-Function 1 Out1 This S-function links to an m. With corrected damping term (1/12/01) .

% mass is the mass of the ball that forms the massive part of the pendulum.thetadot0) % S-file for pendulum (with corrected damping term.NumSampleTimes = 1. case 1. % Specify initial conditions for all states str = []. % l is the length of the pendulum.u). otherwise % Invalid input error(['Unhandled flag = '.u.NumOutputs = 2.DirFeedthrough = 0. sizes.thetadot0].m) This is the contents of the file pendeom. % Compute time of next sample sys=mdlGetTimeOfNextVarHit(t.l.mass. % Initialization [sys.HalfRhoSCd. % Compute derivatives of continuous states sys=mdlDerivatives(t. sizes.NumContStates = 2.x.x. end %*********************************************************** %* mdlInitializeSizes * %*********************************************************** function [sys.u).x0.The m-file describing the pendulum (pendeom.theta0.x.u.str.g.u). sizes. and the sample times and offets. function [sys. sizes = simsizes. % theta0. sys=mdlUpdate(t.thetadot0) % Return the sizes of the system vectors.mass) .ts] = pendeom(t.x. % Create the sizes structure sizes. case 9.num2str(flag)]).HalfRhoSCd.ts]=mdlInitializeSizes(theta0.l.NumInputs = 0. % Finished.flag. sizes.NumDiscStates = 0. thetadot0 are the initial condition on theta and thetadot. case 3.ts]=mdlInitializeSizes(theta0. Do any needed sys=mdlTerminate(t. %initialize the array of sample times %*********************************************************** %* mdlDerivatives * %*********************************************************** . % load sys with the sizes structure x0 = [theta0.x. case 2. It contains the differential equations in for the simple pendulum.x0.g.str.x. switch flag. % g is the acceleration of gravity. initial % conditions. % at least one sample time is needed sys = simsizes(sizes). % str is always an empty matrix ts = [0 0]. % Compute output vector case 4.str. 1/12/01) % This is an S-file subsystem that models a simple pendulum. sys=mdlOutputs(t.m which is written using the Sfunction protocol.x0.thetadot0). sizes.u). case 0.

% Script to analyse the pendulum system. % Empty since this model has no discrete states.DX]=trim('pendulum') disp('Reference point about which to linearize') xR=[0. This allows the nonlinear simulation ot be stored in the matrices ynlsim and tnlsim. If necessary. and input sys = x . time.g.u) % Return the time of the next hit for this block.x. disp('Find trim condition') [X.mass) % Compute derivatives of continuous states x_dot = [x(2).u) % Compute update for discrete states.HalfRhoSCd.x.Y.U.function sys=mdlDerivatives(t. % Point about which to linearize disp(' ').l.0] .disp(' '). sys = [] . check for % sample time hits. Note that % the result is absolute time. %*********************************************************** %* mdlGetTimeOfNextVarHit * %*********************************************************** function sys=mdlGetTimeOfNextVarHit(t.x.x.u.u) % Perform any necessary tasks at the end of the simulation sys = []. -(g/l)*sin(x(1))-HalfRhoSCd*l*x(2)*x(2)*sign(x(2))/mass] .x_dot(2)] . MATLAB Script to analyze the pendulum(PendAnal.u) % Compute output vector given current state. sys = []. %*********************************************************** %* mdlUpdate * %*********************************************************** function sys=mdlUpdate(t. sys = [x_dot(1). Note that this function is % only used when you specify a variable discrete-time sample % time [-2 0] in the sample time array in sampleTime = 1. %*********************************************************** %* mdlOutputs * %*********************************************************** function sys=mdlOutputs(t.m) The MATLAB script below should be run only after the Simulink simulation has been run.disp('Start here'). %************************************************************ %* mdlTerminate * %************************************************************ function sys=mdlTerminate(t.x.

disp(' ').c.Z]=damp(a) % Find properties of the poles of linearized system period=2*pi/Wn(1) % Periods in 10 second disp('Periods in ten seconds') P10=10/period PSYS=ss(a. thetadot= '. .0] [Wn.1] d=[0.disp('New reference point').1] [a. subplot(211) plot(t.0.tnlsim.0]. %Do linear simulation %Plot the linear results and the nonlinear results % which have been stored in tnlsim and ynlsim.1). d=[0.1).xR.2).'.num2str(xR(1)). Wn= '.t.[]) b=[0.t]=lsim(PSYS.b.'.'x') title([str1.ynlsim(:.5.[a.d]=linmod('pendulum'.2).num2str(Z(1))].d]=linmod('pendulum'. [y. str2=['.b.0].num2str(Wn(1)).c.x0).0.'nonlinear sim') % Do everything over again at another linearization point disp(' ').y(:.0] %Use this initial condition for linear simulation t=0:.0] c=[1.0. figure(1) str1=['For Pendulum linearized about theta= '.ynlsim(:.y(:.'nonlinear sim') subplot(212) plot(t.1].1:10'.[]) %Find linear model of nonlinear pendulum b=[0.0.b.num2str(xR(2))].'-'.'x') xlabel('time (sec)') ylabel('thetaDot (r/s)') legend('linear sim'. u=zeros(size(t)). Zeta= '.u.xR.'-'.tnlsim.str2]) xlabel('time (sec)') ylabel('theta (rad)') legend('linear sim'.c. c=[1.d) %Create a linear state space system disp('Initial condition for linear simulation') x0=[. xR=[0.

5.1). thetadot= '.y(:.u.'-'.x0). figure(2) str1=['For Pendulum linearized about theta= '.t.'.num2str(Z(1))].1).'x') title([str1.t]=lsim(PSYS.'.94673864837647e-13 Reference point about which to linearize xR = .ynlsim(:. disp('Initial condition for linear simulation') x0=[.'nonlinear sim') Output from the above script Start here Find trim condition X = -1.50494170623093e-26 1.20915443998539e-14 -3.50494170623093e-26 U = Empty matrix: 0-by-1 Y = Empty matrix: 0-by-1 DX = -3.[Wn.num2str(xR(2))].d). u=zeros(size(t)).b.tnlsim.Z]=damp(a) PSYS=ss(a. str2=['.ynlsim(:. subplot(211) plot(t.num2str(Wn(1)).c.y(:. Wn= '.num2str(xR(1)).2). Zeta= '.'-'.tnlsim.2).'nonlinear sim') subplot(212) plot(t.str2]) xlabel('time (sec)') ylabel('theta (rad)') legend('linear sim'.1:10'.0] %Use this initial condition for linear simulation t=0:. [y.'x') xlabel('time (sec)') ylabel('thetaDot (r/s)') legend('linear sim'.

4025e-07 0 1 1 -1.38606110332193 a = x1 x2 x1 0 -16.01248052951434 Z = 1.01248052951434 4.565910478808 Periods in ten seconds P10 = 6.0999999997317 b = Empty matrix: 2-by-0 c = Empty matrix: 0-by-2 d = [] b = 0 0 c = 1 0 d = 0 0 Wn = 4.74762595506195e-08 1.1 x2 1 -1.402463019451e-07 b = x1 x2 u1 0 0 .0 0 a = 0 -16.74762595506195e-08 period = 1.

5 0 New reference point xR = 0 1 a = 0 -16. Initial condition for linear simulation x0 = 0.01248052951528 4.c = y1 y2 d = y1 y2 u1 0 0 x1 1 0 x2 0 1 Continuous-time system.01248052951528 Z = 0.5 0 » 1.00349526939373441 0.0280494007755387 .00000000000047 -0.00349526939373441 Initial condition for linear simulation x0 = 0.0999999997316 b = Empty matrix: 2-by-0 c = Empty matrix: 0-by-2 d = [] Wn = 4.

.

Wn= 4. Zeta= 1.7476e-08 0.5 0 1 2 3 4 5 time (sec) 6 7 8 9 10 3 2 thetaDot (r/s) 1 0 -1 -2 -3 0 1 2 3 4 5 time (sec) 6 7 8 9 10 linear sim nonlinear sim . thetadot= 0.5 linear sim nonlinear sim theta (rad) 0 -0.0125.For Pendulum linearized about theta= 0.

Zeta= 0. Wn= 4.For Pendulum linearized about theta= 0. thetadot= 1.0125.0034953 0.5 0 1 2 3 4 5 time (sec) 6 7 8 9 10 2 1 thetaDot (r/s) linear sim nonlinear sim 0 -1 -2 0 1 2 3 4 5 time (sec) 6 7 8 9 10 .5 linear sim nonlinear sim theta (rad) 0 -0.