【发布时间】:2020-02-19 21:54:26
【问题描述】:
我正在尝试绘制动态系统的状态空间图以及时间历史图。不过,有一个问题。状态空间被位于 x1 = 0 的平面分成两半。状态空间轴是 x1、x2、x3。 x1 = 0 平面平行于 x2/x3 平面。 x1 = 0 平面上方的状态空间由 eqx3 中的 ODE 描述,而 x1 = 0 平面下方的状态空间由 eqx4 中的 ODE 描述。
所以,平面 x1 = 0 上存在不连续性。我有一个模糊的理解,应该使用事件函数(function [value,isterminal,direction] = myEventsFcn(t,y)),但我不知道要给“value”、“isterminal”赋予什么值”和“方向”。
在下面的代码中,我有一个 eqx3 的初始条件和另一个 eqx4 的初始条件。 eqx3 的初始条件位于状态空间的上半部分 (x1 > 0)。轨道然后撞击 x1 = 0 平面并出现不连续性,并且 eqx4 轨迹从该平面开始,但与 eqx3 结束的点不同。
这可以吗?如何将其放入代码中?当轨道到达平面 x1 = 0 时是否停止积分?
eta = 0.05;
omega = 25;
tspan = [0,50];
initcond = [2, 3, 4]
[t,x] = ode45(@(t,x) eqx3(t,x,eta, omega), tspan, initcond);
initcond1 = [0, 1, 1]
[t,y] = ode45(@(t,y) eqx4(t,y,eta, omega), tspan, initcond1);
plot3(x(:,1), x(:,2), x(:,3),y(:,1), y(:,2), y(:,3))
xlabel('x1')
ylabel('x2')
zlabel('x3')
%subplot(222)
%plot(t, x(:,1), t,x(:,2),t,x(:,3),'--');
%xlabel('t')
function xdot = eqx3(t,x,eta,omega)
xdot = zeros(3,1);
xdot(1) = -(2*eta*omega + 1)*x(1) + x(2) - 1;
xdot(2) = -(2*eta*omega + (omega^2))*x(1) + x(3) + 2;
xdot(3) = -(omega^2)*x(1) + x(2) - 1;
end
function ydot = eqx4(t,y,eta,omega)
ydot = zeros(3,1);
ydot(1) = -(2*eta*omega + 1)*y(1) + y(2) + 1;
ydot(2) = -(2*eta*omega + (omega^2))*y(1) + y(3) - 2;
ydot(3) = -(omega^2)*y(1) + y(2) + 1;
end
function [value,isterminal,direction] = myEventsFcn(t,y)
value = 0
isterminal = 1
direction = 1
end
【问题讨论】:
标签: matlab numerical-methods ode