很难让odeINT接受循环生成的公式

2024-04-19 00:12:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用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)

Tags: ofinself列表forinitdefrange
1条回答
网友
1楼 · 发布于 2024-04-19 00:12:23

使用

a,b = reshape(x,(2,-1))

拆分平面向量

return reshape((dadt,dbdt), -1)

把它们重新组合成一个平面阵列。见https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html


更具体地说,和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))

可以作为第一步。。你知道吗

相关问题 更多 >