Dymos:如何显式调用 solve_ivp 方法来求解动力学方程?

Dymos: How to call solve_ivp method explicitly for solving Dynamics Equations?

我正在尝试在 Dymos 中设置轨迹优化问题。

为了验证要使用的分析模型,我想计算一些初始条件的轨迹。

我已经尝试了 solve_segments=True 方法 here,但是它只能计算 time_duration 的小值(~20 秒)的轨迹。在做了一些实验后,我发现无论我选择什么 num_segments 值,轨迹都会在时间的最终值附近显示突然的超调。

例如: a) num_segments=15, order=3, t_duration=25 出现随机错误:RuntimeWarning:在 power

中遇到无效值

b) 但是,当我设置 num_segents=15, order=3t_duration=20 这个轨迹看起来绝对是正确的!在这两种情况下,转录都是 GaussLobatto。

由于动力学方程有点太复杂,我想知道是否有其他方法可以直接求解方程

有没有办法在已经设置好的情况下调用scipy的solve_ivp方法(prob.setup())? i.e.to 调用 trajectory.simulate() 而不调用 problem.run_model()?

我的另一个问题是: 我正在考虑尝试使用虚拟 objective 样式来求解方程式。任何人都可以请指导吗?我们还没有形成这个问题的 objectives 呢!

我不一定有适合你的解决方案,但我有一些建议。

不幸的是,simulate() 依赖于填充一些输出,唯一的方法是执行模型(使用 run_model()run_driver()

如果你用dymos.run_problem(p, simulate=True)到运行第一个20秒的问题,那应该会生成两个记录文件。 dymos_solution.db 将包含隐式解,dymos_simulation.db 将包含模拟解。您可以通过执行以下操作查看这些文件的后续解决方案:

dm.run_problem(prob, simulate=True, restart='dymos_solution.db')

你试过限制你的状态吗?如果是这样,Radau 方法可能会更好,因为没有像 GaussLobatto 中那样的插值步骤。

你运行prob.check_partials(compact_print=True)验证你的导数是否正确?