2016-09-30 2 views
0

Ich muss nur lesen Using adaptive step sizes with scipy.integrate.ode und die akzeptierte Lösung für dieses Problem, und haben sogar reproduziert die Ergebnisse durch Kopieren und Einfügen in meinem Python-Interpreter.Verwenden von adaptive Zeitschritt für scipy.integrate.ode beim Lösen von ODE-Systemen

Mein Problem ist, dass wenn ich versuche, den Lösungscode zu meinem eigenen Code anzupassen, ich nur flache Linien bekomme.

Mein Code ist wie folgt:

from scipy.integrate import ode 
from matplotlib.pyplot import plot, show 

initials = [1,1,1,1,1] 
integration_range = (0, 100) 

f = lambda t,y: [1.0*y[0]*y[1], -1.0*y[0]*y[1], 1.0*y[2]*y[3] - 1.0*y[2], -1.0*y[2]*y[3], 1.0*y[2], ] 

y_solutions = [] 
t_solutions = [] 
def solution_getter(t,y): 
    t_solutions.append(t) 
    y_solutions.append(y) 


backend = "dopri5" 
ode_solver = ode(f).set_integrator(backend) 
ode_solver.set_solout(solution_getter) 
ode_solver.set_initial_value(y=initials, t=0) 

ode_solver.integrate(integration_range[1]) 

plot(t_solutions,y_solutions) 
show() 

Und die Handlung es ergibt: enter image description here

Antwort

1

In der Zeile

y_solutions.append(y) 

Sie denken, dass Sie den aktuellen Vektor anhängen. Was passiert, ist, dass Sie die Objektreferenz an y anhängen. Da der Integrator während der Integrationsschleife scheinbar den Vektor y wieder verwendet, hängt immer die gleiche Objektreferenz an. Somit wird am Ende jede Position der Liste mit der gleichen Referenz gefüllt, die auf den Vektor des letzten Zustands von y zeigt.

lange Geschichte kurz: ersetzen mit

y_solutions.append(y.copy()) 

und alles ist in Ordnung.

+0

Vielen Dank! Referenzen schaffen es immer noch, mich manchmal zu verwirren ... Btw, wie bist du zu dieser Lösung gekommen? – Ezbob

+1

Durch Debuggen. Die q'n'd-Lösung besteht darin, print-Anweisungen innerhalb von solution_getter und vor dem Plot hinzuzufügen, um zu sehen, was die tatsächlichen Daten sind. – LutzL

Verwandte Themen