Repeat of kind of thing that is done in Excel in PHYS 211 lab, and in Mathematica in PHYS 221 lab.
The Euler algorithm is
\begin{eqnarray} t_\text{new} &=& t_\text{old} + \Delta t \\ x_\text{new} &=& x_\text{old} + v_\text{old}\, \Delta t \\ v_\text{new} &=& v_\text{old} + a_\text{old}\, \Delta t \end{eqnarray}For the harmonic oscillator in this problem there is noticeable growth in amplitude, demonstrating instability in Euler's method, even for $\Delta t = 0.001$.
September 2019
Marty Ligare
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
# Following is an Ipython magic command that puts figures in the notebook.
%matplotlib notebook
# M.L. modification of matplotlib defaults
# Changes can also be put in matplotlibrc file,
# or effected using mpl.rcParams[]
mpl.style.use('classic')
plt.rc('figure', figsize = (6, 4.5)) # Reduces overall size of figures
plt.rc('axes', labelsize=16, titlesize=14)
plt.rc('figure', autolayout = True) # Adjusts supblot parameters for new size
# Linear Restoring Force
def f(x):
return -k*x
m = 1 # mass
k = np.pi**2 # spring constant
x0 = 1 # initial position
v0 = 0 # initial velocity
t0 = 0 # initial time
tf = 10 # final time
n = 10001 # number of points
dt = (tf-t0)/(n-1) # time step
t = np.linspace(0, tf, n) # Create array of t-values
x = np.zeros(len(t)) # Create array for values of x
v = np.zeros(len(t)) # Create array for values of v
x[0] = x0 # Fix initial value of velocity
v[0] = v0 # Fix initial value of velocity
for i in range(1,n-1):
x[i] = x[i-1] + v[i-1]*dt # x_new = x_old + v_old*dt
v[i] = v[i-1] + f(x[i-1])*dt/m # v_new = v_old + a_old*dt
plt.figure()
plt.xlabel('$t$') # Label for horizontal axis
plt.ylabel("$x$") # Label for vertical axis
plt.title("Linear Restoring Force",fontsize=14)
plt.grid(True)
plt.axhline(0,color='green') # Makes solid green x-axis
plt.plot(t,x);
plt.figure()
plt.xlabel('$t$') # Label for horizontal axis
plt.ylabel("$v$") # Label for vertical axis
plt.title("Linear Restoring Force",fontsize=14)
plt.grid(True)
plt.axhline(0,color='green') # Makes solid green x-axis
plt.plot(t,v);
version_information
is from J.R. Johansson (jrjohansson at gmail.com); see Introduction to scientific computing with Python for more information and instructions for package installation.
version_information
is installed on the linux network at Bucknell
%load_ext version_information
version_information numpy, matplotlib