Optimization Scipy.optimize.minimize轨迹优化(成本函数最小化)

Optimization Scipy.optimize.minimize轨迹优化(成本函数最小化),optimization,scipy,minimization,gekko,Optimization,Scipy,Minimization,Gekko,我在这里发布了一个问题,询问如何解决这个问题: 理想情况下,我只想最小化最终时间,但我无法让优化器将时间附加到可以适当调整的变量中,因此我决定现在只尝试最小化u^2 代码如下: 代码运行,但优化器失败。这是输出的错误 c1 0.0 c2 0.0 c3 -100.0 c4 -100.0 c1 0.0 c2 0.0 c3 -100.0 c4 -100.0 c1 0.0 c1 0.0 c1 0.0 c1 0.0 c1 0.0 c1 0.0 c1 0.0 c1 0.0 c1 0.0

我在这里发布了一个问题,询问如何解决这个问题:

理想情况下,我只想最小化最终时间,但我无法让优化器将时间附加到可以适当调整的变量中,因此我决定现在只尝试最小化u^2

代码如下:


代码运行,但优化器失败。这是输出的错误

        c1 0.0
c2 0.0
c3 -100.0
c4 -100.0
c1 0.0
c2 0.0
c3 -100.0
c4 -100.0
c1 0.0
c1 0.0
c1 0.0
c1 0.0
c1 0.0
c1 0.0
c1 0.0
c1 0.0
c1 0.0
c1 0.0
c1 0.0
c2 0.0
c2 0.0
c2 0.0
c2 0.0
c2 0.0
c2 0.0
c2 0.0
c2 0.0
c2 0.0
c2 0.0
c2 0.0
c3 -100.0
c3 -73.76543209876543
c3 -50.617283950617285
c3 -56.79012345679013
c3 -62.96296296296296
c3 -69.1358024691358
c3 -75.30864197530863
c3 -81.4814814814815
c3 -87.65432098765432
c3 -93.82716049382715
c3 -98.45679012345678
c4 -100.0
c4 -72.22222222222223
c4 -44.44444444444445
c4 -44.44444444444445
c4 -44.44444444444445
c4 -44.444444444444436
c4 -44.44444444444445
c4 -44.44444444444448
c4 -44.44444444444445
c4 -44.44444444444442
c4 -72.22222222222221
Singular matrix C in LSQ subproblem    (Exit mode 6)
            Current function value: 4225000.0
            Iterations: 1
            Function evaluations: 12
            Gradient evaluations: 1
     fun: 4225000.0
     jac: array([1800., 1800., 1800., 1800., 1800., 1800., 1800., 1800., 1800.,
       1800.])
 message: 'Singular matrix C in LSQ subproblem'
    nfev: 12
     nit: 1
    njev: 1
  status: 6
 success: False
       x: array([650., 650., 650., 650., 650., 650., 650., 650., 650., 650.])
似乎在一些迭代中没有满足这些约束。我是否应该切换目标函数以包含最终速度和最终位置?我尝试了不同的步长,但退出代码不同

有没有更好的方法来使用这个函数来实现我想要得到的?我试图得到从t0到tf的整个时间间隔内的控制向量u(t),这样我就可以把这些命令发送给火箭进行最优控制。现在,我已经将优化简化为一个轴,只是为了学习如何使用该函数。但正如你所看到的,我没有成功


类似的例子将非常有用,我对其他优化方法持开放态度,只要它们是数值的,并且相对较快,因为我计划最终将其作为模型预测控制器实时实现。

您的模型既有代数方程也有微分方程。您需要DAE解算器来解算上述隐式ODE函数。我所知道的一个这样的包裹就是gekko。() Gekko专门研究线性、混合整数和非线性优化问题的动态优化

下面是一个火箭发射问题的例子,它使最后的发射时间最小化。可在


非常感谢。这就是我要找的。
        c1 0.0
c2 0.0
c3 -100.0
c4 -100.0
c1 0.0
c2 0.0
c3 -100.0
c4 -100.0
c1 0.0
c1 0.0
c1 0.0
c1 0.0
c1 0.0
c1 0.0
c1 0.0
c1 0.0
c1 0.0
c1 0.0
c1 0.0
c2 0.0
c2 0.0
c2 0.0
c2 0.0
c2 0.0
c2 0.0
c2 0.0
c2 0.0
c2 0.0
c2 0.0
c2 0.0
c3 -100.0
c3 -73.76543209876543
c3 -50.617283950617285
c3 -56.79012345679013
c3 -62.96296296296296
c3 -69.1358024691358
c3 -75.30864197530863
c3 -81.4814814814815
c3 -87.65432098765432
c3 -93.82716049382715
c3 -98.45679012345678
c4 -100.0
c4 -72.22222222222223
c4 -44.44444444444445
c4 -44.44444444444445
c4 -44.44444444444445
c4 -44.444444444444436
c4 -44.44444444444445
c4 -44.44444444444448
c4 -44.44444444444445
c4 -44.44444444444442
c4 -72.22222222222221
Singular matrix C in LSQ subproblem    (Exit mode 6)
            Current function value: 4225000.0
            Iterations: 1
            Function evaluations: 12
            Gradient evaluations: 1
     fun: 4225000.0
     jac: array([1800., 1800., 1800., 1800., 1800., 1800., 1800., 1800., 1800.,
       1800.])
 message: 'Singular matrix C in LSQ subproblem'
    nfev: 12
     nit: 1
    njev: 1
  status: 6
 success: False
       x: array([650., 650., 650., 650., 650., 650., 650., 650., 650., 650.])
import numpy as np
import matplotlib.pyplot as plt
from gekko import GEKKO

# create GEKKO model
m = GEKKO()

# scale 0-1 time with tf
m.time = np.linspace(0,1,101)

# options
m.options.NODES = 6
m.options.SOLVER = 3
m.options.IMODE = 6
m.options.MAX_ITER = 500
m.options.MV_TYPE = 0
m.options.DIAGLEVEL = 0

# final time
tf = m.FV(value=1.0,lb=0.1,ub=100)
tf.STATUS = 1

# force
u = m.MV(value=0,lb=-1.1,ub=1.1)
u.STATUS = 1
u.DCOST = 1e-5

# variables
s = m.Var(value=0)
v = m.Var(value=0,lb=0,ub=1.7)
mass = m.Var(value=1,lb=0.2)

# differential equations scaled by tf
m.Equation(s.dt()==tf*v)
m.Equation(mass*v.dt()==tf*(u-0.2*v**2))
m.Equation(mass.dt()==tf*(-0.01*u**2))

# specify endpoint conditions
m.fix(s, pos=len(m.time)-1,val=10.0)
m.fix(v, pos=len(m.time)-1,val=0.0)

# minimize final time
m.Obj(tf)

# Optimize launch
m.solve()

print('Optimal Solution (final time): ' + str(tf.value[0]))

# scaled time
ts = m.time * tf.value[0]

# plot results
plt.figure(1)
plt.subplot(4,1,1)
plt.plot(ts,s.value,'r-',linewidth=2)
plt.ylabel('Position')
plt.legend(['s (Position)'])

plt.subplot(4,1,2)
plt.plot(ts,v.value,'b-',linewidth=2)
plt.ylabel('Velocity')
plt.legend(['v (Velocity)'])

plt.subplot(4,1,3)
plt.plot(ts,mass.value,'k-',linewidth=2)
plt.ylabel('Mass')
plt.legend(['m (Mass)'])

plt.subplot(4,1,4)
plt.plot(ts,u.value,'g-',linewidth=2)
plt.ylabel('Force')
plt.legend(['u (Force)'])

plt.xlabel('Time')
plt.show()