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=3
、t_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)
验证你的导数是否正确?
我正在尝试在 Dymos 中设置轨迹优化问题。
为了验证要使用的分析模型,我想计算一些初始条件的轨迹。
我已经尝试了 solve_segments=True 方法 here,但是它只能计算 time_duration 的小值(~20 秒)的轨迹。在做了一些实验后,我发现无论我选择什么 num_segments 值,轨迹都会在时间的最终值附近显示突然的超调。
例如:
a) num_segments=15, order=3
, t_duration=25
b) 但是,当我设置 num_segents=15, order=3
、t_duration=20
由于动力学方程有点太复杂,我想知道是否有其他方法可以直接求解方程
有没有办法在已经设置好的情况下调用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)
验证你的导数是否正确?