在Matlab中使用事件函数求解ODE

时间:2019-02-20 16:42:02

标签: matlab ode

我现在正在研究一个项目,在该项目中我对多体机械系统的运动进行了建模。它是一个复杂的,非光滑的系统,并且系统的运动并不总是由相同的方程组来描述,这意味着如果我用数值方法求解,则有时必须停止积分(并使用new重新启动)初始条件和方程式。

现在,我想使用Matlab的事件函数在代码中实现这一点。这个概念很简单,但是与documentation一样,在针对实际问题实施该概念时,它总是没有描述性。 (文档中有一个示例,但是由于某种原因我看不到源代码)。尽管如此,我还是编写了一些代码,现在我只想着如何将它们放在一起:我希望ODE求解器(例如ode45)求解我的方程式,然后在事件发生时停止,然后再次与新的积分相集成。一组ODE和初始条件,但是我不知道如何通过ODE求解器下一步要求解的方程式以及新的初始条件是什么!

代码:

function dy = firstODE(t,y)
dy = zeros(2,1);
dy(1) = y(2);
dy(2) = 1/(A1)*(B1-c*y(1));
end


function dy = secondODE(t,y)
dy = zeros(4,1);
dy(1) = y(2);
dy(2) = -c/A2*y(1);
dy(3) = y(4);
dy(4) = D2/B2 + c*C2/(A2*B2)*y(1);
end

function [value,isterminal,direction] = myEventsFcn(t,y)
value = [y(1)-K1, y(1)+K1, y(1)+K2, y(1)+K1, y(1)-K1];
isterminal = [1, 1, 1, 1, 1];
direction = [-1, -1, -1, 1, 1];
end

如何告诉ODE求解器在事件发生后要使用哪些新的初始条件和方程式?

1 个答案:

答案 0 :(得分:1)

调用两个不同的解决方案。即

sol1 = ode45(@(t,x)firstODE(t,x),tspan1,init1);
% set some conditions
sol2 = ode45(@(t,x)secondODE(t,x),tspan2,init2);

如果要让tspan2从上一个中断的地方开始并转到最初定义的tspan1的末尾,请设置tspan2 = [sol1.xe,tspan1(end)]。