주요 콘텐츠

명령줄에서 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.50.5 값은 네 번째 스텝과 그 이후에 사용됩니다.

마찬가지로, 예측 지평의 각 스텝에 대해 서로 다른 출력 변수 가중치를 지정할 수 있습니다. 예를 들면, 다음을 입력합니다.

mpcobj.W.OutputVariables = [0.1 0; 0.2 0; 0.5 0; 1 0];

제어기의 외란 제거 특성을 수정할 수도 있습니다. 자세한 내용은 setEstimator, setindistsetoutdist 항목을 참조하십시오.

제어기 설계 검토하기

발생할 수 있는 잠재적 런타임 안정성 및 성능 문제에 대한 리포트를 생성합니다.

review(mpcobj)

이 예제에서 review 명령이 설계와 관련된 두 가지 잠재적인 문제를 찾아냈습니다. 첫 번째 경고는 C_A 출력 오류에 대한 가중치가 0이라는 사실로 인한 것입니다. 두 번째 경고는 MVMVRate 모두에 하드 제약 조건이 있다는 사실로 인한 것입니다.

아래로 스크롤하면 각 개별 테스트 결과에 대한 자세한 정보를 확인할 수 있습니다.

정상 상태 폐루프 출력 민감도 이득

폐루프 시스템의 정상 상태 폐루프 이득 행렬을 계산합니다.

SoDC = cloffset(mpcobj)
SoDC =

  -5.9952e-15

선형 시뮬레이션 수행하기

sim 함수를 사용하여 시스템의 선형 시뮬레이션을 실행합니다. 예를 들어, 26개의 제어 구간에 대한 mpcobj의 폐루프 응답을 시뮬레이션합니다. 두 번째 스텝부터 반응기 온도(첫 번째 출력)와 시약 농도(두 번째 출력)에 대해 각각 설정점을 20으로 지정합니다. 두 번째 출력에 대한 조정 가중치가 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);

참고 항목

함수

객체

블록

도움말 항목