跳转至

诊断求解失败

非线性规划求解器返回失败状态时,当前迭代点不能视为经过验证的解。直接配点模型通常 是非凸的,因此 Ipopt 和 SciPy 一般只寻找局部解,并不提供全局最优证明。即使模型 本身是凸的,成功终止仍取决于数据一致性、数值尺度和求解器配置。

先读清失败信息

Ipopt 应检查 info["status"]info["status_msg"];SciPy 应检查 result.successresult.statusresult.message。常见信息可按下列方向排查:

  • 检测到不可行: 检查边界条件、路径约束和阶段连接条件是否矛盾;
  • 恢复阶段失败或出现无效数值: 检查平方根、幂、除法和对数的定义域,尤其是初值处;
  • 超过最大迭代次数: 先检查可行性和尺度,不要只提高 max_iter
  • 步长过小或搜索方向失败: 查找冗余约束、近似线性相关的 Jacobian 行和尺度失衡。

诊断时可提高求解器输出级别。更换 Ipopt 线性求解器有时能改善矩阵分解,但前提是 相应后端已安装,而且它不能修复互相矛盾的模型。

核对数学模型

  • 检查单位、符号、参考坐标系,以及状态、控制、边界量和静态参数的排列顺序;
  • 计算初值对变量边界和代数约束的违反量;
  • 确认阶段端点与事件连接方程彼此一致;
  • 缩放状态、控制、目标和约束,避免典型非零量跨越过多数量级;
  • 在整个允许区域内保护平方根、分母和对数等表达式的定义域,而不只检查预期轨迹。

临时移除一组约束有助于定位矛盾,但用于结果前必须恢复全部物理约束并重新验证。

改善初值

有效初值应具有正的阶段时长,满足固定端点和简单边界,并大致顺应动力学方向。多阶段 模型需要为每个阶段以及共享静态参数数组提供初值。前向仿真、解析近似或邻近工况的已解 轨迹通常比常数初值更有效。

还可以采用延续法:先求解较容易的问题,再逐步收紧终端目标、路径边界或模型精度,并用 上一轮结果热启动下一轮。

选择便于诊断的离散

先使用规模适中且具有物理依据的网格。点数太少会漏掉快速瞬态;第一轮就使用过大的转录 则会增加诊断难度。已知不连续点或事件应放在阶段边界。比较 Radau 与 Lobatto 前,应先 确认两种转录使用完全相同的方程和约束。

得到候选解后,应在密集时间网格上重构轨迹;条件允许时独立积分动力学,并检查节点之间的 约束违反。随后提高多项式次数或细化网格,确认轨迹、目标函数和活动约束趋于稳定。

求解器报告成功并不等同于结果已经验证。正式案例给出了 针对不同问题的检查方式;支持的调整流程见误差检查与网格调整