2

我正在编写 GEKKO 方程来确定车辆的齿轮箱比,这取决于车辆先前的导数。有没有办法将一个变量设置为另一个变量的时移值?

前任:

v=0,[1,2,3,4,5]

shift_v=[0,1,2,3,4]

其中方括号是地平线,v 是由方程定义的状态变量。

4

1 回答 1

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

Gekko 中还有一个TIME_SHIFT 功能,可以自动改变值,就好像它们在时间上前进一样。TIME_SHIFT选项控制每次求解时值的偏移量。时移发生在求解开始时。这是一个更完整的示例,其中包含结果的可视化。

与 Gekko 的时移

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 步的延迟。

于 2019-04-05T12:55:48.870 回答