首页 文章

控制Scipy的ODEINT中的输出限制

提问于
浏览
1

我有以下简化的伪代码设置,它涉及一个ODE系统,我试图用scipy的odeint来解决它 .

from scipy.integrate import odeint

def diff_func(y, time, parms):

    # Do stuff with parms that depends upon y and t.
    new_parms = other_funcs(y,time, parms)

    # Now calculate derivatives
    dy1_dt = dy1_func(y, new_parms)
    dy2_dt = dy2_func(y, new_parms)

# Setup up initial conditions
y_0 = [y_1_0, y_2_0]
time = np.linspace(0, 1000, 1000)
parms = list_o_constants

# Solve diffeq
yout, info = odeint(diff_func, y_0, time, args=(parms,), full_output=True)

根据我提供的输入,我可以导致无意义的结果 - 或崩溃 . 我已经把问题缩小到 y 输入偶尔会消极,因为其中一个是温度 - 它会导致各种各样的问题 . 它首先出现负面的原因尚不清楚,可能是一个稳定性问题 .

我试图改变diff函数以包括如下检查:

def diff_func(y, time, parms):
    if y[1] <= 0.1:
        y[1] = 0.1

这似乎工作正常,我还在测试它 . 但是,我想询问:这是否会导致问题,如果有更好的方法强制odeint只允许正输出(即,如果发现负数则改变步长) .

谢谢!

1 回答

  • 0

    请先看看我最近发布的other answer .

    您想要做的是为ODE添加饱和度约束 . 有几种可能性来实现这种行为,但我建议这样做:

    # calculate dy[1]
    y1 = y[1]
    if dy[1] < 0 and y1 <= 0.1 # or 0.0, depends on accuracy you wish to maintain
        y1 = 0
        dy1 = 0 # this prevents your variable from going further down
    else
        # normal routine
    

    如果它适合你,请告诉我 .

    最好的祝福 .

相关问题