2016-12-26 23 views
0

我想使用Python的odeINT来集成由循环生成的多组方程。方程式都是耦合的,所以必须通过一次调用odeINT同时进行集成。问题是初始条件(“y0”)必须是列表或矩阵列表(而不仅仅是列表)。 odeINT给出了这个错误:“初始条件y0必须是一维的”。我想知道如何解决这个问题。这是一个代码示例;非常感谢任何想法。无法使odeINT接受由循环生成的方程

class network: 
    def __init__(self): 
     self.i_range = 3 
     ## INITIAL CONDITIONS WILL BE A LIST OF LISTS. 
     ## THIS IS THE SOURCE OF odeINT's ERROR. 
     self.init = [[] for i in range(self.i_range)] 
     for i in range(0,self.i_range): 
      self.init[i].append(-50.+0.1*(random.random())) 
      self.init[i].append(1.+1.*(random.random())) 

     self.Tfinal = 10 # final time 
     self.dt = 1. # time step 

    def eqns(self, x, t): 
     a, b = x 
     dadt = zeros_like(a) 
     dbdt = zeros_like(b) 
     for i in range (0,i_range): 
      dadt[i] = np.cos(b[i]) 
      dbdt[i] = np.sin(a[i]) 
     return dadt, dbdt 

    def run(self): 
     self.times = sp.arange(0,self.Tfinal,self.dt) 
     self.sim = odeint(self.eqns,self.init,self.times) 

回答

0

使用

a,b = reshape(x,(2,-1)) 

分裂平面矢量和

return reshape((dadt,dbdt), -1) 

将它们重新组合成一个扁平阵列。见https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html


更具体,并与一些蟒蛇的列表功能发挥,在初始化做

a = [ -50. + 0.1*random.random() for _ in range(self.i_range) ] 
b = [ 1. + 1.0*random.random() for _ in range(self.i_range) ] 
self.init = np.reshape((a,b), -1) 

和颂歌功能变得

def eqns(self, x, t): 
    a, b = np.reshape(x,(2,-1)) 
    dadt = [ np.cos(bb) for aa,bb in zip(a,b) ] 
    dbdt = [ np.sin(aa) for aa,bb in zip(a,b) ] 
    return np.reshape((dadt,dbdt), -1) 

这应该是足够得到一些结果。您可能想要将self.sim转换为列表对的列表以重新获得问题的结构,但是您必须工作,因为现在提供了2个“大”维。

np.reshape(self.sim, (self.times.size,2,-1)) 

可以工作的第一步..

+0

非常感谢这个帮助。我已经在eqns部分实现了这一点,但我不明白如何重新格式化初始条件(“self.init”)。正如你在上面的例子代码中看到的,我有两个独立的位置来循环IC(靠近顶部,在“self”中)和变量(在下面,在“eqns”中)。我应该尝试为两者合并一个循环吗? – eve

+0

我问有关组合循环,因为:当我循环不止一次时,我得到错误:“太多的值来解压缩”。这是因为,假设我循环两次:它首先看到4个IC,然后它知道“eqns”只调用2个变量 - 在它知道要循环两次之前。 – eve

+0

你的意图是第一个值是[i]还是第二个b [i]?然后将'init'作为'[[],[]]'作为一对两个列表来启动,并追加到第一个和第二个列表中。或者使用局部变量'a0 = []; b0 = [];',追加到那些并通过'self.init = reshape((a0,b0),-1)'结合它们,以便所有的展平和结构化都通过相同的方法进行。集成的状态向量必须是传递给集成器的所有实例中的平面列表或向量。 – LutzL