在 Matlab 中使用事件函数求解 ODE
Solving ODEs with Event function in Matlab
我现在正在进行一个项目,我在其中对多体机械系统的运动进行建模。这是一个复杂的、非光滑的系统,系统的运动并不总是由同一组方程描述,这意味着如果我用数值求解这个问题,我有时不得不停止积分(并用新的重新开始)初始条件和方程)。
现在我想使用 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 求解器在事件发生后使用哪些新的初始条件和方程?
调用两种不同的解决方案。即
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)].
我现在正在进行一个项目,我在其中对多体机械系统的运动进行建模。这是一个复杂的、非光滑的系统,系统的运动并不总是由同一组方程描述,这意味着如果我用数值求解这个问题,我有时不得不停止积分(并用新的重新开始)初始条件和方程)。
现在我想使用 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 求解器在事件发生后使用哪些新的初始条件和方程?
调用两种不同的解决方案。即
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)].