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