Solving a Physically Double Spring Mass-Energy System in Pthon

The physical model is as follows:

There are two objects in this system, the mass of which is m1 and m2, connected by two springs, the telescopic system is k1 and k2, and the left end is fixed.Assuming there is no external force, the lengths of the two springs are L1 and L2.
Because the two bodies have gravity, then friction is formed on the plane, and the friction coefficients are b1 and b2, respectively.So you can write the differential equation like this:

This is a second-order differential equation. In order to solve it using python, it needs to be converted to a first-order differential equation.So the following two variables are introduced:

These two are equivalent to the speed of movement.Operations can change to this:

In this case, you can change the linear equation to a vector array, and you can use python to define it, as follows:

# Use ODEINT to solve the differential equations defined by the vector field
from scipy.integrate import odeint
 
def vectorfield(w, t, p):
    """
    Defines the differential equations for the coupled spring-mass system.
    Arguments:
        w :  vector of the state variables:
                  w = [x1,y1,x2,y2]
        t :  time
        p :  vector of the parameters:
                  p = [m1,m2,k1,k2,L1,L2,b1,b2]
    """
    x1, y1, x2, y2 = w
    m1, m2, k1, k2, L1, L2, b1, b2 = p
 
    # Create f = (x1',y1',x2',y2'):
    f = [y1,
         (-b1 * y1 - k1 * (x1 - L1) + k2 * (x2 - x1 - L2)) / m1,
         y2,
         (-b2 * y2 - k2 * (x2 - x1 - L2)) / m2]
    return f
 
# Parameter values
# Masses:
m1 = 1.0
m2 = 1.5
# Spring constants
k1 = 8.0
k2 = 40.0
# Natural lengths
L1 = 0.5
L2 = 1.0
# Friction coefficients
b1 = 0.8
b2 = 0.5
 
# Initial conditions
# x1 and x2 are the initial displacements; y1 and y2 are the initial velocities
x1 = 0.5
y1 = 0.0
x2 = 2.25
y2 = 0.0
 
# ODE solver parameters
abserr = 1.0e-8
relerr = 1.0e-6
stoptime = 10.0
numpoints = 250
 
# Create the time samples for the output of the ODE solver.
# I use a large number of points, only because I want to make
# a plot of the solution that looks nice.
t = [stoptime * float(i) / (numpoints - 1) for i in range(numpoints)]
 
# Pack up the parameters and initial conditions:
p = [m1, m2, k1, k2, L1, L2, b1, b2]
w0 = [x1, y1, x2, y2]
 
# Call the ODE solver.
wsol = odeint(vectorfield, w0, t, args=(p,),
              atol=abserr, rtol=relerr)
 
with open('two_springs.dat', 'w') as f:
    # Print & save the solution.
    for t1, w1 in zip(t, wsol):        
        out = '{0} {1} {2} {3} {4}\n'.format(t1, w1[0], w1[1], w1[2], w1[3]);
        print(out)
        f.write(out);


Output the results to the file two_springs.dat here, then write a program to display the data as pictures, and you can publish your paper, code as follows:

# Plot the solution that was generated
 
from numpy import loadtxt
from pylab import figure, plot, xlabel, grid, hold, legend, title, savefig
from matplotlib.font_manager import FontProperties
 
t, x1, xy, x2, y2 = loadtxt('two_springs.dat', unpack=True)
 
figure(1, figsize=(6, 4.5))
 
xlabel('t')
grid(True)
lw = 1
 
plot(t, x1, 'b', linewidth=lw)
plot(t, x2, 'g', linewidth=lw)
 
legend((r'$x_1$', r'$x_2$'), prop=FontProperties(size=16))
title('Mass Displacements for the\nCoupled Spring-Mass System')
savefig('two_springs.png', dpi=100)

Finally, take a look at the output png pictures as follows:

Tags: Spring Python

Posted on Sun, 02 Feb 2020 11:36:04 -0500 by lajocar