Я построил ряд уравнений в 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)