我需要在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”并没有像我希望的那样随时间变化
答案 0 :(得分:1)
首要:提供一个可运行的示例将有助于回答您的问题。
我假设您正在使用scipy's odeint
function
一些问题:
time
不是函数的输入,而是在函数中使用它。尽管目前情况可能会奏效,但这会导致意外行为。
您的for循环中有一个return
语句 。因此,实际上您只在cc = 0
的情况下运行。
而不是for循环,应该尝试向量化代码。 Here's an article,其中包含一些示例(注意:我略读了一下,但没有完整阅读)。
docs指示您应该使用scipy.integrate.solve_ivp
而不是scipy.integrate.odeint