Die Schnittstelle scipy.integrate.ode
zu Integrationsroutinen bietet eine Methode zum Stoppen der Integration, wenn in einem Schritt, set_solout
, eine Einschränkung verletzt wird. Allerdings kann ich diese Methode nicht einmal in den einfachsten Beispielen zum Laufen bringen. Hier ist ein Versuch:Funktioniert scipy.integrate.ode.set_solout?
import numpy as np
from scipy.integrate import ode
def f(t, y):
"""Exponential decay."""
return -y
def solout(t, y):
if y[0] < 0.5:
return -1
else:
return 0
y_initial = 1
t_initial = 0
r = ode(f).set_integrator('dopri5') # Integrator that supports solout
r.set_initial_value(y_initial, t_initial)
r.set_solout(solout)
# Integrate until t = 5, but stop when solout constraint violated
r.integrate(5)
# The time when solout should have terminated integration:
intersection_time = np.log(2)
Die Integration von solout eindämmen sollte, wenn t = log(2) = 0.693...
, sondern weiterhin glücklich bis t = 5
, wenn y = 0.007
.
Ist das ein Fehler in scipy
, oder verwende ich set_solout
nicht richtig?