Programme pendule.py


#!/usr/bin/env pythonw2.3

# lignes utilisees pour matplotlib
import matplotlib
matplotlib.use("WXAgg")
import matplotlib.pylab as pylab
import numpy as N
import math


#############################################################################
# debut du programme
#############################################################################

def pendule_lineaire (tt, vt, at, gR, dt) :
	"""calcule t (t+1), v(t+1), a(t+1)
	t'' + gR t = 0"""
	at = - gR * tt
	vt += at * dt
	tt += vt * dt 
	return tt,vt,at

def pendule_non_lineaire (tt, vt, at, gR, dt) :
	"""calcule t (t+1), v(t+1), a(t+1)
	t'' + gR t = 0"""
	at = - gR * math.sin (tt)
	vt += at * dt
	tt += vt * dt 
	return tt,vt,at

def periode (courbe,dt) :
	"""estime la période d'une courbe dont on sait qu'elle est cyclique"""
	lp = []
	p = 0
	for i in range (1, len (courbe)-1) :
		if courbe [i-1] <= courbe [i] and courbe [i] >= courbe [i+1] :
			# maximum
			lp.append (i)
	# moyenne entre les durees entre deux maximas
	s = 0
	for l in range (1,len (lp)) :
		s += lp [l] - lp [l-1]
	return float (s) / (len (lp)-1) * dt
	
        
# initialisation : un angle t0 != 0, pas de vitesse, pas d'accélération
t0			= 1
tt,vt,at 	= t0,0,0
stt,svt,sat = t0,0,0
dt 			= 0.01
gR 			= 0.5
t 			= 0

T 			= []
th 			= []
sth 		= []
cth 		= []

# boucle
print "simultation"
for i in range (0,4000) :
        T.append (t)
        th.append (tt)
        sth.append (stt)
        ctt 		= t0 * math.cos (math.sqrt (gR) * t)
        cth.append (ctt)
        t 			= t + dt
        tt,vt,at 	= pendule_lineaire (tt, vt, at, gR, dt)
        stt,svt,sat = pendule_non_lineaire (stt, svt, sat, gR, dt)
        
print "periode theorique : ", math.pi * 2 / math.sqrt (gR)
print "periode courbe theorique ", periode (cth, dt)
print "periode courbe lineaire ", periode (th, dt)
print "periode courbe non lineaire ", periode (sth, dt)

# pour calculer l'angle a partir duquel la solution lineaire
# n'est plus viable, il faut calculer la difference entre les periodes
# et choisir un seuil au dela duquel la difference est trop grande
        
# affichage des premieres valeurs
print "premieres valeurs "
print "angle initial : ", t0 * 180 / math.pi
for i in range (0,10) :
        print T[i], " : ", th[i], "\t", cth [i], "\t", sth [i]


# matplotlib n'accepte que des donnees stockees dans un type de tableau
# definies dans le package Numeric
aT = N.array (T)
ath = N.array (th)
acth = N.array (cth)
asth = N.array (sth)

# dessin de la courbe
print "dessin de la courbe"
pylab.title("Oscillation d'un pendule")
pylab.xlabel("t")
pylab.ylabel("theta")
pylab.grid (True)
pylab.plot (aT, ath, linewidth=1.0, color = "blue")
pylab.plot (aT, acth, linewidth=1.0, color = "red")
pylab.plot (aT, asth, linewidth=1.0, color = "green")
pylab.show ()

créé avec py2html version:0.62