Создайте структуру данных, чтобы симулировать многоступенчатый контроллер 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
- Значения параметров функции состояния[]
(по умолчанию) | векторЗначения параметров функций Stage, заданные как вектор с длиной, равной сумме всех значений в 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. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.