如何在Matlab中求解一系列微分方程,直到解达到某个值,然后停止?

如何在Matlab中求解一系列微分方程,直到解达到某个值,然后停止?,matlab,numerical-methods,ode,differential-equations,boundary,Matlab,Numerical Methods,Ode,Differential Equations,Boundary,我正在用ode23在Matlab中求解一系列ODE,这些ode23对于不同的值都会“爆炸”。我想告诉Matlab解方程,直到解大于某个量(比如1000),然后停止,这样我就不必手动找到每个方程的可解范围,而不是说明要解的范围。有办法做到这一点吗?我想这样做,以便我可以为每个ODE声明一个相同的值范围,但每个方程只在该范围的子集上求解。您要查找的是所谓的。除了文档之外,这个网站上还有很多问题涉及到这一点,例如,你确定这些值真的爆炸了吗ode23对于我遇到的大多数问题来说都是一个糟糕的集成器;你确定

我正在用ode23在Matlab中求解一系列ODE,这些ode23对于不同的值都会“爆炸”。我想告诉Matlab解方程,直到解大于某个量(比如1000),然后停止,这样我就不必手动找到每个方程的可解范围,而不是说明要解的范围。有办法做到这一点吗?我想这样做,以便我可以为每个ODE声明一个相同的值范围,但每个方程只在该范围的子集上求解。

您要查找的是所谓的。除了文档之外,这个网站上还有很多问题涉及到这一点,例如,你确定这些值真的爆炸了吗<代码>ode23对于我遇到的大多数问题来说都是一个糟糕的集成器;你确定你没有看到数值不稳定吗?你试过
ode45
ode113
吗?@RodyOldenhuis,关于爆炸的解决方案,我想说
ode45
ode23
一样糟糕,因为它们都是相同类型的方法,一个只是5阶,另一个是2阶(我相信)方法。因此,如果问题来自数值不稳定性,我宁愿建议使用ode23s(ode23的隐式稳定版本)。或者,当用变步长方法求解哈密顿系统时,哈密顿系统也有长时间行为爆炸的习惯。如果是这样的话,我会用Velocity Verlet来代替它。@NickyMattsson是真的,但主要的一点是OP尝试了一些不同的东西。很明显,如果
ode23
ode45
之间的行为不同,您就会遇到问题
ode23s
适用于僵硬的系统,不一定是规模严重的系统,并且由于其低阶性,可能不会产生不同的结果。增加订单通常是一件好事,因此如果刚度是个问题,我的第一个赌注是
ode15s
。但这些天我通常是从ode113开始的,因为它是最好的全方位工具,同样适用于哈密顿系统。哦,好吧。主要信息是:找出这是否是一个真实的现象。你所寻找的是所谓的。除了文档之外,这个网站上还有很多问题涉及到这一点,例如,你确定这些值真的爆炸了吗<代码>ode23对于我遇到的大多数问题来说都是一个糟糕的集成器;你确定你没有看到数值不稳定吗?你试过
ode45
ode113
吗?@RodyOldenhuis,关于爆炸的解决方案,我想说
ode45
ode23
一样糟糕,因为它们都是相同类型的方法,一个只是5阶,另一个是2阶(我相信)方法。因此,如果问题来自数值不稳定性,我宁愿建议使用ode23s(ode23的隐式稳定版本)。或者,当用变步长方法求解哈密顿系统时,哈密顿系统也有长时间行为爆炸的习惯。如果是这样的话,我会用Velocity Verlet来代替它。@NickyMattsson是真的,但主要的一点是OP尝试了一些不同的东西。很明显,如果
ode23
ode45
之间的行为不同,您就会遇到问题
ode23s
适用于僵硬的系统,不一定是规模严重的系统,并且由于其低阶性,可能不会产生不同的结果。增加订单通常是一件好事,因此如果刚度是个问题,我的第一个赌注是
ode15s
。但这些天我通常是从ode113开始的,因为它是最好的全方位工具,同样适用于哈密顿系统。哦,好吧。主要信息是:找出这是否是一个真实的现象。