最佳答案
将 minimax 与最优控制结合起来没有问题。还有关于使用 Jennings example problem 最小化最终时间的信息作为基准最优控制问题。这是一个 Minimax example problem from the APMonitor documentation :
from gekko import GEKKO
m = GEKKO(remote=False)
x1,x2,x3,Z = m.Array(m.Var,4)
m.Minimize(Z)
m.Equation(x1+x2+x3==15)
m.Equations([Z>=x1,Z>=x2,Z>=x3])
m.solve()
print('x1: ',x1.value[0])
print('x2: ',x2.value[0])
print('x3: ',x3.value[0])
print('Z: ',Z.value[0])
这是 Jennings OCP 解决方案,其中最终时间最小化:
import numpy as np
from gekko import GEKKO
import matplotlib.pyplot as plt
m = GEKKO()
nt = 501; tm = np.linspace(0,1,nt); m.time = tm
# Variables
x1 = m.Var(value=np.pi/2.0)
x2 = m.Var(value=4.0)
x3 = m.Var(value=0.0)
p = np.zeros(nt)
p[-1] = 1.0
final = m.Param(value=p)
# FV
tf = m.FV(value=1.0,lb=0.1,ub=100.0)
tf.STATUS = 1
# MV
u = m.MV(value=0,lb=-2,ub=2)
u.STATUS = 1
m.Equation(x1.dt()==u*tf)
m.Equation(x2.dt()==m.cos(x1)*tf)
m.Equation(x3.dt()==m.sin(x1)*tf)
m.Equation(x2*final<=0)
m.Equation(x3*final<=0)
m.Minimize(tf)
m.options.IMODE = 6
m.solve()
print('Final Time: ' + str(tf.value[0]))
tm = tm * tf.value[0]
plt.figure(1)
plt.plot(tm,x1.value,'k-',lw=2,label=r'$x_1$')
plt.plot(tm,x2.value,'b-',lw=2,label=r'$x_2$')
plt.plot(tm,x3.value,'g--',lw=2,label=r'$x_3$')
plt.plot(tm,u.value,'r--',lw=2,label=r'$u$')
plt.legend(loc='best')
plt.xlabel('Time')
plt.ylabel('Value')
plt.show()
结合这两类问题:
import numpy as np
from gekko import GEKKO
import matplotlib.pyplot as plt
m = GEKKO()
nt = 501
tm = np.linspace(0,1,nt)
m.time = tm
x1 = m.Var(value=np.pi/2.0)
x2 = m.Var(value=4.0)
x3 = m.Var(value=0.0)
p = np.zeros(nt)
p[-1] = 1.0
final = m.Param(value=p)
tf = m.FV(value=1.0,lb=0.1,ub=100.0)
tf.STATUS = 1
m.Minimize(tf)
Z = m.Var()
m.Minimize(Z)
m.Equations([Z>=x1,Z>=x2,Z>=x3])
m.Maximize(x1)
m.Maximize(x2)
m.Maximize(x3)
u = m.MV(value=0,lb=-2,ub=2)
u.STATUS = 1
m.Equation(x1.dt()==u*tf)
m.Equation(x2.dt()==m.cos(x1)*tf)
m.Equation(x3.dt()==m.sin(x1)*tf)
m.Equation(x2*final<=0)
m.Equation(x3*final<=0)
m.options.IMODE = 6
m.solve()
print('Final Time: ' + str(tf.value[0]))
tm = tm * tf.value[0]
plt.figure(1)
plt.plot(tm,x1.value,'k-',lw=2,label=r'$x_1$')
plt.plot(tm,x2.value,'b-',lw=2,label=r'$x_2$')
plt.plot(tm,x3.value,'g--',lw=2,label=r'$x_3$')
plt.plot(tm,u.value,'r--',lw=2,label=r'$u$')
plt.legend(loc='best')
plt.xlabel('Time')
plt.ylabel('Value')
plt.show()
关于math - GEKKO 能否解决 Minimax 最优控制问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74788425/