Нелинейные входы (управляемые переменные) в GEKKO

У меня есть нелинейная система с квадратичными входами (управляемые переменные, [MV]). Чтобы выполнить MPC-симуляцию этой системы с помощью GEKKO, я определил следующую функцию для обработки квадратичного ввода:

def NTVin(T, u):
    n = T.shape[0]
    Tntv = zeros(n)
    u2 = zeros_like(u, dtype = float64)
    for i in range(len(u2)):
        u2[i] = copy(u[i].VALUE)
    for i in range(n):
        Tntv[i] = dot(dot(u2, T[i,:,:]), u2)

    return Tntv

Затем я определяю свои системные уравнения следующим образом:

from pylab import*
dt = .02 # sec = 20ms
m = GEKKO(remote = True)
ntg = int(tf/dt) + 1
m.time = linspace(0., tf, ntg)
m.options.CV_TYPE = 2 # 2 = squared error
x = m.Array(m.SV, Nnew, value = 0.)
y = m.Array(m.CV, Mm, value = 0.)
unb = m.Array(m.MV, B.shape[1], lb = 5.e5, ub = 2.25e6)
untv = m.Array(m.MV, Bntv.shape[1], value = 0.)
tau_sp = 3.e-2
for i in range(Bntv.shape[1]):
    untv[i].value = ic[i]
    untv[i].STATUS = 1
for i in range(B.shape[1]):
    unb[i].value = 0.
    unb[i].STATUS = 1
    unb[i].DCOST = 0.
    unb[i].COST = 0.
for i in range(N):
    x[i].value = ans0[i]
for i in range(Nnew):
    m.Equation(x[i].dt() == dot(A[i,:], x) + Bint[i] + dot(B[i,:], unb) - dot(Mnew[i,:], NTVin(Bntv, untv)))
for i in range(Mm):
    m.Equation(y[i] == dot(Phim[i,:], x))
    y[i].value = dot(Phim[i,:], ans0)
    y[i].STATUS = 1
    y[i].TR_INIT = 1
    y[i].SP = omegaR0[i]
    y[i].TAU = tau_sp
m.options.IMODE = 6
m.options.NODES = 2
m.solve(disp = True, GUI = False)

Моделирование выполняется, но GEKKO никогда не изменяет MV untv (независимо от того, что установлено для untv[i].value, остается на этом значении для моделирования), тогда как линейный MV unb оптимизируется во время моделирования и изменяется во времени. Подозреваю, что виновата моя функция NTVin (конкретно в строке: u2[i] = copy(u[i].VALUE). Тогда мой вопрос: может ли GEKKO обрабатывать нелинейные МВ, и если да, то есть ли способ обработать этот квадратичный ввод при объявлении уравнений системы?


person Mitch    schedule 01.10.2019    source источник


Ответы (1)


Да, Gekko и решатели (APOPT, BPOPT, IPOPT) могут решать нелинейные выражения. Когда вы копируете значение u2[i], оно создает числовое значение вместо переменной Gekko. Одна из идей для вашего квадратичного целевого термина - попробовать предварительно созданную функцию qobj, как описано в Функции построения модели документации. Вы также можете попробовать объект State Space и установить m.options.CV_TYPE=2 для квадратичной цели. Есть варианты для непрерывного или дискретного пространства состояний.

person John Hedengren    schedule 03.10.2019
comment
Есть ли какие-нибудь примеры использования qobj? - person Mitch; 04.10.2019
comment
Конечно, вот пара примеров с плотным github.com/BYU -PRISM / GEKKO / blob / master / examples / и разреженные матрицы github.com/BYU-PRISM/GEKKO/blob/master/examples/ - person John Hedengren; 05.10.2019