Example: Pendulum Simulation
# This code block installs ffmpeg to your Deepnote Machine # Allows Deepnote to write MP4 !apt update -y !apt install ffmpeg -y
# Import Libraries: import numpy as np import matplotlib.pyplot as plt from matplotlib.animation import FFMpegWriter from matplotlib.patches import Circle # Pendulum Parameters g = 9.8 L = 1 # We need an array of time points from 0 to 10 in increments of 0.01 seconds dt = 0.001 t_vec = np.arange(0,10,dt) # Initialize a vector of zeros theta_vec = np.zeros(len(t_vec)) dtheta_vec = np.zeros(len(t_vec)) # Set our initial condition theta_vec = np.pi/4 # initial angle dtheta_vec = 0 # initial angular velocity # Loop through time # Euler's Method (approximately integrates the differential equation) for i in range(1, len(t_vec)): theta_vec[i] = theta_vec[i-1] + dtheta_vec[i-1]*dt dtheta_vec[i] = dtheta_vec[i-1] + (-g/L*np.sin(theta_vec[i-1]))*dt plt.plot(t_vec,theta_vec) plt.show()
# Setup Figure: Initialize Figure / Axe Handles fig, ax = plt.subplots() # Initialize Figure and Axes p, = ax.plot(, , color='cornflowerblue') # Initialize Empty Plot ax.axis('equal') ax.set_xlim([-3, 3]) # X Lim ax.set_ylim([-3, 3]) # Y Lim ax.set_xlabel('X') # X Label ax.set_ylabel('Y') # Y Label ax.set_title('Pendulum Simulation:') # Plot Title video_title = "simulation" # name of the mp4 # Initialize Patch: c = Circle((0, 0), radius=0.1, color='cornflowerblue') # Draws a circle of radius 0.1 at (X, Y) location (0, 0) ax.add_patch(c) # Add the patch to the axes # Setup Animation Writer: FPS = 20 # Frames per second for the video sample_rate = int(1 / (dt * FPS)) # Rate at which we sample the simulation to visualize dpi = 300 # Quality of the Video writerObj = FFMpegWriter(fps=FPS) # Video Object # We need to calculate the cartesian location of the pendulum: # Initialize Array: simulation_size = len(t_vec) # We use this alot, so lets store it. x_pendulum_arm = np.zeros(simulation_size) y_pendulum_arm = np.zeros(simulation_size) origin = (0, 0) # Pin Joint (X, Y) Location # Find the X and Y trajectories of the pendulum: for i in range(0, simulation_size): x_pendulum_arm[i] = L * np.sin(theta_vec[i]) + origin y_pendulum_arm[i] = origin - L * np.cos(theta_vec[i]) # Plot and Create Animation: with writerObj.saving(fig, video_title+".mp4", dpi): # We want to create video that represents the simulation # So we need to sample only a few of the frames: for i in range(0, simulation_size, sample_rate): # Update Pendulum Arm: x_data_points = [origin, x_pendulum_arm[i]] y_data_points = [origin, y_pendulum_arm[i]] # We want to avoid creating new plots to make an animation (Very Slow) # Instead lets take the plot we made earlier and just update it with new data. p.set_data(x_data_points, y_data_points) # Update plot with set_data # Update Pendulum Patch: patch_center = x_pendulum_arm[i], y_pendulum_arm[i] c.center = patch_center # Same idea here, instead of drawing a new patch update its location # Update Drawing: fig.canvas.draw() # Update the figure with the new changes # Grab and Save Frame: writerObj.grab_frame()
You should now have a file called "simulation.mp4" located in your Notebooks & Files section.
# We can also run it inline with the following block of code: from IPython.display import Video Video("/work/simulation.mp4", embed=True, width=640, height=480) # You can find the video's path by right clicking on it in Notebooks & Files # and selecting "Copy path to clipboard"