2017-05-03 28 views
0

我寫了一些代碼,有一個邏輯增長組件(即隨着N接近'承載能力'增長速度較慢,直到它達到'承載能力'停止增長) 。但是,當我在R中運行它似乎並沒有工作。一些人口最終大於承載能力。我看了數學和一切OK。所以我認爲問題在於dN/dt只是針對每個人羣計算一次。有誰知道如何解決這個問題?desolve微分方程不工作

任何幫助將不勝感激!

實施例以下代碼:

library('optimbase') 
library('deSolve') 
library('tidyverse') 
K = 150000     #carrying capacity   
deaths = 0.2567534  #death rate   
treesize = 0.23523  #resource size   
K_mat = K*ones(10, 1) #matrix of Ks   
death_mat = deaths*ones(10, 1) #matrix of deathrates 
tree_mat = treesize*ones(11, 1) #matrix of resources 
for_mat <- matrix(rbinom(11 * 10, 1, 0.2), ncol = 11, nrow = 10) #connection 
#matrix of foraging 
parameters <- c(for_mat, tree_mat, death_mat, K_mat) #outline parameters 
N <- runif(10,0,K) 
state <- N #starting state 

nestchange <- function(t, state, parameters){ 
     with(as.list(c(state, parameters)),{ 
    r = for_mat %*% tree_mat - death_mat 
    dNdt = r*N - r*N*(N/K_mat) 
    list(c(dNdt)) 
    }) 
} 
times <- seq(0,100) 

out <- ode (y = state, 
      times = times, 
      func = nestchange, 
      parms = parameters) 

results <- as.data.frame(out) 
results <- gather(results, 'nest', 'N', 2:11) 

ggplot(data=results, 
     aes(x=time, y=N, colour=nest)) + 
    geom_line() + 
    theme_bw() 

回答

1

如果您的功能實際上是

nestchange <- function(t, state, parameters){ 
     with(as.list(c(state, parameters)),{ 
    r <- for_mat %*% tree_mat - death_mat 
    dNdt <- r*state - r*state*(state/K_mat) 
    list(c(dNdt)) 
    }) 
} 

作爲ODE求解器傳遞state到函數在每個時間步驟,然而該函數使用可變用於ODE解算器不會更新的計算,而不是由ODE解算器更新。

+0

完美!這解決了問題!非常感謝! –

+1

很高興它的工作! – Lyngbakr