Dynamic Stability
Contents
Dynamic Stability#
In this course, the equations of motion have been developed in a Newtonian framework - these, in conjunction with the relationship between body rates and the time rate of change of the Euler angles, allow us to describe full unconstrained flight of a six degree of freedom aircraft.
Regarding static stability, some basic static stability properties of fixed-wing aircraft were explored - what the immediate tendency of the aircraft is following a disturbance from trim. In the previous module we developed the equations of motion into two sets of uncoupled linearised equations of motion, representing the longitudinal and lateral/directional motions of fixed wing aircraft.
In this final module, we look at the dynamic stability characteristics of an aircraft - how the aircraft actually responds with time, and how the response to basic pilot inputs may be determined. The stability of any dynamic system is governed by consideration of its free (unforced) motion. Its response to an input (an aircraft control) is determined by the response of the system to forcing.
A simple example that helps us understand dynamic systems is the mass/spring/damper system as shown:
This system is governed by the equation of motion:
where \(x\) is the displacement, \(m\) is the mass, \(c\) is the damping, \(k\) is the spring stiffness, and \(F(t)\) is the input forcing. For free motion, \(F(t)=0\):
which we can represent as:
where \(\omega_n\) is the undamped natural frequency of the system (\(=\sqrt{\frac{k}{m}}\) for this case) and \(\zeta\) is the damping ratio of the system (\(=\frac{c}{2\sqrt{km}}\) for this case).
The stability of this system is given by solution of Eq (86) directly. The general solution is found by assuming that the solution will have the form \(x=Ae^{\lambda_t}\), hence \(\dot{x}=A\lambda e^{\lambda t}, \ddot{x} = A\lambda^2 e^{\lambda t}\). Substitution of this into Equation (86) yields the characteristic equation:
the roots of which are
by superposition, the general solution is
where
Because \(0\leq\zeta\leq\infty\), the radicand may be positive, negative, or zero. These three possibilities give rise to three different types of damped motion, and the difference in behaviour may be classified according to the table below
\(\boldsymbol{\zeta}\) |
Type of Motion |
\(\boldsymbol{\lambda_1,\lambda_2}\) |
Motion Characteristics |
---|---|---|---|
\(>1\) |
‘Overdamped’ |
Real, negative, distinct |
Motion decays to zero over a period of time, \(t\), with zero oscillation. |
\(=1\) |
‘Critically Damped’ |
Real, negative, equal |
Motion decays to zero over a period of time \(t\), where \(t\) is the shortest possible time to return to equilibrium for this system. |
\(<1\) |
‘Underdamped’ |
Complex |
Motion returns toward, and beyond zero in time \(t\) where \(t\) is smaller than the time for the critically damped case. Motion will overshoot and exhibit harmonic oscillation. |
different values of \(\zeta\) are demonstrated for free vibration of the mass-spring-damper system, with the maxima/minima of the underdamped cases shown, to show the change in the damped natural frequencies of the system. Furthermore, the period of the oscillatory systems are used to show the damped natural frequency which is then compared with the value from the formula. Hopefully this should elucidate the difference between the two sorts of natural frequencies.
import numpy as np
import plotly.graph_objects as go
import scipy.signal as sig
# Some constants
m = 1 # mass, kg
k = 25 # spring stiffness, Pa
F0 = 0 # Forcing is zero (free vibration)
x0 = 1 # Initial displacement, m
# time vector
t = np.linspace(0, 2, 10000)
# undamped natural frequency
w_n = np.sqrt(k/m)
# make a figure
fig = go.Figure()
# Iterate over zeta values
for Z in [0.1, .2, 0.3, 0.8, 1, 2.5]:
lam = np.zeros(2, dtype="complex")
lam[0] = w_n * (-Z + np.sqrt(Z**2 -1, dtype="complex"))
lam[1] = w_n * (-Z - np.sqrt(Z**2 -1, dtype="complex"))
x = x0 * (0.5 * np.exp(lam[0] * t) + 0.5 * np.exp(lam[1] * t))
# Plot the solution
fig.add_trace(go.Scatter(x=t, y=x.real,\
mode='lines',\
name=f"$\\zeta={Z}$", showlegend=True))
# put the peaks on
if (Z > 0) and (Z < 0.8):
high_peaks = sig.find_peaks(x.real)[0]
fig.add_trace(go.Scatter(x=t[high_peaks], y=x.real[high_peaks], mode="markers", marker_color="blue", showlegend=False))
low_peaks = sig.find_peaks(-x.real)[0]
fig.add_trace(go.Scatter(x=t[low_peaks], y=x.real[low_peaks], mode="markers", marker_color="red", showlegend=False))
# Get the damped natural frequencies from these
wd_figure = 1/(t[low_peaks[1]] - t[low_peaks[0]])
wd = w_n * np.sqrt(1 - Z**2)
def Hertz(rad):
return rad/np.pi/2
print(f"From the figure the period gives a frequency of {wd_figure:1.2f}Hz for damping ratio of {Z}. For\
an undamped natural frequency of {Hertz(w_n):1.2f}Hz, this corresponds to a damped natural frequency of {Hertz(wd):1.2f}Hz.\n")
fig.update_layout(
title="$\\text{Free vibration of an initially displaced mass spring damper system for different }\zeta$",
title_x=0.5,
xaxis_title="$t/\\text{s}$",
yaxis_title="$x/\\text{m}$",
)
fig.show()
From the figure the period gives a frequency of 0.79Hz for damping ratio of 0.1. For an undamped natural frequency of 0.80Hz, this corresponds to a damped natural frequency of 0.79Hz.
From the figure the period gives a frequency of 0.78Hz for damping ratio of 0.2. For an undamped natural frequency of 0.80Hz, this corresponds to a damped natural frequency of 0.78Hz.
From the figure the period gives a frequency of 0.76Hz for damping ratio of 0.3. For an undamped natural frequency of 0.80Hz, this corresponds to a damped natural frequency of 0.76Hz.