Использование apply, корней и событий над дифференциальными уравнениями для предотвращения отрицательных значений в Desolve - PullRequest
0 голосов
/ 18 октября 2019

Я пытаюсь построить дифференциальные уравнения из строки данных в пределах функции для использования в решателе 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функция, предотвращающая отрицательное изменение отдельных переменных состояния при построении моих дифференциальных уравнений таким образом? Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...