r - 无 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)
谢谢 :)
解决方案
好吧,让我们给你一个提示。在 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 ),了解算法并使其适应您的需求。
推荐阅读
- python - Django 传递字符串参数
- javascript - 从 Vue.js 中的文档元素获取值
- jekyll - 带有 Rouge 和 KaTeX 的 Jekyll 不能在代码中包含 $
- visual-studio - 使用 Visual Studio 创建 GUI C++ 应用程序。我应该如何使用 Text Static 控件?
- python - 如何在 Beautiful Soup 4 中将包含子标签的标签与空标签分开?
- java - “测试”>>:-c:第 0 行:寻找匹配的“”时出现意外的 EOF
- python - 错误:未在此范围内声明“memcpy”(Ubuntu 16.04,opencv2.4.13)
- wso2esb - 从 HTTP 响应中保存文件
- javascript - 从 String.slice() 方法返回的奇怪结果
- rust - 如何让 Rust 函数传播状态?