sistemi di ode complessi in scipy
Domanda
Sto avendo problemi a sollierare l'equazione Optical Bloch, che è un sistema ODE del primo ordine con valori complessi. Ho trovato Scipy potrebbe risolvere tale sistema, ma la loro pagina web offre troppo poche informazioni e non riesco a capirlo.
Ho 8 Odi di primo ordine accoppiata e dovrei generare una funzione come:
def derv(y):
compute the time dervative of elements in y
return answers as an array
.
quindi fai complex_ode(derv)
Le mie domande sono:
- .
- la mia y non è una lista ma una matrice, come posso dare un'uscita corrente si adatta a complesso_ode ()?
-
complex_ode()
ha bisogno di un giacobiano, non ho idea di come iniziare a costruire uno E che tipo dovrebbe essere? - dove dovrei mettere le condizioni iniziali come nell'ode normale e
TIME LINSPACE?
Questo è il collegamento di Scipy's Complex_ode: http://docs.scipy.org/doc/Schipy /reference/generated/scipy.integrate.complex_ode.html
Qualcuno potrebbe fornirmi più informazioni in modo da poter imparare un po 'di più.
Soluzione
Penso che possiamo almeno puntarti nella giusta direzione. L'ottica. Bloch Equation è un problema che è ben compreso nel Scientifico Comunità, anche se non da me :-), quindi ci sono già soluzioni su Internet a questo particolare problema.
http://massey.dur.ac.uk/jdp/code.html .
Tuttavia, per affrontare le tue esigenze, hai parlato di usare compless_ode, che suppongo va bene, ma penso che semplicemente scipy.integrate.ode funzioni bene Secondo la loro documentazione:
from scipy import eye
from scipy.integrate import ode
y0, t0 = [1.0j, 2.0], 0
def f(t, y, arg1):
return [1j*arg1*y[0] + y[1], -arg1*y[1]**2]
def jac(t, y, arg1):
return [[1j*arg1, 1], [0, -arg1*2*y[1]]]
r = ode(f, jac).set_integrator('zvode', method='bdf', with_jacobian=True)
r.set_initial_value(y0, t0).set_f_params(2.0).set_jac_params(2.0)
t1 = 10
dt = 1
while r.successful() and r.t < t1:
r.integrate(r.t+dt)
print r.t, r.y
.
Hai anche il beneficio aggiuntivo di un più vecchio più stabilito e migliore
funzione documentata. Sono sorpreso che tu abbia 8 e non 9 diode accoppiati, ma io sono
certo che lo capisci meglio di I. Sì, sei corretto, la tua funzione
dovrebbe essere del modulo ydot = f(t,y)
, che chiami def derv()
ma tu sei
Dovrebbe essere necessario assicurarsi che la tua funzione richieda almeno due parametri
come derv(t,y)
. Se il tuo y
è in Matrix, nessun problema! Semplicemente "rimodella"
La funzione derv(t,y)
come SO:
Y = numpy.reshape(y,(num_rows,num_cols));
.
Finché num_rows*num_cols = 8
, il tuo numero di Ode dovresti stare bene. Poi
Utilizzare la matrice nei tuoi calcoli. Quando hai finito, assicurati di tornare
Un vettore e non una matrice come:
out = numpy.reshape(Y,(8,1));
.
Il Jacobian non è richiesto, ma probabilmente consentirà che il calcolo proceda molto più velocemente. Se non sai come calcolarlo, potresti voler consultare Wikipedia o un libro di testo del calcolo. È piuttosto semplice, ma può richiedere tempo.
Per quanto riguarda le condizioni iniziali, probabilmente dovresti già sapere cosa dovrebbero essere, sia che sia complesso o reale valutato. Finché selezioni valori che sono All'interno della ragione, non dovrebbe impazzire molto.