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)
非常感謝這個幫助。我已經在eqns部分實現了這一點,但我不明白如何重新格式化初始條件(「self.init」)。正如你在上面的例子代碼中看到的,我有兩個獨立的位置來循環IC(靠近頂部,在「self」中)和變量(在下面,在「eqns」中)。我應該嘗試爲兩者合併一個循環嗎? – eve
我問有關組合循環,因爲:當我循環不止一次時,我得到錯誤:「太多的值來解壓縮」。這是因爲,假設我循環兩次:它首先看到4個IC,然後它知道「eqns」只調用2個變量 - 在它知道要循環兩次之前。 – eve
你的意圖是第一個值是[i]還是第二個b [i]?然後將'init'作爲'[[],[]]'作爲一對兩個列表來啓動,並追加到第一個和第二個列表中。或者使用局部變量'a0 = []; b0 = [];',追加到那些並通過'self.init = reshape((a0,b0),-1)'結合它們,以便所有的展平和結構化都通過相同的方法進行。集成的狀態向量必須是傳遞給集成器的所有實例中的平面列表或向量。 – LutzL