我正在 deSolve (R) 中撰寫延遲微分方程,但收到一條錯誤訊息,我不確定如何求解。所以對于一些背景。我有一個有 12 個微分方程的系統,其中 3 個有延遲。我在沒有 deSolve 的情況下成功撰寫了系統,但我想使用 deSolve,因為它讓我有機會輕松地使用其他非固定步長歐拉方法。但是,現在我把它放在 deSolve 中,并且我正在使用延遲微分方程的通用求解器 (dede),我得到一個錯誤。
這是延遲和誤差的微分方程:
lag2=ifelse(t-tau2<0, 0, e2(lagvalue(t-tau2,3))*lagvalue(t-tau2,8))
dn9dt=lag2-IP2*ethaP2M*P2-mu2*sf0B(B2)*P2-DNB(N2,B2)*P2 DD*PD
第一個和第三個延遲微分方程做的和這個一樣,似乎沒有錯誤。錯誤是:
Error in lagvalue(t - tau2, 3) : illegal input in lagvalue - lag, 0, too large, at time = 15.945
需要注意的是,在這種情況下,延遲 (tau2) 為 16,并且錯誤發生在時間 = 16 之前。
我已經嘗試將 t-tau2<0 更改為 t-tau2<=0,但這無濟于事,我已嘗試增加歷史陣列的大小 (control=list(mxhist = 1e6)),其中也沒有幫助。我也嘗試過幾次重寫延遲,但每次都遇到相同的錯誤。
我試過在網上搜索,但在 deSolve 中幾乎找不到關于 dede 的任何內容,所以我希望這里有人可以提供幫助。
uj5u.com熱心網友回復:
該問題不包含完整的可重現示例,但如果以大量時間步長運行模擬,但歷史陣列太小,則可以重現錯誤。該示例是來自?dede幫助頁面的改編版本:
library("deSolve")
derivs <- function(t, y, parms) {
#cat(t, "\n") # uncomment this to see when the error occurs
lag1 <- ifelse(t - tau1 < 0, 0.1, lagvalue(t - tau1, 2))
lag2 <- ifelse(t - tau2 < 0, 0.1, lagvalue(t - tau2, 2))
dy1 <- -y[1] * lag1 lag2
dy2 <- y[1] * lag1 - y[2]
dy3 <- y[2] - lag2
list(c(dy1, dy2, dy3))
}
yinit <- c(x=5, y=0.1, z=1)
times <- seq(0, 40, by = 0.1)
tau1 <- 1
tau2 <- 10
它成功運行:
yout <- dede(y = yinit, times = times, func = derivs, parms = NULL)
但是如果我們增加時間步數:
times <- seq(0, 40, by = 1e-3)
yout <- dede(y = yinit, times = times, func = derivs, parms = NULL)
我們可以得到一個錯誤:
Error in lagvalue(t - tau2, 2) :
illegal input in lagvalue - lag, 0, too large, at time = 9.99986
cat當演算法開始在歷史陣列中進行插值時,它發生在超過閾值時間(取消上述注釋)之后。作為解決方案,增加歷史緩沖區:
yout <- dede(y = yinit, times = times, func = derivs,
parms = NULL, control = list(mxhist = 1e5))
它還可能有助于減少時間步數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/359726.html
上一篇:JS:具有多個條件的回圈
