# If you want, you can write functions to make code cleaner and clearer
comp_plot <- function(K1, K2, alpha12, alpha21) {
plot(x = NA, type = "n", xlab = "N1", ylab = "N2", xlim = c(0, 1), ylim = c(0, 1), las = 1)
segments(x0 = 0, y0 = 0, x1 = 0, y1 = 1, col = "red", lwd = 2)
segments(x0 = 0, y0 = 0, x1 = 1, y1 = 0, col = "blue", lwd = 2)
N1 <- seq(from = 0, to = 1, by = 0.1)
N2_null <- K2 - alpha21*N1
N1_null <- K1/alpha12 - 1/alpha12*N1
lines(x = N1, y = N1_null, col = "red", lwd = 2)
lines(x = N1, y = N2_null, col = "blue", lwd = 2)
}
par(mfrow = c(2, 2), mar = c(4.5, 4.5, 0.5, 0.5))
comp_plot(K1 = 0.9, K2 = 0.9, alpha12 = 0.25, alpha21 = 0.25)
comp_plot(K1 = 0.9, K2 = 0.9, alpha12 = 1.25, alpha21 = 0.25)
comp_plot(K1 = 0.9, K2 = 0.9, alpha12 = 0.25, alpha21 = 1.25)
comp_plot(K1 = 0.9, K2 = 0.9, alpha12 = 1.5, alpha21 = 1.5)

comp <- function(t, y, parms) {
with(as.list(c(y, parms)), {
dN1 <- r1*N1*(K1 - N1 - alpha12*N2)/K1
dN2 <- r2*N2*(K2 - N2 - alpha21*N1)/K2
return(list(c(dN1, dN2)))
})
}
time_vec <- seq(from = 0, to = 100, by = 0.01)
parm_vec_a <- parm_vec_b <- parm_vec_c <- parm_vec_d <- c(r1 = 1, r2 = 1, K1 = 0.9, K2 = 0.9, alpha12 = 0.25, alpha21 = 0.25)
parm_vec_b["alpha12"] <- 1.25
parm_vec_c["alpha21"] <- 1.25
parm_vec_d[c("alpha12", "alpha21")] <- 1.5
N01 <- c(N1 = 0.8, N2 = 0.1)
N02 <- c(N1 = 0.1, N2 = 0.8)
lims <- c(-0.05, 1)
par(mfrow = c(2, 2), mar = c(4.5, 4.5, 0.5, 0.5))
plot(x = NA, type = "n", xlim = lims, ylim = lims, xlab = expression("N"[1]), ylab = expression("N"[2]), las = 1)
trash <- flowField(deriv = comp, parameters = parm_vec_a, xlim = lims, ylim = lims, add = T, state.names = c("N1", "N2"), points = 22, arrow.type = "proportional")
trash <- nullclines(deriv = comp, parameters = parm_vec_a, xlim = lims, ylim = lims, points = 201, col = c("red", "blue"), add = T, state.names = c("N1", "N2"), add.legend = F, lwd = 2)
trash <- trajectory(deriv = comp, y0 = N01, tlim = c(0, 100), tstep = 0.1, parameters = parm_vec_a, state.names = c("N1", "N2"))
trash <- trajectory(deriv = comp, y0 = N02, tlim = c(0, 100), tstep = 0.1, parameters = parm_vec_a, state.names = c("N1", "N2"))
points(x = c(N01[1], N02[1]), y = c(N01[2], N02[2]), pch = 19)
plot(x = NA, type = "n", xlim = lims, ylim = lims, xlab = expression("N"[1]), ylab = expression("N"[2]), las = 1)
trash <- flowField(deriv = comp, parameters = parm_vec_b, xlim = lims, ylim = lims, add = T, state.names = c("N1", "N2"), points = 22, arrow.type = "proportional")
trash <- nullclines(deriv = comp, parameters = parm_vec_b, xlim = lims, ylim = lims, points = 201, col = c("red", "blue"), add = T, state.names = c("N1", "N2"), add.legend = F, lwd = 2)
trash <- trajectory(deriv = comp, y0 = N01, tlim = c(0, 100), tstep = 0.1, parameters = parm_vec_b, state.names = c("N1", "N2"))
trash <- trajectory(deriv = comp, y0 = N02, tlim = c(0, 100), tstep = 0.1, parameters = parm_vec_b, state.names = c("N1", "N2"))
points(x = c(N01[1], N02[1]), y = c(N01[2], N02[2]), pch = 19)
plot(x = NA, type = "n", xlim = lims, ylim = lims, xlab = expression("N"[1]), ylab = expression("N"[2]), las = 1)
trash <- flowField(deriv = comp, parameters = parm_vec_c, xlim = lims, ylim = lims, add = T, state.names = c("N1", "N2"), points = 22, arrow.type = "proportional")
trash <- nullclines(deriv = comp, parameters = parm_vec_c, xlim = lims, ylim = lims, points = 201, col = c("red", "blue"), add = T, state.names = c("N1", "N2"), add.legend = F, lwd = 2)
trash <- trajectory(deriv = comp, y0 = N01, tlim = c(0, 100), tstep = 0.1, parameters = parm_vec_c, state.names = c("N1", "N2"))
trash <- trajectory(deriv = comp, y0 = N02, tlim = c(0, 100), tstep = 0.1, parameters = parm_vec_c, state.names = c("N1", "N2"))
points(x = c(N01[1], N02[1]), y = c(N01[2], N02[2]), pch = 19)
plot(x = NA, type = "n", xlim = lims, ylim = lims, xlab = expression("N"[1]), ylab = expression("N"[2]), las = 1)
trash <- flowField(deriv = comp, parameters = parm_vec_d, xlim = lims, ylim = lims, add = T, state.names = c("N1", "N2"), points = 22, arrow.type = "proportional")
trash <- nullclines(deriv = comp, parameters = parm_vec_d, xlim = lims, ylim = lims, points = 201, col = c("red", "blue"), add = T, state.names = c("N1", "N2"), add.legend = F, lwd = 2)
trash <- trajectory(deriv = comp, y0 = N01, tlim = c(0, 100), tstep = 0.1, parameters = parm_vec_d, state.names = c("N1", "N2"))
trash <- trajectory(deriv = comp, y0 = N02, tlim = c(0, 100), tstep = 0.1, parameters = parm_vec_d, state.names = c("N1", "N2"))
points(x = c(N01[1], N02[1]), y = c(N01[2], N02[2]), pch = 19)
