Как я могу запустить функцию odeint с циклом for одновременно? - PullRequest
0 голосов
/ 05 июля 2019

Мне нужно запустить 3 переменные, которые меняются во времени внутри функции odeint. У меня есть 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 Ответ

1 голос
/ 05 июля 2019

Прежде всего: предоставление работоспособного примера поможет ответчикам на ваш вопрос.

Я предполагаю, что вы используете функцию Сципи odeint

Несколько вопросов:

  1. time не является входом для вашей функции, но вы используете его в своей функции. Хотя сейчас все может работать, это приведет к неожиданному поведению в будущем.

  2. У вас есть return оператор внутри вашего цикла for. Таким образом, вы на самом деле только каждый случай, когда cc = 0.

  3. Вместо цикла for вы должны попробовать векторизовать ваш код. Вот статья , в которой есть несколько примеров (ПРИМЕЧАНИЕ: я просмотрел ее, но не прочитал полностью).

  4. документы указывают, что вы должны использовать scipy.integrate.solve_ivp вместо scipy.integrate.odeint

...