In [1]:
from pylab import *
%matplotlib inline
from matplotlib import animation
from IPython.html import widgets
from IPython.display import display
import cmath

# nastavitve za izris grafov (http://matplotlib.org/1.3.1/users/customizing.html)
rc('text', usetex=True)
rc('font', size=12, family='serif', serif=['Computer Modern'])
rc('xtick', labelsize='small')
rc('ytick', labelsize='small')
rc('legend', fontsize='medium')
rc('figure', figsize=(5, 3))
rc('lines', linewidth=2.0)
rc('axes', color_cycle=['k'])
rc('contour', negative_linestyle='solid')

Animacije

Pripravimo animacijo utripanja dveh vzmetnih nihal z masama \(m\) in koeficientoma vzmeti \(k\), sklopljenih s šibkejšo vzmetjo s koeficientom \(k^\prime\). Na začetku je raztezek vzmeti prvega nihala A, vzmet drugega pa je neraztegnjena. Obe uteži na začeku mirujeta. Rešiti moramo sklopljen sistem diferencialnih enačb

\[m\ddot{x_1}=-kx_1+k^\prime(x_2-x_1),\]

\[m\ddot{x_2}=-kx_2-k^\prime(x_2-x_1),\]

z začetnimi pogoji \(x_1(0)=A\), \(x_2(0)=0\), \(\dot{x_1}(0)=0\) in \(\dot{x_2}(0)=0\). Rešitev je

\[x_1(t)=\frac{A}{2}\left(\cos(\omega_1 t)+\cos(\omega_2 t)\right),\]

\[x_2(t)=\frac{A}{2}\left(\cos(\omega_1 t)-\cos(\omega_2 t)\right),\]

z \(\omega_1=\sqrt{\frac{k}{m}}\) in \(\omega_2=\sqrt{\frac{k+2k^\prime}{m}}\). V animaciji utripanje.gif je prikazana ena perioda utripanja za \(A=3\,\)cm, \(\omega_1=10\pi\,\)s\(^{-1}\) in \(\omega_2=12\pi\,\)s\(^{-1}\).

In [2]:
fig, ((axa), (axb)) = subplots(2, 1, figsize=(6, 3))
axa.set_xlim([0, 30])
axa.set_ylim([-1, 1])
vzmet1,=axa.plot([], [], lw=3)
vzmet2,=axa.plot([], [], lw=1)
vzmet3,=axa.plot([], [], lw=3)
utez1,=axa.plot([], [], 'or', markersize=40)
utez2,=axa.plot([], [], 'ob', markersize=40)
axa.set_xlabel(r'Polo\v zaj (cm)')
axa.set_yticks([])
axa.grid()
axb.set_xlim([0, 1])
axb.set_ylim([-3, 3])
axb.set_xlabel(r'\v Cas (s)')
axb.set_ylabel(r'Odmik (cm)')
axb.grid()
crta,=axb.plot([], [])

A=3.0
w1=5.0 * 2 * pi
w2=6.0 * 2 * pi
x1t=lambda t: 0.5 * A * (cos(w1 * t) + cos(w2 * t))
x2t=lambda t: 0.5 * A * (cos(w1 * t) - cos(w2 * t))

t=linspace(0, 1, 200)
axb.plot(t, x1t(t), 'r', t, x2t(t), 'b')

def init():
    vzmet1.set_data([], [])
    vzmet2.set_data([], [])
    vzmet3.set_data([], [])
    utez1.set_data([], [])
    utez2.set_data([], [])
    crta.set_data([], [])

nf=200;    
def animate(f):    
    t=f / float(nf)
    x1=x1t(t)
    x2=x2t(t)
    vzmet1.set_data(linspace(0, 10 + x1, 41), 0.25*10/(10+x1)*sin(arange(41)*pi/2))
    vzmet2.set_data(linspace(10 + x1, 20 + x2, 41), 0.25*10/(10+x2-x1)*sin(arange(41)*pi/2))
    vzmet3.set_data(linspace(20 + x2, 30, 41), 0.25*10/(10-x2)*sin(arange(41)*pi/2))
    utez1.set_data([10 + x1], [0])
    utez2.set_data([20 + x2], [0])
    crta.set_data([t, t], [-A, A])
    fig.tight_layout(pad=0.3)

anim=animation.FuncAnimation(fig, animate, init_func=init, frames=nf, interval=25, blit=True)
anim.save('utripanje.gif', writer='imagemagick');
close()

Interaktivni grafi

Graf prikazuje odmik dušenega nihala v odvisnosti od časa. Lastno frekvenco nedušenega nihala \(\omega_0\) in dušenje \(\beta\) spreminjamo z drsnikoma nad grafom (glej ROVF10.ipynb).

In [3]:
def narisi_nihanje(omega0, beta):
    omega = cmath.sqrt(omega0 ** 2 - beta ** 2)
    t = linspace(0, 20, 200)
    y = [(exp(-beta * t1) * cmath.cos(omega * t1)).real for t1 in t]
    y0 = exp(-beta * t)
    
    fig, ax = subplots(1, 1, figsize = (7.5, 4.5))
    ax.set_xlim([0, 20])
    ax.set_ylim([-1.1, 1.1])
    ax.set_xlabel(r'\v Cas (s)')
    ax.set_ylabel(r'Odmik (cm)')
    ax.grid()
    ax.plot(t, y)
    if beta <= omega0:
        ax.fill_between(t, -y0, y0, alpha = 0.2)    
    
omega0_slider = widgets.FloatSliderWidget(min = 0, max = 2, step = 0.1, value = 1)
beta_slider = widgets.FloatSliderWidget(min = 0, max = 2, step = 0.1, value = 0.1)
display(widgets.interactive(narisi_nihanje, omega0 = omega0_slider, beta = beta_slider))

Naloga

Dvostopenjska raketa na začetku miruje v breztežnem prostoru. Prva stopnja tehta 30 ton, druga pa 10 ton. V vsaki od stopenj odpade 3/4 mase na gorivo. Motorji vsake od stopenj porabijo 100 kg goriva na sekundo. Hitrost izpušnih plinov glede na raketo je 3 km/s. Napravi animacijo gibanja rakete od trenutka, ko se vklopijo motorji prve stopnje, do trenutka, ko zmanjka goriva v drugi stopnji rakete. Prikaži tudi, kako se s časom spreminjata hitrost in pospešek rakete. Animacijo pripravi v formatu "animated GIF". Velikost oddane datoteke naj bo največ \(5\,\)MB, uporabiš lahko program za stiskanje datotek v format RAR.