Как я могу построить дифференциальное уравнение, используя график - PullRequest
0 голосов
/ 02 апреля 2020

Я хотел построить график вышеупомянутого кода, используя , но мне не удалось. Я не очень хорошо знаю, как использовать эту библиотеку, и пока мне удалось только ее с помощью функции plot(), но я бы хотел, чтобы выходные данные были интерактивными.

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")

Спасибо за вашу помощь.

Ответы [ 2 ]

2 голосов
/ 02 апреля 2020

Один из способов - преобразовать deSolve объект out в , который затем можно построить с помощью , а затем ggplotly (графическая оболочка):

out <- ode(N0, t, fn, r)
out_df <- as.data.frame(ode(N0, t, fn, r))
colnames(out_df)[2] <- "Y" #changing the column name which was `1`. 

#making the ggplot object `ggp` and then using `ggplotly` to make it interactive.
library(ggplot2); library(plotly) ;
ggp <- ggplot(out_df, aes(x = time, y = Y)) + geom_line();
ggplotly(ggp); #check in the `viewer` tab of RStudio, not in the `Plots` tab.

Это то, что вы хотите?

РЕДАКТИРОВАТЬ , чтобы добавить данные линии, добавьте еще один слой geom_line с ggp, прежде чем перейти к ggplotly:

ggp + geom_line(aes(N0*exp(r*t)), linetype = "dashed", color = "red") + xlim(c(0, 5))

EDIT2 для ответа на вопрос OP:

Вы можете узнать больше о или в , в этом видео . Чтобы проверить, есть ли у вас список, используйте это:

is.list(fn(t, N, r))
[1] TRUE

Затем [[1]] возвращает первый element (который может быть другим списком: P)

fn(t, N, r)[[1]]
  [1]   0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18
 [20]  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37
 [39]  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56
 [58]  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75
 [77]  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90  91  92  93  94
 [96]  95  96  97  98  99 100

И, наконец, является расширенной формой .

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

И чуть более компактно:

library("dplyr")
library("ggplot2")
library("plotly")
library("deSolve")

fn <- function(t, N, r) {
  list(r * N)
}

# Note: initial state as named vector y=c(N=2)
ggp <-
  ode(y = c(N = 2), times = seq(0, 5, .1), func = fn, parms = 1) %>% 
  as.data.frame() %>%
  ggplot(aes(x = time, y = N)) + geom_line()

ggplotly(ggp) # check in the `viewer` tab of RStudio, not in the `Plots` tab.
...