Документация Engee

Функции: прогнозирующие контроллеры

Все прогнозирующие контроллеры в этом модуле используют средство оценки состояния для вычисления прогнозов. Средство оценки LinMPC по умолчанию — SteadyKalmanFilter, а для NonLinMPC с нелинейными моделями — an UnscentedKalmanFilter. Для более простых и классических вариантов также доступна структура InternalModel. По умолчанию она предполагает, что текущая оценка несоответствия модели является постоянной во времени (такой же подход, как при динамическом матричном управлении, DMC).

Согласно принятым правилам для временных рядов (и матриц) используются заглавные буквы, а для

прогнозов (и оценок состояния) — циркумфлексы.

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

Векторы для обрабатываемого входа смещаются на один временной шаг:

Определение приращения обрабатываемого входа в виде , the control horizon налагает условие при . По этой причине соответствующий вектор усекается до :

PredictiveController

# ModelPredictiveControl.PredictiveControllerType

Абстрактный супертип всех прогнозирующих контроллеров.


(mpc::PredictiveController)(ry, d=[]; kwargs...) -> u

Функтор, позволяющий использовать вызываемый объект PredictiveController как псевдоним для moveinput!.

Примеры

julia> mpc = LinMPC(LinModel(tf(5, [2, 1]), 3), Nwt=[0], Hp=1000, Hc=1);

julia> u = mpc([5]); round.(u, digits=3)
1-element Vector{Float64}:
 1.0

LinMPC

# ModelPredictiveControl.LinMPCType

LinMPC(model::LinModel; <keyword arguments>)

Создает линейный прогнозирующий контроллер на основе объекта model типа LinModel.

Контроллер минимизирует следующую целевую функцию в каждый дискретный момент времени :

в который весовые матрицы по умолчанию повторяются или раз:

Также поддерживаются динамические веса по горизонтам. включает входные приращения от до , вектор , прогнозы на выходах от до , и вектор , обрабатываемые входы от до . Ослабляющая переменная ослабляет ограничения, как описано в документации по setconstraint!. Подробные правила см. в расширенной справке.

Этот метод использует средство оценки состояния по умолчанию SteadyKalmanFilter с аргументами по умолчанию.

Аргументы

  • model::LinModel: модель, используемая для прогнозов контроллера и оценок состояния.

  • Hp=10+nk: горизонт прогнозирования ; nk — это число задержек в model.

  • Hc=2: горизонт управления .

  • Mwt=fill(1.0,model.ny): главная диагональ весовой матрицы (вектора) .

  • Nwt=fill(0.1,model.nu): главная диагональ весовой матрицы (вектора) .

  • Lwt=fill(0.0,model.nu): главная диагональ весовой матрицы (вектора) .

  • M_Hp=Diagonal(repeat(Mwt),Hp): диагональная весовая матрица .

  • N_Hc=Diagonal(repeat(Nwt),Hc): диагональная весовая матрица .

  • L_Hp=Diagonal(repeat(Lwt),Hp): диагональная весовая матрица .

  • Cwt=1e5: вес ослабляющей переменной (скалярная величина); Cwt=Inf используется только для жестких ограничений.

  • optim=JuMP.Model(OSQP.MathOptInterfaceOSQP.Optimizer): квадратичный оптимизатор, используемый в прогнозирующем контроллере; предоставляется как модель JuMP.Model (по умолчанию применяется оптимизатор OSQP).

  • Дополнительные именованные аргументы передаются в конструктор SteadyKalmanFilter.

Примеры

julia> model = LinModel([tf(3, [30, 1]); tf(-2, [5, 1])], 4);

julia> mpc = LinMPC(model, Mwt=[0, 1], Nwt=[0.5], Hp=30, Hc=1)
LinMPC controller with a sample time Ts = 4.0 s, OSQP optimizer, SteadyKalmanFilter estimator and:
 30 prediction steps Hp
  1 control steps Hc
  1 manipulated inputs u (0 integrating states)
  4 estimated states x̂
  2 measured outputs ym (2 integrating states)
  0 unmeasured outputs yu
  0 measured disturbances d

Расширенная справка

Уставки обрабатываемых входов не так распространены, однако они могут быть полезны для очень активных систем, когда nu > ny (например, если приоритет должен отдаваться решениям с меньшими затратами). Значение Lwt по умолчанию подразумевает, что эта возможность отключена.

В целевой функции приняты следующие обозначения переменных:

ПЕРЕМЕННАЯ ОПИСАНИЕ РАЗМЕР

горизонт прогнозирования (целое число)

()

горизонт управления (целое число)

()

приращения обрабатываемых входов по

(nu*Hc,)

прогнозируемые выходы по

(ny*Hp,)

обрабатываемые входы по

(nu*Hp,)

уставки прогнозируемых выходов по

(ny*Hp,)

уставки прогнозируемых обрабатываемых входов по

(nu*Hp,)

веса отслеживания уставки выхода по

(ny*Hp, ny*Hp)

веса приращений обрабатываемых входов по

(nu*Hc, nu*Hc)

веса отслеживания уставок обрабатываемых входов по

(nu*Hp, nu*Hp)

вес ослабляющей переменной

()

ослабляющая переменная для смягчения ограничения

()

LinMPC(estim::StateEstimator; <keyword arguments>)

Создает LinMPC с помощью пользовательского средства оценки состояния estim.

Объект estim.model должен относиться к типу LinModel. В противном случае требуется NonLinMPC.

Примеры

julia> estim = KalmanFilter(LinModel([tf(3, [30, 1]); tf(-2, [5, 1])], 4), i_ym=[2]);

julia> mpc = LinMPC(estim, Mwt=[0, 1], Nwt=[0.5], Hp=30, Hc=1)
LinMPC controller with a sample time Ts = 4.0 s, OSQP optimizer, KalmanFilter estimator and:
 30 prediction steps Hp
  1 control steps Hc
  1 manipulated inputs u (0 integrating states)
  3 estimated states x̂
  1 measured outputs ym (1 integrating states)
  1 unmeasured outputs yu
  0 measured disturbances d

ExplicitMPC

# ModelPredictiveControl.ExplicitMPCType

ExplicitMPC(model::LinModel; <keyword arguments>)

Создает явный линейный прогнозирующий контроллер на основе объекта model типа LinModel.

Контроллер минимизирует следующую целевую функцию в каждый дискретный момент времени :

Определения переменных см. в описании LinMPC. Этот контроллер не поддерживает ограничения, но вычислительные затраты крайне низкие (деление массивов), поэтому он подходит для ситуаций, когда требуется очень малое время дискретизации. Именованные аргументы идентичны LinMPC за исключением того, что не поддерживаются аргументы Cwt и optim.

Этот метод использует средство оценки состояния по умолчанию SteadyKalmanFilter с аргументами по умолчанию.

Примеры

julia> model = LinModel([tf(3, [30, 1]); tf(-2, [5, 1])], 4);

julia> mpc = ExplicitMPC(model, Mwt=[0, 1], Nwt=[0.5], Hp=30, Hc=1)
ExplicitMPC controller with a sample time Ts = 4.0 s, SteadyKalmanFilter estimator and:
 30 prediction steps Hp
  1 control steps Hc
  1 manipulated inputs u (0 integrating states)
  4 estimated states x̂
  2 measured outputs ym (2 integrating states)
  0 unmeasured outputs yu
  0 measured disturbances d
ExplicitMPC(estim::StateEstimator; <keyword arguments>)

Создает ExplicitMPC с помощью пользовательского средства оценки состояния estim.

Объект estim.model должен относиться к типу LinModel. В противном случае требуется NonLinMPC.

Примеры

julia> estim = KalmanFilter(LinModel([tf(3, [30, 1]); tf(-2, [5, 1])], 4), i_ym=[2]);

julia> mpc = ExplicitMPC(estim, Mwt=[0, 1], Nwt=[0.5], Hp=30, Hc=1)
ExplicitMPC controller with a sample time Ts = 4.0 s, KalmanFilter estimator and:
 30 prediction steps Hp
  1 control steps Hc
  1 manipulated inputs u (0 integrating states)
  3 estimated states x̂
  1 measured outputs ym (1 integrating states)
  1 unmeasured outputs yu
  0 measured disturbances d

NonLinMPC

# ModelPredictiveControl.NonLinMPCType

NonLinMPC(model::SimModel; <keyword arguments>)

Создает нелинейный прогнозирующий контроллер на основе объекта model типа SimModel.

Поддерживаются как NonLinModel, так и LinModel (см. расширенную справку). Контроллер минимизирует следующую целевую функцию в каждый дискретный момент времени :

Определения переменных см. в описании LinMPC. Пользовательская экономичная функция может накладывать штраф на решения с высокими затратами. Если присвоить всем весам, кроме , значение 0, создается чистый экономичный прогнозирующий контроллер модели (EMPC). Аргументами являются обрабатываемые входы, прогнозируемые выходы и измеряемые возмущения от до включительно:

так как при предполагается, что или . Вектор включает в себя прогнозируемое измеряемое возмущение по .

Если какие-либо из трех аргументов не нужны, их можно заменить _ (см. значение JE по умолчанию ниже).

Этот метод использует средство оценки состояния по умолчанию:

  • если объект model относится к типу LinModel, SteadyKalmanFilter с аргументами по умолчанию;

  • в противном случае UnscentedKalmanFilter с аргументами по умолчанию.

Если возникает ошибка наподобие следующей, см. расширенную справку: MethodError: no method matching Float64(::ForwardDiff.Dual).

Аргументы

  • model::SimModel: модель, используемая для прогнозов контроллера и оценок состояния.

  • Hp=nothing: горизонт прогнозирования ; должен указываться для NonLinModel.

  • Hc=2: горизонт управления .

  • Mwt=fill(1.0,model.ny): главная диагональ весовой матрицы (вектора) .

  • Nwt=fill(0.1,model.nu): главная диагональ весовой матрицы (вектора) .

  • Lwt=fill(0.0,model.nu): главная диагональ весовой матрицы (вектора) .

  • M_Hp=Diagonal(repeat(Mwt),Hp): диагональная весовая матрица .

  • N_Hc=Diagonal(repeat(Nwt),Hc): диагональная весовая матрица .

  • L_Hp=Diagonal(repeat(Lwt),Hp): диагональная весовая матрица .

  • Cwt=1e5: вес ослабляющей переменной (скалярная величина); Cwt=Inf используется только для жестких ограничений.

  • Ewt=0.0: вес затрат (скалярная величина).

  • JE=(_,_,_)->0.0: экономичная функция .

  • optim=JuMP.Model(Ipopt.Optimizer): нелинейный оптимизатор, используемый в прогнозирующем контроллере; предоставляется как модель JuMP.Model (по умолчанию применяется оптимизатор Ipopt).

  • Дополнительные именованные аргументы передаются в конструктор UnscentedKalmanFilter (или SteadyKalmanFilter для LinModel).

Примеры

julia> model = NonLinModel((x,u,_)->0.5x+u, (x,_)->2x, 10.0, 1, 1, 1);

julia> mpc = NonLinMPC(model, Hp=20, Hc=1, Cwt=1e6)
NonLinMPC controller with a sample time Ts = 10.0 s, Ipopt optimizer, UnscentedKalmanFilter estimator and:
 20 prediction steps Hp
  1 control steps Hc
  1 manipulated inputs u (0 integrating states)
  2 estimated states x̂
  1 measured outputs ym (1 integrating states)
  0 unmeasured outputs yu
  0 measured disturbances d

Расширенная справка

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

Для оптимизации применяются возможности автоматического дифференцирования JuMP. С их помощью вычисляются производные цели и ограничений. Оптимизаторы обычно лучше работают с точными производными, которые получаются при автоматическом дифференцировании. Однако функции NonLinModel f и h должны быть совместимы с этой возможностью. В разделе Автоматическое дифференцирование описываются распространенные ошибки, которые допускают при написании этих функций.

Обратите внимание, что если Cwt≠Inf, атрибут nlp_scaling_max_gradient оптимизатора Ipopt устанавливается в значение 10/Cwt (если это значение еще не задано) с целью масштабирования небольших значений .

NonLinMPC(estim::StateEstimator; <keyword arguments>)

Создает NonLinMPC с помощью пользовательского средства оценки состояния estim.

Примеры

julia> model = NonLinModel((x,u,_)->0.5x+u, (x,_)->2x, 10.0, 1, 1, 1);

julia> estim = UnscentedKalmanFilter(model, σQint_ym=[0.05]);

julia> mpc = NonLinMPC(estim, Hp=20, Hc=1, Cwt=1e6)
NonLinMPC controller with a sample time Ts = 10.0 s, Ipopt optimizer, UnscentedKalmanFilter estimator and:
 20 prediction steps Hp
  1 control steps Hc
  1 manipulated inputs u (0 integrating states)
  2 estimated states x̂
  1 measured outputs ym (1 integrating states)
  0 unmeasured outputs yu
  0 measured disturbances d

Перемещение обрабатываемого входа u

# ModelPredictiveControl.moveinput!Function

moveinput!(mpc::PredictiveController, ry=mpc.estim.model.yop, d=[]; <keyword args>) -> u

Вычисляет оптимальное значение обрабатываемого входа u для текущего периода управления.

Решает задачу оптимизации mpc PredictiveController и возвращает результаты . Согласно принципу удаляющегося горизонта алгоритм отбрасывает оптимальные будущие обрабатываемые входы Обратите внимание, что этот метод изменяет внутренние данные mpc, но не изменяет состояния mpc.estim. Вызовите updatestate!(mpc, u, ym, d), чтобы обновить оценки состояний mpc.

При вызове объекта PredictiveController вызывается данный метод.

См. также описание LinMPC, ExplicitMPC и NonLinMPC.

Аргументы

  • mpc::PredictiveController: решение задачи оптимизации mpc.

  • ry=mpc.estim.model.yop: текущие уставки выходов .

  • d=[]: текущие измеряемые возмущения .

  • D̂=repeat(d, mpc.Hp): прогнозируемые измеряемые возмущения ; по умолчанию являются постоянными в будущем или равны для до .

  • R̂y=repeat(ry, mpc.Hp): уставки прогнозируемых выходов ; по умолчанию являются постоянными в будущем или равны для до .

  • R̂u=repeat(mpc.estim.model.uop, mpc.Hp): уставки прогнозируемых обрабатываемых входов; по умолчанию являются постоянными в будущем или равны для до .

  • ym=nothing: текущие измеряемые выходы ; требуется, только если объект mpc.estim относится к типу InternalModel.

Примеры

julia> mpc = LinMPC(LinModel(tf(5, [2, 1]), 3), Nwt=[0], Hp=1000, Hc=1);

julia> ry = [5]; u = moveinput!(mpc, ry); round.(u, digits=3)
1-element Vector{Float64}:
 1.0