如何解决Dymos:如何显式调用solve_ivp 方法来求解动力学方程?
我正在尝试在 Dymos 中设置轨迹优化问题。
为了验证要使用的分析模型,我想计算一些初始条件的轨迹。
我已经尝试过如 here 所述的 solve_segments=True 方法,但是它只能计算 time_duration 的小值(~20 秒)的轨迹。在做了一些实验之后,我发现无论我选择什么 num_segments 值,轨迹都会在时间的结束值附近突然出现超调。
例如:
a) num_segments=15,order=3
、t_duration=25
有一个随机错误:RuntimeWarning: 在电源中遇到无效值
b) 但是,当我设置 num_segents=15,order=3
时,t_duration=20
这个轨迹看起来绝对是正确的!两种情况下的转录都是 GaussLobatto。
由于动力学方程有点太复杂,我想知道是否有其他方法可以解方程。
有没有办法在已经设置好的情况下调用scipy的solve_ivp方法(prob.setup()
)?即调用 trajectory.simulate()
而不调用 problem.run_model()
?
我的另一个问题是: 我正在考虑尝试一种虚拟的客观风格来解决方程。任何人都可以请指导吗?我们还没有为这个问题制定我们的目标!
解决方法
我不一定有适合您的解决方案,但我有一些建议。
不幸的是,simulate() 依赖于一些被填充的输出,而唯一的方法是执行模型(使用 using(cws = new ClientWebSocket())
{
await cws.ConnectAsync(...);
await DoSomeListeningForABit();
} //cws gets implicitly disposed here
或 run_model()
)
如果您使用 run_driver()
来运行前 20 秒的问题,应该会生成两个记录文件。 dymos.run_problem(p,simulate=True)
将包含隐式解决方案,而 dymos_solution.db
将包含模拟解决方案。您可以通过执行以下操作来查看这些文件的后续解决方案:
dymos_simulation.db
你试过限制你的状态吗?如果是这样,Radau 方法可能会更有效,因为没有 GaussLobatto 中的插值步骤。
您是否运行 dm.run_problem(prob,simulate=True,restart='dymos_solution.db')
来验证您的导数是否正确?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。