我有一个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
答案 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中轻松实现。