在特定时间以八度为单位给药

时间:2014-03-20 11:33:30

标签: octave

我在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功能帮助我如何通过一定的时间步骤来控制剂量。

2 个答案:

答案 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);

脚本创建此图:

drug dose plot


请注意,微分方程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),以便“看到”药物剂量。