我有一个一般性的问题,我将在更具体的情况下表达。
如果想要找到双摆的动力学,可以在数学上推导出运动方程,重写ODE,使其具有对数值计算有用的特殊形式,并使用c ++中的odeint解决ODE(参见堆栈溢出https://stackoverflow.com/a/30582741)上的示例。
现在想象一下我们想对n耦合摆(n在运行时已知)做同样的事情。这需要我们写一个所谓的拉格朗日(动能 - 势能),这个函数的不同衍生物将是我们需要解决的ODE。此外,这些ODE必须以适合odeint的形式重写。一般来说这很难用手去做。
在像Mathematica和Maple这样的程序中,这实际上非常简单。人们可以明确地从拉格朗日求出所需的ODE,并且ODE求解器不需要我们将方程放在任何特殊形式中(参见mathematica中的示例https://mathematica.stackexchange.com/a/84279)。
是否有可能在c ++中做这样的事情而不会遇到太多麻烦?
潜在方法:
可能的方法是使用c ++包ginac。这可以帮助我们分析地推导出ODE。但我不知道如何将来自ginac的表达式重写为适合odeint中数值计算的形式。有什么想法吗?
答案 0 :(得分:1)
琐碎的intertia术语有助于你只需要计算dV / dq而不是dT / dp。 odeint提供了一个辛积分器的版本,它只需要dV / dq,并假设dT / dp在你的情况下是微不足道的。但是,您仍需要获得衍生物。