Я пытаюсь построить дифференциальные уравнения из строки данных в пределах функции для использования в решателе ODE DeSolve. В то время как я могу построить уравнения, используя lapply
, переменные состояния станут отрицательными по прошествии некоторого времени, чего не должно быть. Я сталкиваюсь с трудностями при настройке функции события (с или без корней), чтобы предотвратить падение отдельной переменной состояния ниже нуля.
Combine <- c(" - 1*0.4545*(H2O2^1) - 1*27000000*(`$OH`^1)*(H2O2^1)", " - 1*3100000000*(`1,4-dioxane`^1)*(`$OH`^1)",
" - 1*33000*(TOC^1)*(`$OH`^1)", "2*0.4545*(H2O2^1) - 1*3100000000*(`1,4-dioxane`^1)*(`$OH`^1) - 1*33000*(TOC^1)*(`$OH`^1) - 1*27000000*(`$OH`^1)*(H2O2^1) - 1*8500000*(`$OH`^1)*(`HCO3-`^1) - 1*390000000*(`$OH`^1)*(`CO3 2-`^1)",
" - 1*8500000*(`$OH`^1)*(`HCO3-`^1)", " - 1*390000000*(`$OH`^1)*(`CO3 2-`^1)"
)
time <- seq(from=0, to=0.01, by = 1E-4)
State <- c(H2O2 = 0.000294117647058824, `1,4-dioxane` = 0.00000113494,
TOC = 0, `$OH` = 0, `HCO3-` = 0.003766104, `CO3 2-` = 0.0000167638711956647)
dY = rep(0,length(Species$Species))
ODEcreater <- function(t, state, parameters){
with(
as.list(c(state)),{
dY <- lapply(Combine, function(y) eval(parse(text=y)))
return(list(c(dY)))
} )}
out1 <- ode(y = state, times = time, func = ODEcreater, parms = NULL,
events = list(func = eventfun, times=0:max(time)), rtol = 1e-6, atol = 1e-10)
Я пробовал множество различных комбинаций корней и функций событий безрезультатно:
eventfun <- function(t, y, parms){
with(as.list(y), {
y[y<0] <- 0
return(y)
})}
eventfun <- function(t, y, pars) {
with(as.list(y), {
y <- lapply(Combine, function(y) y <- 0)
return(as.numeric(unlist(y)))
})}
Мой вопрос: как я могу перефразировать мои eventfun
или root
функция, предотвращающая отрицательное изменение отдельных переменных состояния при построении моих дифференциальных уравнений таким образом? Спасибо!