2017-05-24 25 views
0

嗨,大家好,我在我的ODE系列中遇到了一個我的方程式問題。我有兩個完全相同的方程,然而他們出現了非常不同的答案。我的方程式給出不同的答案有什麼原因嗎? 這兩個方程是管理e和r的方程。相同ODE方程的作用不同

library(sigmoid) 

parameters <- c(
       a = 0.032, 
       b = (9/140), 
       c = (5/1400), 
       d = (95/700), 
       k = 1/140, 
       i = 0.25, 
       # r = 0.2, 
       n = 6000000, 
       x = 0.5 , 
       y = 0.25, 
       t = 1/180,  # important in looking at the shape 
       u = 1/180,  # important in looking at the shape 
       v = 1/180,  # important in looking at the shape 
       p = 10, 
       s = 100, 
       g = 100 

       # e = .4, 
       #h = 1000 
) 

    state <- c(
      S = 5989900, 
      E = 0, 
      I = 0, 
      Q = 0, 
      D = 100, 
      B = 0, 
      C = 100, 
      Y = 100, 
      H = 100, 
      R = 10, 
      J = 10, 
      h = 100, 
      e = 0.1, 
      r = 0.1 
    ) 

# Function will transition between 0 and 1 when h and Q are approximately 
equal 
smooth.transition <- function(h, Q, tune = 0.01){ 
sigmoid((h/Q - 1)/tune) 
} 
Q <- 1 
h <- seq(0.001, 5, by = 0.001) 

plot(h/Q, j, type = "l") 


# set up the equations 

equation <- (function(t, state, parameters) 
    with(as.list(c(state, parameters)), { 
    # rate of change 

    dS <- (-(a * S * I)/n) - (((1/r) * S * D)/n) 
    dE <- (a * S * I)/n + (((1/r) * S * D)/n) - i * E 
    j <- smooth.transition(h, Q) 
    dI <- i * (j) * E - (e) * I - c * I - d * I 
    dQ <- (j) * (e) * I - b * Q - k * Q 
    dD <- d * I - r * D 
    dB <- b * Q + r * D 
    dC <- c * I + k * Q 

    dY <- p * (b * Q + r * D) 
    dR <- j*(1 - x - y) * (p * (b * Q + r * D)) - j*t * (R) 
    de <- j*t * (s/R) 
    dJ <- (y) * (p * (b * Q + r * D)) - v * (J) 
    dr <- v * (s/J) 
    dH <- (x) * (p * (b * Q + r * D)) - u * (H) 
    dh <- u * (H/g) 


    # return the rate of change 
    list(c(dS, dE, dI, dQ, dD, dB, dC, dY, dR, de, dJ, dr, dH, dh)) 
    })) 
# 

# solve the equations for certain starting parameters 


library(deSolve) 
times <- seq(0, 200, by = 1) 

out <- 
    ode(y = state, 
    times = times, 
    func = equation, 
    parms = parameters, 
    maxsteps = 1e5 
) 
# , method = "vode" 
head(out) 
tail(out) 

# graph the results 

par(oma = c(0, 0, 3, 0)) 
plot(out, xlab = "Time", ylab = "People") 
#plot(out[, "X"], out[, "Z"], pch = ".") 
mtext(outer = TRUE, side = 3, "Ebola Model",cex = 1.5 
) 

我得到了R,E,J和r初始迭代:

R: 10, 10.05540, 10.11050 
    e: 0.1, 59, 138 

    J: 10, 39, 79 
    r: 0.1, 0.105, 0.11 

J和8r被表現得像我希望他們採取行動,而R和E都沒有。任何人都可以在我的編碼中看到問題。我認爲我的數學是堅實的。

+0

你是什麼意思 「初始迭代」?早期的模型解決方案?你如何期望你的變量行爲? PS您可以刪除Q和h以及相鄰繪圖功能的定義。這只是爲了向你展示平滑函數的外觀。 – Lyngbakr

+0

我希望至少我改變參數,R和J的行爲相同,因此作爲e和r是J和R的衍生物也應該是相同的 – angusr

+0

我有點困惑。 dR和dJ的定義並不相同,爲什麼它們的表現會一樣呢? – Lyngbakr

回答

0

您已將參數定義爲t,解決方案中的時間也定義爲t

0

您返回您的變化率的順序與最初定義狀態變量的順序不同。

CF

state <- c(
      S = 5989900, 
      E = 0, 
      I = 0, 
      Q = 0, 
      D = 100, 
      B = 0, 
      C = 100, 
      Y = 100, 
      H = 100, 
      R = 10, 
      J = 10, 
      h = 100, 
      e = 0.1, 
      r = 0.1 
    ) 

list(c(dS, dE, dI, dQ, dD, dB, dC, dY, dR, de, dJ, dr, dH, dh)) 

返回列表應閱讀:

list(c(dS, dE, dI, dQ, dD, dB, dC, dY, dH, dR, dJ, dh, de, dr)) 
+0

謝謝,真的有幫助!我還想知道,如果我可以在方程中使用t作爲時間段,因爲它似乎並不工作 – angusr

+0

沒問題!我不完全確定「方程式中的時間段」是什麼意思。時間步驟?當前時間值?你能發佈不工作的代碼並解釋你希望如何工作嗎? – Lyngbakr

+0

不用擔心解決它,非常感謝您的幫助,否則本來會丟失的 – angusr

相關問題