getSimulationData

Создайте структуру данных, чтобы симулировать многоступенчатый контроллер MPC с nlmpcmove

Описание

Используйте эту функцию, чтобы создать структуру данных по умолчанию, чтобы симулировать многоступенчатый контроллер MPC с nlmpcmove функция.

Для получения информации о генерации структур данных для mpcmoveCodeGeneration, смотрите getCodeGenerationData.

пример

simdata = getSimulationData(nlmpcMSobj) создает начальную структуру данных моделирования для использования с nlmpcmove.

Примеры

свернуть все

В этом примере показано, как создать и симулировать простой многоступенчатый контроллер MPC в замкнутом цикле с помощью исходных предположений с функцией MATLAB® nlmpcmove.

Создайте многоступенчатый контроллер MPC

Создайте многоступенчатый объект MPC с горизонтом с семью шагами, одним состоянием и одной переменной, которой управляют.

nlmsobj = nlmpcMultistage(7,1,1);

Задайте функцию изменения состояния для модели предсказания (mystatefcn задан в конце этого примера).

nlmsobj.Model.StateFcn = @mystatefcn;

Как лучшая практика, используйте Якобианы каждый раз, когда они доступны, в противном случае решатель должен вычислить ее численно.

Задайте якобиан функции изменения состояния (mystatejacobian задан в конце файла).

nlmsobj.Model.StateJacFcn = @mystatejac;

Задайте функции стоимости для всех этапов кроме первых двух (mycostfcn задан в конце файла).

for i=3:8
    nlmsobj.Stages(6).CostFcn = @mycostfcn;
end

Задайте начальные условия, создайте структуру данных и подтвердите функции

Инициализируйте состояние объекта и введите.

x=3;
mv=0;

Создайте начальную структуру данных моделирования.

simdata = getSimulationData(nlmsobj)
simdata = struct with fields:
    InitialGuess: []

Подтвердите функции и структуру данных.

validateFcns(nlmsobj,x,mv,simdata);
Model.StateFcn is OK.
Model.StateJacFcn is OK.
"CostFcn" of the following stages 6 are OK.
Analysis of user-provided model, cost, and constraint functions complete.

Симулируйте контроллер в замкнутом цикле

Симулируйте цикл управления для 10 шагов.

for k=1:10
    [mv,simdata] = nlmpcmove(nlmsobj, x, mv, simdata);     % calculate move
    x = x + (mv-sqrt(x))*1;                                % update x: x(t+1)=x(t)+xdot*Ts
end

Поскольку обновленные исходные предположения предоставляются как входной параметр в simdata структура, nlmpcmove не должен повторно вычислять их на каждом временном шаге, который сохраняет время вычисления и улучшает производительность. Обновление исходных предположений на каждом временном шаге является лучшей практикой.

Отобразите последние значения состояния и переменных, которыми управляют.

disp(['Final value of x =' num2str(x)])
Final value of x =1.6556
disp(['Final value of mv =' num2str(mv)])
Final value of mv =1.2816

Функции поддержки

Функция изменения состояния.

function xdot = mystatefcn(x,u)
    xdot = u-sqrt(x);
end

Якобиан функции изменения состояния.

function [A,B] = mystatejac(x,~)
    A = -1/(2*x^(1/2));
    B = 1;
end

Подготовьте функции стоимости.

function j = mycostfcn(s,x,u)
    j = abs(u)/s+s*x^2; 
end

Входные параметры

свернуть все

Многоступенчатый нелинейный контроллер MPC в виде nlmpcMultistage объект.

Выходные аргументы

свернуть все

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

Измеренные значения воздействия в виде вектора-строки из длины Nmd или массив со столбцами Nmd, где Nmd является количеством измеренных воздействий. Если ваш многоступенчатый объект MPC имеет какой-либо измеренный заданный канал воздействия, необходимо задать MeasuredDisturbance. Если у вашего контроллера нет измеренных воздействий, можно не использовать это поле в структуре или задать его как [].

Чтобы использовать те же значения воздействия через горизонт предсказания, задайте вектор-строку.

Чтобы варьироваться значения воздействия по горизонту предсказания со времени k ко времени k +p, задайте массив с до p +1 строка. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит значения воздействия для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, nlmpcmove использует значения в итоговой строке для остающихся шагов горизонта предсказания.

Если вы задаете измеренные воздействия во входном объекте, необходимо обеспечить их через simdata во времени выполнения.

Переменные нижние границы, которыми управляют, в виде вектора-строки из длины Nmv или матрица со столбцами Nmv, где Nmv является количеством переменных, которыми управляют. MVMin(:,i) заменяет ManipulatedVariables(i).Min свойство контроллера во время выполнения.

Чтобы использовать те же границы через горизонт предсказания, задайте вектор-строку.

Чтобы варьироваться границы по горизонту предсказания со времени k ко времени k +p–1, задайте матрицу с до строк p. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит границы для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, итоговые границы используются для остающихся шагов горизонта предсказания.

Если simdata не содержит MVMin поле, затем переменная нижняя граница, которой управляют (если существующий во входном объекте) не изменяется во время выполнения.

Переменные верхние границы, которыми управляют, в виде вектора-строки из длины Nmv или матрица со столбцами Nmv, где Nmv является количеством переменных, которыми управляют. MVMax(:,i) заменяет ManipulatedVariables(i).Max свойство контроллера во время выполнения.

Чтобы использовать те же границы через горизонт предсказания, задайте вектор-строку.

Чтобы варьироваться границы по горизонту предсказания со времени k ко времени k +p-1, задайте матрицу с до строк p. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит границы для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, итоговые границы используются для остающихся шагов горизонта предсказания.

Если simdata не содержит MVMax поле, затем переменная верхняя граница, которой управляют (если существующий во входном объекте) не изменяется во время выполнения.

Нижние границы с плавающей ставкой, которыми управляют, в виде вектора-строки из длины Nmv или матрица со столбцами Nmv, где Nmv является количеством переменных, которыми управляют. MVRateMin(:,i) заменяет ManipulatedVariables(i).RateMin свойство контроллера во время выполнения. MVRateMin границы должны быть неположительными.

Чтобы использовать те же границы через горизонт предсказания, задайте вектор-строку.

Чтобы варьироваться границы по горизонту предсказания со времени k ко времени k +p-1, задайте матрицу с до строк p. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит границы для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, итоговые границы используются для остающихся шагов горизонта предсказания.

Если simdata не содержит MVRateMin поле, затем нижняя граница с плавающей ставкой, которой управляют (если существующий во входном объекте) не изменяется во время выполнения.

Верхние границы с плавающей ставкой, которыми управляют, в виде вектора-строки из длины Nmv или матрица со столбцами Nmv, где Nmv является количеством переменных, которыми управляют. MVRateMax(:,i) заменяет ManipulatedVariables(i).RateMax свойство контроллера во время выполнения. MVRateMax границы должны быть неотрицательными.

Чтобы использовать те же границы через горизонт предсказания, задайте вектор-строку.

Чтобы варьироваться границы по горизонту предсказания со времени k ко времени k +p-1, задайте матрицу с до строк p. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит границы для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, итоговые границы используются для остающихся шагов горизонта предсказания.

Если simdata не содержит MVRateMax поле, затем верхняя граница с плавающей ставкой, которой управляют (если существующий во входном объекте) не изменяется во время выполнения.

Нижние границы состояния в виде вектора-строки из длины Nx или матрица со столбцами Nx, где Nx является количеством состояний. StateMin(:,i) заменяет States(i).Min свойство контроллера во время выполнения.

Чтобы использовать те же границы через горизонт предсказания, задайте вектор-строку.

Чтобы варьироваться границы по горизонту предсказания со времени k +1 ко времени k +p, задайте матрицу с до строк p. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит границы для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, итоговые границы используются для остающихся шагов горизонта предсказания.

Если simdata не содержит StateMin поле, затем нижняя граница состояния (если существующий во входном объекте) не изменяется во время выполнения.

Верхние границы состояния в виде вектора-строки из длины Nx или матрица со столбцами Nx, где Nx является количеством состояний. StateMax(:,i) заменяет States(i).Max свойство контроллера во время выполнения.

Чтобы использовать те же границы через горизонт предсказания, задайте вектор-строку.

Чтобы варьироваться границы по горизонту предсказания со времени k +1 ко времени k +p, задайте матрицу с до строк p. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит границы для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, итоговые границы используются для остающихся шагов горизонта предсказания.

Если simdata не содержит StateMax поле, затем верхняя граница состояния (если существующий во входном объекте) не изменяется во время выполнения.

Значения параметра функции состояния в виде вектора с длиной равняются значению Model.ParameterLength свойство многоступенчатого объекта контроллера. Если Model.StateFcn нуждается в векторе параметра, необходимо ввести его значение во времени выполнения с помощью этого поля, в противном случае можно не использовать это поле или установить его на [].

Подготовьте значения параметров функций в виде вектора с длиной, равной сумме всех значений в Stages(i).ParameterLength свойства многоступенчатого объекта контроллера. Если любая стоимость или ограничительная функция, определяемая в Stages свойству нужен вектор параметра, необходимо обеспечить все векторы параметра во времени выполнения (сложенный в отдельном столбце) использующий это поле, в противном случае можно не использовать это поле или установить его на [].

Необходимо сложить векторы параметра для всех этапов в вектор-столбце StageFcnParameters можно следующим образом.

[parameter vector for stage 1;
 parameter vector for stage 2;
 ...
 parameter vector for stage p+1;
]

Конечное состояние в виде вектор-столбца со столькими же элементов сколько количество состояний. Конечное состояние является требуемым состоянием на последнем шаге предсказания. Чтобы задать желаемые конечные состояния во времени выполнения через это поле, необходимо задать конечные значения в TerminalState поле Model свойство nlmpcMSobj. Задайте inf для состояний, которые вы не должны ограничивать к конечной стоимости. Во время выполнения, nlmpcmove игнорирует любые значения в TerminalState поле simdata это соответствует inf значения в nlmpcMSobj. Если вы не задаете условия конечной стоимости в nlmpcMSobj, это поле не создается в simdata.

Если simdata не содержит TerminalState поле, затем ограничение конечного состояния (если существующий во входном объекте) не изменяется во время выполнения.

Исходные предположения для переменных решения в виде вектора-строки из длины, равной сумме длин всех векторов переменной решения для каждого, подготавливают.

Необходимо быть стеком исходные предположения для всех этапов в вектор-столбце InitialGuess можно следующим образом.

[state vector guess for stage 1;
 manipulated variable vector guess for stage 1;
 manipulated variable vector rate guess for stage 1; % if used
 slack variable vector guess for stage 1; % if used
 state vector guess for stage 2;
 manipulated variable vector guess for stage 2;
 manipulated variable vector rate guess for stage 2; % if used
 slack variable vector guess for stage 2; % if used
 ...
 state vector guess for stage p+1;
 manipulated variable vector guess for stage p+1;
 manipulated variable vector rate guess for stage p+1; % if used
 slack variable vector guess for stage p+1; % if used
]

Если InitialGuess []то nlmpcmove вычисляет исходные предположения от его x и lastmv аргументы.

В общем случае во время симуляции с обратной связью, вы не задаете InitialGuess самостоятельно. Вместо этого при вызове nlmpcmove, возвратите simdata выходной аргумент, который содержит расчетные исходные предположения для следующего контрольного интервала. Можно затем передать simdata как входной параметр к nlmpcmove для следующего контрольного интервала. Эти шаги являются лучшей практикой, даже если вы не задаете никакие другие опции во время выполнения.

Введенный в R2021a