[英]Can GEKKO solve the problem that two dynamic optimal control processes are conducting simultaneously?
我将不胜感激任何微小的建议。 下面的代码是根据@TexasEngineer 写的代码修改的,但我还是觉得不是我想要的。 PS 有一篇文章用非常复杂的编程方法解决了几乎相同的问题,虽然他们在附录中非常详细地解释了整个编程过程,但由于我的知识有限,我没有完全理解他们的方法。(见https://www.nber.org/system/files/working_papers/w27840/w27840.pdf )
import numpy as np
from gekko import GEKKO
import matplotlib.pyplot as plt
# define variables
t = np.linspace(0,100,101)
m = GEKKO(); m.time=t
tt = m.Var(0)
x = m.Var(50,lb=1e-5)
u = m.Array(m.MV,2,value=1,lb=1e-5,ub=10)
# differential equation
m.Equation(x.dt()==x*(1-x/2)-u[0])
m.Equation(tt.dt()==1)
# Change u1 to maximize the first objective function, and change u2 to maximize the second objective function, and let the two processes alternate.
if (-1)**tt.value-1==0:
u[0].STATUS = 1
u[1].STATUS = 0
else:
u[0].STATUS = 0
u[1].STATUS = 1
# create parameter to maximize only final integral
final = np.zeros(101); final[-1]=1
p = m.Param(final)
# objective 1
m.Maximize((((-1)**tt+1)/2)*p*m.integral((10-5/x)*np.prod(u)))
# objective 2
m.Maximize(-((((-1)**tt+1)/2)-1)*p*m.integral((20-8/(x*u[1]))*u[0]))
# solve
m.options.IMODE=6
m.options.NODES=3
m.options.MAX_ITER=200
m.solve()
# plot
plt.plot(m.time,x.value,'k-',label='x')
plt.plot(m.time,u[0].value,'b--',label=r'$u_1$')
plt.plot(m.time,u[1].value,'r:',label=r'$u_2$')
plt.xlabel('Time'); plt.ylabel('Value'); plt.legend()
plt.show()
是的,Gekko 可以解决多个目标,但只需将它们加在一起即可。 您的问题陈述中缺少一条信息。 它没有指定在微分方程中u(t)
是u1(t)
还是u2(t)
。 这是一个假设它是u1(t)
的版本。 x
和u
的下限为1e-5
以避免被零除。
import numpy as np
from gekko import GEKKO
import matplotlib.pyplot as plt
t = np.linspace(0,10,101)
m = GEKKO(); m.time=t
x = m.Var(50,lb=1e-5)
u = m.Array(m.MV,2,value=1,lb=1e-5,ub=10)
for i in range(2):
u[i].STATUS=1
# create parameter to maximize only final integral
final = np.zeros(101); final[-1]=1
p = m.Param(final)
# objective 1
m.Maximize(p*m.integral((10-5/x)*np.prod(u)))
# objective 2
m.Maximize(p*m.integral((20-8/(x*u[1]))*u[0]))
# differential equation
m.Equation(x.dt()==x*(1-x/2)-u[0])
# solve
m.options.IMODE=6
m.options.NODES=3
m.solve()
# plot
plt.plot(m.time,x.value,'k-',label='x')
plt.plot(m.time,u[0].value,'b--',label=r'$u_1$')
plt.plot(m.time,u[0].value,'r:',label=r'$u_2$')
plt.xlabel('Time'); plt.ylabel('Value'); plt.legend()
plt.show()
这是 IPOPT 解决方案。
EXIT: Optimal Solution Found.
The solution was found.
The final value of the objective function is -1007.50065504272
---------------------------------------------------
Solver : IPOPT (v3.12)
Solution time : 0.827599999996892 sec
Objective : -1007.50065504272
Successful solution
---------------------------------------------------
您可以获得 1007.5 的目标 function 的最大化版本
print(-m.options.OBJFCNVAL)
Gekko 通过乘以-1
将Maximize
问题转换为Minimize
问题。 求解器报告的目标是最小化,因此您需要乘以-1
以获得原始目标。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.