问题描述
我正在开发一个摩托车单圈时间模拟器,该模拟器使用 IPOPT 来解决最小化单圈时间的最佳控制问题。我遇到了一个奇怪的问题,它有几个症状。我不确定这是否与问题公式或我的优化器设置或其他方面有关。
优化器没有收敛,所以我在 30 次迭代后将其切断。我能够得到自行车时间序列的一些结果,尽管它们有点颠簸。
首先,当自行车接近一圈终点时,自行车会出现非常大的减速。虽然看起来自行车的速度没有受到影响,但时间序列中的最终值与之前的速度值大致相同。
在整个优化过程中,对偶和原始不可行性值仍然很高。
lg(mu) 值在整个问题中仍然很高,实际上在整个问题中都在增加。
我认为可能是我错误地定义了问题,并且自行车正试图准确地在终点线上完成,并且使用加速度来校正速度以实现这一目标。这可能就是 lg(mu) 稳步增加的原因。虽然我不知道这是否正确。
这里有一些迭代:
iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls
0 5.0000000e+01 7.61e+00 1.06e+00 0.0 0.00e+00 - 0.00e+00 0.00e+00 0
1 5.2354734e+01 1.25e+02 2.61e+04 1.0 3.72e+02 - 4.49e-01 1.05e-01f 2
2 5.8209179e+01 1.13e+02 4.89e+04 1.3 5.74e+02 - 3.30e-01 2.38e-01f 1
3 5.8427608e+01 1.09e+02 7.80e+04 1.3 2.26e+03 - 5.29e-02 3.40e-02h 1
4 5.7286457e+01 1.05e+02 1.58e+05 1.3 3.27e+03 - 5.93e-02 4.73e-02h 1
5 5.4742469e+01 1.00e+02 1.68e+05 1.3 1.08e+03 - 9.76e-02 9.39e-02h 1
6 5.3103432e+01 9.65e+01 3.23e+05 1.3 8.30e+02 - 3.88e-02 4.60e-02h 1
7 5.1403543e+01 9.27e+01 2.96e+05 1.3 3.32e+02 - 9.96e-02 4.42e-02h 1
8 4.8435240e+01 8.68e+01 3.25e+05 1.3 9.18e+02 - 1.33e-01 7.93e-02h 1
9 4.6636072e+01 8.34e+01 2.54e+05 1.8 1.96e+03 - 7.10e-02 4.57e-02h 1
iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls
10 4.5624201e+01 8.31e+01 5.34e+05 2.6 6.59e+03 - 3.66e-02 2.25e-02f 1
11 4.5396562e+01 8.15e+01 8.21e+06 -4.4 2.19e+03 - 5.52e-02 2.13e-02h 1
12 4.4770540e+01 8.64e+01 1.35e+06 3.1 2.09e+04 - 1.89e-02 1.28e-02f 1
13 4.3376367e+01 9.29e+01 1.63e+06 3.4 9.37e+03 - 3.07e-02 2.18e-02f 1
14 4.3629802e+01 1.05e+02 9.69e+06 3.3 3.05e+03 - 3.69e-02 2.34e-02f 1
15 4.3981118e+01 1.03e+02 3.18e+06 3.3 5.75e+03 - 8.46e-02 4.62e-02f 1
16 4.4061311e+01 1.01e+02 3.15e+06 3.6 5.42e+03 - 4.83e-02 2.46e-02f 1
17 4.4041548e+01 1.00e+02 3.58e+06 3.6 2.39e+03 - 6.00e-02 3.60e-03h 1
18 4.3262006e+01 8.41e+01 3.57e+07 3.2 3.70e+03 - 2.31e-02 3.58e-02h 1
19 4.4835984e+01 9.57e+01 4.87e+07 4.4 3.48e+04 - 3.97e-02 1.57e-02f 1
iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls
20 4.4439370e+01 9.39e+01 5.39e+07 3.2 5.56e+03 - 4.40e-03 8.81e-03h 2
21 4.3925581e+01 9.28e+01 5.73e+07 3.2 8.07e+03 - 3.75e-02 1.32e-02h 1
22 4.2768412e+01 1.03e+02 1.72e+08 3.2 5.42e+03 - 2.22e-02 3.43e-02h 1
23 4.2551257e+01 1.02e+02 2.15e+08 3.6 5.82e+03 - 8.74e-02 7.16e-03h 1
24 4.2023292e+01 9.45e+01 3.90e+08 3.7 3.55e+03 - 2.65e-02 4.02e-02h 1
25 4.1719605e+01 9.26e+01 1.44e+08 4.2 4.45e+03 - 7.99e-02 5.57e-02f 1
26 4.1331097e+01 8.89e+01 2.64e+07 2.9 2.85e+03 - 5.92e-02 3.60e-02h 1
27 4.1143710e+01 8.75e+01 4.59e+07 3.7 2.73e+03 - 6.33e-02 1.50e-02h 1
28 4.2020100e+01 2.19e+02 4.59e+08 4.6 1.56e+04 - 2.37e-03 7.91e-02f 1
29 4.1767670e+01 2.16e+02 4.52e+08 3.4 3.64e+03 - 3.53e-02 1.56e-02h 1
iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls
30 4.0837002e+01 2.13e+02 3.87e+08 3.4 9.14e+03 - 3.52e-02 4.11e-02h 1
31 4.0047846e+01 2.15e+02 9.25e+08 4.4 2.67e+04 - 1.35e-01 2.10e-02h 1
32 3.9770188e+01 2.14e+02 2.55e+08 -2.2 1.80e+04 - 1.50e-02 7.12e-03h 1
33 3.9584783e+01 2.13e+02 3.63e+08 4.6 3.79e+04 - 5.50e-02 8.17e-03h 1
34 3.9240198e+01 2.12e+02 4.33e+08 4.6 5.02e+04 - 4.00e-03 1.47e-02h 1
35 3.8725727e+01 2.10e+02 2.96e+08 4.6 3.30e+04 - 5.70e-02 2.37e-02f 2
36 3.8716577e+01 2.12e+02 2.19e+08 4.6 6.89e+03 - 6.33e-03 1.19e-02H 1
37r 3.8716577e+01 2.12e+02 1.00e+03 4.6 0.00e+00 - 0.00e+00 2.92e-07R 16
38r 3.8713861e+01 2.40e+02 3.60e+03 -1.5 2.46e+04 - 1.12e-01 4.00e-02f 1
39 3.8709293e+01 2.40e+02 1.02e+05 1.9 2.12e+03 - 4.93e-01 8.65e-04f 1
iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls
40 4.0422833e+01 3.28e+02 8.00e+05 3.0 4.39e+04 - 4.88e-02 5.47e-02f 1
如果您想看一下,这里有一个存储库,IPOPT 选项位于 problemSolver.py 中。 https://github.com/RoryMcDonald/LTS-Help
解决方法
是的,您绝对没有收敛。我查看了您的 TrackingODE,许多输出都具有除以 (1-n*k) 形式的奇点。我注意到 IPOPT 确实不能很好地处理奇点。
在我的例子中,奇点是由 v 速度除法引起的,我在初始阶段使用不包含奇点的简化 ODE 解决了这个问题,当 v 大到不会引起问题时结束。
我认为类似的东西不会适用于您的系统,但这只是粗略地查看。也许您可以将 1/(1-x) 展开为泰勒级数 1 + x + x^2 + x^3 + ... 并忽略高于某个幂的项。