Управление выходным пределом в ODEINT Сципи

У меня есть следующая упрощенная настройка псевдокода, которая включает систему ODE, которую я пытаюсь решить с помощью Сципи.

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 Входные данные иногда становятся отрицательными, так как один из них - температура - это приводит ко всем видам проблем. Во-первых, причина, по которой он становится отрицательным, неясна и может быть проблемой стабильности.

Я попытался изменить функцию сравнения, чтобы включить проверку как:

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

Это, кажется, работает хорошо, я все еще проверяю это. Но я хотел спросить, если: это вызовет проблемы в будущем, и если есть лучший способ заставить odeint разрешить только положительные результаты (то есть, изменить размер шага, если отрицательный найден).

Спасибо!

1 ответ

Пожалуйста, сначала посмотрите на мой другой ответ, который я недавно опубликовал.

Что вы хотите сделать, это добавить ограничение насыщения в ваш 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

Дайте мне знать, если вас это устраивает.

С наилучшими пожеланиями.

Другие вопросы по тегам