繁体   English   中英

GEKKO能否解决两个动态最优控制过程同时进行的问题?

[英]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)的版本。 xu的下限为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 通过乘以-1Maximize问题转换为Minimize问题。 求解器报告的目标是最小化,因此您需要乘以-1以获得原始目标。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM