Octave 以八度音阶在特定时间步长给药
我正在Ocate上做一个简单的任务。 我必须在第1天、第7天、第21天和第28天给药 我写了一个这样的函数: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
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。