我正在写GEKKO方程来确定车辆的变速箱比,该比取决于车辆的先前导数。有没有办法将一个变量设置为另一个变量的时移值?
例如:
v = 0,[1,2,3,4,5]
shifted_v = [0,1,2,3,4]
其中方括号是水平线,v是方程式定义的状态变量。
答案 0 :(得分:1)
转移数据集最简单的方法之一是使用 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
还有一个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。该链接提供了一个如何通过四个延迟步骤实现此示例的示例。您可能希望修改离散状态空间矩阵,以使导数与齿轮箱比之间具有1阶的延迟。