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

问题描述

multiple-target optimal control problem

我将不胜感激任何微小的建议。 下面的代码是根据@TexasEngineer 写的代码修改的,但是我还是觉得不完全是我想要的。 附注有一篇文章使用非常复杂的编程方法处理几乎相同的问题,由于我的知识有限,我没有完全理解他们的方法,尽管他们在附录中非常详细地解释了整个编程过程。(见{ {3}})

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 可以解决多个目标,但只需将它们加在一起即可。您的问题陈述中缺少一条信息。它没有指定微分方程中的 pub(crate)int a = 2; int arr[4] = {a,a,a}; 还是 u(t)。这是一个假定它是 u1(t) 的版本。 u2(t)u1(t) 包含 1e-5 的下限以避免被零除。

Solution

x

这是IPOPT解决方案。

u

可以得到1007.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,'r:',label=r'$u_2$')
plt.xlabel('Time'); plt.ylabel('Value'); plt.legend()
plt.show()

Gekko 通过乘以 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 --------------------------------------------------- print(-m.options.OBJFCNVAL) 问题转换为 Maximize 问题。求解器报告的目标是最小化,因此您需要乘以 Minimize 以获得原始目标。