在 R 中求解具有时间相关参数的 SDE

计算科学 微分方程 r 朱莉娅 随机颂歌
2021-12-01 05:04:48

我正在尝试解决R使用Diffeqr package.

让我们将系统简化为一个简单的 ODE:

# Packages
library(tidyverse)
library(diffeqr)
library(JuliaCall)
diffeq_setup()

# Drift function
f <- function(u,p,t){
  du1 = p[1]  
  return(c(du1))
}

# Diffusion function
g <- function(u,p,t){
  du1 = 0 # note that there is currenlty no noise
}

u0 = 1                   
tspan <- list(0.0, 100)       
p = 1
sol = sde.solve(f, g, u0, seed = 1, tspan, p=p, saveat=0.05)
udf=as.data.frame(sol$u)
udf <- udf %>% rownames_to_column(var = "time") 
udf <- udf %>% rename(y=`sol$u`)
plot(udf$time, udf$y, type = "l", xlim = c(0,400))

我想知道是否可以随时间改变参数?我试图p=1p=c( c(1,2,3,4,5) )(例如)替换,但这不起作用。

或者是否有其他解决方案可以解决 R 中具有时间相关参数的 SDE 系统?

1个回答

参数可以是任何类型,所以这里我传入一个时间相关函数 forp并在微分方程中使用它:

# Packages
library(tidyverse)
library(diffeqr)
library(JuliaCall)
diffeq_setup()

# Drift function
f <- function(u,p,t){
  du1 = p(t)
  return(c(du1))
}

# Diffusion function
g <- function(u,p,t){
  du1 = 0 # note that there is currenlty no noise
}

u0 = 1                   
tspan <- list(0.0, 100)       
p <- function(t){
  t
}
sol = sde.solve(f, g, u0, tspan, p=p, saveat=0.05)
udf=as.data.frame(sol$u)
udf <- udf %>% rownames_to_column(var = "time") 
udf <- udf %>% rename(y=`sol$u`)
plot(udf$time, udf$y, type = "l", xlim = c(0,400))