我认为至少可以指出正确的方向。光布洛赫方程是科学界已经很好理解的问题,虽然我不理解 :-) ,但是这个特定问题已经有了解决方案,可以在互联网上找到。
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个ODE而不是9个,但我相信您比我更理解这个。是的,您是正确的,您的函数应该是
ydot = f(t,y)
,并且您称其为
def derv()
,但您需要确保您的函数至少需要两个参数,如
derv(t,y)
。如果您的
y
是矩阵,也没有问题!只需在
derv(t,y)
函数中进行“reshape”即可:
Y = numpy.reshape(y,(num_rows,num_cols));
只要
num_rows*num_cols = 8
,你的ODE数量应该是可以处理的。然后在计算中使用矩阵。完成后,请确保返回向量而不是像下面这样的矩阵:
out = numpy.reshape(Y,(8,1))
雅可比矩阵不是必需的,但它很可能会使计算更快。 如果您不知道如何计算它,您可以参考维基百科或微积分教材。 这很简单,但可能耗时。
就初始条件而言,您可能已经知道这些应该是什么,无论是复数还是实数。 只要选择合理的值,就不太重要。