Pregunta

Estoy teniendo problemas para sovling la óptica de bloch ecuación, la cual es de primer orden ODE sistema con valores complejos.He encontrado scipy puede resolver este sistema, pero su página web ofrece muy poca información y casi no puedo entenderlo.

Tengo 8 acoplados de primer orden las ecuaciones diferenciales ordinarias, y que yo debería de generar una función como:

def derv(y):
    compute the time dervative of elements in y
    return answers as an array

a continuación, hacer complex_ode(derv)

Mis preguntas son:

  1. mi, y no es una lista, pero de una matriz, ¿cómo puedo dar un corrent de salida encaja en complex_ode()?
  2. complex_ode() necesita un jacobiano, no tengo idea de cómo empezar a construir uno y de qué tipo debe ser?
  3. Donde debo poner las condiciones iniciales como en la normal de educación a distancia y tiempo linspace?

este es scipy del complex_ode enlace:http://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.complex_ode.html

Alguien podría proporcionarme más información para que yo pueda aprender un poco más.

¿Fue útil?

Solución

Creo que al menos podemos apuntar en la dirección correcta.La óptica bloch ecuación es un problema que es bien entendido en el científico de la comunidad, aunque no por mí :-), por lo que ya existen soluciones en internet para este problema en particular.

http://massey.dur.ac.uk/jdp/code.html

Sin embargo, para abordar sus necesidades, usted habló de usar complex_ode, que supongo que está bien, pero creo que simplemente scipy.integrar.la educación a distancia funciona muy bien así de acuerdo a su documentación:

 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

Usted también tiene el beneficio añadido de una mayor y más establecidas y mejor función documentado.Estoy sorprendido de que tiene 8 y no 9 junto ODE, pero estoy seguro que usted entiende esto mejor que yo.Sí, estás en lo correcto, su función debe ser de la forma ydot = f(t,y), que te llame def derv() pero usted está va a necesitar para asegurarse de que su función toma al menos dos parámetros como derv(t,y).Si su y es en la matriz, no hay problema!Sólo "remodelar" en el derv(t,y) la función así:

Y = numpy.reshape(y,(num_rows,num_cols));

Mientras num_rows*num_cols = 8, su número de la educación a distancia es que debe estar bien.Entonces utilice la matriz en sus cálculos.Cuando ya está todo hecho, sólo asegúrese de volver un vector y no una matriz como:

out = numpy.reshape(Y,(8,1));

El Jacobiano no es necesario, pero es probable que permiten el cálculo de proceder mucho más rápidamente.Si usted no sabe cómo calcular esto es posible que desee consultar de wikipedia o de un cálculo de los libros de texto.Es bastante simple, pero puede llevar mucho tiempo.

Tan lejos como las condiciones iniciales, se debe probablemente ya sabes lo que debe ser, si es complejo o real valorados.Mientras que usted seleccione los valores que se dentro de la razón, no importa mucho.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top