最近,我一直在某些动力系统上进行模拟,其中所有动态量都是相互依赖的。因此,为了模拟动态,我在小的时间步长dt <1上执行循环并且在每次迭代内改变量。模拟分别在Mathematica和Matlab中完成。 我得到了很好的结果,但由于迭代过程缓慢,模拟可能需要很长时间。一般来说,我听说应该避免像我使用的那样循环,因为它们会大大减慢模拟速度。另一方面,我对如何在没有小时间步骤迭代的情况下进行模拟毫无头绪。因此,我问你:对于一个动力系统,每个数量必须以超小的时间步进改变,那么模拟动力学的可能方法是什么。
答案 0 :(得分:2)
直接的方法是将问题写成一组微分方程,并使用任一系统的ODE求解能力。 MATLAB和Mathematica都有先进的(可定制的)数值微分方程求解器,它们都支持微分方程中的特殊“事件”,这些事件不能用简单的公式表示(例如球从地板反弹的事件)
对于Mathematica,首先查看NDSolve
,WhenEvent
,然后查看Advanced Numerical Differential Equation Solving tutorial。
根据您的描述,您可能会使用天真的ODE求解方法,例如Euler method。使用更好的数字ODE求解技术可以提供显着的有效加速(通过不强迫您使用“超小时间步”)。
如果性能至关重要,请考虑使用C或C ++等低级语言重新实现模拟,并可能从Mathematica(LibraryLink)调用它,以便于数据分析和可视化。