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

时间:2010-11-19 17:04:38

标签: python numpy scipy

我目前正在使用odeint在python下解决微分方程系统,以模拟字段中的带电粒子(源来自此package):

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)

但是我有更好的解决方案。我找到了this,但在我看来它确定了步数,这是令人遗憾的。 任何建议都表示赞赏。

1 个答案:

答案 0 :(得分:1)

如果你编写了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])])