我正在尝试在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数组中的负解替换为较小的非负值。