我有一个非ode函数,它根据时间向量和空间变量向量的前一个时间步进行计算。
此函数中的一个参数是常量。但是,我想将该参数设为变量,该变量将在给定时间内更改。
以下是一些示例代码,以明确这一点。
nstrains = 10;
param = .3*rand(1,nstrains);
strtime = rand(1,nstrains);
strtime = round(strtime);
strtime = sort(strtime);
initialconds = .5
t=0:.1:10; %time vector
x=1:.1:10; %spatial vector
k = zeros(numel(x),numel(t))
k = zeros(numel(x)/2,1) = initialconds
for i = 1:(numel(t)-1)
for j = 2:(numel(x)-1)
k(j,i+1) = 5*2+c(j+1,i)+param*c(j,1)+param
end
end
如果param保持不变,那就没问题了。我想要做的是为param提供一个随机数的向量,在随机时间为param输入随机数。随机时间由strtime决定。
So for example, if strtime vector = [2 4 9 10], and
param vector = [.21 .01 .25 .05]
First, I want an initial param value at time 0 = .2 (arbitrary). As soon as my
time vector matches with my strtime vector, which in this example is 2, then
my param value is updated to .21. .21 will be used at each time step until my
time vector matches my strtime vector again, which in this case, would be 4. By
time step 4, .01 is used as my param value, and so on.
由于函数以这种方式编入索引,我无法弄清楚如何解决此问题。有没有办法做到这一点,同时保持函数索引的方式,只是以某种方式更新param到由strtime向量确定的新值?
谢谢,希望我足够清楚。
答案 0 :(得分:0)
创建一个与时间向量t
大小相同的向量,每次都有适当的参数值。
以您的示例数据为例,这是一种方法:
首先,在strtime和param向量的开头,添加初始条件(t> = 0,param以.2开头)。
strtime = [0 2 4 9 10];
param = [.2 .21 .01 .25 .05];
接下来,对于t
中的每个元素,找到strtime
中与该时间点小于或等于的最大元素,并使用该索引查找相应的参数。在这里,我使用arrayfun
完成了此操作,而不是将其作为for
循环实现,但从概念上讲它们是相同的。
p = arrayfun(@(x)param(find(strtime< = x,1,' last')),t);
现在您已经有了一个向量p
,您可以使用i
将其编入索引(使用param
替换循环部分中的p(i)
)。< / p>