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:

    .
  1. la mia y non è una lista ma una matrice, come posso dare un'uscita corrente si adatta a complesso_ode ()?
  2. complex_ode() ha bisogno di un giacobiano, non ho idea di come iniziare a costruire uno E che tipo dovrebbe essere?
  3. 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ù.

È stato utile?

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.

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