首页 > 解决方案 > 无 ode 函数的 SIR 模型

问题描述

我有以下基本 SIR 模型的代码。我需要在没有 ode() 函数或任何其他函数的情况下求解微分方程。你能帮我看看如何在不使用 ode() 函数的情况下计算这个微分方程吗?

library(deSolve)
library(shiny)


ui <- fluidPage(

  titlePanel("Choose amounts"),

  fluidRow(column(width = 4,


  sliderInput(inputId = "time_values", label = "Days", value = 10, min = 1, max = 10),
  sliderInput(inputId = "beta", label ="Disease", value = 0.05, min = 0, max = 1, step = 0.05),
  sliderInput(inputId = "gamma", label ="Cure", value = 0.5, min = 0, max = 1, step = 0.1),
  ),
  column(width = 8,

  (plotOutput("plot"))
    )
  )
)

server <- function(input, output) {
  sir_equations <- function(time, variables, parameters) {
    with(as.list(c(variables, parameters)), {
      dS <- -beta * I * S
      dI <-  beta * I * S - gamma * I
      dR <-  gamma * I
      return(list(c(dS, dI, dR)))
    })
  }

  initial_values <-  c(S = 1000, I = 1, R = 0)

  sir_values_1 <- reactiveValues(val = data.frame())

  observe({
    sir_values_1$val <- as.data.frame(ode(
      y = initial_values,
      times = seq(0, input$time_values),
      func = sir_equations,
      parms = c(beta=input$beta, gamma=input$gamma) 
    ))
  })

  output$plot <- renderPlot({
    with(sir_values_1$val, {
    plot(sir_values_1$val$time, sir_values_1$val$S, type = "l", col = "blue",
         xlab = "Days", ylab = "Number of people")
    lines(sir_values_1$val$time, sir_values_1$val$I, col = "red")
    lines(sir_values_1$val$time, sir_values_1$val$R, col = "green")
    legend("right", c("halthy", "infected", "cured"),
           col = c("blue", "red", "green"), lty = 1, bty = "n")
    })
  })
}

shinyApp(ui = ui, server = server)

谢谢 :)

标签: rode

解决方案


好吧,让我们给你一个提示。在 R 的大多数 ode 求解器包中,所有求解器都是用 Fortran 或 C 编写的。但是,我仍然记得deSolve的前身odesolve包包含一个用纯 R 编写的简单显式固定步长 Runge-Kutta 求解器“rk4.R” .

您可以访问 CRAN 存档,下载odesolve的最新版本,并查看集成是如何完成的:

https://cran.r-project.org/src/contrib/Archive/odesolve/

然后使用您最喜欢的教科书(或维基百科:https ://en.wikipedia.org/wiki/Runge%E2%80%93Kutta_methods ),了解算法并使其适应您的需求。


推荐阅读