Livre_silo 30 août 2013 16:32 Page 228
¨
©
¨
©
¨
©
¨
©
C o p y r i g h t E y r o l l e s
228
Informatique pour tous
9.2.2 Équations scalaires d’ordre 2 ou plus
Une équation scalaire telle que ¨
θ = −k sin θ est d’ordre 2 (ici, l’ordre désigne la plus
grande dérivée intervenant dans l’équation, il n’est pas question de l’ordre d’un schéma
numérique). Si on s’intéresse au couple X = (θ, ˙
θ), alors il vérifie l’équation ˙
X = G(X),
avec G l’application ³ (α, β) → (β, −k sin α). On ramène par ce procédé de vectorisation
les équations différentielles scalaires d’ordre p à des équations d’ordre 1, mais à valeurs
dans R
p .
Par chance, la méthode d’Euler (mais aussi les autres méthodes numériques usuelles) fonctionne aussi bien pour des fonctions à valeurs vectorielles que réelles ! Il n’y a donc pas
grand-chose à modifier :
def euler_vectoriel(F, a, b, y0, h):
y = y0
t = a
les_y = [y0] # la liste des valeurs renvoyées
les_t = [a]
while t+h <= b:
y = y + h * F(t, y)
les_y.append(y)
t += h
les_t.append(t)
return les_t, les_y
Exercice 9.3 Trouver les différences avec la version scalaire.
Regardez le nom de la fonction : il a changé ! Mais il n’y a pas que cela...
Si on choisit intelligemment les types de données, il n’y a donc rien à changer. Attention
cependant. Le mathématicien pense : (1, 2) + (3, 4) = (4, 6). Mais du point de vue de
Python, cette expression désigne une concaténation de n-uplets :
In [5]: (1,2) + (4,5)
Out[5]: (1, 2, 4, 5)
Changer de structure de données ne résout pas le problème :
In [6]: [1,2] + [4,5]
Out[6]: [1, 2, 4, 5]
Encore perdu : ici, on a concaténé des listes.
Pour que les additions intérieures ou multiplications extérieures se passent « comme
dans R
n », on va utiliser des array issus de la bibliothèque numpy.
3. L’ expérience montre que chez le débutant, ne pas vouloir expliciter la fonction G (en donnant la valeur de
G(α, β)) est souvent une économie de temps très modeste et qui coûte très cher par la suite...
¨
©
¨
©
¨
©
¨
©
C o p y r i g h t E y r o l l e s
228
Informatique pour tous
9.2.2 Équations scalaires d’ordre 2 ou plus
Une équation scalaire telle que ¨
θ = −k sin θ est d’ordre 2 (ici, l’ordre désigne la plus
grande dérivée intervenant dans l’équation, il n’est pas question de l’ordre d’un schéma
numérique). Si on s’intéresse au couple X = (θ, ˙
θ), alors il vérifie l’équation ˙
X = G(X),
avec G l’application ³ (α, β) → (β, −k sin α). On ramène par ce procédé de vectorisation
les équations différentielles scalaires d’ordre p à des équations d’ordre 1, mais à valeurs
dans R
p .
Par chance, la méthode d’Euler (mais aussi les autres méthodes numériques usuelles) fonctionne aussi bien pour des fonctions à valeurs vectorielles que réelles ! Il n’y a donc pas
grand-chose à modifier :
def euler_vectoriel(F, a, b, y0, h):
y = y0
t = a
les_y = [y0] # la liste des valeurs renvoyées
les_t = [a]
while t+h <= b:
y = y + h * F(t, y)
les_y.append(y)
t += h
les_t.append(t)
return les_t, les_y
Exercice 9.3 Trouver les différences avec la version scalaire.
Regardez le nom de la fonction : il a changé ! Mais il n’y a pas que cela...
Si on choisit intelligemment les types de données, il n’y a donc rien à changer. Attention
cependant. Le mathématicien pense : (1, 2) + (3, 4) = (4, 6). Mais du point de vue de
Python, cette expression désigne une concaténation de n-uplets :
In [5]: (1,2) + (4,5)
Out[5]: (1, 2, 4, 5)
Changer de structure de données ne résout pas le problème :
In [6]: [1,2] + [4,5]
Out[6]: [1, 2, 4, 5]
Encore perdu : ici, on a concaténé des listes.
Pour que les additions intérieures ou multiplications extérieures se passent « comme
dans R
n », on va utiliser des array issus de la bibliothèque numpy.
3. L’ expérience montre que chez le débutant, ne pas vouloir expliciter la fonction G (en donnant la valeur de
G(α, β)) est souvent une économie de temps très modeste et qui coûte très cher par la suite...
