getSimulationData

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

Описание

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

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

пример

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

Примеры

свернуть все

В этом примере показано, как создать и симулировать очень простой многоступенчатый контроллер MPC в замкнутом цикле.

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

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

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:
        StateMin: []
        StateMax: []
           MVMin: []
           MVMax: []
    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

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

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, значения в итоговой строке используются для остающихся шагов горизонта предсказания.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Векторы параметра для всех этапов должны быть сложены в вектор-столбце StateFcnParameters как:

[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.

Если нет никакого TerminalState в simdata затем ограничение конечного состояния (если есть) не изменяется во время выполнения.

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

Исходные предположения для всех этапов должны быть сложены в вектор-столбце 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 [], исходные предположения по умолчанию вычисляются от x и lastmv аргументы передали nlmpcmove).

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

Введенный в R2021a