MATLAB事件位置,以找到不同物种完全转换所需的时间

时间:2015-03-04 09:56:05

标签: matlab simulink

我有一个ODE系统如下:

dx1/dt = (x1,x2,x3)
dx2/dt = (x1,x2,x3)
dx3/dt = (x1,x2,x3)

初始条件是x1 = x2 = x3 = 0 @ t = 0且约束为dx1 / dt = 0,dx2 / dt = 0,dx3 / dt = 0表示x1 = 1,x2 = 1,x3 =分别为1。一旦x1,x2,x3达到值1,它们应保持为1以进一步增加t。

我需要找出(1)x1,x2,x3在不同的t和(2)估计t的值,当它们每个变为1.我很难得到(2)的结果。

我尝试使用以下事件函数:

function [val,stop,dir] = event(t,X)
X1 = x1; 
X2 = x2; 
X3 = x3;
val = [X1 -1; X2 -1; X3 -1];
stop= [1;1;1];
dir = [1;1;1];
end

它不起作用。然后我尝试了另一个代码,至少找到对应于x3 = 1的t(因为x3与x1和x2相比增长缓慢)。

function [val,stop,dir] = event(t,X)
X3 = x3;
val = X3 -1;
stop= 1;
dir = 1;
end

有人可以在这方面指导我吗?

关心。 Sudip

1 个答案:

答案 0 :(得分:0)

使用ode解算器解决此问题非常简单,无需事件。我会定义一个函数,如:

function dX = my_ode(t,X)

for k=1:length(X)
    if abs(X(k)-1) <= 1e-6 % or use whatever tolerance you want, e.g. eps
       dX(k) = 0;
    else
       dX(k) = X(k);
    end
end

然后我会按如下方式调用ode求解器:

tspan = [0 10]; % choose whatever time span you want
X_init = [0 0 0];
[T,X] = ode45(@my_ode,tspan,X_init);
plot(T,X)

不确定为什么你有Simulink标签,但如果需要,也可以在Simulink中轻松实现。