数值求解两个耦合非线性二阶微分方程

计算科学 matlab 数学
2021-11-29 00:09:54

我在拉格朗日力学中遇到了以下微分方程组。您能否建议一种数值方法,以及有关如何解决它的相关链接和参考,以及 C 中的实现(如果可能)另外,Matlab 或 Mathematica 上是否有更短的实现?

mxy˙2+mgcos(y)Mg(m+M)x¨=0gsin(y)+2x˙y˙+xy¨=0

其中 x˙y˙ 是时间导数,双点表示时间的二阶导数。

3个回答

为什么要手动实现?Matlab、Maple 和 Mathematica 都内置了数值求解微分方程的工具,它们使用的方法比您在有限时间内自己实现的方法要好得多。在 Matlab 中,您想查看ode45在 Maple 中它被称为dsolve(带有 'numeric' 选项集),在 Mathematica 中它是NDSolve

您可以使用Runge-Kutta 方法对这个系统进行数值求解,首先通过执行以下替换技巧将您的二阶方程重写为一阶系统:

{x1=x2y1=y2x2=x1y2+gcosy1(M+m)g/my2=g(siny1)/x12x2y2/x1

现在您可以使用MATLAB'sode45ode23来解决它,如果您想在 C 上实现该方法,我相信互联网上有很多 pkgs 可用,例如this

诸如 (4,5) 之类的龙格-库塔方法也可以在GNU 科学库(用 C 语言编写)中找到。它们还包括自适应时间步长。