Physics Simulations (2016)
Physics simulations I made to learn about Lagrangian dynamics
Purpose
I love physics, and I wanted to learn about Lagrangian dynamics, a much more powerful way of modeling forces than Newton's Laws alone. I decided to try out what I learned using Processing.py.
Languages / Libraries:
- Python
- Processing.py
- SymPy
Concepts:
- Langrangian Dynamics
- Runge-Kutta Approximation Technique
- Vectors
- Rectangular/Polar coordinate systems
Lagrangian Dynamics
Lagrangian Dynamics is a method of studying the motion of a system. It is similar to Newton’s Second Law (\(F = ma\)), but with some key differences:
- Lagrangian Dynamics looks at the kinetic/potential energy of a system whereas Newtonian Dynamics looks at the forces in a system.
- Lagrangian Dynamics works in any coordinate system, not just Cartesian coordinates. For example, a pendulum’s position is more easily expressed as an angle than an (x, y) position.
What is a Lagrangian? It is a value that describes the energy of the system.
If T is the total kinetic energy of the system and V is the total potential energy, the Lagrangian L is:
Units: \(kg * m^2/s^2 = J = N * m\), in other words, units of energy!
Unfortunately, there’s no intuitive meaning to the Lagrangian. Just think of it as a mathematical object that contains info about the energy of the system.
Coordinate Systems
Now to use the Lagrangian, we must pick a coordinate system for denoting position of parts of the system. Some examples:
Variables | Coordinate system | Units |
---|---|---|
Cartesian | m, m | |
Polar | m, rad | |
Generalized | ?, ? |
That ‘q’s in the last row are simply placeholder variables for any arbitrary coordinate system. For example, in rectangular coordinates:
whereas in polar coordinates:
Also, when \(q_i\) appears in equations below, it just means that the equation applies for any of the coordinates.
The Equation
The Euler-Lagrange equation, is the equation that governs Lagrangian dynamics. Here it is:
Looks messy, doesn’t it? Not to worry, we can break this down into smaller parts. Most of the time, the left hand side of the equation deals with the kinetic energy term, while the right hand side deals with potential energy.
Right Hand Side
Let’s start with the right hand side’s units using an (x, y) coordinate system:
We take the derivative of the energy of the system (L) with respect to one of the coordinates. Often, only the potential energy terms depend on position, so this derivative is often the same as
For example, take a system with spring potential energy:
and since kinetic energy does not depend on position (only velocity), we have:
Look familiar? \(-kx\) is simply the spring force! Often familiar forces will appear on the right hand side of the equation after taking the derivative.
Left Hand Side
First, take the derivative of the Lagrangian with respect to the velocity. Here is the dimensional analysis:
For an example, take the spring example.
We get the usual formula for momentum!
Now we simply take this quantity and take the time derivative:
Mass times acceleration… where have we seen this before? Newton’s Second law!
All Together Now
In the spring example, we went from here:
to here:
Which is exactly the same as if you started with
So why the trouble of doing these derivatives when regular force analysis works fine? The main reason is that Lagrangian dynamics works in any coordinate system, which makes it more flexible than Newtonian force analysis which is easiest in Cartesian coordinates.
For example, it is easier to represent the equation for a Pendulum using angle instead of x- and y-position.
In some of the sections below, I give examples of the equations used in each simulation, along with the coordinate system that is most useful.
One thing to note: when making physics simulations, the acceleration is the quantity we want, for then we can approximate velocity and position over time.
So for the above example, we would solve for the acceleration:
Vectors
Vectors are mathematical objects that contain several components. They can be added together, scaled by a constant, etc.
Runge-Kutta Approximation
Runge-Kutta is a method of approximating the integral of a function numerically. It is similar in principle to Euler’s Method, though it uses a weighted average of derivative values to improve accuracy at the cost of extra calculations.
See here for a site that explains the equations, since this page is already large as it is.
In physics simulations, you do the Runge-Kutta algorithm twice at each time step. One approximates the velocity given the acceleration, and the other calculates position from velocity.
We do this at every frame of the animation. This allows us to plot the path of various objects, even when a position function cannot be directly derived. This is especially the case for chaotic systems like the double pendulum or double spring.
Simulations
Here are the simulations included so far in the project along with a quick summary of the equations behind them.
Note that each simulation has a plot of phase space, i.e. a graph of velocity vs. position that represents all the states of the system. Notice how the simple systems (Single Spring/Pendulum) have simple phase plots, while chaotic systems (Double Spring/Pendulum) have very convoluted paths through phase space.
Single Pendulum
Variables:
Variable | Units | Description |
---|---|---|
kg | mass of the bob. Constant. | |
m | Length of the pendulum | |
m/s^2 | Acceleration due to gravity | |
rad | Angle of the pendulum from vertical | |
rad/s | Angular velocity of the pendulum | |
rad/s^2 | Angular acceleration of the pendulum |
Equations:
Quantity | Equation |
---|---|
Kinetic Energy | |
Potential Energy | |
Equations for Motion |
Double Pendulum
…
Single Spring
This simulation is of an ideal, massless spring fixed at one end with a bob on the other end. The system oscillates horizontally on a frictionless surface.
Variables:
Variable | Units | Description |
---|---|---|
kg | mass of the bob. Constant. | |
N/m | Spring constant. | |
m | stretch of the spring from the equilbrium position | |
m/s | horizontal velocity | |
m/s^2 | horizontal acceleration |
Equations:
Quantity | Equation |
---|---|
Kinetic Energy | |
Potential Energy | |
Equations for Motion |
Double Spring
Variables:
Variable | Units | Description |
---|---|---|
kg | mass of bob number i. Constant. | |
N/m | Spring constant for spring number i. | |
m | stretch of the i-th spring from the equilbrium position | |
m/s | horizontal velocity of bob number i | |
m/s^2 | horizontal acceleration of bob number i |
Note: bob 2’s position, \(x_2\) is measured from equilibrium. this is NOT the stretch of spring 2.
Equations:
Quantity | Equation |
---|---|
Kinetic Energy | |
Potential Energy | |
Equations for Motion | |
Note: For potential energy, we need the stretch of each spring. for spring 1, this is the same as its displacement from equilibrium. However, for spring 2, we have to subtract the stretch of spring 1, else the value will be the stretch + how much spring 2 translates to the right due to spring 1’s stretch.
Orbiting Planets
Variables:
Variable | Units | Description |
---|---|---|
kg | mass of satellite | |
kg | mass of planet | |
… | Gravitational Constant | |
m | distance of satellite from center of the planet | |
m/s | radial velocity of satellite | |
m/s^2 | radial acceleration of satellite | |
rad | angle of satellite around the planet | |
rad/s | angular velocity of satellite | |
rad/s^2 | angle of satellite around the planet |
Equations:
…
Accomplishments:
- Modeled simple springs, pendula and orbiting planets
- Learned about symbolic computation using SymPy
- Created a Python class for representing a generic mathematical vector
Needed Improvements:
- Add more physic simulations!
- Refactor the SymPy Code, there's lots of boilerplate code there
- Refactor out a vector math library. This will be helpful in other projects.