0

時間ベクトルと空間変数ベクトルの前の時間ステップに基づいて計算する非常微分方程式関数があります。

この関数のパラメーターの1つは定数です。ただし、そのパラメーターを変数にしたいのですが、これは特定の時間に基づいて変更されます。

これを明確にするためのサンプルコードを次に示します。

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. 

関数がそのように索引付けされているので、これをどのように取得するかを実際に理解することはできません。関数のインデックスをそのままにして、strtimeベクトルによって決定された新しい値にparamを更新する方法はありますか?

ありがとう、そして私が十分に明確であったことを願っています。

4

1 に答える 1

0

時間ベクトルと同じサイズのベクトルを、t各時間に適切なパラメーター値で作成します。

サンプルデータを取り上げると、これを行う1つの方法があります。

まず、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置き換えてください)。paramp(i)

于 2012-06-11T05:08:19.653 に答える