La (breve) documentazione per scipy.integrate.ode
dice che due metodi (dopri5
e dop853
) hanno controllo di passi e output denso. Guardando gli esempi e il codice stesso, vedo solo un modo molto semplice per ottenere l'output da un integratore. Vale a dire, sembra che appena un passo in avanti l'integratore da alcuni dt fisso, ottiene il valore della funzione (s) in quel momento, e ripetere.Utilizzo di dimensioni di passo adattive con scipy.integrate.ode
Il mio problema ha tempi piuttosto variabili, quindi vorrei solo ottenere i valori in qualunque momento passi che deve valutare per raggiungere le tolleranze richieste. Cioè, presto, le cose stanno cambiando lentamente, quindi i passi del tempo di uscita possono essere grandi. Ma dato che le cose diventano interessanti, i passi del tempo di output devono essere minori. In realtà non voglio output denso a intervalli uguali, voglio solo i passi temporali che la funzione adattiva utilizza.
EDIT: uscita Dense
Una nozione relativa (quasi l'opposto) è "uscita densa", per cui le misure adottate sono grandi come stepper preoccupa di prendere, ma i valori della funzione sono interpolate (solitamente con precisione paragonabile all'accuratezza dello stepper) a qualsiasi cosa tu voglia. FORTRAN sottostante scipy.integrate.ode
è apparentemente capace di questo, ma ode
non ha l'interfaccia. odeint
, d'altra parte, si basa su un codice diverso e fa evidentemente un output denso. (È possibile eseguire l'output ogni volta che viene richiamato il proprio lato destro per vedere quando ciò accade e vedere che non ha nulla a che fare con i tempi di output.)
Così ho potuto sfruttare l'adattabilità, purché Potrei decidere i passi temporali di uscita che voglio in anticipo. Purtroppo, per il mio sistema preferito, io non so nemmeno che cosa i tempi approssimativi sono in funzione del tempo, fino a quando ho eseguito l'integrazione. Quindi dovrò combinare l'idea di prendere un passo dell'integratore con questa nozione di output denso.
Ricorda che per ora (versione 0.16) devi chiamare 'set_solout()' ** prima ** 'set_initial_value()' o solout non verrà chiamato. –