繁体   English   中英

Python科学:用条件中断微分方程求解

[英]Python scientific: interrupt differential equation solving with a condition

我目前正在使用odeint在python下解决一个微分方程系统,以模拟一个场中的带电粒子(源于此 ):

time = np.linspace(0, 5, 1000)

def sm(x, t): 
    return np.array([x[1], eta*Ez0(x[0])])

traj = odeint(sm,[0,1.], time)

它工作正常,但我想在x [0] <0时立即停止计算。目前,我只是阻止系统的发展:

def sm1(x, t): 
    if x[0] < 0:
        return np.array([0, 0]) 
    else:
        return np.array([x[1], eta*Ez0(x[0])])

traj = odeint(sm1,[0,1.],time)

但我想有更好的解决方案。 我发现了这一点,但在我看来,它固定了步骤的数量,这是令人遗憾的。 任何建议表示赞赏。

如果编写odeint函数的自定义扩展名,则可以使函数在完成时引发特定异常。 在Python中执行此操作可能会使其运行速度大大降低,但我认为您在C或Cython中编写的内容相同。 请注意,我还没有测试以下内容。

class ThatsEnoughOfThat(Exception):
    pass

def custom_odeint(func, y0, t): # + whatever parameters you need
    for timestep in t:
        try:
            # Do stuff. Call odeint/other scipy functions?
        except ThatsEnoughOfThat:
            break
    return completedstuff

def sm2(x, t):
    if x[0] < 0:
       raise ThatsEnoughOfThat
    return np.array([x[1], eta*Ez0(x[0])])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM