Python 无法让odeINT接受循环生成的方程式
我想使用Python的odeINT来集成由循环生成的多组方程。这些方程都是耦合的,因此必须通过一次调用odeINT同时进行积分。问题在于初始条件(“y0”)必须是列表列表或矩阵(而不仅仅是列表)。odeINT给出了这个错误:“初始条件y0必须是一维的”。我想知道如何解决这个问题。下面是一个代码示例;非常感谢你的建议Python 无法让odeINT接受循环生成的方程式,python,loops,differential-equations,odeint,Python,Loops,Differential Equations,Odeint,我想使用Python的odeINT来集成由循环生成的多组方程。这些方程都是耦合的,因此必须通过一次调用odeINT同时进行积分。问题在于初始条件(“y0”)必须是列表列表或矩阵(而不仅仅是列表)。odeINT给出了这个错误:“初始条件y0必须是一维的”。我想知道如何解决这个问题。下面是一个代码示例;非常感谢你的建议 class network: def __init__(self): self.i_range = 3 ## INITIAL CONDITIO
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)
使用
拆分平面向量和
return reshape((dadt,dbdt), -1)
将它们重新组合成平面阵列。看
更具体地说,在初始化中使用python的一些列表功能
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)
ode函数变成
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
转换为一组列表,以重新获得问题的结构,但是您必须在那里工作,因为现在有两个“大”维度需要提供
np.reshape(self.sim, (self.times.size,2,-1))
可以作为第一步。非常感谢您的帮助。我已经在eqns部分实现了这一点,但我不知道如何重新格式化初始条件(“self.init”)。正如您在上面的示例代码中所看到的,我有两个单独的位置用于通过IC(接近顶部,在“self”中)和通过变量(下面,在“eqn”中)的循环。我是否应该尝试将两个循环合并为一个循环?我询问如何合并循环,因为:当我多次循环时,会出现错误:“太多的值无法解包”。这是因为,假设我循环两次:它首先看到4个IC,然后它看到“eqns”只调用2个变量——在它知道循环两次之前。你的意图是第一个值是a[I],第二个值是b[I]?然后以两个列表对的形式启动
init
并将其附加到第一个和第二个列表中。或者使用局部变量a0=[];b0=[]
,附加到这些文件中,并通过self.init=重塑((a0,b0),-1)
将它们组合起来,以便使用相同的方法进行所有展平和结构化。集成的状态向量必须是一个平面列表或向量,在所有实例中,它被传递给集成器。是的,这正是我的意图。创建列表列表时,错误在于y0(初始条件)必须是一维的。当我附加到局部变量,然后按照您的建议进行组合时,我会得到:“太多的值需要解包”。因此,基本上,odeINT要求ICs是一个一维列表,并且它不知道如何适当地将每两个条目降级,即使给定了您的框架。你能不能把你的修改嵌入到我上面的代码中,这样我就能完全理解你的意思?
np.reshape(self.sim, (self.times.size,2,-1))