在R中使用deSolve的微分均衡器

在R中使用deSolve的微分均衡器,r,ode,differential-equations,R,Ode,Differential Equations,很抱歉,我之前不清楚。我现在对函数有了更多的了解,但在几个方面需要一些帮助 我想得到转换(X)和体积(V)的关系,或者反过来也可以。在我看来,传统的“时间”项是我想用一个0-1的X序列来代替的,X是以0和1.0为界的 下面,rw是反应速率,是任何给定时刻分压的函数,分压被描述为p.w、p.x、p.y和p.z,其本身是初始条件(p.w0、v.0)和转换的函数,同样是x 先谢谢你 rm(list = ls()) weight <- function( Vols, State, Pars )

很抱歉,我之前不清楚。我现在对函数有了更多的了解,但在几个方面需要一些帮助

我想得到转换(X)和体积(V)的关系,或者反过来也可以。在我看来,传统的“时间”项是我想用一个0-1的X序列来代替的,X是以0和1.0为界的

下面,rw是反应速率,是任何给定时刻分压的函数,分压被描述为p.w、p.x、p.y和p.z,其本身是初始条件(p.w0、v.0)和转换的函数,同样是x

先谢谢你

rm(list = ls())

weight <- function( Vols, State, Pars ) {


  with(as.list(c(State, Pars)), {

    y = 1
    delta = 2
    ya.0 = 0.4
    eps = ya.0 * delta

    temp = 800
    R = 8.314

    k.2 = exp( (35000 / ( R*temp )) - 7.912 )

    K.3 = exp( 4.084  /     temp    - 4.33  )

    P.w <- P.w0 * ( 1 -   X ) * y / ( 1 + eps * X )
    P.x <- P.w0 * ( 1 - 2*X ) * y / ( 1 + eps * X )
    P.y <- P.w0 * ( 1 +   X ) * y / ( 1 + eps * X )
    P.z <- P.w0 * ( 1 + 4*X ) * y / ( 1 + eps * X )

    r.w <- k.2 * ( K.3 * P.w * P.x ^ 2 - P.y * P.z^4 )

    F.w0 <- P.w0 * v.0 / ( R * temp )

    dX.dq <- r.w / F.w0
    res <- dX.dq

    return(list(res))

  })
}

pars <- c( y = 1, 
           P.w0 = 23, 
           v.0 = 120 )

yini <- c( X = 0 )

vols <- seq( 0 , 100 , by = 1 )

out <- ode( yini , vols , weight , pars )
rm(list=ls())
体重刚刚跑步

vol.func(0,0,params)
i、 e.在初始条件下计算梯度,得出
NaN
。正确的诊断方法是将复杂的梯度表达式分成不同的项,然后看看哪个项会引起麻烦。我不打算详细讨论这个问题,但正如@Sixiang.Hu在上面的评论中指出的那样,你在梯度函数中除以
V
,如果分子是有限的,这将导致无穷大的值;如果分子是零,这将导致
NaN


更一般地说,不清楚您是否理解梯度函数(您的
vol.func
)的第一个参数应该是当前时间,而不是状态变量的值。也许
V
应该是你的状态变量,
X
应该是一个参数…?

我不知道你的问题是从哪里来的,但请不要使用
t
作为变量名
T
是R中的布尔值。在
ode
中输入的
V
0
,因此在
vol.func
函数中它被0除?