我正在尝试使用该函数求解一阶微分方程ode
来自deSolve
包裹。问题如下:药物在某些时间(输注时间)以恒定的输注速率给药,并以一阶速率消除。因此,该过程可以描述为:
if(t %in% Infusion_times){Infusion <- Infusion_rate} else{Infusion <- 0}
dC <- -Ke*C + Infusion
where t
是时候了,Infusion_times
是包含给药时间的载体,C
是药物的量,Ke
是它的消除常数,Infusion
是一个变量,有输液时取输液速率的值,否则取值0。
因此,假设我们想要注射 3 剂,从时间 0、24 和 40 开始,每次输注持续两个小时,假设我们想要deSolve
每 0.02 个时间单位计算一次答案。
我们想要deSolve
例如,以 0.02 次单位的步长求解 0 到 48 次之间的微分方程。所以我们的向量指定了时间ode
函数将是:
times <- seq(from = 0, to = 48, by = 0.02)
输注时间由下式给出:
Infusion_times <- c(seq(from = 0, to = 2, by = 0.02), seq(from = 24, to = 26, by = 0.02),
seq(from = 40, to = 42, by = 0.02))
起初,我担心问题可能出在浮点数的比较上。为了防止这种情况,我将两个向量四舍五入到小数点后两位:
times <- round(times, 2)
Infusion_times <- round(times, 2)
所以现在,希望所有Infusion_times
都包含在times
vector:
(sum(Infusion_times %in% times)/length(Infusion_times))*100
[1] 100
如您所见,中的所有值Infusion_times
(100%)包含在向量中times
,因此变量Infusion
应该取值Infusion_rate
在指定的时间。然而,当我们解方程时,它不起作用。
让我们证明一下,但首先,让我们指定该函数所需的其他值ode
功能:
parameters <- c(Ke = 0.5)
amounts <- c(C = 0) #Initial value for drug is 0
Inf_rate <- 5
现在,让我们根据需要编写一个函数来说明变化率:
OneComp <- function(t, amounts, parameters){
with(as.list(c(amounts, parameters)),{
if(t %in% Infusion_times){Infuse =Inf_rate} else{Infuse = 0}
dC <- -Ke*C + Infuse
list(c(dC))})
}
对于那些不熟悉的人deSolve
包,参数t
函数的值将说明方程应该积分的时间,amounts
将指定 C 的初始值和parameters
将给出参数的值(在本例中,只是Ke
)。
现在,让我们解方程:
out <- ode(func = OneComp, y = amounts, parms = parameters, times = times)
让我们绘制结果:
library(ggplot2)
ggplot(as.data.frame(out)) + geom_line(aes(x = times, y = C))
这与我们得到的结果完全相同Infusion
始终等于 0。
然而,请注意,如果我们只模仿单剂量,并且我们要尝试类似的方法,它会起作用:
OneComp <- function(t, amounts, parameters){
with(as.list(c(amounts, parameters)),{
if(t < 2){Infuse =Inf_rate} else{Infuse = 0}
dC <- -Ke*C + Infuse
list(c(dC))})
}
out <- ode(func = OneComp, y = amounts, parms = parameters, times = times)
ggplot(as.data.frame(out)) + geom_line(aes(x = times, y = C))
在这里,我们设置了变量Infuse
取值Inf_rate
仅当时间少于2小时时,它有效!因此,我对这些行为完全感到困惑。这不是更改变量值的问题,也不是浮点数之间比较的问题......知道这些可能是什么吗?谢谢