Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Octave 以八度音阶在特定时间步长给药_Octave - Fatal编程技术网

Octave 以八度音阶在特定时间步长给药

Octave 以八度音阶在特定时间步长给药,octave,Octave,我正在Ocate上做一个简单的任务。 我必须在第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

我正在Ocate上做一个简单的任务。 我必须在第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函数,在一定的时间步长内给药。

你可能想用ismember t,a替换t==a。另外,您应该删除else子句,因为它对答案没有影响

更新

考虑将函数重写为:

function xdot = f (x,t)
  xdot = -0.4077*x + 57.947*ismember (t, [1 7 21 28])
endfunction

看起来你有一个简单的清除模型,在一个时间段内的每一次,你都希望剂量能瞬间传递。也就是说,在a中的每一次,受试者体内的药物量增加57.947

如果这是您心目中的模型,那么在xdot的公式中实现它将不会很好。实际上,您需要将其作为一个组件来实现,而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,以便能够看到药物剂量。

请检查解释器上的表达式t==a。谢谢Julio,我按照您的建议做了同样的操作,但结果仍然相同。我假设问题在于我的t函数。因为t的值是负数,当我在函数文件中显示它时,它与主文件中显示的值有很大的不同。可能是它的lsode函数,它正在改变t的值。在这种情况下,应该怎么做?若这个问题看起来很愚蠢,我很抱歉,因为我的背景是生物学。请帮我理解。@shm,我更新了答案。请务必阅读lsode的帮助页面,在解释器上键入help lsode。