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 нужен вектор параметра, вы должны предоставить его значение во время выполнения, используя это поле, в противном случае можно опустить это поле или задать его [].

Значения параметров функций Stage, заданные как вектор с длиной, равной сумме всех значений в 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