如何用较小的非零值替换ODE积分器产生的负值

时间:2019-05-07 14:38:03

标签: python ode

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

0 个答案:

没有答案