在R中计算数量可变的表达式

在R中计算数量可变的表达式,r,differential-equations,R,Differential Equations,我试图从XML解析表达式,然后在deSolve的ode函数中使用它们 定义速率的XML位如下所示: <model name="Lorenz"> <state_variables> <variable id="X" name="x" value="1"/> <variable id="Y" name="y" value="1"/> <variable id="Z" name="z" val

我试图从XML解析表达式,然后在deSolve的ode函数中使用它们

定义速率的XML位如下所示:

<model name="Lorenz">
    <state_variables>
        <variable id="X" name="x" value="1"/>
        <variable id="Y" name="y" value="1"/>
        <variable id="Z" name="z" value="1"/>
    </state_variables>
    <parameters>
        <variable id="a" name="a" value="-2.66"/>
        <variable id="b" name="b" value="-10"/>
        <variable id="c" name="c" value="28"/>
    </parameters>
    <rates>
        <variable id="dX" name="xchange" value="a*X+Y*Z"/>
        <variable id="dY" name="ychange" value="b*(Y-Z)"/>
        <variable id="dZ" name="zchange" value="-X*Y+c*Y-Z"/>
    </rates>
</model>
parameters = extractVars(doc, model="Lorenz", node="parameters", numeric=TRUE)
states = extractVars(doc, model="Lorenz", node="state_variables", numeric=TRUE)
rates = extractVars(doc, model="Lorenz", node="rates", expression=TRUE)
differentialRates <- function(t, y, parameters){
  return(lapply(rates, eval))
}
我的目标是在这样的函数中得到这些表达式,但不是硬编码的:

differentialRates= function(t, states, parameters){
  with(as.list(c(states, parameters)),{
    # This works but is still hardcoded:
    dX <- eval(rates[1])
    dY <- eval(rates[2])
    dZ <- eval(rates[3])
    # return the rate of change
    list(c(dX, dY, dZ))
  })
}
out <- ode(y = states, times = times, func = differentialRates, parms = parameters)
检索如下所示的变量:

<model name="Lorenz">
    <state_variables>
        <variable id="X" name="x" value="1"/>
        <variable id="Y" name="y" value="1"/>
        <variable id="Z" name="z" value="1"/>
    </state_variables>
    <parameters>
        <variable id="a" name="a" value="-2.66"/>
        <variable id="b" name="b" value="-10"/>
        <variable id="c" name="c" value="28"/>
    </parameters>
    <rates>
        <variable id="dX" name="xchange" value="a*X+Y*Z"/>
        <variable id="dY" name="ychange" value="b*(Y-Z)"/>
        <variable id="dZ" name="zchange" value="-X*Y+c*Y-Z"/>
    </rates>
</model>
parameters = extractVars(doc, model="Lorenz", node="parameters", numeric=TRUE)
states = extractVars(doc, model="Lorenz", node="state_variables", numeric=TRUE)
rates = extractVars(doc, model="Lorenz", node="rates", expression=TRUE)
differentialRates <- function(t, y, parameters){
  return(lapply(rates, eval))
}
我猜是这样一个函数:

<model name="Lorenz">
    <state_variables>
        <variable id="X" name="x" value="1"/>
        <variable id="Y" name="y" value="1"/>
        <variable id="Z" name="z" value="1"/>
    </state_variables>
    <parameters>
        <variable id="a" name="a" value="-2.66"/>
        <variable id="b" name="b" value="-10"/>
        <variable id="c" name="c" value="28"/>
    </parameters>
    <rates>
        <variable id="dX" name="xchange" value="a*X+Y*Z"/>
        <variable id="dY" name="ychange" value="b*(Y-Z)"/>
        <variable id="dZ" name="zchange" value="-X*Y+c*Y-Z"/>
    </rates>
</model>
parameters = extractVars(doc, model="Lorenz", node="parameters", numeric=TRUE)
states = extractVars(doc, model="Lorenz", node="state_variables", numeric=TRUE)
rates = extractVars(doc, model="Lorenz", node="rates", expression=TRUE)
differentialRates <- function(t, y, parameters){
  return(lapply(rates, eval))
}

您可以执行类似于
返回(lappy(rates,eval))
。。。但这听起来像是你在向很多坏消息敞开心扉。我很想知道您是如何解析XML的,以及这里的最终目标是什么。。。一定有比盲目评估解析的XML表达式更好的方法@Justin我编辑了我的问题以包含您要求的信息,我也尝试了您的建议,但我得到了我在尝试中经常遇到的错误:
func()(1)返回的导数数必须等于初始条件向量(3)的长度。
。不知何故,它似乎认为3是一个表达式或什么。这段代码的要点是从XML中加载差异模型,以后计划使用更多的现有内容。@Justin使用函数得到了不同的结果:
derivs4