This example is taken from a tutorial related to convolution integral.
I would like to export this example as animation in mp4 format. So far, the code looks like this :
import scipy.integrate
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
def showConvolution(f1, f2, t0):
# Calculate the overall convolution result using Simpson integration
convolution = np.zeros(len(t))
for n, t_ in enumerate(t):
prod = lambda tau: f1(tau) * f2(t_-tau)
convolution[n] = scipy.integrate.simps(prod(t), t)
# Create the shifted and flipped function
f_shift = lambda t: f2(t0-t)
prod = lambda tau: f1(tau) * f2(t0-tau)
# Plot the curves
plt.gcf().clear() # il
plt.subplot(211)
plt.gca().set_ymargin(0.05) # il
plt.plot(t, f1(t), label=r'$f_1(\tau)$')
plt.plot(t, f_shift(t), label=r'$f_2(t_0-\tau)$')
plt.fill(t, prod(t), color='r', alpha=0.5, edgecolor='black', hatch='//') # il
plt.plot(t, prod(t), 'r-', label=r'$f_1(\tau)f_2(t_0-\tau)$')
plt.grid(True); plt.xlabel(r'$\tau$'); plt.ylabel(r'$x(\tau)$') # il
plt.legend(fontsize=10) # il
plt.text(-4, 0.6, '$t_0=%.2f$' % t0, bbox=dict(fc='white')) # il
# plot the convolution curve
plt.subplot(212)
plt.gca().set_ymargin(0.05) # il
plt.plot(t, convolution, label='$(f_1*f_2)(t)$')
# recalculate the value of the convolution integral at the current time-shift t0
current_value = scipy.integrate.simps(prod(t), t)
plt.plot(t0, current_value, 'ro') # plot the point
plt.grid(True); plt.xlabel('$t$'); plt.ylabel('$(f_1*f_2)(t)$') # il
plt.legend(fontsize=10) # il
plt.show() # il
Fs = 50 # our sampling frequency for the plotting
T = 5 # the time range we are interested in
t = np.arange(-T, T, 1/Fs) # the time samples
f1 = lambda t: np.maximum(0, 1-abs(t))
f2 = lambda t: (t>0) * np.exp(-2*t)
t0 = np.arange(-2.0,2.0, 0.05)
fig = plt.figure(figsize=(8,3))
anim = animation.FuncAnimation(fig, showConvolution(f1,f2, t0), frames=np.linspace(0, 50, 500), interval=80)
anim.save('animation.mp4', fps=30) # fps = frames per second
plt.show()
As I understood, I should be able to change t0 value between -2.00 and 2.00 with 0.05 steps. At first glance I've tried to use numpy's arange function.
t0 = np.arange(-2.0,2.0, 0.05)
But it gives an error message :
ValueError: operands could not be broadcast together with shapes (80,) (500,)
How should I change t0 value so that I should be able to generate animation video?
Edit : I tried the suggested changes. I run this example with
python convolution.py
Rather than an animation I see the output of see the output of convolution integral at t0 = -0.20.
Is there a way to change t0 so that I'd like to able to save it as animation as in the tutorial In the example t0 decreases from -2.0 to -1.95 etc the green curve is shifted right, and the area between curves, product increases. In the example there is an html animation and I would like to save as mp4 file.
Edit 2 :
Removing the plt.show()
calls from inside of the re-draw function allows
it to run end-to-end and write out the animation.