명령줄에서 MPC 제어기 설계하기
이 예제에서는 명령줄에서 모델 예측 제어기를 생성하고 테스트하는 방법을 보여줍니다.
플랜트 모델 정의하기
이 예제에서는 Design Controller Using MPC Designer에 설명된 플랜트 모델을 사용합니다. 플랜트의 상태공간 모델을 생성하고 몇 가지 선택적 모델 속성(예: 입력 변수, 상태 변수, 출력 변수의 이름과 단위)을 설정합니다.
% continuous-time state-space matrices, with temperature as a first output A = [ -5 -0.3427; 47.68 2.785]; B = [ 0 1 0.3 0]; C = [0 1; 1 0]; D = zeros(2,2); % create state space plant model CSTR = ss(A,B,C,D); % set names CSTR.InputName = {'T_c', 'C_A_f'}; % set names of input variables CSTR.OutputName = {'T', 'C_A'}; % set names of output variables CSTR.StateName = {'C_A', 'T'}; % set names of state variables % set units CSTR.InputUnit = {'deg K', 'kmol/m^3'}; % set units of input variables CSTR.OutputUnit = {'deg K', 'kmol/m^3'}; % set units of output variables CSTR.StateUnit = {'kmol/m^3', 'deg K'}; % set units of state variables
참고로, 이 모델은 동작점 주변의 비선형 모델을 선형화하여 도출된 것입니다. 따라서 선형 모델의 입력 및 출력 신호 값은 비선형 모델의 동작점 값에 대한 편차를 나타냅니다. 자세한 내용은 Linearization Using MATLAB Code 항목을 참조하십시오.
입력 신호 및 출력 신호를 서로 다른 MPC 범주에 할당하기
냉매 온도는 조작 변수(MV)이고, 유입 시약 농도는 비측정 외란 입력(UD)이며, 반응기 온도는 측정 출력(MO)이고, 시약 농도는 비측정 출력(UO)입니다.
CSTR=setmpcsignals(CSTR,'MV',1,'UD',2,'MO',1,'UO',2);
기본 플랜트 속성 표시 및 계단 응답 플로팅하기
damp를 사용하여 선형 플랜트 모델 극점의 감쇠비, 고유 주파수, 시정수를 표시합니다.
damp(CSTR)
Pole Damping Frequency Time Constant
(rad/seconds) (seconds)
-1.11e+00 + 1.09e+00i 7.13e-01 1.55e+00 9.03e-01
-1.11e+00 - 1.09e+00i 7.13e-01 1.55e+00 9.03e-01
개루프 계단 응답을 플로팅합니다.
step(CSTR)

플랜트의 공칭 안정성(nominal stability)을 고려했을 때, 약 1초의 시정수는 샘플 시간이 0.5초를 넘지 않아야 함을 암시합니다. 샘플 시간이 0.5초이면 10개 스텝의 예측 지평이 개루프 플랜트의 전체 정착 시간을 포함할 수 있으므로, 두 파라미터를 초기 추측값으로 사용할 수 있습니다. 샘플 시간이 짧아지면 제어 계산에 사용할 수 있는 시간이 줄어듦을 의미합니다. 지평이 길어지면(스텝이 더 많음) 최적화 변수의 개수가 많아짐을 의미하므로, 사용 가능한 시간 스텝 내에 해결해야 하는 문제의 계산량이 더 많이 요구됩니다.
제어기 생성하기
예제의 명확성을 높이기 위해 MPC 제어기에서 명령 창 메시지를 표시하지 않도록 합니다.
old_status = mpcverbosity('off');
제어 구간, 즉 샘플 시간을 0.5초로 설정하고 10개 스텝의 예측 지평, 2개 스텝의 제어 지평을 포함한 다른 모든 속성을 디폴트 값으로 설정하여 모델 예측 제어기를 생성합니다.
mpcobj = mpc(CSTR,0.5) %#ok<*NOPTS>
MPC object (created on 19-Apr-2026 09:50:46):
---------------------------------------------
Sampling time: 0.5 (seconds)
Prediction Horizon: 10
Control Horizon: 2
Plant Model:
--------------
1 manipulated variable(s) -->| 2 states |
| |--> 1 measured output(s)
0 measured disturbance(s) -->| 2 inputs |
| |--> 1 unmeasured output(s)
1 unmeasured disturbance(s) -->| 2 outputs |
--------------
Indices:
(input vector) Manipulated variables: [1 ]
Unmeasured disturbances: [2 ]
(output vector) Measured outputs: [1 ]
Unmeasured outputs: [2 ]
Disturbance and Noise Models:
Output disturbance model: default (type "getoutdist(mpcobj)" for details)
Input disturbance model: default (type "getindist(mpcobj)" for details)
Measurement noise model: default (unity gain after scaling)
Weights:
ManipulatedVariables: 0
ManipulatedVariablesRate: 0.1000
OutputVariables: [1 0]
ECR: 100000
State Estimation: Default Kalman Filter (type "getEstimator(mpcobj)" for details)
Unconstrained
Use built-in "active-set" QP solver with MaxIterations of 120.
제어기 속성 확인 및 수정하기
제어기 속성과 그에 해당하는 현재 값의 목록을 표시합니다.
get(mpcobj)
Ts: 0.5
PredictionHorizon (P): 10
ControlHorizon (C): 2
Model: [1x1 struct]
ManipulatedVariables (MV): [1x1 struct]
OutputVariables (OV): [1x2 struct]
DisturbanceVariables (DV): [1x1 struct]
Weights (W): [1x1 struct]
Optimizer: [1x1 struct]
Notes: {}
UserData: []
History: 19-Apr-2026 09:50:46
표시되는 History 값은 제어기가 생성된 시점에 따라 달라지므로, 이 값은 사용자의 제어기마다 다릅니다. MPC 제어기의 편집 가능한 속성에 대한 설명을 보려면 명령줄에 mpcprops를 입력하십시오.
점 표기법을 사용하여 이러한 속성을 수정합니다. 예를 들어, 예측 지평을 15로 변경합니다.
mpcobj.PredictionHorizon = 15;
일부 속성 이름에는 별칭이 있습니다. 예를 들어, ManipulatedVariables 대신 별칭 MV를 사용할 수 있습니다. 또한, 제어기 속성 중 다수는 추가 필드를 포함하는 구조체입니다. 점 표기법을 사용하여 이러한 필드 값을 확인하고 수정합니다. 예를 들어, 기본적으로 제어기에는 조작 변수와 출력 변수에 대한 제약 조건이 없기 때문에 점 표기법을 사용하여 이러한 제약 조건을 확인하고 수정할 수 있습니다.
제어기 조작 변수에 대한 제약 조건을 설정합니다.
mpcobj.MV.Min = -10; % K mpcobj.MV.Max = 10; % K mpcobj.MV.RateMin = -1; % K/step mpcobj.MV.RateMax = 1; % K/step
약어가 모호하지 않은 한 속성 이름을 축약할 수 있습니다. 제어기 조정 가중치를 확인하고 수정할 수도 있습니다. 예를 들어, 조작 변수 변화율과 출력 변수에 대한 가중치를 수정합니다.
mpcobj.W.ManipulatedVariablesRate = 0.3; mpcobj.W.OutputVariables = [1 0];
각 시간 스텝마다 이동하는 예측 지평에 대해 시변 제약 조건과 가중치를 정의할 수도 있습니다. 예를 들어, 조작 변수가 예측 지평의 끝으로 갈수록 더 느리게 변하도록 하려면 다음을 입력합니다.
mpcobj.MV.RateMin = [-2; -1.5; -1; -1; -1; -0.5];
mpcobj.MV.RateMax = [2; 1.5; 1; 1; 1; 0.5];
-0.5 및 0.5 값은 네 번째 스텝과 그 이후에 사용됩니다.
마찬가지로, 예측 지평의 각 스텝에 대해 서로 다른 출력 변수 가중치를 지정할 수 있습니다. 예를 들면, 다음을 입력합니다.
mpcobj.W.OutputVariables = [0.1 0; 0.2 0; 0.5 0; 1 0];
제어기의 외란 제거 특성을 수정할 수도 있습니다. 자세한 내용은 setEstimator, setindist 및 setoutdist 항목을 참조하십시오.
제어기 설계 검토하기
발생할 수 있는 잠재적 런타임 안정성 및 성능 문제에 대한 리포트를 생성합니다.
review(mpcobj)

이 예제에서 review 명령이 설계와 관련된 두 가지 잠재적인 문제를 찾아냈습니다. 첫 번째 경고는 C_A 출력 오류에 대한 가중치가 0이라는 사실로 인한 것입니다. 두 번째 경고는 MV와 MVRate 모두에 하드 제약 조건이 있다는 사실로 인한 것입니다.
아래로 스크롤하면 각 개별 테스트 결과에 대한 자세한 정보를 확인할 수 있습니다.
정상 상태 폐루프 출력 민감도 이득
폐루프 시스템의 정상 상태 폐루프 이득 행렬을 계산합니다.
SoDC = cloffset(mpcobj)
SoDC = -5.9952e-15
선형 시뮬레이션 수행하기
sim 함수를 사용하여 시스템의 선형 시뮬레이션을 실행합니다. 예를 들어, 26개의 제어 구간에 대한 mpcobj의 폐루프 응답을 시뮬레이션합니다. 두 번째 스텝부터 반응기 온도(첫 번째 출력)와 시약 농도(두 번째 출력)에 대해 각각 설정점을 2와 0으로 지정합니다. 두 번째 출력에 대한 조정 가중치가 0이므로 농도에 대한 설정점은 무시됩니다.
T = 26;
r = [0 0;
2 0];
sim(mpcobj,T,r)


mpcsimopt를 사용하여 시뮬레이션 옵션을 수정할 수 있습니다. 예를 들어, 조작 변수 제약 조건을 끈 상태로 시뮬레이션을 실행합니다.
mpcopts = mpcsimopt;
mpcopts.Constraints = 'off';
sim(mpcobj,T,r,mpcopts)


조작 변수의 첫 번째 증분이 이제는 지정된 1 단위 변화율 제약 조건을 초과합니다.
플랜트와 모델이 일치하지 않아도 시뮬레이션을 수행할 수 있습니다. 예를 들어, 제어기가 사용하는 모델에 비해 이득이 50% 더 크고 0.1초의 시간 지연을 갖는 플랜트를 정의합니다.
mpcopts.Model = tf(1.5,1,'InputDelay',0.1)*CSTR;
sim(mpcobj,T,r,mpcopts)


플랜트와 모델의 불일치는 폐루프 응답의 진동 동작에서 알 수 있듯이 제어기 성능을 저하시킵니다. 성능 저하는 심각할 수 있으며 사례별로 테스트해야 합니다.
다른 시뮬레이션 옵션으로는 조작 변수 또는 측정 출력에 지정된 잡음 시퀀스 추가, 개루프 시뮬레이션, 그리고 더 나은 설정점 추종 또는 측정 외란 제거를 위한 예측 옵션이 있습니다.
시뮬레이션 결과 저장 및 플로팅하기
시뮬레이션 결과를 MATLAB® 작업 공간에 저장하는 시스템을 시뮬레이션합니다.
[y,t,u] = sim(mpcobj,T,r);
이 구문은 자동 플로팅을 비활성화하고 시뮬레이션 결과를 y, t, u 변수로 반환합니다. 이 결과는 사용자 지정 플로팅을 포함해 다른 목적으로 사용할 수 있습니다. 예를 들어, 조작 변수와 두 출력 변수를 동일한 Figure에 플로팅합니다.
figure subplot(2,1,1) plot(t,u) title('Inputs') legend('T_c') subplot(2,1,2) plot(t,y) title('Outputs') legend('T','C_A') xlabel('Time')

mpcverbosity 설정을 복원합니다.
mpcverbosity(old_status);
