2010-11-19 5 views
0

Je résous actuellement un système d'équations différentielles en python utilisant odeint pour simuler des particules chargées dans un champ (la source provient de ce package):Python scientifique: interrompre l'équation différentielle de résolution avec une condition

time = np.linspace(0, 5, 1000) 

def sm(x, t): 
    return np.array([x[1], eta*Ez0(x[0])]) 

traj = odeint(sm,[0,1.], time) 

Il fonctionne très bien, mais je voudrais arrêter le calcul dès que x [0] < 0. pour l'instant, je bloque juste l'évolution du sytem:

def sm1(x, t): 
    if x[0] < 0: 
     return np.array([0, 0]) 
    else: 
     return np.array([x[1], eta*Ez0(x[0])]) 

traj = odeint(sm1,[0,1.],time) 

mais je Gess il y a de meilleures solutions. J'ai trouvé this mais il me semble qu'il corrige le nombre de pas, ce qui est regrettable. Toute suggestion appréciée.

+0

Votre solution semble assez raisonnable pour moi. Que pensez-vous qui ne va pas avec? –

+0

vous obtenez un avertissement: lsoda-- à courant t (= r1), mxstep (= i1) étapes prises sur cet appel avant d'atteindre tout Dans le message ci-dessus, I1 = 500 Dans le message ci-dessus, R1 = 0,4223349048304E + 00 Excédent de travail effectué sur cet appel (peut-être un mauvais type Dfun). Exécuter avec full_output = 1 pour obtenir des informations quantitatives. – Mermoz

Répondre

1

Si vous écrivez une extension personnalisée de la fonction odeint, votre fonction peut déclencher une exception particulière lorsqu'elle est terminée. Le faire en Python pourrait le rendre beaucoup plus lent, mais je pense que vous écrivez la même chose en C ou en Cython. Notez que je n'ai pas testé ce qui suit.

class ThatsEnoughOfThat(Exception): 
    pass 

def custom_odeint(func, y0, t): # + whatever parameters you need 
    for timestep in t: 
     try: 
      # Do stuff. Call odeint/other scipy functions? 
     except ThatsEnoughOfThat: 
      break 
    return completedstuff 

def sm2(x, t): 
    if x[0] < 0: 
     raise ThatsEnoughOfThat 
    return np.array([x[1], eta*Ez0(x[0])]) 
Questions connexes