Как заменить отрицательные значения, полученные интегратором ODE, небольшим ненулевым значением - PullRequest
0 голосов
/ 07 мая 2019

Я пытаюсь добавить некоторый тип квалификатора к решениям моего ODE, чтобы они не опустились ниже нуля (поскольку переменные представляют концентрации в модели).Мне нужен способ проверить решения и заменить отрицательные значения во время интеграции (т.е. до конца), чтобы избежать повторного включения отрицательных значений в ODE на следующем шаге по времени и искажения результатов.

Я пробовал много разных типов операторов if, таких как: if ode.successful() <= 0: ode.successful() = 1e-10.Однако все они производят одинаковые Syntax error: can't assign to function call.

maty = np.zeros((8))

def SM(t,y):
    for i in range (1,4):
        j=2*i
        k=(2*i)+1

        uss = (1/(4*gamma*E2))*(sqrt((16*gamma*y[0]*E2)+(y[1]*y[1]-(2*y[1])+1)+y[1]-1)

        maty[0] = (1/E1)*((mu-y[0])/(mu+y[0])*(beta+((q[0]*y[1])/(E3+1-y[1])))+(gamma*E2*(uss*uss))+((1-y[1])*uss)-(y[1]*y[1])- y[1])
        maty[1] = ((1-y[1])*uss)-(y[1])/(E3+1-y[1])

        maty[j] = (1/E1)*((mu-y[j])/(mu+y[j])*(beta+((q[i]*y[k])/(E3+1-y[k])))+(gamma*E2*(uss*uss))+((1-y[k])*uss)-(y[j]*y[j]) - y[j])
        maty[k] = ((1-y[k])*uss)-(y[k])/(E3+1-y[k])

        return maty


ode = ode(SM)

ode.set_integrator('vode',atol=1e-10,rtol=1e-10,method='bdf')
ode.set_initial_value(yinit,t_start)

ts = []
ys = []

while ode.successful() and ode.t <= t_end:
    ode.integrate(ode.t + t_step)

ts.append(ode.t)
ys.append(ode.y)

Я ожидаю, что отрицательные решения в массиве ys будут заменены небольшим неотрицательным значением.

...