Один из самых простых способов смещения наборов данных - использовать функцию 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
В 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 шаг задержки между производной и передаточным числом.