Сложные системы ODE в scipy

У меня возникли проблемы с совмещением оптического уравнения Блоха, представляющего собой систему ОДУ первого порядка со сложными значениями. Я обнаружил, что Сципи может решить эту систему, но их веб-страница предлагает слишком мало информации, и я с трудом могу ее понять.

У меня есть 8 связанных ODE первого порядка, и я должен сгенерировать такую ​​функцию:

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

тогда делай complex_ode(derv)

Мои вопросы:

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

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

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

1 ответ

Решение

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

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, ваше количество ODE, вы должны быть в порядке. Затем используйте матрицу в своих вычислениях. Когда вы все закончите, просто верните вектор, а не матрицу вроде:

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

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

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

Другие вопросы по тегам