Создайте структуру данных, чтобы симулировать многоступенчатый контроллер 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
nlmpcMSobj
— Нелинейный Многоступенчатый контроллер MPCnlmpcMultistage
объектМногоступенчатый нелинейный контроллер MPC в виде nlmpcMultistage
объект.
simdata
— Структура данных моделирования во время выполненияДанные моделирования во время выполнения в виде структуры со следующими полями.
MeasuredDisturbance
— Измеренные значения воздействия[]
(значение по умолчанию) | вектор-строка | массивИзмеренные значения воздействия в виде вектора-строки из длины Nmd или массив со столбцами Nmd, где Nmd является количеством измеренных воздействий. Если ваш многоступенчатый объект MPC имеет какой-либо измеренный заданный канал воздействия, необходимо задать MeasuredDisturbance
. Если у вашего контроллера нет измеренных воздействий, можно не использовать это поле в структуре или задать его как []
.
Чтобы использовать те же значения воздействия через горизонт предсказания, задайте вектор-строку.
Чтобы варьироваться значения воздействия по горизонту предсказания со времени k ко времени k +p, задайте массив с до p +1 строка. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит значения воздействия для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, значения в итоговой строке используются для остающихся шагов горизонта предсказания.
MVMin
— Переменные нижние границы, которыми управляют,[]
(значение по умолчанию) | вектор-строка | матрицаПеременные нижние границы, которыми управляют, в виде вектора-строки из длины Nmv или матрица со столбцами Nmv, где Nmv является количеством переменных, которыми управляют. MVMin(:,i)
заменяет ManipulatedVariables(i).Min
свойство контроллера во время выполнения.
Чтобы использовать те же границы через горизонт предсказания, задайте вектор-строку.
Чтобы варьироваться границы по горизонту предсказания со времени k ко времени k +p-1, задайте матрицу с до строк p. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит границы для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, итоговые границы используются для остающихся шагов горизонта предсказания.
MVMax
— Переменные верхние границы, которыми управляют,[]
(значение по умолчанию) | вектор-строка | матрицаПеременные верхние границы, которыми управляют, в виде вектора-строки из длины Nmv или матрица со столбцами Nmv, где Nmv является количеством переменных, которыми управляют. MVMax(:,i)
заменяет ManipulatedVariables(i).Max
свойство контроллера во время выполнения.
Чтобы использовать те же границы через горизонт предсказания, задайте вектор-строку.
Чтобы варьироваться границы по горизонту предсказания со времени k ко времени k +p-1, задайте матрицу с до строк p. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит границы для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, итоговые границы используются для остающихся шагов горизонта предсказания.
MVRateMin
— Нижние границы с плавающей ставкой, которыми управляют,[]
(значение по умолчанию) | вектор-строка | матрицаНижние границы с плавающей ставкой, которыми управляют, в виде вектора-строки из длины Nmv или матрица со столбцами Nmv, где Nmv является количеством переменных, которыми управляют. MVRateMin(:,i)
заменяет ManipulatedVariables(i).RateMin
свойство контроллера во время выполнения. MVRateMin
границы должны быть неположительными.
Чтобы использовать те же границы через горизонт предсказания, задайте вектор-строку.
Чтобы варьироваться границы по горизонту предсказания со времени k ко времени k +p-1, задайте матрицу с до строк p. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит границы для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, итоговые границы используются для остающихся шагов горизонта предсказания.
MVRateMax
— Верхние границы с плавающей ставкой, которыми управляют,[]
(значение по умолчанию) | вектор-строка | матрицаВерхние границы с плавающей ставкой, которыми управляют, в виде вектора-строки из длины Nmv или матрица со столбцами Nmv, где Nmv является количеством переменных, которыми управляют. MVRateMax(:,i)
заменяет ManipulatedVariables(i).RateMax
свойство контроллера во время выполнения. MVRateMax
границы должны быть неотрицательными.
Чтобы использовать те же границы через горизонт предсказания, задайте вектор-строку.
Чтобы варьироваться границы по горизонту предсказания со времени k ко времени k +p-1, задайте матрицу с до строк p. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит границы для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, итоговые границы используются для остающихся шагов горизонта предсказания.
StateMin
— Нижние границы состояния[]
(значение по умолчанию) | вектор-строка | матрицаНижние границы состояния в виде вектора-строки из длины Nx или матрица со столбцами Nx, где Nx является количеством состояний. StateMin(:,i)
заменяет States(i).Min
свойство контроллера во время выполнения.
Чтобы использовать те же границы через горизонт предсказания, задайте вектор-строку.
Чтобы варьироваться границы по горизонту предсказания со времени k +1 ко времени k +p, задайте матрицу с до строк p. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит границы для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, итоговые границы используются для остающихся шагов горизонта предсказания.
StateMax
— Верхние границы состояния[]
(значение по умолчанию) | вектор-строка | матрицаВерхние границы состояния в виде вектора-строки из длины Nx или матрица со столбцами Nx, где Nx является количеством состояний. StateMax(:,i)
заменяет States(i).Max
свойство контроллера во время выполнения.
Чтобы использовать те же границы через горизонт предсказания, задайте вектор-строку.
Чтобы варьироваться границы по горизонту предсказания со времени k +1 ко времени k +p, задайте матрицу с до строк p. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит границы для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, итоговые границы используются для остающихся шагов горизонта предсказания.
StateFcnParameters
— Значения параметра функции состояния[]
(значение по умолчанию) | векторЗначения параметра функции состояния в виде вектора с длиной равняются значению Model.ParameterLength
свойство многоступенчатого объекта контроллера. Если Model.StateFcn
нуждается в векторе параметра, необходимо ввести его значение во времени выполнения с помощью этого поля, в противном случае можно не использовать это поле или установить его на []
.
StateFcnParameters
— Значения параметра функции состояния[]
(значение по умолчанию) | векторПодготовьте значения параметров функций в виде вектора с длиной, равной сумме всех значений в Stages(i).ParameterLength
свойства многоступенчатого объекта контроллера. Если любая стоимость или ограничительная функция, определяемая в Stages
свойству нужен вектор параметра, необходимо обеспечить все векторы параметра во времени выполнения (сложенный в отдельном столбце) использующий это поле, в противном случае можно не использовать это поле или установить его на []
.
Векторы параметра для всех этапов должны быть сложены в вектор-столбце StateFcnParameters
как:
[parameter vector for stage 1; parameter vector for stage 2; ... parameter vector for stage p+1; ]
TerminalState
— Конечное состояние[]
(значение по умолчанию) | векторКонечное состояние в виде вектор-столбца со столькими же элементов сколько количество состояний. Конечное состояние является требуемым состоянием на последнем шаге предсказания. Чтобы задать желаемые конечные состояния во времени выполнения через это поле, необходимо задать конечные значения в TerminalState
поле Model
свойство nlmpcMSobj
. Задайте inf
для состояний, которые не должны быть ограничены к конечной стоимости. Во время выполнения, nlmpcmove
игнорирует любые значения в TerminalState
поле simdata
это соответствует inf
значения в nlmpcMSobj
. Если вы не задаете условия конечной стоимости в nlmpcMSobj
, это поле не создается в simdata
.
Если нет никакого TerminalState
в simdata
затем ограничение конечного состояния (если есть) не изменяется во время выполнения.
InitialGuess
— Исходные предположения для переменных решения[]
(значение по умолчанию) | векторИсходные предположения для переменных решения в виде вектора-строки из длины, равной сумме длин всех векторов переменной решения для каждого, подготавливают.
Исходные предположения для всех этапов должны быть сложены в вектор-столбце 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
для следующего контрольного интервала. Эти шаги являются лучшой практикой, даже если вы не задаете никакие другие опции во время выполнения.
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.