Гекко, динамически ограничивают нижнюю границу переменных на основе интервалов

Например, если у меня есть переменная f, я хочу, чтобы нижняя граница была

  • 0.1 if f < 0.25
  • 0.75 if f < 1
  • 1.25 if f < 1.5
  • 1.7 if f >= 1.5

Я пробовал следующее безрезультатно

limit1 = m.if3(f-0.25, 0.1, 0.25)
limit2 = m.if3(f-1,limit1, 0.75)
limit3 = m.if3(f-1.5, limit2, 1.7)
f.lower = limit3.value
f.upper = 3

Кажется, можно правильно установить нижнюю границу, но когда я это сделаю

print(f.lower,"<", f.value,"<", f.upper)

Я получаю [0.1] < [constant value independent of lower bound] < 3

Теперь у меня есть несколько переменных, таких как f, в массиве с разными возможностями нижней границы, и все они имеют одинаковые значения, как если бы нижняя граница даже не имела значения.

При написании

f.lower=f1

затем, когда я печатаю f.lower.value, я получаю

[correct lower bound] < [upper bound] < upper bound

Я, вероятно, неправильно подхожу к проблеме, поэтому мне нужна помощь.


person user4676310    schedule 10.06.2020    source источник


Ответы (1)


Значения .lower и .upper переменной Gekko имеют одно значение и не регулируются оптимизатором во время итераций.

Вы можете создать любую произвольную связь (например, пошаговую функцию) с помощью кусочно-линейной pwl функции, такой как показано в Методы построения моделей. В вашем случае вы хотите, чтобы lower изменялся при изменении значения f. Вот одна реализация только для демонстрации функции для lower, поскольку она зависит от f:

Кусочно-линейная функция

from gekko import GEKKO
import numpy as np
m = GEKKO()
f = m.Param(np.linspace(0,2,200))
lower = m.Var()

d=1e-5
x_data = [-1e5,0.25,0.25+d,1,1+d,1.5,1.5+d,1e5]
y_data = [0.1,0.1,0.75,0.75,1.25,1.25,1.7,1.7]

m.pwl(f,lower,x_data,y_data)
#m.Equation(f>=lower)

m.options.IMODE = 2
m.solve()

import matplotlib.pyplot as plt
plt.plot(f,lower,'b--')
plt.plot(x_data,y_data,'ro')
plt.xlim([0,2])
plt.show()

Я закомментировал уравнение m.Equation(f>=lower), потому что у меня f значения ниже 0.1, и это создает недопустимое решение. Другой способ решить эту проблему - использовать двоичные переменные, как показано в обсуждении логических условий в оптимизация. В APMonitor также есть пример решения кусочно-разрывных функций с двоичными переменными.

person John Hedengren    schedule 11.06.2020