我有一个一般性的问题,我将在更具体的情况下提出。

如果要查找双摆的动力学特性,则可以用数学方法得出运动方程,将ODE重写为具有可用于数值计算的特殊形式,并使用C++中的odeint来求解ODE(请参见示例)在堆栈上溢出https://stackoverflow.com/a/30582741)。

现在想象我们要对n个耦合摆(在运行时已知)执行相同的操作。这要求我们编写一个所谓的拉格朗日(动能-势能),并且此函数的不同导数将是我们需要解决的ODE。此外,必须以适合于odeint的形式重写这些ODE。通常,这很难手动完成。

在像Mathematica和Maple这样的程序中,这实际上很容易。可以从Lagrangian显式导出所需的ODE,而ODE求解器不需要我们以任何特殊形式放置方程(请参见mathematica中的示例此处https://mathematica.stackexchange.com/a/84279)。

是否可以在c++中做这样的事情而不会遇到太多麻烦?

潜在方法:

一种可能的方法是使用c++包ginac。这可以帮助我们分析得出ODE。但是我不知道如何将来自ginac的表达式重写为适合odeint数值计算的形式。有任何想法吗?

最佳答案

琐碎的中间项从某种意义上说是有用的,您只需要计算dV/dq而不是dT/dp。 odeint提供了辛积分器的一个版本,仅期望dV/dq并假定dT/dp像您的情况一样微不足道。但是,您仍然需要获取导数。

关于c++ - C++中拉格朗日/可变方法的ODE求解器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31263391/

10-12 22:28