在Matlab中用事件函数解决ODE

问题描述 投票:0回答:1

我正在研究一个项目,我已经模拟了多体机械系统的运动。它是一个复杂的,非光滑的系统,并且系统的运动并不总是用同一组方程来描述,这意味着如果我用数字解决这个问题,我必须有时停止积分(并用新的方法再次启动它)初始条件和方程式)。

现在我想使用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求解器事件发生后要使用的新初始条件和方程式?

matlab ode
1个回答
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)]。

© www.soinside.com 2019 - 2024. All rights reserved.