0

ode45などのODEソルバーを使用しても、呼び出された関数内のパラメーターの値を「変更」することはできますか?

たとえば、次の関数を使用する場合:

function y = thisode(t, Ic)
% example derivative function

% parameters
a = .05;
b = .005;
c = .0005;
d = .00005;

% state variables
R = Ic(1);
T = Ic(2);

y = [(R*a)-(T/b)+d; (d*R)-(c*T)];

このスクリプトで:

clear all
% Initial conditions
It = [0.06 0.010];
% time steps
time = 0:.5:10;
% ODE solver
[t,Ic1] = ode45(@thisode, time, It);

すべてが期待どおりに機能します。ただし、パラメーター値を簡単に変更する方法が必要ですが、それでも1つの関数と1つのスクリプトだけでODEソルバーの複数の反復を実行します。ただし、ODEソルバーに用語を追加するだけでは不十分なようです。たとえば、次のようになります。

function y = thisode(t, Ic, P)

% parameters
a = P(1);
b = P(2);
c = P(3);
d = P(4);

% state variables
R = Ic(1);
T = Ic(2);

y = [(R*a)-(T/b)+d; (d*R)-(c*T)];

このスクリプトで:

clear all
% Initial conditions
It = [0.06 0.010];
P1 = [.05 .005 .0005 .00005]
% time steps
time = 0:.5:10;
% ODE solver
[t,Ic1] = ode45(@thisode, time, It, [], P1);

動作しません。私はこれがうまくいかないことを知っていると思いますが、私は解決策を思い付くことができませんでした。また、関数内でifステートメントを検討し、使用するパラメーターのセットをいくつかハードコーディングしました(たとえば、P == 1の場合はセット1を使用し、P == 2の場合はセット2を使用します)が、これも次のようには機能しませんでした。 ODEで使用するセットをどこで呼び出すかはわかりません。パラメータ値を変更できるようにしながら、ODEソルバーで1つの関数と1つのスクリプトを使用する方法に関するヒントや提案をいただければ幸いです。

ありがとう、マイク

4

1 に答える 1

1

関数を別の方法で呼び出す必要があります。

[t,Ic1] = ode45(@(t,y) thisode(t,y,P1), time, It);

この関数ode45は、渡されたすべての関数が と のみを受け入れると想定していtますy。上記の呼び出しは、Matlab に を渡すための標準的なトリックP1であり、 whileはすべての呼び出しode45でそれを渡しtます。y

于 2012-10-16T04:19:57.367 に答える