2016-12-26 21 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