我在ocatve上做了一个简单的任务。 我必须在第1,7,21和28天施用药物剂量。
我写了一个像这样的函数: function xdot = f (x,t)
a=[1;7;21;28]
drug=0; ### initially drug is zero
if (t==a)
drug=drug+57.947;
else
drug=drug+0;
endif
xdot=(-0.4077)*(x)+ drug; passing the value of drug to differential equation
endfunction
在主文件中,我在lsode中调用了这个函数:
t=linspace(0,30,30);
x0=0;
y=lsode(@ex,x0,t); ### ex is the file name where function is written
plot(t,y,'o')
这个程序不起作用..它一直显示药物的零值。任何人都可以通过操纵linspace功能帮助我如何通过一定的时间步骤来控制剂量。
答案 0 :(得分:0)
您可能希望t==a
替换ismember (t, a)
。此外,您应该删除else
子句,因为它对答案没有影响。
<强>更新强>
考虑将您的功能重写为:
function xdot = f (x,t)
xdot = -0.4077*x + 57.947*ismember (t, [1 7 21 28])
endfunction
答案 1 :(得分:0)
看起来你有一个简单的清除模型,并且每次都在a
,你想要立即交付剂量。也就是说,在a
的每一次,受试者的药物量增加了57.947。
如果这是您考虑的模型,那么在xdot
的公式中实现它将无效。您实际上需要将其实现为"delta function",而lsode
将无法使用它。
相反,我建议分阶段解决问题,对应于时间间隔[0,1],[1,7],[7,21]和[21,28]。在一个阶段中,不同的等式只是xdot = -0.4077*x
。在第一阶段,初始条件为0.在下一阶段,初始条件是前一阶段的最终值加上剂量57.947。
这是一个脚本:
dose = 57.947;
a = [1 7 21 28 30];
x0 = 0.0;
t0 = 0;
t = [];
y = [];
for t1 = a
tinterval = linspace(t0, t1, 2*(t1 - t0) + 1);
yinterval = lsode(@(x, t) -0.4077*x, x0, tinterval);
t = [t tinterval];
y = [y yinterval'];
t0 = t1;
x0 = yinterval(end) + dose;
end
plot(t, y, "linewidth", 2);
脚本创建此图:
请注意,微分方程xdot = -k*x
具有解x0*exp(-k*(t-t0))
,因此对lsode
的调用可以替换为
yinterval = x0*exp(-0.4077*(tinterval - t0));
如果你这样做,也要从yinterval
下面的两行删除转置:
y = [y yinterval];
如果您希望将药物剂量的管理实施保持在xdot
的公式范围内,您需要在很短的时间间隔内进行分配。它可以实现为宽度为w
且高度为57.974 / w
的短矩形脉冲。您还需要确保lsode
采用足够小的内部时间步长(小于w
),以便“看到”药物剂量。