Я пытаюсь добавить некоторый тип квалификатора к решениям моего 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 будут заменены небольшим неотрицательным значением.