我正在编写 GEKKO 方程来确定车辆的齿轮箱比,这取决于车辆先前的导数。有没有办法将一个变量设置为另一个变量的时移值?
前任:
v=0,[1,2,3,4,5]
shift_v=[0,1,2,3,4]
其中方括号是地平线,v 是由方程定义的状态变量。
我正在编写 GEKKO 方程来确定车辆的齿轮箱比,这取决于车辆先前的导数。有没有办法将一个变量设置为另一个变量的时移值?
前任:
v=0,[1,2,3,4,5]
shift_v=[0,1,2,3,4]
其中方括号是地平线,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))
您可以使用 .value 属性使用 Gekko 变量应用此策略,例如:
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
Gekko 中还有一个TIME_SHIFT 功能,可以自动改变值,就好像它们在时间上前进一样。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 个时间步长的离散状态空间模型。该链接提供了一个示例,说明如何通过 4 个延迟步骤来实现这一点。您可能希望修改离散状态空间矩阵以在导数和齿轮箱比之间有 1 步的延迟。