Ball and Spring Model of Matter: Difference between revisions

From Physics Book
Jump to navigation Jump to search
Aj6588 (talk | contribs)
Wrote the full page: main idea, math model, GlowScript model, examples, limits, diagram, references
Aj6588 (talk | contribs)
Added GlowScript link
Line 90: Line 90:


There's also a <code>use_morse</code> switch at the top. If you set it to <code>True</code>, the program uses a Morse potential instead of a perfect spring, which is a more realistic bond (it's the blue curve in the diagram). For a small starting stretch (<math>0.05d</math>) the period barely changes, only about 0.4%. If you bump the starting stretch up to <math>0.4d</math>, the Morse bond's period comes out 18% longer than the spring prediction. That's the spring model starting to fail, which ties into the limits section below.
There's also a <code>use_morse</code> switch at the top. If you set it to <code>True</code>, the program uses a Morse potential instead of a perfect spring, which is a more realistic bond (it's the blue curve in the diagram). For a small starting stretch (<math>0.05d</math>) the period barely changes, only about 0.4%. If you bump the starting stretch up to <math>0.4d</math>, the Morse bond's period comes out 18% longer than the spring prediction. That's the spring model starting to fail, which ties into the limits section below.
Run it here: [https://www.glowscript.org/#/user/akshajdewan102/folder/MyPrograms/program/BallSpringTwoAtoms Two atoms on a spring (GlowScript)]


<pre>
<pre>

Revision as of 23:29, 3 November 2026

Claimed by Akshaj Dewan, Fall 2026

The ball and spring model is a way of picturing a solid as atoms (balls) stuck together by bonds that act like springs. We use it in class to go from stuff about single atoms to stuff you can measure, like how much a wire stretches when you hang a weight on it or how fast sound goes through a metal bar.

The Main Idea

If you pull on a metal rod it stretches a tiny bit, and when you let go it goes back to its original length. Push on it and it gets a tiny bit shorter, then springs back. That's what a spring does, so it makes sense to guess that whatever holds the atoms together acts like a bunch of springs.

In the model, the atoms sit in a 3D grid and each one is connected to its nearest neighbors. Each atom is a ball with mass [math]\displaystyle{ m_a }[/math], and each bond is a spring with stiffness [math]\displaystyle{ k_s }[/math] and relaxed length [math]\displaystyle{ d }[/math] (the distance between the centers of two neighboring atoms). Stretching a solid means stretching a huge number of these little springs at once. Heating it up means the balls vibrate harder on their springs.

The reason this works is that the real force between two atoms looks like a spring force, as long as the atoms don't move too far from their normal spacing (more on that in the math section). The nice thing is that with three numbers, [math]\displaystyle{ m_a }[/math], [math]\displaystyle{ d }[/math], and [math]\displaystyle{ k_s }[/math], you can explain Young's Modulus and the Speed of Sound in Solids, and also get a start on heat capacity. Atoms aren't tiny balls and bonds aren't coiled wire, so the model has limits, which I go over near the bottom of the page.

Ball and spring model diagram
Ball and spring model diagram
(a) Atoms as balls of mass ma connected by springs of stiffness ks, a distance d apart. (b) The actual potential energy of a bond (blue) vs. an ideal spring (orange dashed). Near the bottom of the well they match, which is why springs work for small stretches. I made this in Python with matplotlib, using a Morse potential with numbers set to match aluminum.

A Mathematical Model

Why a bond acts like a spring

Two atoms have a potential energy [math]\displaystyle{ U(r) }[/math] that depends on how far apart their centers are. Push them too close and the electron clouds repel, so [math]\displaystyle{ U }[/math] goes way up. Pull them far apart and the attraction dies off, so [math]\displaystyle{ U }[/math] levels out near zero. Somewhere in between there's a minimum at [math]\displaystyle{ r = d }[/math], and that's where the atoms sit when nothing is pushing or pulling on them (panel (b) above).

If you zoom in close to the bottom of any smooth curve, it looks like a parabola. Doing a Taylor expansion of [math]\displaystyle{ U(r) }[/math] around [math]\displaystyle{ r = d }[/math]:

[math]\displaystyle{ U(r) \approx U(d) + U'(d)(r-d) + \frac{1}{2}U''(d)(r-d)^2 }[/math]

The slope [math]\displaystyle{ U'(d) }[/math] is zero at the minimum, so the middle term goes away. Call the stretch [math]\displaystyle{ s = r - d }[/math] and call the curvature [math]\displaystyle{ k_s = U''(d) }[/math], and you get

[math]\displaystyle{ U \approx U(d) + \frac{1}{2}k_s s^2 }[/math]

which is the same as spring potential energy (plus a constant, which doesn't matter). Force is the negative slope of energy, so [math]\displaystyle{ F = -\frac{dU}{dr} = -k_s s }[/math], and the size of the force is

[math]\displaystyle{ |\vec{F}| = k_s |s| }[/math]

The minus sign means the force pulls the atoms back toward their normal spacing. Stretch the bond ([math]\displaystyle{ s \gt 0 }[/math]) and it pulls them together; squish it ([math]\displaystyle{ s \lt 0 }[/math]) and it pushes them apart. Also, [math]\displaystyle{ k_s }[/math] is how curved the bottom of the well is, so a narrow well means a stiff bond.

Finding d from the density

You can't measure [math]\displaystyle{ d }[/math] with a ruler, but you can get it from the density and molar mass. Mass of one atom:

[math]\displaystyle{ m_a = \frac{M}{N_A} }[/math]

with [math]\displaystyle{ M }[/math] in kg/mol and [math]\displaystyle{ N_A = 6.022 \times 10^{23} }[/math] atoms/mol. If you pretend each atom takes up a little cube of side [math]\displaystyle{ d }[/math] (simple cubic), then density is one atom's mass over one cube's volume:

[math]\displaystyle{ \rho = \frac{m_a}{d^3} \quad \Rightarrow \quad d = \left(\frac{m_a}{\rho}\right)^{1/3} }[/math]

Connecting ks to Young's modulus

Think of a wire with length [math]\displaystyle{ L }[/math] and cross sectional area [math]\displaystyle{ A }[/math] as a bundle of chains of atoms running along the wire.

  • Chains side by side: [math]\displaystyle{ N_{chains} = \frac{A}{d^2} }[/math]. These are springs in parallel, so their stiffnesses add.
  • Bonds in one chain: [math]\displaystyle{ N_{bonds} = \frac{L}{d} }[/math]. These are in series, so the chain is weaker than one bond (each bond only takes part of the total stretch).

Putting that together, the whole wire's stiffness is

[math]\displaystyle{ k_{wire} = k_s \frac{N_{chains}}{N_{bonds}} = k_s \frac{A/d^2}{L/d} = \frac{k_s A}{L d} }[/math]

Young's modulus is stress over strain, [math]\displaystyle{ Y = \frac{F/A}{\Delta L/L} }[/math]. Plug in [math]\displaystyle{ F = k_{wire} \Delta L }[/math] and the [math]\displaystyle{ A }[/math], [math]\displaystyle{ L }[/math], and [math]\displaystyle{ \Delta L }[/math] all cancel, leaving

[math]\displaystyle{ Y = \frac{k_s}{d} \quad \Rightarrow \quad k_s = Y d }[/math]

I think this is the coolest part of the model. You get [math]\displaystyle{ Y }[/math] from stretching a big wire and [math]\displaystyle{ d }[/math] from the density, and from those two you get the stiffness of one bond between two atoms. The Length and Stiffness of an Interatomic Bond and Young's Modulus pages have more on this.

Speed of sound

Sound in a solid is a pulse getting passed from ball to ball through the springs. The model says the speed should be

[math]\displaystyle{ v = d\sqrt{\frac{k_s}{m_a}} }[/math]

(the derivation is on the Speed of Sound in Solids page). If you substitute [math]\displaystyle{ k_s = Y d }[/math] and [math]\displaystyle{ m_a = \rho d^3 }[/math] this turns into [math]\displaystyle{ v = \sqrt{Y/\rho} }[/math], which is the thin rod formula you see in most intro textbooks, so the two approaches agree.

Two atoms on one spring

With two atoms of mass [math]\displaystyle{ m_a }[/math] on a single bond, both atoms move. Writing the momentum principle for each one and subtracting gives

[math]\displaystyle{ \frac{d^2 s}{dt^2} = -\frac{2k_s}{m_a}s }[/math]

so [math]\displaystyle{ \omega = \sqrt{2k_s/m_a} }[/math] and [math]\displaystyle{ T = 2\pi\sqrt{\frac{m_a}{2k_s}} }[/math]. The extra 2 is there because both ends of the spring can move. This is the setup my computational model simulates (and the Difficult example works it out step by step).

A Computational Model

I wrote a GlowScript program that simulates two aluminum atoms connected by one bond, using real aluminum numbers ([math]\displaystyle{ m_a = 4.48 \times 10^{-26} }[/math] kg, [math]\displaystyle{ d = 2.55 \times 10^{-10} }[/math] m, [math]\displaystyle{ k_s = 17.9 }[/math] N/m, which come from the Simple example). The atoms start at rest with the bond stretched a little bit. Every time step, the program:

  1. finds the stretch [math]\displaystyle{ s }[/math] from the distance between the atoms
  2. finds the spring force on each atom (equal and opposite, Newton's third law)
  3. updates momentum with the momentum principle, [math]\displaystyle{ \vec{p}_{new} = \vec{p} + \vec{F}_{net}\Delta t }[/math]
  4. updates position with [math]\displaystyle{ \vec{r}_{new} = \vec{r} + \frac{\vec{p}}{m}\Delta t }[/math]

It graphs the stretch and the energies (kinetic, potential, total) vs. time, and at the end it prints the period it measured next to the theory period [math]\displaystyle{ T = 2\pi\sqrt{m_a/2k_s} }[/math]. When I ran it the two matched (both [math]\displaystyle{ 2.22 \times 10^{-13} }[/math] s), and total energy stayed constant to within about 0.3%, so the time step is small enough.

There's also a use_morse switch at the top. If you set it to True, the program uses a Morse potential instead of a perfect spring, which is a more realistic bond (it's the blue curve in the diagram). For a small starting stretch ([math]\displaystyle{ 0.05d }[/math]) the period barely changes, only about 0.4%. If you bump the starting stretch up to [math]\displaystyle{ 0.4d }[/math], the Morse bond's period comes out 18% longer than the spring prediction. That's the spring model starting to fail, which ties into the limits section below.

Run it here: Two atoms on a spring (GlowScript)

GlowScript 3.2 VPython

# Two aluminum atoms connected by one interatomic bond (ball and spring model)
# Akshaj Dewan, Fall 2026
#
# Real numbers for aluminum:
#   m  = (26.98 g/mol) / N_A  = 4.48e-26 kg
#   d  = 2.55e-10 m  (from density 2.70 g/cm^3)
#   ks = Y*d = (7.0e10 Pa)(2.55e-10 m) = 17.9 N/m
#
# Set use_morse = True to swap the ideal spring for a Morse potential.
# With a small stretch both give the same period. Crank s0 up to 0.4*d
# and the Morse bond oscillates slower and lopsided, which is where the
# spring model starts to fail.

use_morse = False

m  = 4.48e-26        # kg, mass of one Al atom
d  = 2.55e-10        # m, equilibrium bond length
ks = 17.9            # N/m, interatomic spring stiffness
D  = 1.6e-19         # J, Morse well depth (rough guess, about 1 eV)
a  = sqrt(ks/(2*D))  # 1/m, picks a so the Morse curve has the same ks at the bottom

s0 = 0.05*d          # initial stretch of the bond

# atoms start at rest, pulled apart by s0
atom1 = sphere(pos=vector(-(d+s0)/2, 0, 0), radius=0.3*d, color=color.cyan)
atom2 = sphere(pos=vector( (d+s0)/2, 0, 0), radius=0.3*d, color=color.cyan)
bond  = helix(pos=atom1.pos, axis=atom2.pos-atom1.pos, radius=0.08*d,
              coils=8, thickness=0.02*d, color=color.orange)

p1 = vector(0, 0, 0)
p2 = vector(0, 0, 0)

def bond_force(r_vec):
    # force ON atom2 FROM atom1; r_vec points from atom1 to atom2
    r = mag(r_vec)
    s = r - d
    if use_morse:
        Fmag = -2*D*a*(1 - exp(-a*s))*exp(-a*s)
    else:
        Fmag = -ks*s
    return Fmag*norm(r_vec)

def bond_energy(r_vec):
    s = mag(r_vec) - d
    if use_morse:
        return D*(1 - exp(-a*s))**2
    return 0.5*ks*s**2

# graphs
gs = graph(title="bond stretch s vs time", xtitle="t (s)", ytitle="s (m)")
s_curve = gcurve(graph=gs, color=color.blue)
ge = graph(title="energy vs time", xtitle="t (s)", ytitle="E (J)")
K_curve = gcurve(graph=ge, color=color.red,   label="K")
U_curve = gcurve(graph=ge, color=color.blue,  label="U")
E_curve = gcurve(graph=ge, color=color.black, label="K+U")

# theory: two equal masses on one spring -> reduced mass m/2
omega = sqrt(2*ks/m)
T_theory = 2*pi/omega

t  = 0
dt = 1e-16           # s, about 1/2000 of a period

s_old = s0
t_last_cross = -1   # -1 means no crossing yet
periods = []

while t < 5*T_theory:
    rate(2000)

    r_vec = atom2.pos - atom1.pos
    F2 = bond_force(r_vec)   # on atom2
    F1 = -F2                 # Newton's third law

    # momentum principle, then position update
    p1 = p1 + F1*dt
    p2 = p2 + F2*dt
    atom1.pos = atom1.pos + (p1/m)*dt
    atom2.pos = atom2.pos + (p2/m)*dt
    t = t + dt

    bond.pos  = atom1.pos
    bond.axis = atom2.pos - atom1.pos

    r_vec = atom2.pos - atom1.pos
    s = mag(r_vec) - d
    K = mag(p1)**2/(2*m) + mag(p2)**2/(2*m)
    U = bond_energy(r_vec)

    s_curve.plot(t, s)
    K_curve.plot(t, K)
    U_curve.plot(t, U)
    E_curve.plot(t, K+U)

    # time a full period: s crosses zero going from negative to positive
    if s_old < 0 and s >= 0:
        if t_last_cross > 0:
            periods.append(t - t_last_cross)
        t_last_cross = t
    s_old = s

total = 0
for P in periods:
    total = total + P
T_sim = total/len(periods)
print("simulated period =", T_sim, "s")
print("theory period    =", T_theory, "s")
print("percent diff     =", 100*abs(T_sim - T_theory)/T_theory, "%")

Examples

All of these use aluminum: molar mass 26.98 g/mol, density 2.70 g/cm3 (2700 kg/m3), and Young's modulus [math]\displaystyle{ 7.0 \times 10^{10} }[/math] Pa (from OpenStax University Physics Vol. 1, Table 12.1).

Simple

Find the stiffness of one interatomic bond in aluminum.

Mass of one atom:

[math]\displaystyle{ m_a = \frac{0.02698 \text{ kg/mol}}{6.022 \times 10^{23} \text{ atoms/mol}} = 4.48 \times 10^{-26} \text{ kg} }[/math]

Bond length from the density:

[math]\displaystyle{ d = \left(\frac{m_a}{\rho}\right)^{1/3} = \left(\frac{4.48 \times 10^{-26}}{2700}\right)^{1/3} = (1.66 \times 10^{-29} \text{ m}^3)^{1/3} = 2.55 \times 10^{-10} \text{ m} }[/math]

Bond stiffness:

[math]\displaystyle{ k_s = Y d = (7.0 \times 10^{10} \text{ Pa})(2.55 \times 10^{-10} \text{ m}) = 17.9 \text{ N/m} }[/math]

That's pretty soft. One aluminum bond is about as stiff as a weak spring you could stretch with a finger. Metal only feels rigid because even a 1 mm wire has something like [math]\displaystyle{ 10^{13} }[/math] chains side by side (see the Middling example).

As a check, plug these into the speed of sound formula:

[math]\displaystyle{ v = d\sqrt{\frac{k_s}{m_a}} = (2.55 \times 10^{-10})\sqrt{\frac{17.9}{4.48 \times 10^{-26}}} = 5.09 \times 10^3 \text{ m/s} }[/math]

HyperPhysics lists 5100 m/s for aluminum, so that's within 1%.

Middling

An aluminum wire is 2.0 m long with a 1.0 mm diameter. You hang a 5.0 kg mass on it. How much does the wire stretch, and how much does each bond stretch?

Force and area:

[math]\displaystyle{ F = mg = (5.0)(9.8) = 49 \text{ N} }[/math]

[math]\displaystyle{ A = \pi r^2 = \pi (0.50 \times 10^{-3} \text{ m})^2 = 7.85 \times 10^{-7} \text{ m}^2 }[/math]

Number of chains, and the force on each:

[math]\displaystyle{ N_{chains} = \frac{A}{d^2} = \frac{7.85 \times 10^{-7}}{(2.55 \times 10^{-10})^2} = 1.21 \times 10^{13} }[/math]

[math]\displaystyle{ F_{chain} = \frac{49 \text{ N}}{1.21 \times 10^{13}} = 4.06 \times 10^{-12} \text{ N} }[/math]

Every bond in a chain has the same tension, so each bond is pulled with [math]\displaystyle{ 4.06 \times 10^{-12} }[/math] N. That means one bond stretches

[math]\displaystyle{ s = \frac{F_{chain}}{k_s} = \frac{4.06 \times 10^{-12}}{17.9} = 2.27 \times 10^{-13} \text{ m} }[/math]

which is about 0.09% of [math]\displaystyle{ d }[/math]. That's tiny, so we're well inside the range where the spring approximation is fine.

For the whole wire, each chain has [math]\displaystyle{ L/d }[/math] bonds in a row:

[math]\displaystyle{ \Delta L = \frac{L}{d}s = \frac{2.0}{2.55 \times 10^{-10}}(2.27 \times 10^{-13}) = 1.8 \times 10^{-3} \text{ m} }[/math]

So the wire stretches about 1.8 mm. You get the same thing from [math]\displaystyle{ \Delta L = \frac{FL}{AY} }[/math], which makes sense since [math]\displaystyle{ k_s }[/math] came from [math]\displaystyle{ Y }[/math] in the first place.

Difficult

Two aluminum atoms are connected by one bond and nothing else. Starting from the momentum principle, find the period of their oscillation.

Put atom 1 on the left at [math]\displaystyle{ x_1 }[/math] and atom 2 on the right at [math]\displaystyle{ x_2 }[/math]. The stretch is [math]\displaystyle{ s = (x_2 - x_1) - d }[/math].

If the bond is stretched, it pulls atom 2 left and atom 1 right:

[math]\displaystyle{ F_{2,x} = -k_s s \qquad F_{1,x} = +k_s s }[/math]

Momentum principle for each atom (mass is constant, so I wrote it with acceleration):

[math]\displaystyle{ m_a \frac{d^2 x_2}{dt^2} = -k_s s \qquad m_a \frac{d^2 x_1}{dt^2} = +k_s s }[/math]

Subtract the second from the first. [math]\displaystyle{ d }[/math] is a constant, so [math]\displaystyle{ \frac{d^2 s}{dt^2} = \frac{d^2 x_2}{dt^2} - \frac{d^2 x_1}{dt^2} }[/math], and you get

[math]\displaystyle{ m_a \frac{d^2 s}{dt^2} = -2k_s s \quad \Rightarrow \quad \frac{d^2 s}{dt^2} = -\frac{2k_s}{m_a}s }[/math]

That's the same equation as one mass on a spring, with [math]\displaystyle{ \omega^2 = 2k_s/m_a }[/math]. Plugging in numbers:

[math]\displaystyle{ \omega = \sqrt{\frac{2(17.9)}{4.48 \times 10^{-26}}} = 2.83 \times 10^{13} \text{ rad/s} }[/math]

[math]\displaystyle{ T = \frac{2\pi}{\omega} = 2.22 \times 10^{-13} \text{ s} }[/math]

So the bond vibrates around 4.5 trillion times a second ([math]\displaystyle{ f = 4.5 \times 10^{12} }[/math] Hz). This is the same period my GlowScript program measures, which is a good sign the code is right.

Where the Model Breaks Down

Everything above assumes the stretch is small compared to [math]\displaystyle{ d }[/math]. Panel (b) of the diagram shows what happens when it isn't.

Big stretches. The real energy curve isn't symmetric. It shoots up fast when you squeeze the atoms together but flattens out when you pull them apart, so a real bond is stiffer in compression than in tension. A perfect spring is the same both ways. This lopsided shape is also why things expand when they get hot. Hotter atoms vibrate farther, and since the well is wider on the stretched side, their average spacing ends up a bit bigger than [math]\displaystyle{ d }[/math]. With perfect springs the average spacing would stay at [math]\displaystyle{ d }[/math] and nothing would expand.

Bending something for good. If you bend a paperclip far enough, it stays bent. In the ball and spring model every atom has fixed neighbors, so everything should spring back. In a real metal, whole planes of atoms slide past each other and the atoms end up next to new neighbors. The model can't do that, so it only covers the elastic (spring back) part of a stress vs. strain graph.

Breaking. The bond force is the slope of [math]\displaystyle{ U(r) }[/math]. After the steepest point on the curve (the black dot in the diagram), pulling the atoms farther apart takes less force, so the bond can't hold any more load and it breaks. A spring's force keeps growing, so the spring model never predicts breaking. Real wires also break way below this single bond limit, because tiny cracks and defects pile the force onto a few bonds at a time.

Melting. In this model temperature is the balls vibrating on their springs. Heat the solid up and the vibrations grow until atoms can hop out of their spots in the grid. A rule of thumb from Lindemann (1910) says this happens once the vibration amplitude gets to around a tenth of [math]\displaystyle{ d }[/math]. After that the atoms don't have fixed neighbors anymore, and a liquid doesn't fit the ball and spring picture.

Other stuff we simplified. I assumed a simple cubic grid, but aluminum is face centered cubic, so the [math]\displaystyle{ k_s }[/math] we calculated is more of an "effective" stiffness that lumps a few bonds together. The model is also classical. At very low temperatures the heat capacity of real solids drops toward zero, and you need quantum mechanics to explain that.

Connectedness

  1. How is this topic connected to something that you are interested in? I like that a few numbers you can look up in a table (density, molar mass, Young's modulus) are enough to predict something you'd have to measure separately, like the speed of sound, and that it lands within 1%.
  2. How is it connected to your major? I'm in computer engineering, and the accelerometer in a phone is a tiny ball and spring system. It has a small silicon mass hanging on thin silicon beams that act as springs, and the chip measures how far the mass moves to figure out acceleration. The stiffness of those beams comes from the same atomic bonds this page talks about.
  3. Is there an interesting industrial application? Quartz crystal oscillators keep time in watches and computers. A small piece of quartz vibrates at a very steady frequency set by its stiffness and mass. Also, ultrasound testing uses the speed of sound in a metal to find hidden cracks inside parts.

History

Robert Hooke published the spring law in 1678 in De Potentia Restitutiva, summed up as "ut tensio, sic vis" ("as the extension, so the force"). He'd first put it out in 1676 as a scrambled anagram so nobody could take credit before he was ready. Thomas Young described the modulus that's now named after him in his 1807 lectures on natural philosophy. Neither of them was thinking about atoms, they were describing whole objects.

The atom level version came later. In 1907 Einstein treated a solid as atoms vibrating on springs and used early quantum ideas to explain why heat capacity drops at low temperatures. In 1910 Lindemann used the same vibrating atom picture to estimate when solids melt. In the 1920s John Lennard-Jones and Philip Morse came up with formulas for the energy between atoms (the Lennard-Jones and Morse potentials), which give the curved energy wells that the spring model approximates.

See also

Further reading

  • OpenStax, University Physics Volume 1, Chapter 12 (Static Equilibrium and Elasticity) and Chapter 15 (Oscillations). Free online.

External links

References

  1. Ling, S. J., Sanny, J., and Moebs, W. University Physics Volume 1. OpenStax, 2016. Section 12.3, "Stress, Strain, and Elastic Modulus" (Table 12.1 for Young's modulus of aluminum). https://openstax.org/books/university-physics-volume-1/pages/12-3-stress-strain-and-elastic-modulus
  2. Ling, S. J., Sanny, J., and Moebs, W. University Physics Volume 1. OpenStax, 2016. Section 15.1, "Simple Harmonic Motion." https://openstax.org/books/university-physics-volume-1/pages/15-1-simple-harmonic-motion
  3. Nave, R. "Elasticity, Elastic Properties." HyperPhysics, Georgia State University. http://hyperphysics.phy-astr.gsu.edu/hbase/permot3.html
  4. Nave, R. "Speed of Sound." HyperPhysics, Georgia State University. http://hyperphysics.phy-astr.gsu.edu/hbase/Tables/Soundv.html
  5. Nave, R. "Phonons and the Debye Specific Heat." HyperPhysics, Georgia State University. http://hyperphysics.phy-astr.gsu.edu/hbase/Solids/phonon.html
  6. "Morse potential." Wikipedia. https://en.wikipedia.org/wiki/Morse_potential
  7. "Lindemann index." Wikipedia. https://en.wikipedia.org/wiki/Lindemann_index
  8. GlowScript VPython documentation. https://www.glowscript.org/docs/VPythonDocs/index.html