我正在尝试使用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
解决方案应该逐渐变小,并在正和负之间交替,以具有负比率。