Domanda

Mi piacerebbe essere in grado di fare qualcos'altro in ogni momento passo durante la risoluzione di un ode (usando l'integrazione di Scipy).c'è un modo per farlo?Posso in qualche modo scrivere il mio anello di tempo e chiamare un singolo e.g.Runge-kutta passo da me stesso?C'è una routine in Python o dovrei venire con il mio?Penso che ci debba essere uno dal momento che Osteint è necessario utilizzare una tale funzione.Quindi la domanda è, come posso accederle?

Quindi dovrebbe cercare qualcosa lungo queste linee:

from scipy.integrate import *
from pylab import *

def deriv(y, t):
    a = -2.0
    b = -0.1
    return array([y[1], a*y[0]+b*y[1]])


time = linspace(0.0, 10.0, 1000)
dt = 10.0/(1000-1)
yinit = array([0.0005, 0.2])

for t in time:
    # doSomething, write into a file or whatever
    y[t] = yinit
    yinit = RungeKutta(deriv, yinit, t, dt, varargs)
.

È stato utile?

Soluzione

Ora sono arrivato con questo:

from pylab import *
from scipy.integrate import *

def RHS(t, x):
    return -x

min_t = 0.0
max_t = 10.0
num_t = 1e2
grid_t = linspace(min_t, max_t, num_t)
grid_dt = (max_t - min_t)/(num_t - 1)

y = zeros(num_t, dtype=complex)
y[0] = complex(1.0, 0.0)

solver = complex_ode(RHS)
solver.set_initial_value(y[0], grid_t[0]).set_integrator('dopri5')

for idx in range(1, int(num_t)):
    solver.integrate(solver.t + grid_dt)
    y[idx] = solver.y[0]
.

In qui posso fare tutto ciò che voglio durante l'integrazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top