multiple changing parameters in ODEs in R - r
I have been using the deSolve function to solve ODEs and I have a Parameter, 'e', that changes throughout the code and is also used to determine some of the other bits of code. I just added another parameter r which does a similar thing throughout the code and got this warning message:
DLSODA- Warning..Internal T (=R1) and H (=R2) are
such that in the machine, T + H = T on the next step
(H = step size). Solver will continue anyway.
In above message, R1 = 0, R2 = 0
DINTDY- T (=R1) illegal
In above message, R1 = 1
T not in interval TCUR - HU (= R1) to TCUR (=R2)
In above message, R1 = 0, R2 = 0
DINTDY- T (=R1) illegal
In above message, R1 = 2
T not in interval TCUR - HU (= R1) to TCUR (=R2)
In above message, R1 = 0, R2 = 0
DLSODA- Trouble in DINTDY. ITASK = I1, TOUT = R1
In above message, I1 = 1
In above message, R1 = 2
my original code is:
parameters <- c(a = 0.32,
b = (9/140),
c = (5/1400),
d = (95/700),
k = 1/140,
i = 0.25,
r = 0.2,
n = 6000000,
x = 0.3 ,
t = 1/180, # important in looking at the shape
u = 1/180, # important in looking at the shape
p = 10,
s = 100,
g = 100,
# e = .3,
h = 1000)
# where a is contact with infected patient
# where b is safely burried percentage
# where c is chance of being cured with no medical help
# where d is the chance that patients will go from infected to dead with no safe burial
# where e is the education percentage (percentage of patients that go into quarentine)
# where k is the chance of being cured with medical help
# where i is the infection rate (assuming contact with dead and alive ebola people are the same)
# where n is the population
# where r is the riual burial rate (unsafe contact of the dead patients with alive non infected people)
# where x is the percentage of money spent on hospitals
# where t is how fast the education is implemented
# where m is how fast hospitals go from money to actual hospitals
# where is the price placed on one life (the constant that is multiplied by the burrials)
state <- c(S = 5999900,
E = 0,
I = 100,
Q = 1,
D = 0,
B = 0,
C = 0,
Y = 0,
#H = 0,
R = 1,
#h = 100,
e = 0
)
# where S is suseptable
# where E is effected
# where I is infected
# where Q is quarentined
# where B is burried
# where C is cured
# where D is dead but not burried
# where Y is income
# where is education that we have funding for
# where is hospitals that we have funding for
# where is education deployed
# where is hospitals deployed
# set up the equations
equation <- (function(t, state, parameters)
with(as.list(c(state, parameters)),{
# rate of change
dS <- (-(a*S*I)/n) - ((r*S*D)/n)
dE <- (a*S*I)/n + ((r*S*D)/n) - i*E
#if (h >= Q)
# e = e
#else if (h < Q )
# e = 0
dI <- i*E - (e)*I - c*I - d*I
#(if (h >= Q)
# e = 1
#else if (h < Q )
# e = 0
dQ <- (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 <- (1-x)* (p*(b*Q + r*D)) -t*(R)
de <- t*(s/R)
#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))
}))
# , dH, dh
# solve the equations for certain starting parameters
library(deSolve)
times <- seq(0, 1000, by = 1)
out <- ode(y = state, times = times, func = equation, parms = parameters)
head(out)
tail(out)
# graph the results (need to know how to add D to the graph)
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)
and this has been changed to:
parameters <- c(a = 0.32,
b = (9/140),
c = (5/1400),
d = (95/700),
k = 1/140,
i = 0.25,
# r = 0.2,
n = 6000000,
x = 0.3 ,
t = 1/180, # important in looking at the shape
u = 1/180, # important in looking at the shape
v = 1, # important in looking at the shape
p = 10,
s = 100,
g = 100,
# e = .3,
h = 1000)
# where a is contact with infected patient
# where b is safely burried percentage
# where c is chance of being cured with no medical help
# where d is the chance that patients will go from infected to dead with no safe burial
# where e is the education percentage (percentage of patients that go into quarentine)
# where k is the chance of being cured with medical help
# where i is the infection rate (assuming contact with dead and alive ebola people are the same)
# where n is the population
# where r is the riual burial rate (unsafe contact of the dead patients with alive non infected people)
# where x is the percentage of money spent on hospitals
# where t is how fast the education is implemented
# where m is how fast hospitals go from money to actual hospitals
# where is the price placed on one life (the constant that is multiplied by the burrials)
state <- c(S = 5999900,
E = 0,
I = 100,
Q = 1,
D = 0,
B = 0,
C = 0,
Y = 0,
#H = 0,
R = 1,
J =0,
#h = 100,
e = 0.3,
r = 0.3
)
# where S is suseptable
# where E is effected
# where I is infected
# where Q is quarentined
# where B is burried
# where C is cured
# where D is dead but not burried
# where Y is income
# where is education that we have funding for
# where is hospitals that we have funding for
# where is education deployed
# where is hospitals deployed
# set up the equations
equation <- (function(t, state, parameters)
with(as.list(c(state, parameters)),{
# rate of change
dS <- (-(a*S*I)/n) - ((r*S*D)/n)
dE <- (a*S*I)/n + ((r*S*D)/n) - i*E
#if (h >= Q)
# e = e
#else if (h < Q )
# e = 0
dI <- i*E - (e)*I - c*I - d*I
#(if (h >= Q)
# e = 1
#else if (h < Q )
# e = 0
dQ <- (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 <- (1-x)* (p*(b*Q + r*D)) -t*(R)
de <- t*(s/R)
dJ <- (x)* (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, 100, by = 1)
out <- ode(y = state, times = times, func = equation, parms = parameters)
head(out)
tail(out)
# graph the results (need to know how to add D to the graph)
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)
any help would be great!
Related
Bayesian in R: Dimension mismatch in values supplied for betaA
I am working with a matrix that is 35 rows and 16 columns. I am trying to run a Bayesian Multistate Model but something in my model code prevents it from working. When I run the code in R, I get the error message: ` Error in checkForRemoteErrors(val) : 3 nodes produced errors; first error: RUNTIME ERROR: Dimension mismatch in values supplied for betaA ` Any help is appreciated and my code is below: # psi = movement probability # phi = apparent survival # p = detection probability # o = occurrence probability # load libraries library(jagsUI) library(lattice) library(coda) library("R2WinBUGS") library("R2jags") library(zoo) devtools::install_github("bstaton1/postpack")` # initializing functions#### known.state.ms <- function(ms, notseen){ #notseen: label for 'not seen' state <- ms state[state==notseen] <- NA for (i in 1:dim(ms)[1]){ m <- min(which(!is.na(state[i,]))) state[i,m] <- NA } return(state) `}` #i = 1 #ch = CHY[i,] #first = f[i]` z_inits = function(ch, first) { nt = length(ch) to_fill = which(ch == 4 & 1:nt >= first) to_keep = which(ch != 4 & 1:nt >= first) known = ch; known[to_fill] = NA unknown = rep(NA, nt) known_alive = rep(NA, nt) unknown[to_fill] = 2 for (t in 1:nt) { known_alive[t] = ifelse(any(!is.na(known[t:nt])), 1, 0) } last_known_alive = max(which(known_alive == 1)) if (last_known_alive < 16) { dead = rep(0, nt) for (t in (last_known_alive + 1):nt) { dead[t] = sample(c(0,1), size = 1, prob = matrix(c(0.9, 0.1, 0, 1), 2, 2, byrow = T)[dead[t-1] + 1,]) } unknown[dead == 1] = 4 } unknown } ` # import data dat <- read.csv("bass_encounter_history_0.csv") covs <- read.csv("depth.csv") depth = covs[,1] histories <- unlist(lapply(dat$history, function(x) strsplit(x,split=""))) CH <- t(matrix(histories,nrow=16,ncol=35)) CH <- gsub("0",4,CH) CH <- gsub("A",1,CH) CH <- gsub("B",2,CH) CH <- gsub("C",3,CH) CH <- matrix(as.numeric(CH),nrow=35,ncol=16) # Built the model#### nind= nrow(CH) n.occasions = ncol(CH) f=c(1,1,1,2,2,2,2,2,3,3,3,4,4,4,4,4,4,1,1,1,3,1,1,1,3,3,3,3,5,3,5,6,6,6,6) # initial tagging week jags_model = function() { # ------------------------------------------------- # Parameters: # phiA: survival probability at site A # phiB: survival probability at site B # phiC: survival probability at site C # psiA[1,t]: probability of staying in site A # psiA[2,t]: movement probability from site A to site B # psiB[1,t]: movement probability from site B to site A # psiB[2,t]: probability of staying in site B # psiB[3,t]: movement probability from site B to site C # psiC[1,t]: probability of staying in site C # psiC[2,t]: movement probability from site C to site B # betaA[i]: the effect of standardized flow on movement probabilities at site A # betaB[i]: the effect of standardized flow on movement probabilities at site B # betaC[i]: the effect of standardized flow on movement probabilities at site C # wA,B,C: the variable weight of the betas, 1 = essential, 0 = insignificant # pA: recapture probability at site A # pB: recapture probability at site B # pC: recapture probability at site C # ------------------------------------------------- # States (S): # 1 alive at A # 2 alive at B # 3 alive at C # 4 dead # Observations (O): # 1 seen at A # 2 seen at B # 3 seen at C # 4 not seen # ------------------------------------------------- # Priors and constraints # Survival and recapture: uniform phiA ~ dunif(0, 1) phiB ~ dunif(0, 1) phiC ~ dunif(0, 1) pA ~ dunif(0, 1) pB ~ dunif(0, 1) pC ~ dunif(0, 1) wA ~ dbern(.5) for(i in 1:3){ wB[i] ~ dbern(.5) } wC ~ dbern(.5) for(t in 1:(n.occasions-1)){ logit(psiA[1,t]) <- muA + wA*betaA*x[t] psiA[2,t] <- 1 - psiA[1,t] logit(psiC[1,t]) <- muC + wC*betaC*x[t] psiC[2,t] <- 1 - psiC[1,t] for(i in 1:3){ b[i,t] <- exp(muB[i] + wB[i]*betaB[i]*x[t]) psiB[i,t] <- b[i,t]/sum(b[,t]) } } muA ~ dt(0, 1/1.566^2, 7.763) muC ~ dt(0, 1/1.566^2, 7.763) mean.psiA <- 1/(1+exp(-muA)) #it's not really the mean - it's the probability of staying in A at mean value of x (only b/c x is z- transformed) mean.psiC <- 1/(1+exp(-muC)) betaA ~ dt(0, 1/1.566^2, 7.763) betaC ~ dt(0, 1/1.566^2, 7.763) for(i in 1:2){ muB[i] ~ dt(0, 1/1.566^2, 7.763) betaB[i] ~ dt(0, 1/1.566^2, 7.763) } muB[3] <- 0 betaB[3] <- 0 # PREDICTED TRANSITION PROBS FOR PLOTTING for(r in 1:n.depth){ for(i in 1:3){ pred.b[i,r] <- exp(muB[i] + wB[i]*betaB[i]*depthseq[r]) pred.psiB[i,r] <- pred.b[i,r]/sum(pred.b[,r]) } logit(pred.psiA[1,r]) <- muA + wA*betaA*depthseq[r] pred.psiA[2,r] <- 1 - pred.psiA[1,r] logit(pred.psiC[1,r]) <- muC + wC*betaC*depthseq[r] pred.psiC[2,r] <- 1 - pred.psiC[1,r] } # Define probabilities of state S(t+1) given S(t) for (t in 1:(n.occasions-1)){ ps[1,t,1] <- phiA * psiA[1,t] ps[1,t,2] <- phiA * psiA[2,t] ps[1,t,3] <- 0 ps[1,t,4] <- 1-phiA ps[2,t,1] <- phiB * psiB[1,t] ps[2,t,2] <- phiB * psiB[2,t] ps[2,t,3] <- phiB * psiB[3,t] ps[2,t,4] <- 1-phiB ps[3,t,1] <- 0 ps[3,t,2] <- phiC * psiC[2,t] ps[3,t,3] <- phiC * psiC[1,t] # switch these so the coefs talk about prob(stay in C) ps[3,t,4] <- 1-phiC ps[4,t,1] <- 0 ps[4,t,2] <- 0 ps[4,t,3] <- 0 ps[4,t,4] <- 1 # Define probabilities of O(t) given S(t) po[1,t,1] <- pA po[1,t,2] <- 0 po[1,t,3] <- 0 po[1,t,4] <- 1-pA po[2,t,1] <- 0 po[2,t,2] <- pB po[2,t,3] <- 0 po[2,t,4] <- 1-pB po[3,t,1] <- 0 po[3,t,2] <- 0 po[3,t,3] <- pC po[3,t,4] <- 1-pC po[4,t,1] <- 0 po[4,t,2] <- 0 po[4,t,3] <- 0 po[4,t,4] <- 1 } #t # Likelihood for (i in 1:nind){ # Define latent state at first capture z[i,f[i]] <- y[i,f[i]] for (t in (f[i]+1):n.occasions){ # State process: draw S(t) given S(t-1) z[i,t] ~ dcat(ps[z[i,t-1], t-1,]) # Observation process: draw O(t) given S(t) y[i,t] ~ dcat(po[z[i,t], t-1,]) } #t } #i } jags_file = "invasiondepthmodel.txt" postpack::write_model(jags_model, jags_file) # Configure the model settings and initial values #### depthseq = seq(min(depth),max(depth),length.out=100) n.depth=length(depthseq) #compile jags data object jags_data <- list(y = CH, x= depth, depthseq=depthseq, n.depth=n.depth, f = f, n.occasions = n.occasions, nind = nind, z = known.state.ms(CH, 4)) #specify initial values jags_inits <- function(i){list( muA = runif(1,-1,1), muB = c(runif(2,-1,1),NA), muC = runif(1,-1,1), wA= rbinom(3, 1, 0.5), wB= rbinom(3, 1, 0.5), wC= rbinom(3, 1, 0.5), betaA = runif(2,-1,1), betaB = c(runif(2,-1,1),NA), betaC = runif(2,-1,1), phiA = runif(1, 0.5, 1), phiB = runif(1, 0.5, 1), phiC = runif(1, 0.5, 1), pA = runif(1, 0.5, 1), pB = runif(1, 0.5, 1), pC = runif(1, 0.5, 1), z = t(sapply(1:nind, function(i) z_inits(CH[i,], f[i]))) ) } # Parameters monitored jags_params <- c("phiA","phiB","phiC", "psiA","psiB","psiC", "wA","wB","wC", "muA","muB","muC", "betaA","betaB","betaC", "pA","pB","pC", "pred.psiA","pred.psiB","pred.psiC") jags_dims = c( na = 10000, # number of samples in adapting phase ni = 40000, # number of post-burn-in samples per chain nb = 40000, # number of burn-in samples nt = 20, # thinning rate nc = 3, # number of chains, parallel = T # run chains in parallel? ); with(as.list(jags_dims), ni/nt * nc) inits = lapply(1:jags_dims["nc"], jags_inits) # Run the model in JAGS ##### starttime = Sys.time() cat("MCMC Started: ", format(starttime), "\n") post = jagsUI::jags.basic( data = jags_data, model.file = jags_file, inits = inits, parameters.to.save = jags_params, n.adapt = jags_dims["na"], n.iter = sum(jags_dims[c("ni", "nb")]), n.thin = jags_dims["nt"], n.burnin = jags_dims["nb"], n.chains = jags_dims["nc"], parallel = jags_dims["parallel"], verbose = F ) I was expecting the dimensions between the matrix and betaA values to match up. However, it seems like they are not.
In the model, betaA is a scalar. In the model code, you have betaA*x[t] and in the prior: betaA ~ dt(0, 1/1.566^2, 7.763) both indicating a single value. However, in the initial values, it is a vector of length 2: betaA = runif(2,-1,1). You either need to define it as a vector in the model or pass a single value in the inits.
avoid negative values when resolving a ODE
I am trying to model the behavior of a made-up networks of 5 genes, but I have the problem that I get negative values, which it has not sense biologically speaking. Is there a way to limit the values to zero? I managed to do it when I represent the graph, but I don't know how to use the ifelse in the main equation. Thank you very much-1 ################################################### ###preliminaries ################################################### library(deSolve) library(ggplot2) library(reshape2) ################################################### ### Initial values ################################################### values <- c(A = 1, B = 1, D = 1, E = 20, R = 1) ################################################### ### Set of constants ################################################### constants <- c(a = 1.2, b = 0.5, c = 1.2, d = 1.5, e = 0.3, f = 0.5, g = 1.5, h = 0.9, i = 1.3, j = 1.3, m = 0.8, n = 0.6, q = 1, t = 0.0075, u = 0.0009, Pa = 100, Pb = 0.05, Pd = 0.1, Pe = 10) ################################################### ### differential equations ################################################### Dynamic_Model<-function(t, values, constants) { with(as.list(c(values, constants)),{ dA <- Pa + a*D - j*A - R dB <- Pb + b*A + e*E - m*B dD <- Pd + d*B + f*E - g*A - n*D dE <- Pe - h*B + i*E - q*E dR <- t*A*B - u*D*E list(c(dA, dB, dD, dE, dR)) }) } ################################################### ### time ################################################### times <- seq(0, 200, by = 0.01) ################################################### ### print ## Ploting ################################################### out <- ode(y = values, times = times, func = Dynamic_Model, parms = constants) out2 <- ifelse(out<0, 0, out) out.df = as.data.frame(out2) out.m = melt(out.df, id.vars='time') p <- ggplot(out.m, aes(time, value, color = variable)) + geom_point(size=0.5) + ggtitle("Dynamic Model")
I agree completely with #Lutz Lehmann, that the negative values are a result of the structure of the model. The system of equations allows that derivatives still become negative, even if the states are already below zero, i.e. the states can further decrease. We don't have information about what the states are, so the following is only a technical demonstration. Here a dimensionless Monod-type feedback function fb is implemented as a safeguard. It is normally close to one. The km value should be small enough to act only for state values close to zero, and it should not be too small to avoid numerical errors. It can be formulated individually for each state. Other function types are also possible. library(deSolve) library(ggplot2) library(reshape2) values <- c(A = 1, B = 1, D = 1, E = 20, R = 1) constants <- c(a = 1.2, b = 0.5, c = 1.2, d = 1.5, e = 0.3, f = 0.5, g = 1.5, h = 0.9, i = 1.3, j = 1.3, m = 0.8, n = 0.6, q = 1, t = 0.0075, u = 0.0009, Pa = 100, Pb = 0.05, Pd = 0.1, Pe = 10, km = 0.001) Dynamic_Model<-function(t, values, constants) { with(as.list(c(values, constants)),{ fb <- function(x) x / (x+km) # feedback dA <- (Pa + a*D - j*A - R) * fb(A) dB <- (Pb + b*A + e*E - m*B) * fb(B) dD <- (Pd + d*B + f*E - g*A - n*D) * fb(D) dE <- (Pe - h*B + i*E - q*E) * fb(E) dR <- (t*A*B - u*D*E) * fb(R) list(c(dA, dB, dD, dE, dR)) }) } times <- seq(0, 200, by = 0.1) out <- ode(y = values, times = times, func = Dynamic_Model, parms = constants) plot(out) Additional hints: Removal of negative values afterwards (out2 <- ifelse(out<0, 0, out)) is just wrong. Removal of negative values in the model function, i.e. use the ifelse in the main would also be wrong as it can lead to a severe violation of mass balance. the time steps don't need to be very small. They are automatically adapted anyway by the solver. Too small time steps make your model slow and you get more outputs as needed. some of your parameters are quite large, so that the model becomes very stiff.
Step change in input parameter with time in R
If anyone can help me how to incorporate step in input parameter with respect to time. Please see the code below: library(ReacTran) N <- 10 # No of grids L = 0.10 # thickness, m l = L/2 # Half of thickness, m k= 0.412 # thermal conductivity, W/m-K cp = 3530 # thermal conductivity, J/kg-K rho = 1100 # density, kg/m3 T_int = 57.2 # Initial temperature , degC T_air = 19 # air temperature, degC h_air = 20 # Convective heat transfer coeff of air, W/m2-K xgrid <- setup.grid.1D(x.up = 0, x.down = l, N = N) x <- xgrid$x.mid alpha.coeff <- (k*3600)/(rho*cp) Diffusion <- function (t, Y, parms){ tran <- tran.1D(C=Y, flux.down = 0, C.up = T_air, a.bl.up = h_air, D = alpha.coeff, dx = xgrid) list(dY = tran$dC, flux.up = tran$flux.up, flux.down = tran$flux.down) } # Initial condition Yini <- rep(T_int, N) times <- seq(from = 0, to = 2, by = 0.2) print(system.time( out <- ode.1D(y = Yini, times = times, func = Diffusion, parms = NULL, dimens = N))) plot(times, out[,(N+1)], type = "l", lwd = 2, xlab = "time, hr", ylab = "Temperature") I want the T_air to be constant for the 1st hour and it changes to another value for remaining 1 hr. This would be a step changein the parameter. How can I do it? Any help would be appreciated. Thanks,
ReacTran 2D Diffusion model with non-conformable arrays error in R, matrix and setup.grid.1D and setup.grid.2D
I am trying to model diffusion in 2D in R with the diffusion rate being dependent on the density, y. I have completed this model in 1D, but trying to change it 2D it keep getting the error code: Error in -VF.grid$x.int * D.grid$x.int * diff(rbind(C.x.up, C, C.x.down, non-conformable arrays I have no data, as it is a simulation. My code is as follows; library(ReacTran) N <- 50 # number of grid cells Nx <-50 Ny <-50 XX <- 10 # total size dy <- dx <- XX/N # grid size Dy <- Dx <- 0.1 # diffusion coeff, X- and Y-direction r <- 0.005 # growth rate ini <- 10 # initial value at x=0 N2 <- ceiling(N/2) K <- 100 #Carrying Capacity A0<- 2 #pop ini size x.grid <- setup.grid.1D(x.up = 0, x.down = 1, N = N) y.grid <- setup.grid.1D(x.up = 0, x.down = 1, N = N) grid2D <- setup.grid.2D(x.grid, y.grid) D.grid <- setup.prop.2D(value = Dx, y.value = Dy, grid = grid2D) #diffusion coefficient on cell interfaces v.grid <- setup.prop.2D(value = 0, y.value=0, grid = grid2D) #advection velocity A.grid <- setup.prop.2D(value = 1, y.value=1, grid = grid2D) #interface area AFDW.grid <- setup.prop.2D(value = 0, y.value=0, grid = grid2D) #advction weight difference VF.grid <- setup.prop.2D(value = 0, y.value=1, grid = grid2D) #volume fraction # The model equations - using the grids Diff2Db <- function (t, y, parms) { U <- matrix(nrow = N, ncol = N, data = y) dCONC <- tran.2D(C = y, C.x.up=0, C.x.down=0, C.y.up=0, C.y.down=0, grid = grid2D, D.grid = D.grid, D.x=(y-1)^2 + 1, D.y=(y-1)^2 + 1, dx=dx, dy=dy, A.grid = A.grid, VF.grid = VF.grid, AFDW.grid = AFDW.grid, v.grid = v.grid )$dC return (list(dCONC)) } # initial condition: 0 everywhere, except in central point y <- matrix(nrow = N, ncol = N, data = 0) y[N2,N2] <- ini # initial concentration in the central point... times <- 0:8 outb <- ode.2D (y = y, func = Diff2Db, t = times, parms = NULL, dim = c(49, N), lrw = 160000) I am out of ideas to try to fix it. Any help would be greatly appreciated. Thank you in advance
solving for steady state PDE using steady.1D (rootSolve R)
I am trying to obtain a steady state for a spatially-explicit Lotka-Volterra competition model of two competing species (with spatial diffusion). Here is the model (without diffusion term): http://en.wikipedia.org/wiki/Competitive_Lotka%E2%80%93Volterra_equations where I let r1 = r2 = rG & alpha12 = alpha 21 = a. The carrying capacity of species 1 is assumed to vary linearly across space x i.e. K1 = x (while K2 = 0.5). And we assume Neumann BC. The spatial domain x is from 0 to 1. Here is the example of coding in R for this model: LVcomp1D <- function (time, state, parms, N, Da, x, dx) { with (as.list(parms), { S1 <- state[1:N] S2 <- state[(N+1):(2*N)] ## Dispersive fluxes; zero-gradient boundaries FluxS1 <- -Da * diff(c(S1[1], S1, S1[N]))/dx FluxS2 <- -Da * diff(c(S2[1], S2, S2[N]))/dx ## LV Competition InteractS1 <- rG * S1 * (1- (S1/x)- ((a*S2)/x)) InteractS2 <- rG * S2 * (1- (S2/(K2))- ((a*S1)/(K2))) ## Rate of change = -Flux gradient + Interaction dS1 <- -diff(FluxS1)/dx + InteractS1 dS2 <- -diff(FluxS2)/dx + InteractS2 return (list(c(dS1, dS2))) }) } pars <- c(rG = 1.0, a = 0.8, K2 = 0.5) dx <- 0.001 x <- seq(0, 1, by = dx) N <- length(x) Da <- 0.001 state <- c(rep(0.5, N), rep(0.5, N)) print(system.time( out <- steady.1D (y = state, func = LVcomp1D, parms = pars, nspec = 2, N = N, x = x, dx = dx, Da = Da, pos = TRUE) )) mf <- par(mfrow = c(2, 2)) plot(out, grid = x, xlab = "x", mfrow = NULL, ylab = "N(x)", main = c("Species 1", "Species 2"), type = "l") par(mfrow = mf) The problem is I cannot get the steady state solutions of the model. I keep getting a horizontal line passing through x-axis. Can you please help me since I do not know what is wrong with this code. Thank you