質問のタイトルが示すように、ODE の最大値を探している場合は、非常に近いです。微分方程式自体の根を使用して、これらの点を見つけます。つまり、導関数がゼロの場合です。これは、値がゼロ (またはその他の値) の解とは少し異なりますが、関連しています。問題は、指定value = Lorenz(t,x)
していて、 のみに関心がある場合に ODE 関数がベクトルを返すことですx(3)
。ただし、状態ベクトルにアクセスでき、3 つの選択肢があります。
最も簡単な:
function [value,isterminal,direction] = event(t,x)
b = 8/3;
value = x(1)*x(2)-b*x(3); % The third equation from Lorenz(t,x)
isterminal = 0;
direction = -1;
または、あまり効率的ではありません:
function [value,isterminal,direction] = event(t,x)
y = Lorenz(t,x); % Evaluate all three equations to get third one
value = y(3);
isterminal = 0;
direction = -1;
または、3 つの次元すべての最大値が必要な場合:
function [value,isterminal,direction] = event(t,x)
value = Lorenz(t,x);
isterminal = [0;0;0];
direction = [-1;-1;-1];
グローバルな最大値に関心がある場合は、出力を処理する必要がありますxm
。または、システムが特定の振動動作をしている体制にいる場合は、 の最初の値に切り替えるか、単に見るisterminal
だけでよい場合があります。1
xm
最後に、無名関数を介してパラメーターを渡すことを検討してください。
r = 15;
sigma = 10;
b = 8/3;
f = @(t,x)Lorenz(t,x,r,sigma,b);
I = [1;5;10];
options = odeset('Events',@(t,x)event(t,x,b));
[t,x,tm,xm,ie] = ode45(f,[0;10],I,options);
と:
function X = Lorenz(t,x,r,sigma,b)
...
function [value,isterminal,direction] = event(t,x,b)
...