如何数值对比Dymos优化解与仿真解及开展收敛研究?
Dymos优化拟合轨迹与仿真解的对比方法及数据访问指南
一、访问多项式拟合数据
Dymos通过配点法(如Gauss-Lobatto)用Lagrange多项式拟合状态/控制变量的时间序列,直接获取任意时间点的拟合值是最实用的方式:
- 优化完成后,利用Phase对象的
interpolate方法,传入优化解和目标变量名,就能生成密集时间点的拟合数据:import numpy as np # 假设已定义phase并得到优化后的solution对象 # 生成覆盖整个时域的密集时间点(远多于配点数量) dense_times = np.linspace(phase.t_initial, phase.t_final, 1000) # 插值获取状态变量的密集拟合值 dense_state = phase.interpolate(solution, 'your_state_variable_name', dense_times) # 同理获取控制变量 dense_control = phase.interpolate(solution, 'your_control_variable_name', dense_times) - 若需直接操作多项式系数,可通过
phase.transcription.grid_data获取配点节点的位置,结合配点节点的变量值(solution.get_val('phase_name.states:state_name'))手动构造Lagrange多项式,但一般无需这么做,interpolate方法已封装了这一逻辑。
二、对比拟合轨迹与仿真解的最佳方法
要评估配点以外的拟合差异,核心是在非配点的密集时间点上做量化和可视化对比,步骤如下:
生成统一的密集时间序列
生成远多于配点数量的时间点(比如1000个以上),均匀覆盖整个时域,确保包含配点之间的所有区间,避免遗漏拟合误差的峰值区域。获取优化解的密集拟合数据
用上述interpolate方法,在统一的密集时间点上获取状态、控制变量的拟合值。运行高精度仿真并输出密集结果
基于优化得到的初始状态和控制轨迹,用Dymos的simulate方法运行仿真(或直接调用底层积分器,如scipy.integrate.solve_ivp),确保仿真模型与优化模型完全一致,并在同一密集时间点上输出仿真结果。注意设置足够小的仿真步长,避免积分误差干扰对比。量化误差与收敛性分析
- 逐点误差:计算每个时间点的绝对误差
|sim_val - opt_val|和相对误差|sim_val - opt_val| / max(|sim_val|, 1e-6)(避免除以零),定位误差较大的时间段。 - 全局误差指标:计算整个时域的最大误差、均方根误差(RMSE)、L2范数误差,这些指标能直观反映拟合的整体精度。
- 收敛性验证:改变配点节点数量(比如从10增加到20、40),绘制误差指标随节点数变化的曲线,若误差随节点数增加单调下降并趋于稳定,说明拟合收敛。
- 逐点误差:计算每个时间点的绝对误差
可视化对比
- 轨迹重叠图:将优化拟合轨迹与仿真轨迹绘制在同一坐标系,直观观察整体趋势的一致性。
- 误差时序图:绘制误差随时间的变化曲线,重点关注配点之间的误差波动,判断多项式在非节点处的拟合效果。
- 收敛曲线:绘制RMSE/最大误差随节点数变化的曲线,验证收敛特性。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

