答えの最初の部分または2番目の部分があなたに関連しているかどうかを確認するために最後まで読んでください:
パート1:最初に、計算を説明する関数と.m
を与える関数を
含むファイルを作成します。例:次のコードを含むというファイルを作成します。a
b
fun_name.m
function Dy = fun_name(t,y)
Dy=[ a(t)*y(1)+b(t)*y(2); ...
-a(t)*y(3)+b(t)*y(1); ...
a(t)*y(2)] ;
end
function fa=a(t);
fa=cos(t); % or place whatever you want to place for a(t)..
end
function fb=b(t);
fb=sin(t); % or place whatever you want to place for b(t)..
end
次に、次のコードを含む2番目のファイルを使用します。
t_values=linspace(0,10,101); % the time vector you want to use, or use tspan type vector, [0 10]
initial_cond=[1 ; 0 ; 0];
[tv,Yv]=ode45('fun_name',t_values,initial_cond);
plot(tv,Yv(:,1),'+',tv,Yv(:,2),'x',tv,Yv(:,3),'o');
legend('y1','y2','y3');
もちろん、fun_name.m
私が書いた場合、a(t)
とのサブ関数を使用する必要はありません。可能であればb(t)
、明示的な関数形式を使用できます(など)。Dy
cos(t)
パート2 :、が(パート1のように)の関数として表現できない、たまたま持っている数のベクトルである場合 a(t)
、それぞれが発生する時間ベクトルも必要になります。これは次のようになります。もちろん、ODEに使用するのと同じ時間ですが、補間が機能する限り、そうである必要はありません。期間や解像度が異なる場合は、一般的なケースを扱います。次に、次のことを実行して、ファイルを作成します。b(t)
t
fun_name.m
function Dy = fun_name(t, y, at, a, bt, b)
a = interp1(at, a, t); % Interpolate the data set (at, a) at times t
b = interp1(at, b, t); % Interpolate the data set (bt, b) at times t
Dy=[ a*y(1)+b*y(2); ...
-a*y(3)+b*y(1); ...
a*y(2)] ;
これを使用するには、次のスクリプトを参照してください。
%generate bogus `a` ad `b` function vectors with different time vectors `at` and `bt`
at= linspace(-1, 11, 74); % Generate t for a in a generic case where their time span and sampling can be different
bt= linspace(-3, 33, 122); % Generate t for b
a=rand(numel(at,1));
b=rand(numel(bt,1));
% or use those you have, but you also need to pass their time info...
t_values=linspace(0,10,101); % the time vector you want to use
initial_cond=[1 ; 0 ; 0];
[tv,Yv]= ode45(@(t,y) fun_name(t, y, at, a, bt, b), t_values, initial_cond); %
plot(tv,Yv(:,1),'+',tv,Yv(:,2),'x',tv,Yv(:,3),'o');
legend('y1','y2','y3');