Demonstration that an ellipse can be constructed from two circular motions of same frequency but oposite rotations.
Can be used as a model for transmission line theory.
In [19]:
# JSAnimation import available at https://github.com/jakevdp/JSAnimation
from JSAnimation import IPython_display
from matplotlib import animation
Gamma0 = .5*exp(pi/4*1j)
a0 = 1
b0 = Gamma0*a0
theta = linspace(0,2*pi,101)
a = a0*exp(1j*theta)
b = b0*exp(-1j*theta)
v = a+b
i = (a-b)
fig,axs = subplots(1,2 , sharey=True,
subplot_kw=dict(xlim=(-3, 3),ylim=(-3, 3)),
figsize=(8,3.8))
ax, ax2 = axs
ax2.set_xlim(theta[0], theta[-1])
a_line, = ax.plot([], [], 'o-',lw=2, color ='b', label = 'a')
b_line, = ax.plot([], [], 'o-',lw=2, color='r', label = r'$\pm$b')
c_line, = ax.plot([], [], 'o-',lw=2, color='r',label = None)
v_line, = ax.plot([], [], 'o-',lw=2, color='g', label= 'v')
i_line, = ax.plot([], [], 'o-',lw=2, color='y', label = 'i')
a_line2, = ax2.plot([], [], 'o-',lw=2, color ='b', label = 'a')
b_line2, = ax2.plot([], [], 'o-',lw=2, color='r', label = r'$\pm$b')
c_line2, = ax2.plot([], [], 'o-',lw=2, color='r',label = None)
v_line2, = ax2.plot([], [], 'o-',lw=2, color='g', label= 'v')
i_line2, = ax2.plot([], [], 'o-',lw=2, color='y', label = 'i')
primary, = ax.plot(a.real, a.imag)
secondary, = ax.plot(a0+b.real, a0+b.imag)
result_v,= ax.plot(v.real, v.imag)
result_i,= ax.plot(i.real, i.imag)
ax.legend()
primary2, = ax2.plot(theta, a.imag)
secondary2, = ax2.plot(theta,b.imag)
result_v2,= ax2.plot(theta, v.imag)
result_i2,= ax2.plot(theta, i.imag)
ax2.legend()
global lines
lines = [a_line,b_line,c_line, v_line,i_line]
def init():
global lines
[k.set_data([], []) for k in lines]
plot()
legend()
return lines,
def animate(k):
global lines
a_line.set_data([0,a[k].real],[0,a[k].imag])
b_line.set_data([a[k].real,v[k].real],[a[k].imag,v[k].imag])
c_line.set_data([a[k].real,i[k].real],[a[k].imag,i[k].imag])
v_line.set_data([0,v[k].real],[0,v[k].imag])
i_line.set_data([0,i[k].real],[0,i[k].imag])
a_line2.set_data([theta[k], a[k].imag])
b_line2.set_data([theta[k], b[k].imag])
#c_line2.set_data([a[k].real,i[k].real],[a[k].imag,i[k].imag])
v_line2.set_data([theta[k], v[k].imag])
i_line2.set_data([theta[k], i[k].imag])
secondary.set_data([a[k].real+b.real,a[k].imag+b.imag])
g = b[k]/a[k]
z = v[k]/i[k]
#ax,=fig.get_axes()
ax.set_title('$\Gamma = %.1f e ^{%.1fj\pi}$, '\
'$Z= %.1f e^{%.1fj\pi}$'\
%( abs(g), angle(g)/pi, abs(z), angle(z)/pi))
return lines,
animation.FuncAnimation(fig, animate, len(theta), init_func=init,
interval=40, blit=True)
Out[19]:
In [13]:
from IPython.html.widgets import interact, interactive, fixed
from IPython.display import display
from IPython.html import widgets
# create a simple animation
#fig = plt.figure(figsize = (5,5))
#ax = plt.axes(xlim=(-3, 3), ylim=(-3, 3))
fig,axs = subplots(1,2 , sharey=True,
subplot_kw=dict(xlim=(-3, 3), ylim=(-3, 3)),
figsize=(8,3))
ax, ax2 = axs
ax.axis('equal')
ax2.axis('equal')
# vectors
a_line, = ax.plot([], [], 'o-',lw=2, color ='b', label = 'a')
b_line, = ax.plot([], [], 'o-',lw=2, color='r', label = r'$\pm$b')
c_line, = ax.plot([], [], 'o-',lw=2, color='r',label = None)
v_line, = ax.plot([], [], 'o-',lw=2, color='g', label= 'v')
i_line, = ax.plot([], [], 'o-',lw=2, color='y', label = 'i')
# trajectories
primary, = ax.plot(a.real, a.imag)
secondary, = ax.plot(a0+b.real, a0+b.imag)
result_v,=ax.plot(v.real, v.imag)
result_i,=ax.plot(i.real, i.imag)
primary, = ax2.plot(theta, a.imag)
secondary, = ax2.plot(theta, a0+b.imag)
result_v,=ax2.plot(theta, v.imag)
result_i,=ax.plot(theta, i.imag)
close()
def animate(phi,Gamma_mag, Gamma_phase):
global fig,ax,lines
Gamma0 = Gamma_mag*exp(1j*Gamma_phase*pi)
a0 = 1
b0 = Gamma0*a0
theta = linspace(0,2*pi,101)
a = a0*exp(1j*theta)
b = b0*exp(-1j*theta)
v = a+b
i = (a-b)
k = rf.find_nearest_index(theta, phi*pi)
primary.set_data([a.real, a.imag])
secondary.set_data([a0+b.real, a0+b.imag])
result_v.set_data([v.real, v.imag])
result_i.set_data([i.real, i.imag])
a_line.set_data([0,a[k].real],[0,a[k].imag])
b_line.set_data([a[k].real,v[k].real],[a[k].imag,v[k].imag])
c_line.set_data([a[k].real,i[k].real],[a[k].imag,i[k].imag])
v_line.set_data([0,v[k].real],[0,v[k].imag])
i_line.set_data([0,i[k].real],[0,i[k].imag])
secondary.set_data([a[k].real+b.real,a[k].imag+b.imag])
g = b[k]/a[k]
z = v[k]/i[k]
#ax,=fig.get_axes()
ax.set_title('$\Gamma = %.1f e ^{%.1fj\pi}$, '\
'$Z= %.1f e^{%.1fj\pi}$'\
%( abs(g), angle(g)/pi, abs(z), angle(z)/pi))
display(fig)
interactive(animate,
phi = (0, 2,.1),
Gamma_mag=(-2,2,.1),
Gamma_phase=(0,2,.1) )
In [65]:
ax.plot?
In [26]:
fig,axs = subplots(1,2 , sharey=True,
subplot_kw=dict(xlim=(-3, 3), ylim=(-3, 3)),
figsize=(8,3))
ax1, ax2 = axs
In [19]:
subplots?
In [11]:
axis?
In [ ]: