2016-02-28 35 views
-1

由於之前不清楚,我對此表示歉意。我現在更瞭解這個功能,但可以在幾個方面使用一些幫助。在R中使用deSolve的差分Eq

我想找回轉換(X)與音量(V)的關係,或者反過來也可以。在我看來,傳統的「時代」術語是我想用0-1的X序列取代的,X是轉換,記得如此界定0和1.0

下面,rw是反應速率,並且是任何給定時刻的分壓的函數,它們被描述爲Pw,Px,Py和Pz,它們本身是初始條件(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) 
+0

我不知道其他問題來自哪裏,但請不要使用'T'作爲變量名稱。 'T'是R.中的一個布爾值。 – Heroka

+0

'ode'中'V'的輸入是'0',因此它在'vol.func'函數中被除以0。 –

回答

0

只需運行

vol.func(0,0,params) 

即,在初始條件下評估梯度,給出NaN。診斷這種方法的正確方法是將複雜的梯度表達式分成不同的術語,並查看哪一個導致了問題。我不打算詳細介紹這一點,但是@ Sixiang.Hu在上面的評論中指出,在梯度函數中,除以V,如果分子是有限的,將導致無限值,如果分子是零......

更一般地,目前還不清楚是否明白,梯度函數的第一個參數(你vol.func)被認爲是當前時間,狀態變量不是一個值。也許V應該是你的狀態變量,而X應該是一個參數...?