Как решить и построить дифференциальное уравнение в R? - PullRequest
2 голосов
/ 01 апреля 2020

Я хочу решить и построить график дифференциального уравнения для экспоненциального роста, но я не совсем понимаю, как использовать библиотеку deSolve. Мое уравнение - N = N_0 * e ^ (rt), а код, который я пробовал, -

library(deSolve)

## Time
t <- seq(0, 5, 1)

## Initial population
N0 <- 2

## Parameter values
r = 1

fn <- function(t, N0, r) with(r, list(N0 * exp(r*t)))

## Solving and ploting 
out <- ode(N0, t, fn, params)
plot(out, lwd=2, main="exp")

, но я надеюсь, что вывод не тот, который я хочу. Вот графики, которые я хочу получить:

enter image description here

Надеюсь, вы мне поможете. Спасибо

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

Функция модели fn должна содержать производную, интегрирование затем выполняется решателем. Конечно, рост первого порядка можно решить аналитически, но это не всегда возможно для более сложных моделей.

library(deSolve)

## == derivative ==
fn <- function(t, N, r) {
  # dN/dt = r * N
  list(r * N)
}

r <- 1       # Parameter value
N <- 0:100   # sequence of N
t <- 0       # dummy as the derivative is not time dependent

plot(N, fn(t, N, r)[[1]], type="l")

## == integration ==
t <- seq(0, 5, .1)  # time
N0 <- 2             # initial state

## numerical solver
out <- ode(N0, t, fn, r)
plot(out, lwd=2, main="exp")

## for comparison: analytical integration
lines(t, N0*exp(r*t), lwd=2, lty="dotted", col="red")
0 голосов
/ 09 апреля 2020

В качестве альтернативы вы можете попробовать функцию curve.

op <- par(mfrow=c(1, 2), mar=c(5, 5, 4, 3))
curve(r*x, from=0, to=100, xlab="N", ylab=bquote(dot(N)), main=bquote(dot(N)==N))
curve(N0 * exp(r*x), from=0, to=5, xlab="Time t", ylab="N(t)", main="Exponential growth")
par(op)

enter image description here

...