Построение ODE для цикла внутри функции для DeSolve - PullRequest
0 голосов
/ 03 октября 2019

Я построил ряд уравнений в R-сценарии, к которому я хочу призвать последовательно для построения дифференциальных уравнений.

Combine <- c(" - 0.909*1*H2O2*2 - 27000000*1*`$OH`* 1*H2O2*1", " - 3100000000*1*`1,4-dioxane`*1*`$OH`", 
" - 33000*1*TOC*1*`$OH`", "0.909*1*H2O2*2 - 3100000000*1*`1,4-dioxane`*1*`$OH` - 33000*1*TOC*1*`$OH` - 27000000*1*`$OH`*1*H2O2* 1 - 8500000*1*`$OH`*1*`HCO3-`* 1 - 390000000*1*`$OH`*1*`CO3 2-`* 1", 
" - 8500000*1*`$OH`*1*`HCO3-`*1", " - 390000000*1*`$OH`*1*`CO3 2-`*1"

Я также создал ряд переменных, чтобы сохранить их для использования в пакете DeSovlve. Например, если первое уравнение было подходящим для H2O2, то я создал кадр данных, где первая запись - dH2O2, чтобы присвоить этому уравнению:

Species <- structure(list(Species = c("H2O2", "1,4-dioxane", "TOC", "$OH", 
"HCO3-", "CO3 2-"), DeltaSpecies = list(dH2O2, `d1,4-dioxane`, 
    dTOC, `d$OH`, `dHCO3-`, `dCO3 2-`)), row.names = c(NA, 6L
), class = "data.frame")

Все значения для вида $ Species, которые будут начальнымиусловия, хранятся в глобальной среде, которую я вызываю:

state<- lapply(Species$Species, function(x) get(x, envir = globalenv()))
state <- as.numeric(state)

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

state <- c(`1,4-dioxane` = 0,
           H2O2 = 0.000294118,
           TOC = 0.552,
           `$OH` = 0,
           `HCO3-` = 0.003766,
           `CO3 2-` = 0.000294)

У меня вопрос в 2 раза: во-первых, есть ли лучший способ создать вектор начальных значений всех видов из глобальной среды, вместо использования get и apply. Вывод такой же, как создание списка вручную? Во-вторых, и что более важно, как я могу построить дифференциальные уравнения, используя COMBINE и SPECIES, как указано выше в цикле for? Я сталкиваюсь с трудностями, используя следующий код:

time <- seq(from=0, to=1E-1, by = 1E-6)

state<- lapply(Species$Species, function(x) get(x, envir = globalenv()))
state <- as.numeric(state)

logistic <- function(t, state, parameters){
  with(
    as.list(c(state)),{
      for (i in 1:length(Species$Species)) {
        Species$DeltaSpecies[i] <- reformulate(Combine[i], envir = globalenv())
      }
      return(list(c(Species$DeltaSpecies))) 
    }
  )
}

out2 <- ode(y = state, times = time, func = logistic, parms = NULL, rtol = 1e-6, atol = 1e-6)
...