首页 > 解决方案 > 在 Julia_Eval 中为 diffeqr 求解器评估字符串

问题描述

我正在尝试使用 R 脚本中的 for 循环评估字符串JuliaCall::julia_eval。虽然我能够使用该deSolve包在 R 中完成此操作,但在将代码转换为与 Julia 兼容的代码时遇到了问题。正确运行的 R deSolve 代码的基本代码如下所示。

library(deSolve)
library(dplyr)

 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)

ODEcreater2 <- function(t, state, parameters){
  with(as.list(c(state)),{
           for (i in 1:6) { #
            dY[i] <- eval(parse(text=Combine[i]))}
      return(list(dY))
} )}

out1<- ode(y = state, times = time, func = ODEcreater2, parms = NULL)

我正在尝试使用复制代码并在 Julia 中运行它,以通过使用diffeqrvs.来提高 ODE 求解器的速度deSolve。不幸的是,我正在评估 for 循环中的字符串/表达式julia_call

library(diffeqr)
diffeqr::diffeq_setup()
library(JuliaCall)
julia <- julia_setup()

    ODEcreater <- JuliaCall::julia_eval("
    function (dY,t,state)
        for i in 1:6
          dY[i] = eval(Meta.parse(:Combine[i]))
    end
    end")

    tspan <- list(1E-6, 1E-3)

    sol = diffeqr::ode.solve(ODEcreater,state,tspan, abstol=1e-8, reltol=1e-8)

有没有人了解评估 for 循环中字符串的最佳方法?我一直在研究 JuliaLang 网站上的元表达式,但仍然迷路。

标签: rjuliaevaldifferential-equations

解决方案


如重复问题https://stackoverflow.com/a/58766919/1544203中所述,构建字符串然后执行

sprintf("function f(du,u,p,t)\n%s\nend", paste(Combine, collapse="\n"))

从 R 端构建一个与有效格式匹配的字符串。这也是最佳的,因为它从生成的函数中排除了任何额外的函数调用。


推荐阅读