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