Управление выходным пределом в 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
Дайте мне знать, если вас это устраивает.
С наилучшими пожеланиями.