Как установить значение переменной на x [3] = 6 (не начальное условие) в Python Gekko?

Я могу установить начальное условие y (0) = 5 в Gekko с помощью y = m.Var(5), но как мне установить значение, которое не является начальным условием, например y (3) = 6, где значение в момент времени = 3 равно 6, как показано Красная точка?

Укажите внутреннюю точку

from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt
m = GEKKO(remote=False)
m.time = np.linspace(0,10,11)
x = m.Var(np.ones(11)*6)
m.Equation(5*x.dt() == -x)
m.options.IMODE = 4
m.solve()
plt.plot(m.time, x.value)
plt.plot([3],[6],'ro',MarkerSize=5)
plt.show()

У меня есть проблема моделирования, когда мне нужно решение, чтобы получить промежуточные значения на временном горизонте m.time = [0,1,2,3,4,5,6,7,8,9,10]. Когда я инициализирую x=m.Var(np.ones(11)*6), значения позже меняются решателем. Могу ли я исправить одно из значений не в исходном состоянии? Это похоже на краевую задачу, в которой начальная или конечная точки фиксированы, но в этом случае заданное значение является внутренним по отношению к временному горизонту.


person TexasEngineer    schedule 08.12.2019    source источник


Ответы (2)


Первое, что нужно сделать, чтобы начальное условие вычислялось с параметром fixed_initial=False, когда вы указываете x=m.Var(). Функция построения модели m.fix() может зафиксировать любую точку горизонта, например, с помощью m.fix(x,pos=3,val=6), но при этом также фиксируется производная в этой точке.

Альтернативный метод - указать цель минимизировать отклонение от значения 6 в момент времени = 3.

pi = np.zeros(11); pi[3]=1
p = m.Param(pi)
m.Minimize(p*(x-6)**2)

Это создает цель везде, но p не равно нулю только в момент времени = 3.

Бесплатное начальное состояние

from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt
m = GEKKO(remote=False)
m.time = np.linspace(0,10,11)
x = m.Var(np.zeros(11)*6,fixed_initial=False)
m.Equation(5*x.dt() == -x)
pi = np.zeros(11); pi[3]=1
p = m.Param(pi)
m.Minimize(p*(x-6)**2)
m.options.IMODE = 6
m.solve()
plt.plot(m.time, x.value)
plt.plot([3],[6],'ro',MarkerSize=5)
plt.show()
person John Hedengren    schedule 08.12.2019

Проблема эталонного теста Bryson (см. № 2) показывает четыре способа исправить значения, которые не являются начальными условиями.

if option == 1:
    # most likely to cause DOF issues because of many 
    #  zero (0==0) equations
    m.Equation(final*x1 == 0)
    m.Equation(final*x2 == 0) 
elif option == 2:
    # inequality constraint approach is better but there
    #   are still many inactive equations
    m.Equation((final*x1)**2 <= 0)
    m.Equation((final*x2)**2 <= 0)
elif option == 3: #requires GEKKO version >= 0.0.3a2
    # fix the value just at the endpoint (best option)
    m.fix(x1,pos=nt-1,val=0)
    m.fix(x2,pos=nt-1,val=0)
else:
    #penalty method ("soft constraint") that may influence
    # optimal solution because there is just one
    # combined objective and it may interfere with
    # minimizing myObj
    m.Obj(1000*(final*x1)**2)
    m.Obj(1000*(final*x2)**2)

m.Obj(myObj*final)

Этот код можно было бы адаптировать так, чтобы он имел точку посередине.

person Eric Hedengren    schedule 08.12.2019