Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法让odeINT接受循环生成的方程式_Python_Loops_Differential Equations_Odeint - Fatal编程技术网

Python 无法让odeINT接受循环生成的方程式

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

我想使用Python的odeINT来集成由循环生成的多组方程。这些方程都是耦合的,因此必须通过一次调用odeINT同时进行积分。问题在于初始条件(“y0”)必须是列表列表或矩阵(而不仅仅是列表)。odeINT给出了这个错误:“初始条件y0必须是一维的”。我想知道如何解决这个问题。下面是一个代码示例;非常感谢你的建议

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))