Я думаю, что мы можем по крайней мере указать вас в правильном направлении. Оптическое уравнение 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));
Якобиан не требуется, но это, вероятно, позволит продолжить вычисление гораздо быстрее.Если вы не знаете, как вычислить это, вы можете обратиться к википедии или учебному пособию по исчислению. Это довольно просто, но может занять много времени.
Что касается начальных условий, вероятно, вы уже должны знать, что должно быть быть, сложным или реальным. Пока вы выбираете значения в разумных пределах, это не имеет большого значения.
Большое спасибо за ур отличный ответ, должно быть, стоило у довольно много времени. Ссылка, которую я дал, абсолютно идеальна именно для того, что я ищу. Да, верно, это должно быть 9 :) хорошо, ушло время на сегодня, могу я вернуться к тебе, если я где-то смутился? Еще раз спасибо. – user1233157