python - 使用 Gekko 的最优控制问题:“未找到解决方案”
问题描述
我需要用目标函数最小化解决方案来解决最优控制问题。我的参考是 APM 示例,网址为:https ://www.youtube.com/watch?v=y26X-BSf8KU&list=PLLBUgWXdTBDjxcpH9hRuq-bsm_ti2UvoB&index=12 。
我的目标函数是 Z => integration exp(-r*t)*C(t).dt,其中 C(t) = Ii.ai + Ij.aj。Ii 和 Ij 是操纵变量,ai、aj 和 r 是常数。目标是最小 Z。
该问题受以下约束:dKi/dt = Ii – delta.Ki;dKj/dt = Ij – deltaj.Kj;和 Ki = (DB.Kj-E)/A。Ki 和 Kj 是变量,初始值 Ki0 和 Kj0 是已知的。D、A、B、delta、deltaj 和 E 是常数系数。
我开发了一个 Gekko / python 脚本如下。但是,优化脚本没有实现解决方案(“异常:@error:未找到解决方案”。我试图改变初始条件和初始猜测,但我没有实现解决方案。
from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt
import math
#Create Gekko model
m=GEKKO()
#Time points
nt=101
m.time=np.linspace(0,10,nt)
t = m.Param(value=m.time)
#Constants
A=-0.0000159
B=-0.0000506
E=0.614
deltai=0.031
deltaj=0.1
ai=10
aj=27632
r=0.085
Ii=m.MV(value=100)
Ij=m.MV(value=100)
Ii.STATUS=1
Ii.COST=0
Ij.STATUS=1
Ij.COST=0
Ki=m.Var(value=15.548)
Kj=m.Var(value=0.932)
m.Equation(Ki.dt()==Ii-deltai*Ki)
m.Equation(Kj.dt()==Ij-deltaj*Kj)
m.Equation(Ki==(0.577-B*Kj-E)/A)
#Objective
Z=m.Var()
#Final objective
Zf=m.FV()
Zf.STATUS=1
m.Connection(Zf, Z, pos2='end')
m.Equation(Z.dt() == ((m.exp(-r*t)))*(Ii*ai+Ij*aj))
m.Obj(Zf)
#Options
m.options.IMODE=6
m.options.NODES=3
m.options.SOLVER=3
m.solve()
解决方案
求解器表明您的问题是无限的。
EXIT: Iterates diverging; problem might be unbounded.
An error occured.
The error code is 4
---------------------------------------------------
Solver : IPOPT (v3.12)
Solution time : 1.44470000000729 sec
Objective : -4.152133137209157E+021
Unsuccessful with error code 0
---------------------------------------------------
Creating file: infeasibilities.txt
Use command apm_get(server,app,'infeasibilities.txt') to retrieve file
@error: Solution Not Found
Traceback (most recent call last):
File "C:\Users\johnh\Desktop\test.py", line 53, in <module>
m.solve()
File "C:\Python37\lib\site-packages\gekko\gekko.py", line 2174, in solve
raise Exception(response)
Exception: @error: Solution Not Found
s应该MV
有界限吗?
Ii=m.MV(value=100,lb=0,ub=100)
Ij=m.MV(value=100,lb=0,ub=100)
此外,通过这些界限,APPT 求解器报告该问题是不可行的。似乎有 3 个方程可以解决 2 个变量:Ki
和Kj
。
m.Equation(Ki.dt()==Ii-deltai*Ki)
m.Equation(Kj.dt()==Ij-deltaj*Kj)
m.Equation(Ki*A==(0.577-B*Kj-E))
如果你删除最后一个方程,那么你会得到一个成功的解决方案。简而言之,问题可能是无界的、过度指定的,或两者兼而有之。这是一个成功解决的版本:
from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt
import math
m=GEKKO() #Create Gekko model
nt=101 #Time points
m.time=np.linspace(0,10,nt)
t = m.Param(value=m.time)
final = np.zeros(nt); final[-1] = 1
f = m.Param(final)
#Constants
A=-0.0000159; B=-0.0000506; E=0.614
deltai=0.031; deltaj=0.1
ai=10; aj=27632; r=0.085
Ii=m.MV(value=100,lb=0,ub=100)
Ij=m.MV(value=100,lb=0,ub=100)
Ii.STATUS=1; Ii.COST=0
Ij.STATUS=1; Ij.COST=0
Ki=m.Var(value=15.548)
Kj=m.Var(value=0.932)
e = m.Intermediate(m.exp(-r*t))
m.Equation(Ki.dt()==Ii-deltai*Ki)
m.Equation(Kj.dt()==Ij-deltaj*Kj)
#m.Equation(Ki*A==(0.577-B*Kj-E))
#Minimize objective at final point
m.Minimize(f*m.integral(e*(Ii*ai+Ij*aj)))
#Options
m.options.IMODE=6; m.options.NODES=2
m.options.SOLVER=1
m.solve()
我也使用了新m.integral()
功能。您可能需要验证您的方程,您还可以尝试不同的求解器,看看是否有一个可以为您提供更有意义的信息。
Each time step contains
Objects : 0
Constants : 0
Variables : 7
Intermediates: 1
Connections : 0
Equations : 5
Residuals : 4
Number of state variables: 1600
Number of total equations: - 1400
Number of slack variables: - 0
---------------------------------------
Degrees of freedom : 200
----------------------------------------------
Dynamic Control with APOPT Solver
----------------------------------------------
Iter Objective Convergence
0 2.55775E+01 2.61383E+00
1 1.99997E-03 9.61349E-09
2 2.00000E-03 1.82031E-10
3 2.00000E-03 2.22045E-16
4 2.00000E-03 2.22045E-16
Successful solution
---------------------------------------------------
Solver : APOPT (v1.0)
Solution time : 0.498800000001211 sec
Objective : 1.999999949475750E-003
Successful solution
---------------------------------------------------
推荐阅读
- reactjs - next-mdx-remote 不通过组件
- python - 从 Google 地球引擎导出图像时,我可以在 QGIS Python 控制台的 for 循环中重复 task.start() 吗?
- javascript - 10 位或 6 位数字的正则表达式不应以“/”开头和结尾,也可以是字符串中的单个单词
- python - 如何创建具有相同键的字典列表?
- asp.net - webforms 所有执行异步回发的子节点,即使 updatemode 设置为条件
- python - SqlAlchemy - 函数总和的多列
- docker - 使用 docker compose 启动时,CORS 会阻止从前端到 Flask 服务器的请求
- octopus-deploy - 结构化变量替换不适用于 web.config (XML)
- xml - Ant 的 echo-task 和换行
- python - 打印文件名列表时没有输出