使用 "past" 值定义 GEKKO 方程中的当前值
Using "past" values to define current values in GEKKO equation
我正在编写 GEKKO 方程来确定车辆的变速箱比率,这取决于车辆的先前导数。有没有办法将一个变量设置为另一个变量的时移值?
例如:
v=0,[1,2,3,4,5]
shifted_v=[0,1,2,3,4]
其中方括号是 horizon,v 是由方程定义的状态变量。
移动数据集最简单的方法之一是使用 numpy.roll 函数。
import numpy as np
x = np.linspace(0,5,6)
y = np.roll(x,-1) # shift left
y[-1] = 6
z = np.roll(x,1) # shift right
z[0] = -1
print('x: ' + str(x))
print('y: ' + str(y))
print('z: ' + str(z))
您可以使用 Gekko 变量应用此策略,方法是使用 .value 属性 例如:
import numpy as np
from gekko import GEKKO
m = GEKKO()
m.time = np.linspace(0,5,6)
x = m.Param(value=m.time)
y = m.Param()
y.value = np.roll(x.value,-1)
y.value[-1] = 6
z = m.Param()
z.value = np.roll(x.value,1)
z.value[0] = -1
还有一个 TIME_SHIFT feature in Gekko 可以自动移动值,就好像它们在时间上前进一样。 TIME_SHIFT 选项控制每次求解时值的移动量。时移发生在求解开始时。这是一个更完整的示例,其中包含结果的可视化。
import numpy as np
from gekko import GEKKO
import matplotlib.pyplot as plt
m = GEKKO()
m.time = np.linspace(0,5,6)
x = m.Param(value=m.time)
y = m.Param()
y.value = np.roll(x.value,-1)
y.value[-1] = 6
z = m.Param()
z.value = np.roll(x.value,1)
z.value[0] = -1
s = m.Var()
m.Equation(s==x+y-z)
m.options.IMODE=4
m.solve()
plt.subplot(2,1,1)
plt.plot(m.time,x.value,label='x')
plt.plot(m.time,y.value,label='y')
plt.plot(m.time,z.value,label='z')
plt.legend()
# solve a second time
m.options.TIME_SHIFT = 1 # default is 1
m.solve()
plt.subplot(2,1,2)
plt.plot(m.time,x.value,label='x')
plt.plot(m.time,y.value,label='y')
plt.plot(m.time,z.value,label='z')
plt.legend()
plt.show()
从你的问题来看,你似乎需要计算一个变量的前导数。如果您需要在计算期间对值进行时移,而不仅仅是在初始化阶段,那么我建议使用延迟 1 个时间步长的 discrete state space model。 link 提供了一个示例,说明如何通过 4 个延迟步骤来实现这一点。您可能希望修改离散状态矩阵 space 以在导数和齿轮箱比率之间有 1 步延迟。
我正在编写 GEKKO 方程来确定车辆的变速箱比率,这取决于车辆的先前导数。有没有办法将一个变量设置为另一个变量的时移值?
例如:
v=0,[1,2,3,4,5]
shifted_v=[0,1,2,3,4]
其中方括号是 horizon,v 是由方程定义的状态变量。
移动数据集最简单的方法之一是使用 numpy.roll 函数。
import numpy as np
x = np.linspace(0,5,6)
y = np.roll(x,-1) # shift left
y[-1] = 6
z = np.roll(x,1) # shift right
z[0] = -1
print('x: ' + str(x))
print('y: ' + str(y))
print('z: ' + str(z))
您可以使用 Gekko 变量应用此策略,方法是使用 .value 属性 例如:
import numpy as np
from gekko import GEKKO
m = GEKKO()
m.time = np.linspace(0,5,6)
x = m.Param(value=m.time)
y = m.Param()
y.value = np.roll(x.value,-1)
y.value[-1] = 6
z = m.Param()
z.value = np.roll(x.value,1)
z.value[0] = -1
还有一个 TIME_SHIFT feature in Gekko 可以自动移动值,就好像它们在时间上前进一样。 TIME_SHIFT 选项控制每次求解时值的移动量。时移发生在求解开始时。这是一个更完整的示例,其中包含结果的可视化。
import numpy as np
from gekko import GEKKO
import matplotlib.pyplot as plt
m = GEKKO()
m.time = np.linspace(0,5,6)
x = m.Param(value=m.time)
y = m.Param()
y.value = np.roll(x.value,-1)
y.value[-1] = 6
z = m.Param()
z.value = np.roll(x.value,1)
z.value[0] = -1
s = m.Var()
m.Equation(s==x+y-z)
m.options.IMODE=4
m.solve()
plt.subplot(2,1,1)
plt.plot(m.time,x.value,label='x')
plt.plot(m.time,y.value,label='y')
plt.plot(m.time,z.value,label='z')
plt.legend()
# solve a second time
m.options.TIME_SHIFT = 1 # default is 1
m.solve()
plt.subplot(2,1,2)
plt.plot(m.time,x.value,label='x')
plt.plot(m.time,y.value,label='y')
plt.plot(m.time,z.value,label='z')
plt.legend()
plt.show()
从你的问题来看,你似乎需要计算一个变量的前导数。如果您需要在计算期间对值进行时移,而不仅仅是在初始化阶段,那么我建议使用延迟 1 个时间步长的 discrete state space model。 link 提供了一个示例,说明如何通过 4 个延迟步骤来实现这一点。您可能希望修改离散状态矩阵 space 以在导数和齿轮箱比率之间有 1 步延迟。