2016-04-17 34 views
2

私は解決したいODE方程式のシステムを持っていますが、システムが定常状態になったときに、 1つ(またはそれ以上)のパラメータの値。たとえば、次の点を考慮します。MatlabのODE関数でODE値を計算して定常状態を検出する

function dydt = diff(t,x,params) 
    F = params(1); 
    G = params(2); 
    dydt = zeros(2,1); 
    dydt(1) = F*x(1) - G*x(1)*x(2); 
    dydt(2) = (F-G)*x(2); 
end 

私は、システムが定常状態に達したとき、Fの値は、10に変更され、Gの値が2に変更されるように動作するように私のコードをしたいと思います例えば。私は私が行うにはどうすればよい、例えば、使用してdydtは(1)とdydtは(2)の値を検出する

if norm(dydt)<1 
    F = 10; 
    G = 2; 
end 

を考えていたというMATLABでODEを発現させるため? ODE式の前に条件ifを置くと、dydtの値は常にゼロになります。しかし、If条件をODE式の後に置くと、If条件はODE式を修正するために使用されません。

ありがとうございました!

+1

これを行う適切な方法は、[イベントの位置](http://www.mathworks.com/help/matlab/math/ode-event-location.html)を使用して、 ([example here](http://stackoverflow.com/a/15992197/2278029))。その後、パラメータを変更して新しい統合を開始します。パラメータを変更するには、ODE関数に 'if'文を置かないでください。 – horchler

+0

私はイベントの場所を考慮しましたが、これは統合を停止して新しい統合手順を開始する必要があることを意味しますか?もしそうなら、定常状態が見つかる前に最初の積分ステップの最後の点に初期値を更新する必要がありますか? – user6101792

答えて

0

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)を正確に検出しようとしないことが重要です。代わりに、小さな公差を使用することができます。ただし、システムによっては、この許容値を選択するとパラメータを変更した後の動作に影響を与える可能性があります。また、この問題を境界値の問題として再検討することもできます。私はあなたがこのシステムで何をしようとしているのか分かりませんので、他にはあまり言い表せません(そして、おそらくこのサイトで話題にならないでしょう)。

関連する問題