J'utilise la méthode de scipy integr.odeint pour résoudre un LDE de second ordre. La méthode nécessite que l'équation soit mise sous la forme d'un système de deux équations du premier ordre à deux inconnues. La méthode

odeint(system_matrix,initial_conditions_matrix,time_values)

Renvoie le vecteur de solution à chaque instant dans time_values. Le vecteur solution est en fait de la forme [u, u '], où u est la variable qui m'intéresse. Je veux donc tracer uniquement u. J'ai trouvé en ligne un moyen d'y parvenir est d'utiliser

u,u'=odeint(system_matrix,initial_conditions_matrix,time_values).T

Mais je ne comprends pas pourquoi cela fonctionne et que signifie le .T à la fin?

2
Joshua Benabou 14 janv. 2017 à 18:37

2 réponses

Meilleure réponse

odeint(system_matrix,initial_conditions_matrix,time_values) est une matrice de 2 colonnes.

Pour pouvoir obtenir la première colonne, utilisez d'abord .T (transposer) et ensuite vous pourrez décompresser puisque les éléments sont orientés comme vous le souhaitez.

BTW je doute que u' soit un nom de variable valide. Je ferais:

u,_ = odeint(system_matrix,initial_conditions_matrix,time_values).T

Puisque la seconde valeur ne vous intéresse pas.

3
Jean-François Fabre 14 janv. 2017 à 15:41

L'exemple que j'ai en tête est:

>>> sol = odeint(pend, y0, t, args=(b, c))
The solution is an array with shape (101, 2). The first column is theta(t), and the second is omega(t). The following code plots both components.

>>>
>>> import matplotlib.pyplot as plt
>>> plt.plot(t, sol[:, 0], 'b', label='theta(t)')
>>> plt.plot(t, sol[:, 1], 'g', label='omega(t)')

sol[:,0] sélectionne la première colonne de sol

Le déballage est généralement utilisé avec une fonction qui renvoie un tuple, par exemple:

def foo():
   ....
   return [1,2,3],{3:3}
x, y = foo()

Devrait finir par x être une liste, y un dictionnaire.

Mais cela fonctionne avec tout itérable, fournissez le nombre de termes correspondant. Par exemple, un tableau à 2 lignes peut être décompressé en 2 tableaux.

In [1]: x, y = np.arange(6).reshape(2,3)
In [4]: x,y
Out[4]: (array([0, 1, 2]), array([3, 4, 5]))

Si j'avais créé un tableau (3,2), j'aurais eu besoin de x,y,z= ..., ou .T.

Parce que nous pouvons indexer des colonnes et des lignes, la décompression n'est pas beaucoup utilisée dans numpy. Habituellement, nous avons trop de lignes à décompresser. Mais cela fonctionne exactement comme Python de base le voulait.

Par curiosité, transpose travaille sur un tuple

In [6]: np.transpose((x,y))
Out[6]: 
array([[0, 3],
       [1, 4],
       [2, 5]])

Ceci est en fait utilisé dans np.argwhere, qui transforme le tuple d'indices produit par np.where en tableau avec le même nombre de colonnes que les dimensions.

0
hpaulj 14 janv. 2017 à 17:41