2012-02-25 2 views
3

У меня возникла проблема соединить уравнение оптического пузыря, которое представляет собой систему ODE первого порядка со сложными значениями. Я нашел, что scipy может решить такую ​​систему, но их веб-страница содержит слишком мало информации, и я не могу ее понять.Комплексные системы ODE в scipy

У меня есть 8 соединены ОДУ первого порядка, и я должен генерировать функции, как:

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

затем сделать complex_ode(derv)

Мои вопросы:

  1. мой у не список но как матрица, как я могу дать выход из корня вписывается в complex_ode()?
  2. complex_ode() нужен якобиан, я понятия не имею, как начать строительство одного и какого типа он должен быть?
  3. Где я должен помещать начальные условия, например, в обычную оду и время linspace?

это complex_ode ссылка SciPy в: http://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.complex_ode.html

Может кто-нибудь дать мне большую информацию, так что я могу узнать немного больше.

ответ

5

Я думаю, что мы можем по крайней мере указать вас в правильном направлении. Оптическое уравнение bloch - проблема, которая хорошо понятна в научном сообществе , хотя не мной :-), поэтому в этой проблеме уже есть решения в Интернете .

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

Однако для решения ваших потребностей, вы говорили с использованием complex_ode, который я полагаю это хорошо, но я думаю, что просто scipy.integrate.ode будет работать нормально, а в соответствии с их документацией :

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 

у вас также есть дополнительное преимущество старшей более устоявшихся и лучше документированной функции. Я удивлен, что у вас 8, а не 9 связанных ODE, но я уверен, что вы это понимаете лучше, чем я. Да, вы правы, ваша функция должна быть следующей формы: ydot = f(t,y), которую вы называете def derv(), но вы вам нужно будет убедиться, что ваша функция занимает не менее двух параметров , таких как derv(t,y). Если ваш y находится в матрице, не проблема! Просто «перекроить» ее в функцию derv(t,y) следующим образом:

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

Пока num_rows*num_cols = 8, ваше число ОДУ вы должны быть хорошо. Затем используйте матрицу в своих вычислениях. Когда вы все сделали, только не забудьте вернуть вектор, а не матрицу, как:

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

Якобиан не требуется, но это, вероятно, позволит продолжить вычисление гораздо быстрее.Если вы не знаете, как вычислить это, вы можете обратиться к википедии или учебному пособию по исчислению. Это довольно просто, но может занять много времени.

Что касается начальных условий, вероятно, вы уже должны знать, что должно быть быть, сложным или реальным. Пока вы выбираете значения в разумных пределах, это не имеет большого значения.

+0

Большое спасибо за ур отличный ответ, должно быть, стоило у довольно много времени. Ссылка, которую я дал, абсолютно идеальна именно для того, что я ищу. Да, верно, это должно быть 9 :) хорошо, ушло время на сегодня, могу я вернуться к тебе, если я где-то смутился? Еще раз спасибо. – user1233157

Смежные вопросы