我可以在Gekko中使用设置初始条件y(0)= 5,y = m.Var(5)
但如何设置不是初始条件的值,例如y(3)= 6,其中时间= 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)
,值稍后会由求解器更改。我可以固定其中一个不在初始状态的值吗?这类似于边界值问题,其中起点或终点固定,但在这种情况下,指定值位于时间范围内。
首先,要在fixed_initial=False
指定时使用option计算初始条件x=m.Var()
。模型构建功能m.fix()
可以固定地平线上的任意点,例如,m.fix(x,pos=3,val=6)
但也可以固定该点的导数。
一种替代方法是指定一个目标,以最大程度地减少与6
时间= 3的值的偏差。
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()
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句