Использование «прошлых» значений для определения текущих значений в уравнении GEKKO - PullRequest
2 голосов
/ 04 апреля 2019

Я пишу уравнения GEKKO для определения передаточного числа транспортного средства, которое зависит от предыдущих производных транспортного средства.Есть ли способ установить переменную в значение сдвига во времени другой переменной?

Пример:

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

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

, где квадратная скобка - горизонт, а v - переменная состояния, определяемая уравнениями.

1 Ответ

1 голос
/ 05 апреля 2019

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

Time shift with 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 шаг задержки между производной и передаточным числом.

...