ODEのパラメータは固定であるとみなされ、システムの状態に依存しません。あなたがしようとしているのは、区分的に連続するODEをシミュレートすることです。この種の問題は通常、event location(解決策が存在すると仮定して)で解決されます。キーポイントでシミュレーションを停止し、パラメータを変更し、以前のものと同じ初期条件で新しいシミュレーションを再開する必要があります。
ここでは、ODE機能の例を示します。私はあなたの初期条件、初期パラメータ値、またはその他の設定を知らないので、これはちょうどこのスキームを実証することである。この場合、
function eventsdemo
params = [-1.5 1];
tspan = [0 10];
x0 = [1;1];
opts = odeset('Events',@events);
[t1,x1] = ode45(@(t,x)f(t,x,params),tspan,x0,opts); % Simulate with events
% Change parameters, set initial conditions based on end of previous run
params = [1.5 1];
x0 = x1(end,:);
tspan = [t1(end) 10];
[t2,x2] = ode45(@(t,x)f(t,x,params),tspan,x0); % Simulate again
% Concatenate results, removing duplicate points
t = [t1;t2(2:end)];
x = [x1;x2(2:end,:)];
figure;
plot(t,x);
hold on;
plot(t2(1),x2(1,:),'k*'); % Plot event location
function dxdt = f(t,x,params) %#ok<INUSL>
F = params(1);
G = params(2);
dxdt = [F*x(1) - G*x(1)*x(2);
(F-G)*x(2)];
function [value,isterminal,direction] = events(t,x) %#ok<INUSL>
value = norm(x)-1e-3; % Don't try to detect exact zero for asymptotics
isterminal = true;
direction = -1;
ソリューションは漸近的に(0,0)で安定固定点に近づきました。解が決してその点に到達しないように、(0,0)を正確に検出しようとしないことが重要です。代わりに、小さな公差を使用することができます。ただし、システムによっては、この許容値を選択するとパラメータを変更した後の動作に影響を与える可能性があります。また、この問題を境界値の問題として再検討することもできます。私はあなたがこのシステムで何をしようとしているのか分かりませんので、他にはあまり言い表せません(そして、おそらくこのサイトで話題にならないでしょう)。
これを行う適切な方法は、[イベントの位置](http://www.mathworks.com/help/matlab/math/ode-event-location.html)を使用して、 ([example here](http://stackoverflow.com/a/15992197/2278029))。その後、パラメータを変更して新しい統合を開始します。パラメータを変更するには、ODE関数に 'if'文を置かないでください。 – horchler
私はイベントの場所を考慮しましたが、これは統合を停止して新しい統合手順を開始する必要があることを意味しますか?もしそうなら、定常状態が見つかる前に最初の積分ステップの最後の点に初期値を更新する必要がありますか? – user6101792