Создание MEX-файла, который решает (универсальную или многоступенчатую) проблему нелинейного управления MPC
создает файл MEX, который решает проблему нелинейного управления MPC быстрее, чем mexFcn = buildMEX(nlobj,mexName,coreData,onlineData)nlmpcmove. Файл MEX создается в текущей рабочей папке.
Создайте нелинейный контроллер MPC с четырьмя состояниями, двумя выходами и одним входом.
nlobj = nlmpc(4,2,1);
In standard cost function, zero weights are applied by default to one or more OVs because there are fewer MVs than OVs.
Укажите время выборки и горизонты контроллера.
Ts = 0.1; nlobj.Ts = Ts; nlobj.PredictionHorizon = 10; nlobj.ControlHorizon = 5;
Укажите функцию состояния контроллера, которая находится в файле pendulumDT0.m. Эта модель дискретного времени интегрирует модель непрерывного времени, определенную в pendulumCT0.m с использованием многоступенчатого прямого метода Эйлера.
nlobj.Model.StateFcn = "pendulumDT0";
nlobj.Model.IsContinuousTime = false;Модель прогнозирования использует необязательный параметр Ts для представления времени выборки. Укажите количество параметров и создайте вектор параметров.
nlobj.Model.NumberOfParameters = 1;
params = {Ts};Укажите функцию вывода модели, передав параметр времени выборки в качестве входного аргумента.
nlobj.Model.OutputFcn = "pendulumOutputFcn";Определите стандартные ограничения для контроллера.
nlobj.Weights.OutputVariables = [3 3]; nlobj.Weights.ManipulatedVariablesRate = 0.1; nlobj.OV(1).Min = -10; nlobj.OV(1).Max = 10; nlobj.MV.Min = -100; nlobj.MV.Max = 100;
Проверка функций модели прогнозирования.
x0 = [0.1;0.2;-pi/2;0.3]; u0 = 0.4; validateFcns(nlobj,x0,u0,[],params);
Model.StateFcn is OK. Model.OutputFcn is OK. Analysis of user-provided model, cost, and constraint functions complete.
Измеримы только два состояния растений. Поэтому создайте расширенный фильтр Калмана для оценки четырех состояний установки. Его функция перехода состояния определена в pendulumStateFcn.m и его измерительная функция определена в pendulumMeasurementFcn.m.
EKF = extendedKalmanFilter(@pendulumStateFcn,@pendulumMeasurementFcn);
Определите начальные условия для моделирования, инициализируйте расширенное состояние фильтра Калмана и укажите нулевое начальное управляемое значение переменной.
x0 = [0;0;-pi;0]; y0 = [x0(1);x0(3)]; EKF.State = x0; mv0 = 0;
Создание структур данных генерации кода для контроллера с указанием исходных условий и параметров.
[coreData,onlineData] = getCodeGenerationData(nlobj,x0,mv0,params);
Укажите ссылочное значение вывода в оперативной структуре данных.
onlineData.ref = [0 0];
Создайте функцию MEX для решения нелинейной задачи управления MPC. Функция MEX создается в текущей рабочей папке.
mexFcn = buildMEX(nlobj,"myController",coreData,onlineData);Generating MEX function "myController" from nonlinear MPC to speed up simulation. Code generation successful. MEX function "myController" successfully generated.
Запустить моделирование для 10 секунд. В течение каждого контрольного интервала:
Исправьте предыдущий прогноз с помощью текущего измерения.
Вычислите оптимальные перемещения управления с помощью функции MEX. Эта функция возвращает вычисленные оптимальные последовательности в onlineData. Передача обновленной структуры данных в функцию MEX в следующем интервале управления обеспечивает начальные догадки для оптимальных последовательностей.
Спрогнозировать состояния модели.
Примените первое вычисленное оптимальное контрольное перемещение к установке, обновив состояния установки.
Генерируйте данные датчика с белым шумом.
Сохраните состояния завода.
mv = mv0; y = y0; x = x0; Duration = 10; xHistory = x0; for ct = 1:(Duration/Ts) % Correct previous prediction xk = correct(EKF,y); % Compute optimal control move [mv,onlineData] = myController(xk,mv,onlineData); % Predict prediction model states for the next iteration predict(EKF,[mv; Ts]); % Implement first optimal control move x = pendulumDT0(x,mv,Ts); % Generate sensor data y = x([1 3]) + randn(2,1)*0.01; % Save plant states xHistory = [xHistory x]; end
Постройте график результирующих траекторий состояния.
figure subplot(2,2,1) plot(0:Ts:Duration,xHistory(1,:)) xlabel('time') ylabel('z') title('cart position') subplot(2,2,2) plot(0:Ts:Duration,xHistory(2,:)) xlabel('time') ylabel('zdot') title('cart velocity') subplot(2,2,3) plot(0:Ts:Duration,xHistory(3,:)) xlabel('time') ylabel('theta') title('pendulum angle') subplot(2,2,4) plot(0:Ts:Duration,xHistory(4,:)) xlabel('time') ylabel('thetadot') title('pendulum velocity')

nlobj - Контроллер прогнозирования нелинейной моделиnlmpc объект | nlmpcMultistage объектКонтроллер прогнозирования нелинейной модели, указанный как nlmpc или nlmpcMultistage объект.
Контроллер должен использовать значение по умолчанию fmincon решатель с алгоритмом SQP. Кроме того, контроллер не должен использовать анонимные функции для своей модели прогнозирования, функции пользовательских затрат или функции пользовательских ограничений.
mexName - имя функции MEXИмя функции MEX, указанное как строковый или символьный вектор.
coreData - Нелинейные параметры конфигурации MPCНелинейные параметры конфигурации MPC, постоянные во время выполнения, заданные как структура, сгенерированная с помощью getCodeGenerationData.
onlineData - Исходные данные онлайн-контроллераИсходные данные оперативного контроллера, заданные как структура, сгенерированная с помощью getCodeGenerationData. Для получения дополнительной информации о настройке полей onlineData, см. nlmpcmoveCodeGeneration.
mexConfig - Объект конфигурации генерации кодаMexCodeConfig объектОбъект конфигурации создания кода, указанный как MexCodeConfig объект.
Чтобы создать объект конфигурации, используйте следующий код.
mexConfig = coder.config('mex');Чтобы настроить создание кода MEX, измените настройки этого объекта. Например, для обнаружения нарушений доступа к памяти во время выполнения во время отладки установите IntegrityChecks кому true.
mexConfig.IntegrityChecks = true;
По умолчанию для повышения производительности созданного кода выполняются такие проверки, как IntegrityChecks и ResponsivenessChecks отключены buildMEX.
buildMEX перезаписывает следующие настройки конфигурации с указанными значениями.
| Настройка конфигурации | Стоимость |
|---|---|
cfg.DynamicMemoryAllocation | 'AllVariableSizeArrays' |
cfg.ConstantInputs | 'Remove' |
mexFcn - Сгенерированная функция MEXСгенерированная функция MEX, возвращаемая как дескриптор функции. Эта функция MEX имеет следующую подпись.
[mv,newOnlineData,info] = mexFcn(x,lastMV,onlineData)
Функция MEX имеет следующие входные аргументы, которые совпадают с соответствующими входными аргументами nlmpcmoveCodeGeneration.
| Входной аргумент | Описание |
|---|---|
x | Текущие состояния модели прогнозирования, заданные как вектор длины Nx, где Nx - количество состояний модели прогнозирования. |
lastMV | Управляющие сигналы, используемые в установке на предыдущем контрольном интервале, определяемом как вектор длины Nmv, где Nmv - количество манипулируемых переменных. |
onlineData | Данные оперативного контроллера, которые необходимо обновить во время выполнения, указанные как структура. Создание начальной структуры с помощью getCodeGenerationData. Для получения дополнительной информации о настройке полей onlineData, см. nlmpcmoveCodeGeneration. |
Функция MEX имеет следующие выходные аргументы, которые совпадают с выходными аргументами nlmpcmoveCodeGeneration.
| Выходной аргумент | Описание |
|---|---|
mv | Оптимальное управляющее действие манипулируемой переменной, возвращаемое в виде вектора столбца длиной Nmv, где Nmv - количество манипулируемых переменных. |
newOnlineData | Обновленные данные онлайн-контроллера, возвращенные в виде структуры. Эта структура аналогична |
info | Подробные данные решения, возвращенные в виде структуры. |
Для моделирования контроллера с использованием сгенерированной функции MEX используйте начальную оперативную структуру данных. onlineData для первого интервала управления. Для последующих контрольных интервалов измените оперативные данные в newOnlineData и передать обновленную структуру функции MEX как onlineData.
getCodeGenerationData | nlmpc | nlmpcmove | nlmpcmoveCodeGeneration
Имеется измененная версия этого примера. Открыть этот пример с помощью изменений?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.