Perhaps the most jarring examples of structural stability loss is the **snap-through instability**. The most familiar example of **snapping** is the popper toy – a spherical cap made of rubber that rapidly jumps when it’s turned inside out.

**bistable**, as they have two configurations that are in statical equilibrium, rather than one

^{1}.

Although snapping may be familiar, the physical mechanism behind it is rather tricky, which leads us to a rather fundamental question:

Why does a structure suddenly “snap” to a new shape?

The simplest possible system that exhibits snapping is a bistable arch. We’ll consider an arch that has been discretized into two linear springs of stiffness , that are pinned^{2} together and pinned at supports separated by a distance . Initially, the springs form an arch with an angle , and upon loading the apex of the arch with a force the arch will deform with a new angle^{3} .

We know that for a structure to be in static equilibrium its **total potential energy** must be *stationary,*

The total potential energy of our simple arch will be the sum of the strain energy in the springs and the potential energy of the load,

.**Derive the total potential energy (Expand)**

The strain energy of a compressed spring is , where is the amount of compression.

Therefore, we can write the strain energy in the two springs as,

.If the arch is initially shallow, remains shallow, and symmetric, we can write this strain energy as

**Approximation of the strain energy (Expand)**

First, our small angle approximations allow us to Taylor expand the cosine of the angles

.Putting these expansions back into the strain energy, and factoring out leads to

.We next find a common denominator between the two fractions by multiplying each by one, in the form of for the first term, and for the second, arriving at

.Now, we pull out the one half squared, and expand the denominator, so that the energy becomes

.Finally, we see that all the terms in the denominator will be small compared with one due to our small angle approximation, so upon neglecting them we arrive at the approximate strain energy.

Now, we need the potential energy of the load, or the work done by a force displacing the arch some distance. The displacement is the difference in heights of the triangles above,

,which can be simplified by the small angle approximation to

.

Our total potential energy can be written as

So, we can find all the equilibrium configurations of the arch by differentiating the total strain energy with respect to the deformed angle, and setting that equal to zero. By solving for the load,

,we can plot a force vs. displacement diagram^{4} (Below, middle):

We can learn a few things from this force vs. displacement curve. First, three points equilibrium points when the force is zero, suggesting the arch may be multistable. Second, the curve has peaks – maxima and minima. The second main axiom of elastic stability says that for an equilibrium state to be **stable** it must be a relative **minimum** of the total potential energy. These peaks mean those equilibrium states may not be at a minimum, and suggest that we should check if these points are stable.

We check for stability by requiring the total potential energy to be a minimum – this means checking the second variation of the energy.

.Therefore, the second variation is

,and this parabola is plotted next to the force displacement curve above. Positive values of the second variation are stable, while negative values are unstable^{5}.

The picture of **snapping** should now start to come into focus. First we see that an arch is **bistable**^{6}. Second, when the arch is pushed on hard enough it reaches a point of **unstable equilibrium**, a *limit* point. It has no choice but to find an equilibrium shape that can sustain that applied load.

In the case of snapping, the closest stable equilibrium state is far away, and it requires the arch to jump suddenly to a new shape.

Putting this all together, we can see the behavior of a snapping arch below, along with its corresponding force vs. displacement curve.

The force increases until it reaches a critical point, and then the arch needs to find a shape on the equilibrium curve that can sustain that same load, and so it snaps. The area under the curve during the snapping process gives the energy released during snapping, which is typically dissipated through damping by large amplitude vibrations about the new equilibrium state. **In the example of a ***snapping popper***, these vibrations are the audible ‘pop’ you hear as it snaps.**

It is worth emphasizing that **snapping** is a *limit point instability*, which is a fundamentally different type of instability than **buckling**. Buckling is classified as a *stable, symmetric bifurcation*. The difference is important: with buckling when stability it lost, the closest, stable equilibrium state is **infinitesimally** close the state just prior to buckling. With snapping, the nearest equilibrium state is a **finite** distance away, and all the intermediate equilibrium states are inaccessible without some external controls.

**Mathematica Code (Expand)**

Note: Code is from Mathematica 10.3

[wlcode](*Snap-Through of a Simple Arch Douglas P. Holmes, Boston University www.bu.edu/moss Reference: [1] J.M.T. Thompson, G.W. Hunt, "A General Theory of Elastic Stability", John Wiley & Sons, London, (1973).*) (*Under the hood: Defining variables, plotting details, and generating a list*) k = 1; R = 1; \[Alpha] = \[Pi]/2; step = 0.1; pSizeRed = 0.04; pSizeGray = 0.0325; qList = Range[\[Alpha], \[Alpha]/\[Sqrt]3, -step]~Join~ Range[-2 \[Alpha]/\[Sqrt]3, -2 \[Alpha]/\[Sqrt]3 - 1/3, -step]~ Join~Range[-2 \[Alpha]/\[Sqrt]3 - 1/3, -\[Alpha]/\[Sqrt]3, step]~ Join~Range[2 \[Alpha]/\[Sqrt]3, 2 \[Alpha]/\[Sqrt]3 + 1/3, step]~ Join~Range[2 \[Alpha]/\[Sqrt]3 + 1/3, \[Alpha], -step]; X = Table[-Q1 + \[Alpha], {Q1, qList}]; \[Alpha]Step = Range[\[Alpha], -\[Alpha], -step]~Join~ Range[-\[Alpha], \[Alpha], step];[/wlcode]

*A Simple Arch — Show original/deformed arches*

Plot[\[Alpha] x + R \[Alpha], {x, -1, 0},

PlotRange -> {All, {-0.1 \[Alpha], 1.5 \[Alpha]}},

PlotStyle -> Thickness[0.02] , Ticks -> None,

AxesStyle -> LightGray, Method -> {“AxesInFront” -> False},

ImageSize -> 400],

Plot[-\[Alpha] x + R \[Alpha], {x, 0, 1},

PlotRange -> {All, {-0.1 \[Alpha], 1.5 \[Alpha]}},

PlotStyle -> Thickness[0.02]],

Graphics[{LightGray, PointSize[pSizeGray], Point[{-1, 0}]}],

Graphics[{LightGray, PointSize[pSizeGray], Point[{1, 0}]}],

Graphics[{Red, PointSize[pSizeRed], Point[{0, R \[Alpha]}]}],

Graphics[Text[Style[“R”, Large, Bold] , {0.5 R, 0.1 \[Alpha]}]],

Graphics[

Text[Style[“k”, Large, Bold] , {-0.55 R, 0.65 \[Alpha]}]],

Graphics[

Text[Style[“\[Alpha]”, Large, Bold] , {-0.75 R, 0.1 \[Alpha]}]],

Graphics[{Arrowheads[{-.05, .05}], Arrow[{{0, 0}, {R, 0}}]}] ];

archDef = Show[

Plot[\[Alpha]/2 x + R \[Alpha]/2, {x, -1, 0},

PlotRange -> {All, {-0.1 \[Alpha], 1.5 \[Alpha]}},

PlotStyle -> Thickness[0.02] , Ticks -> None,

AxesStyle -> LightGray, Method -> {“AxesInFront” -> False},

ImageSize -> 400],

Plot[-\[Alpha]/2 x + R \[Alpha]/2, {x, 0, 1},

PlotRange -> {All, {-0.1 \[Alpha], 1.5 \[Alpha]}},

PlotStyle -> Thickness[0.02]],

Graphics[{LightGray, PointSize[pSizeGray], Point[{-1, 0}]}],

Graphics[{LightGray, PointSize[pSizeGray], Point[{1, 0}]}],

Graphics[{Red, PointSize[pSizeRed], Point[{0, R \[Alpha]/2}]}],

Graphics[{Blue, Thick, Arrowheads[{0, .075}],

Arrow[{{0, R \[Alpha]}, {0, R \[Alpha]/2}}]}],

Graphics[

Text[Style[“P”, Large, Bold] , {0, R \[Alpha] + 0.1 \[Alpha]}]],

Graphics[

Text[Style[“\!\(\*SubscriptBox[\(Q\), \(1\)]\)”, Large,

Bold] , {-0.55 R, 0.1 \[Alpha]}]] ];

GraphicsRow[{archRef, archDef}][/wlcode]

*Energies, and First & Second Variations*

\[Zeta][Q1_] := R (\[Alpha] – Q1)

V[Q1_, P_] := U[Q1] – P \[Zeta][Q1]

P[Q1_] := Evaluate[ P /. Solve[D[V[Q1, P], Q1] == 0, P]];

V11[Q1_] := Evaluate[D[V[Q1, P], {Q1, 2}]][/wlcode]

*Animate/Manipulate plots of arch configuration, first and second variations*

Plot[Q1 x + R (Q1), {x, -1, 0},

PlotRange -> {All, {-1.5 \[Alpha], 1.5 \[Alpha]}},

PlotStyle -> Thickness[0.02] , Ticks -> None,

AxesStyle -> LightGray, Method -> {“AxesInFront” -> False},

ImageSize -> 333],

Plot[-Q1 x + R (Q1), {x, 0, 1},

PlotRange -> {All, {-1.5 \[Alpha], 1.5 \[Alpha]}},

PlotStyle -> Thickness[0.02]],

Graphics[{LightGray, PointSize[pSizeGray], Point[{-1, 0}]}],

Graphics[{LightGray, PointSize[pSizeGray], Point[{1, 0}]}],

Graphics[{Red, PointSize[pSizeRed], Point[{0, R Q1}]}] ];

archPvQ[Q1_] := Show[

Plot[P[q1][[1]], {q1, -2 \[Alpha], -\[Alpha]/\[Sqrt]3},

PlotRange -> {{-1.3 \[Alpha], 1.3 \[Alpha]}, {-1.1 \[Alpha],

1.1 \[Alpha]}}, PlotStyle -> {Black, Thickness[0.01]},

Frame -> {{True, False}, {True, False}} ,

FrameLabel -> {“\!\(\*SubscriptBox[\(Q\), \(1\)]\)”,

“P(\!\(\*SubscriptBox[\(Q\), \(1\)]\))”},

FrameTicks -> {{None,

None}, {{{-\[Alpha], “-\[Alpha]”}, {-\[Alpha]/\[Sqrt]3,

“-\!\(\*FractionBox[\(\[Alpha]\), \(\[Sqrt]3\)]\)”},

0, {\[Alpha]/\[Sqrt]3,

“\!\(\*FractionBox[\(\[Alpha]\), \(\[Sqrt]3\)]\)”}, \

{\[Alpha], “\[Alpha]”}}, None}}, ImageSize -> 333],

Plot[P[q1][[1]], {q1, -\[Alpha]/\[Sqrt]3, \[Alpha]/\[Sqrt]3},

PlotRange -> {{-1.1 \[Alpha],

1.1 \[Alpha]}, {-\[Alpha], \[Alpha]}},

PlotStyle -> {Gray, Dotted, Thickness[0.0055]}],

Plot[P[q1][[1]], {q1, \[Alpha]/\[Sqrt]3, 2 \[Alpha]},

PlotRange -> {{-1.1 \[Alpha],

1.1 \[Alpha]}, {-\[Alpha], \[Alpha]}},

PlotStyle -> {Black, Thickness[0.01]}],

Graphics[{Gray, PointSize[pSizeGray],

Point[{-\[Alpha]/\[Sqrt]3, -(\[Pi]^3/(12 Sqrt[3]))}]}],

Graphics[{Gray, PointSize[pSizeGray], Point[{0, 0}]}],

Graphics[{Gray, PointSize[pSizeGray],

Point[{\[Alpha]/\[Sqrt]3, \[Pi]^3/(12 Sqrt[3])}]}],

Graphics[{Red, PointSize[pSizeRed],

Point[{Q1, k R Q1 (\[Alpha]^2 – Q1^2)}]}] ];

archV11[Q1_] := Show[

Plot[V11[q1], {q1, -2 \[Alpha], -\[Alpha]/\[Sqrt]3},

PlotRange -> {{-1.3 \[Alpha], 1.3 \[Alpha]}, {-2 \[Alpha],

4 \[Alpha]}}, PlotStyle -> {Black, Thickness[0.01]},

Frame -> {{True, False}, {True, False}} ,

FrameLabel -> {“\!\(\*SubscriptBox[\(Q\), \(1\)]\)”,

“\!\(\*SubscriptBox[\(\[PartialD]\), \(11\)]\)V”},

FrameTicks -> {{{{-\[Alpha]^2,

“-\!\(\*SuperscriptBox[\(\[Alpha]\), \(2\)]\)”}, 0},

None}, {{-\[Alpha], “-\[Alpha]”}, {-\[Alpha]/\[Sqrt]3,

“-\!\(\*FractionBox[\(\[Alpha]\), \(\[Sqrt]3\)]\)”},

0, {\[Alpha]/\[Sqrt]3,

“\!\(\*FractionBox[\(\[Alpha]\), \(\[Sqrt]3\)]\)”}, {\[Alpha],

“\[Alpha]”}, None}}, ImageSize -> 333],

Plot[V11[q1], {q1, -\[Alpha]/\[Sqrt]3, \[Alpha]/\[Sqrt]3 },

PlotStyle -> {Gray, Dotted, Thickness[0.0055]}],

Plot[V11[q1], {q1, \[Alpha]/\[Sqrt]3, 2 \[Alpha]},

PlotRange -> {All, {-2 \[Alpha], 4 \[Alpha]}},

PlotStyle -> {Black, Thickness[0.01]}],

Graphics[{Red, PointSize[pSizeRed], Point[{Q1, V11[Q1]}]}],

Graphics[{Gray, PointSize[pSizeGray],

Point[{\[Alpha]/\[Sqrt]3, 0}]}],

Graphics[{Gray, PointSize[pSizeGray],

Point[{-\[Alpha]/\[Sqrt]3, 0}]}] ];

(*Animate[GraphicsRow[{archEQ[Q1],archPvQ[Q1],archV11[Q1]}],{Q1,\

\[Alpha],-\[Alpha]}, AnimationDirection\[Rule]ForwardBackward]*)

Manipulate[

GraphicsRow[{archEQ[Q1], archPvQ[Q1],

archV11[Q1]}], {Q1, \[Alpha], -\[Alpha]}][/wlcode]

*Animations of stable equilibrium arch configurations and snap-through*

Plot[Q1 x + R (Q1), {x, -1, 0},

PlotRange -> {All, {-1.5 \[Alpha], 1.5 \[Alpha]}},

PlotStyle -> Thickness[0.015], Ticks -> {None, None},

AxesStyle -> LightGray, Method -> {“AxesInFront” -> False},

ImageSize -> 500],

Plot[-Q1 x + R (Q1), {x, 0, 1},

PlotRange -> {All, {-1.5 \[Alpha], 1.5 \[Alpha]}},

PlotStyle -> Thickness[0.015]],

Graphics[{LightGray, PointSize[pSizeGray], Point[{-1, 0}]}],

Graphics[{LightGray, PointSize[pSizeGray], Point[{1, 0}]}],

Graphics[{Red, PointSize[pSizeRed], Point[{0, R Q1}]}]];

archPvD[Q1_] := Show[

Plot[-P[q1 – \[Alpha]][[

1]], {q1, -1, -\[Alpha]/\[Sqrt]3 + \[Alpha]},

PlotRange -> {{-\[Alpha]/2, 2.5 \[Alpha]}, {-3 \[Alpha],

3 \[Alpha]}}, PlotStyle -> {Black, Thickness[0.01]},

Ticks -> {{{\[Alpha], “\[Alpha]”, {0, 0.04}}, {2 \[Alpha],

“2 \[Alpha]”, {0, 0.04}}}, None},

AxesLabel -> {“R(\[Alpha]-\!\(\*SubscriptBox[\(Q\), \(1\)]\))”,

“P/k”}, BaseStyle -> FontSize -> 14,

Method -> {“AxesInFront” -> False}, ImageSize -> 500],

Plot[-P[q1 – \[Alpha]][[

1]], {q1, -\[Alpha]/\[Sqrt]3 + \[Alpha], \[Alpha]/\[Sqrt]3 + \

\[Alpha]},

PlotRange -> {{-1.1 \[Alpha],

1.1 \[Alpha]}, {-\[Alpha], \[Alpha]}},

PlotStyle -> {Gray, Dotted, Thickness[0.0035]}],

Plot[-P[q1 – \[Alpha]][[1]], {q1, \[Alpha]/\[Sqrt]3 + \[Alpha],

3 \[Alpha]}, PlotStyle -> {Black, Thickness[0.01]}],

Graphics[{LightGray, PointSize[pSizeGray],

Point[{-\[Alpha]/\[Sqrt]3 + \[Alpha], \[Pi]^3/(12 Sqrt[3])}]}],

Graphics[{Gray, PointSize[pSizeGray],

Point[{2 \[Alpha]/\[Sqrt]3 + \[Alpha], \[Pi]^3/(12 Sqrt[3])}]}],

Graphics[{LightGray, PointSize[pSizeGray],

Point[{\[Alpha]/\[Sqrt]3 + \[Alpha], -(\[Pi]^3/(

12 Sqrt[3]))}]}],

Graphics[{Gray, PointSize[pSizeGray],

Point[{-2 \[Alpha]/\[Sqrt]3 + \[Alpha], -(\[Pi]^3/(

12 Sqrt[3]))}]}],

Graphics[{Red, PointSize[pSizeRed],

Point[{-Q1 + \[Alpha], k R Q1 (\[Alpha]^2 – Q1^2)}]}],

Graphics[{Blue,

Arrow[{{-\[Alpha]/\[Sqrt]3 + 1.3 \[Alpha], \[Pi]^3/(

12 Sqrt[3])}, {2 \[Alpha]/\[Sqrt]3 + 0.8 \[Alpha], \[Pi]^3/(

12 Sqrt[3])}}]}],

Graphics[{Blue,

Arrow[{{\[Alpha]/\[Sqrt]3 + 0.7 \[Alpha], -(\[Pi]^3/(

12 Sqrt[3]))}, {-2 \[Alpha]/\[Sqrt]3 +

1.2 \[Alpha], -(\[Pi]^3/(12 Sqrt[3]))}}]}],

Graphics[Text[“Snap”, {1.35 \[Alpha], \[Pi]^3/(12 Sqrt[3]) + 0.4}]],

Graphics[

Text[“Snap”, {0.7 \[Alpha], – (\[Pi]^3/(12 Sqrt[3])) – 0.4}]]
];

(*Animate[GraphicsRow[{archSnap[Q1],archPvD[Q1]}],{Q1,\[Alpha]-X}, \

AnimationDirection\[Rule]Forward]*)

Manipulate[

GraphicsRow[{archSnap[Q1], archPvD[Q1]}], {Q1, \[Alpha] – X, Slider}][/wlcode]

- The popper toy is a bit of a peculiar example, as its everted – or inside-out – shape is
*metastable*, which is why it snaps back. This metastability comes from a small amount of viscoelasticity within the material. - Free to pivot, or rotate in the plane of the page without resistance.
- Why did I choose such an annoying variable name? This is for consistency with the concept of
*generalized coordinates*. The subscript makes it clear that this is a one degree of freedom system. - To plot this curve, I took the spring stiffness and half-span to be equal to one.
- When the second variation is identically zero, we cannot say anything about its stability, and therefore we have to examine the third variations. Doing so would reveal that these are unstable
*critical*or*limit*points. - While it has multiple points of equilibrium in the absence of force, although only two of the three points are stable.