112 lines
2.7 KiB
Python
112 lines
2.7 KiB
Python
import matplotlib.pyplot as plt
|
|
from copy import deepcopy
|
|
|
|
class StateSpace():
|
|
def __init__(self, pos, vel, accel):
|
|
self.pos = pos
|
|
self.vel = vel
|
|
self.accel = accel
|
|
|
|
def print(self):
|
|
print(f"Pos: {self.pos}, Vel: {self.vel}, Accel: {self.accel}")
|
|
|
|
class Block():
|
|
def __init__(self):
|
|
self.mass = 5
|
|
|
|
self.statespace = StateSpace(5,0,0)
|
|
|
|
self.net_force = 0
|
|
|
|
|
|
class Spring():
|
|
def __init__(self):
|
|
self.mass = 1
|
|
|
|
self.pos1 = 0
|
|
self.pos2 = 10
|
|
self.vel = 0
|
|
self.accel = 0
|
|
|
|
self.length = self.pos2 - self.pos1
|
|
self.zero_length = 10
|
|
|
|
self.k = 10
|
|
self.del_l = self.length - self.zero_length
|
|
self.force = self.del_l * self.k
|
|
|
|
def get_force(self):
|
|
self.length = self.pos2 - self.pos1
|
|
self.del_l = self.length - self.zero_length
|
|
self.force = self.del_l * self.k
|
|
return self.force
|
|
|
|
applied_force = 0
|
|
|
|
block = Block()
|
|
spring = Spring()
|
|
|
|
|
|
# Initialize lists to store data for plotting
|
|
t_values = []
|
|
pos_values = []
|
|
vel_values = []
|
|
accel_values = []
|
|
force_net_values = []
|
|
spring_force_values = []
|
|
del_l_values = []
|
|
|
|
|
|
del_t = 0.1
|
|
t = 0
|
|
while t < 10:
|
|
spring.pos1 = block.statespace.pos
|
|
spring.force = spring.get_force()
|
|
|
|
block.net_force = applied_force + spring.force
|
|
block.statespace.accel = block.net_force / block.mass
|
|
|
|
block.statespace.vel += block.statespace.accel * del_t
|
|
block.statespace.pos += block.statespace.vel * del_t
|
|
|
|
# Store data for plotting
|
|
t_values.append(t)
|
|
pos_values.append(block.statespace.pos)
|
|
vel_values.append(block.statespace.vel)
|
|
accel_values.append(block.statespace.accel)
|
|
force_net_values.append(block.net_force)
|
|
spring_force_values.append(spring.force)
|
|
del_l_values.append(spring.del_l)
|
|
|
|
t += del_t
|
|
|
|
print(max(pos_values))
|
|
|
|
# Plot the data
|
|
plt.figure(figsize=(12, 8))
|
|
|
|
plt.subplot(3, 1, 1)
|
|
plt.plot(t_values, pos_values)
|
|
plt.plot(t_values, del_l_values)
|
|
plt.title('Position vs Time')
|
|
plt.legend(['Position', 'Delta Length'])
|
|
plt.xlabel('Time (s)')
|
|
plt.ylabel('Position')
|
|
|
|
plt.subplot(3, 1, 2)
|
|
plt.plot(t_values, vel_values)
|
|
plt.title('Velocity vs Time')
|
|
plt.xlabel('Time (s)')
|
|
plt.ylabel('Velocity')
|
|
|
|
plt.subplot(3, 1, 3)
|
|
plt.plot(t_values, accel_values)
|
|
plt.plot(t_values, force_net_values)
|
|
plt.plot(t_values, spring_force_values)
|
|
plt.legend(['Acceleration', 'Net Force', 'Spring Force'])
|
|
plt.title('Acceleration, Net Force, and Spring Force vs Time')
|
|
plt.xlabel('Time (s)')
|
|
plt.ylabel('Value')
|
|
|
|
plt.tight_layout()
|
|
plt.show() |