Решатель SciPy ODE имеет проблемы с дискретными событиями - PullRequest
0 голосов
/ 03 ноября 2018

Я использую Класс интегратора SciPy ODE для решения системы обыкновенных дифференциальных уравнений. Предполагается, что полная программа имитирует механическую систему и визуализирует ее с помощью 3D-анимации. Это прекрасно работает, пока я действительно хочу решить нормальное дифференциальное уравнение. Однако некоторые переменные состояния системы механической системы ограничены в своем диапазоне значений. Этим переменным запрещено стрелять за пределы определенного предела.
Мой текущий подход к сохранению x_n

solver = scipy.integrate.ode(rhs)
solver.set_initial_value(...) #not important
solver.set_integrator("vode", method="adams", rtol=1e-6, atol=1e-9)
...
while(True):
    state = solver.integrate(solver.t + timeStep)
    visualizeModel(state)
    ...

def rhs(t, x):
    x1, x2, x3 = x
    dx1dt = x1_dot(x1, x2, x3)
    dx2dt = x2_dot(x1, x2, x3)
    dx3dt = x3_dot(x1, x2, x3)
    if numpy.abs(x1) > my_limit:
        dx1dt = 0 #the solver seems to absolutely hate this line
    return [dx1dt, dx2dt, dx3dt]

`` `

Как я могу предотвратить остановку решателя на этом этапе? Как я могу реализовать ограниченный диапазон значений для переменных дифференциального уравнения?

...