目标为滞后变量的GEKKO动态优化



我正在尝试使用GEKKO优化以下目标函数:

Objective = sum[(Y(t)/Y(t-1)) - G(t)]^2

其中目标函数在时间t=0到10上求和。Y(t(是在时间段t处的选择/控制变量,G(t(为给定的教导时间段t的值。约束条件为:(1(Y(0(=5.64(2(Y(10(=3。

我对python中的优化非常陌生。下面的代码可能有很多错误。有人能帮忙吗?非常感谢。

#Problem 2
from gekko import GEKKO
import numpy as np
#initialize 
m= GEKKO()
#time points (say we have 10 time points)
nt= 10
m.time = np.linspace (0,1,nt)
#variables (say initial value of y at t=0 is given as 5.64)
y_init = np.array([5.64]*nt)
yo = [ m.Var ( value = y_init [ i ] ) for i in range ( nt ) ]
#parameter
g_init=np.array([-0.025751073, -0.026431718, -0.027149321, -0.025581395, 
-0.026252983, -0.022058824, -0.020050125, -0.015345269, 
-0.015584416, -0.01055409])
g =[ m.Param ( value = gs_init [ i ] ) for i in range ( nt ) ]
#Equations
a1=5.64
a2=3.1
m.Equation(yo[0]==a1)
m.Equation(yo[9]==a2)
#Objective Function 
m.Obj(sum(((yo[i] /yo[i-1]) - g[i] )**2 ) for i in range(nt-1))
#set global options
m.options.IMODE =6
m.solve(disp=True) 

不需要动态优化模式(IMODE=6(,因为没有微分方程。这是一个使用IMODE=3修改的解决方案脚本。我添加了一个下界(lb=1e-5(,否则求解器无法找到解决方案,因为在目标函数中除以零。

from gekko import GEKKO
import numpy as np
m= GEKKO()
nt= 10
a1=5.64; a2=3.1
yo = m.Array(m.Var,nt,value=a1,lb=1e-5)
gi=[-0.025751073, -0.026431718, -0.027149321, -0.025581395, 
-0.026252983, -0.022058824, -0.020050125, -0.015345269, 
-0.015584416, -0.01055409]
g = [m.Param(value=gi[i]) for i in range (nt)]
m.Equation(yo[0]==a1)
m.Equation(yo[9]==a2)
for i in range(nt-1):
m.Minimize(((yo[i]/yo[i-1])-g[i])**2)
m.options.IMODE = 3
m.options.SOLVER = 1
m.solve(disp=True)
print(yo)

它产生了解决方案:

[[5.64] [5.267947462] [4.9219842299] [3.8147730229] [0.30626159246]
[0.023821036642] [0.0018246461089] [0.00013501474087] [1e-05] [3.1]]

我建议检查目标函数,因为gi值表明最佳yo解决方案应该逐渐变小,并在正和负之间交替,以具有负比率。

最新更新