Scipy中复杂ODE系统

3

我希望您能帮忙翻译关于IT技术的内容,其中需要涉及光学布洛赫方程的求解,这是一个含有复数值的一阶常微分方程系统。我发现scipy这个工具包可能可以解决该问题,但相关网页提供的信息太少,我几乎无法理解。

我有8个耦合的一阶常微分方程,应该生成如下函数:

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

然后执行 complex_ode(derv)

我的问题是:

  1. 我的y不是一个列表,而是一个矩阵,我该如何在complex_ode()中给出正确的输出?
  2. complex_ode()需要一个雅可比矩阵,我不知道如何开始构建它以及应该是什么类型的?
  3. 我应该把初始条件放在哪里,就像普通的ode和时间linspace一样?

这是scipy的complex_ode链接: http://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.complex_ode.html

是否有人能够提供更多信息,以便我可以学到更多?

1个回答

7
我认为至少可以指出正确的方向。光布洛赫方程是科学界已经很好理解的问题,虽然我不理解 :-) ,但是这个特定问题已经有了解决方案,可以在互联网上找到。 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));

雅可比矩阵不是必需的,但它很可能会使计算更快。 如果您不知道如何计算它,您可以参考维基百科或微积分教材。 这很简单,但可能耗时。

就初始条件而言,您可能已经知道这些应该是什么,无论是复数还是实数。 只要选择合理的值,就不太重要。


非常感谢您的出色回答,一定花费了您很多时间。您提供的链接绝对完美,正是我所需要的。是的,您是正确的,应该是9:)好的,今天有时间,如果我遇到问题,我可以再回来找您吗?再次感谢。 - user1233157

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接