我可以使用y = m.Var(5)
在Gekko中设置初始条件y(0)= 5,但是如何设置不是初始条件的值,例如y(3)= 6,其中time = 3是6,如红点所示?
from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt
m = GEKKO(remote=False)
m.time = np.linspace(0,10,11)
x = m.Var(np.ones(11)*6)
m.Equation(5*x.dt() == -x)
m.options.IMODE = 4
m.solve()
plt.plot(m.time, x.value)
plt.plot([3],[6],'ro',MarkerSize=5)
plt.show()
我遇到一个模拟问题,需要解决方案才能沿时间范围m.time = [0,1,2,3,4,5,6,7,8,9,10]
得出中间值。当我用x=m.Var(np.ones(11)*6)
初始化时,求解器随后会更改值。我可以固定其中一个不在初始状态的值吗?这类似于边界值问题,其中起点或终点是固定的,但在这种情况下,指定的值在时间范围内。
答案 0 :(得分:2)
首先,当您指定fixed_initial=False
时,要使用x=m.Var()
选项计算初始条件。模型构建函数m.fix()
可以固定地平线上的任何点,例如m.fix(x,pos=3,val=6)
,但这也可以固定该点的导数。
另一种方法是指定一个目标,以最大程度地减少在时间= 3时与6
的值的偏差。
pi = np.zeros(11); pi[3]=1
p = m.Param(pi)
m.Minimize(p*(x-6)**2)
这将在各处创建目标,但是p
在时间= 3时仅为非零。
from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt
m = GEKKO(remote=False)
m.time = np.linspace(0,10,11)
x = m.Var(np.zeros(11)*6,fixed_initial=False)
m.Equation(5*x.dt() == -x)
pi = np.zeros(11); pi[3]=1
p = m.Param(pi)
m.Minimize(p*(x-6)**2)
m.options.IMODE = 6
m.solve()
plt.plot(m.time, x.value)
plt.plot([3],[6],'ro',MarkerSize=5)
plt.show()
答案 1 :(得分:1)
Bryson benchmark problem (see #2)显示了四种方法来修正不是初始条件的值。
if option == 1:
# most likely to cause DOF issues because of many
# zero (0==0) equations
m.Equation(final*x1 == 0)
m.Equation(final*x2 == 0)
elif option == 2:
# inequality constraint approach is better but there
# are still many inactive equations
m.Equation((final*x1)**2 <= 0)
m.Equation((final*x2)**2 <= 0)
elif option == 3: #requires GEKKO version >= 0.0.3a2
# fix the value just at the endpoint (best option)
m.fix(x1,pos=nt-1,val=0)
m.fix(x2,pos=nt-1,val=0)
else:
#penalty method ("soft constraint") that may influence
# optimal solution because there is just one
# combined objective and it may interfere with
# minimizing myObj
m.Obj(1000*(final*x1)**2)
m.Obj(1000*(final*x2)**2)
m.Obj(myObj*final)
此代码可以修改为在中间有一个点。