ode - 使用 deSolve 时,如何将初始条件强制到离散化 PDE 上?
问题描述
我正在尝试用一个 ODE 和一个二阶 PDE 求解一个微分方程组。我已经离散化了 PDE,以便我可以使用 deSolve ode.1D 来解决它,但现在我无法弄清楚如何将我的边界条件包含在空间 dE/dx 导数中。在 x = 0 和 x = 1 处,dE/dx 的边界值对于获得正确解很重要。如何将它们包含在模型中?
我的代码:
BVmod1D <- function(time, state, parms, N, dx) {
with(as.list(parms), {
E <- state[1 : N]
U <- state[(N + 1) : (2 * N)]
coef1 <- Sv * io / (Qox - Qred)
coef2 <- Tau * io / Cd
BV <- exp(aa * f * (E - 0.5 * (1 + U) )) - exp(-ac * f * (E - 0.5 * (1 + U)))
dEdx <- diff(c(E, E[N])) / dx # first spatial derivative of E
ddEddx <- diff(c(dEdx, dEdx[N])) / dx # second spatial derivative of E
dU <- coef1 * BV # dU/dt, Eqn 8
dE <- (ddEddx - (coef2 * BV)) / Tau # dE/dt, Eqn 12
return(list(c(dE, dU)))
})
}
pars <- c(Sv = 1.72e5,
io = 1.71e-6,
Qox = 1.56,
Qred = 0,
Tau = 3.79e-6,
Cd = 7.42e-8,
aa = 0.7674,
ac = 0.2326,
ks = 0.042992,
sig = 1.67e-6,
f = 38.92237)
R <- 1
N <- 50
dx <- R / N
Vo <- 0.5
# Initial and Boundary Conditions
yini <- rep(0, (2 * N))
yini[ 1 : N ] <- 2 * Vo
yini[ (N + 1) : (2 * N)]
times <- seq(0, 1 , by = 0.002 )
tail(out <- ode.1D(
y = yini,
times = times,
func = BVmod1D,
parms = pars,
nspec = 2,
N = N,
dx = dx
))
解决方案
推荐阅读
- dataframe - 在数据框上定义函数
- python - Python 请求:使用 Oauth2 密码身份验证流程的自定义身份验证似乎不起作用
- sql - 优化 Oracle 查询 - 用于视图
- powerbi - 错误消息:此报告无法访问其数据源。请联系
, 作者。但我可以访问数据源(网关) - python - 打印列表时出现奇怪的字符
- forms - 在 Microsoft Dynamics 365 中,当我运行启动 Visual Studio 项目时,为什么我的筛选器不是组合框?
- elasticsearch - Apache Nifi Flowfile 到 Elasticsearch 批量 api
- curl - 使用静态 openssl (libssl.a, libcrypto.a) 静态编译 curl lib
- php - 组内的 Laravel 组不起作用,它没有看到命名空间参数
- sharepoint - 在 yaml 管道中构建 SharePoint wsp 时缺少依赖项