如何同时使用for循环运行odeint函数?

时间:2019-07-05 17:41:30

标签: python for-loop odeint

我需要在odeint函数中运行3个随时间变化的变量。我有3个包含多个元素的数组,并且我希望odeint函数将数组的第1个元素用于t = 0,将数组的第2个元素用于t = 1 ...

我尝试将“ for”放置在“ def”内部,这仅使用数组的第一个元素;如果我将“ def”放置在“ for”内部,则仅使用数组的最后一个元素 具有多个元素的数组是:ur; utheta; uphi,它们在代码的其他地方计算 在这里,我可以设置数组有多少个元素以及模拟的时间

具有多个元素的数组是:ur; utheta; uphi,它们在代码的其他地方计算 元素数与代码中给出的“时间”相同

time=10

def c(zc,t):

    for cc in range(0, time):

        x1=zc[0]
        x2=zc[1]
        x3=zc[2]
        x4=zc[3]
        x5=zc[4]
        x6=zc[5]
        dx1dt=x2
        dx2dt= x1 * (x4 ** 2) * (sin(x5) ** 2) + x1 * (x6 ** 2) - (mu / (x1 ** 2)) + (3 / 2) * mu * J2 * (ae ** 2) * (3 * (((cos(x5)) ** 2) - 1) / (x1 ** 4)) + ur[cc]
        dx3dt=x4
        dx4dt= -((2*x2*x4) / x1) - 2 * x4 * x6 * cot(x5) + (utheta[cc] / (x1 * sin(x5)))
        dx5dt=x6
        dx6dt= -((2*x2*x6) / x1) + (x4 ** 2) * sin(x5) * cos(x5) + 3 * mu * J2 * ((ae ** 2) / (x1 ** 5)) * cos(x5) * sin(x5) + (uphi[cc] / x1)
        print(ur[cc])
        return [dx1dt, dx2dt, dx3dt, dx4dt, dx5dt, dx6dt]
z0 = [r, rdot, theta, thetadot, phi, phidot] #initial conditions provided elsewhere
t=np.linspace(0,time,time) 
zc=odeint(c,z0,t)

使用“ print(ur [cc])”,我可以看到“ ur”并没有像我希望的那样随时间变化

1 个答案:

答案 0 :(得分:1)

首要:提供一个可运行的示例将有助于回答您的问题。

我假设您正在使用scipy's odeint function

一些问题:

  1. time不是函数的输入,而是在函数中使用它。尽管目前情况可能会奏效,但这会导致意外行为。

  2. 您的for循环中有一个return语句 。因此,实际上您只在cc = 0的情况下运行。

  3. 而不是for循环,应该尝试向量化代码。 Here's an article,其中包含一些示例(注意:我略读了一下,但没有完整阅读)。

  4. docs指示您应该使用scipy.integrate.solve_ivp而不是scipy.integrate.odeint