我一直在构建一个类似于文档中赛车示例的最优控制模拟(https://openmdao.org/dymos/docs/latest/examples/racecar/racecar.html)。在我的模型中,有一个车辆动力学模型,它根据轮胎产生的力和车辆当前的速度计算车辆参考系中的加速度。
轮胎力由第二个分量计算,该分量使用简单的线性关系(纵向力与扭矩成线性关系,横向力与滑移角成线性关系)获取车辆速度(状态)和施加的扭矩(控制)。最后还有第三个组件,它根据摩擦圆计算轮胎的抓地力极限。请参阅下面的 XDSM:
当我尝试运行此程序时,我发现 IPOPT 恢复失败。检查复杂步骤的总导数给出了这个输出:
'traj.phase0.collocation_constraint.defects:r' | 'traj.phase0.states:n' | 9.8677e-02 | 9.8723e-02 | 3.0820e-03 | 3.1218e-02 | >ABS_TOL >REL_TOL |
+---------------------------------------------------+-------------------------+-------------+-------------+-------------+-------------+--------------------+
| 'traj.phase0.collocation_constraint.defects:r' | 'traj.phase0.states:r' | 1.0607e+01 | 1.0607e+01 | 2.3431e-03 | 2.2091e-04 | >ABS_TOL >REL_TOL |
+---------------------------------------------------+-------------------------+-------------+-------------+-------------+-------------+--------------------+
| 'traj.phase0.collocation_constraint.defects:r' | 'traj.phase0.states:u' | 7.0988e-02 | 7.1729e-02 | 4.4107e-03 | 6.1491e-02 | >ABS_TOL >REL_TOL |
+---------------------------------------------------+-------------------------+-------------+-------------+-------------+-------------+--------------------+
| 'traj.phase0.collocation_constraint.defects:r' | 'traj.phase0.states:v' | 2.7646e-02 | 2.9618e-02 | 3.5225e-03 | 1.1893e-01 | >ABS_TOL >REL_TOL |
+---------------------------------------------------+-------------------------+-------------+-------------+-------------+-------------+--------------------+
| 'traj.phase0.collocation_constraint.defects:r' | 'traj.phase0.states:xi' | 1.6765e+00 | 1.6593e+00 | 5.8082e-02 | 3.5004e-02 | >ABS_TOL >REL_TOL |
+---------------------------------------------------+-------------------------+-------------+-------------+-------------+-------------+--------------------+
| 'traj.phase0.collocation_constraint.defects:v' | 'traj.phase0.states:n' | 1.3974e+00 | 1.3982e+00 | 7.9276e-03 | 5.6700e-03 | >ABS_TOL >REL_TOL |
+---------------------------------------------------+-------------------------+-------------+-------------+-------------+-------------+--------------------+
| 'traj.phase0.collocation_constraint.defects:v' | 'traj.phase0.states:r' | 4.4467e+01 | 4.4466e+01 | 6.6054e-03 | 1.4855e-04 | >ABS_TOL >REL_TOL |
+---------------------------------------------------+-------------------------+-------------+-------------+-------------+-------------+--------------------+
| 'traj.phase0.collocation_constraint.defects:v' | 'traj.phase0.states:u' | 7.9225e-01 | 7.9746e-01 | 1.1748e-02 | 1.4732e-02 | >ABS_TOL >REL_TOL |
+---------------------------------------------------+-------------------------+-------------+-------------+-------------+-------------+--------------------+
| 'traj.phase0.collocation_constraint.defects:v' | 'traj.phase0.states:v' | 1.0619e+01 | 1.0620e+01 | 9.0666e-03 | 8.5377e-04 | >ABS_TOL >REL_TOL |
+---------------------------------------------------+-------------------------+-------------+-------------+-------------+-------------+--------------------+
| 'traj.phase0.collocation_constraint.defects:v' | 'traj.phase0.states:xi' | 1.2890e+01 | 1.2893e+01 | 1.3847e-01 | 1.0740e-02 | >ABS_TOL >REL_TOL |
+---------------------------------------------------+-------------------------+-------------+-------------+-------------+-------------+--------------------+
我已经使用复杂的步骤方法检查了所有的部分,就像在 baristochrome 示例中所做的那样,它们应该都是正确的。
当我将车辆动力学和轮胎力计算块合并到一个块中时,优化运行得很好,没有任何问题。这让我认为可能缺少用于计算轮胎力的滑移角偏导数的信息,因此我尝试将滑移角计算移至 TireForce 组件。但这并没有解决问题,所以这里可能还有其他问题。
当部分正确但总计错误时,这强烈表明模型中有反馈,但没有合适的非线性求解器来收敛非线性系统,也没有合适的线性求解器来求解全导数。
我建议将 DiectSolver 添加到可能包含反馈循环的最小组,以及 NewtonSolver 或 NonlinearBlockGS 求解器。
回想一下,OpenMDAO 用于求解导数的理论意味着,一旦任何残差被驱动到相当接近于零,就求解线性方程组。当不涉及反馈时,默认求解器对于常见情况是高性能的,但当存在反馈时需要其他求解器。