본 페이지에서는 Nonlinear MPC를 설계하는 다음의 code를 설명합니다.

run_NMPC_CICS_2022.m

문제 설정

Untitled

Code 설명 1 : Off-line 연산

Linear MPC와 유사하게 system을 설명하는 paramter를 다음과 같이 정의합니다.

%% Describe a system
A = 1.2;
B = 0.2;

dim_x = 1;
dim_u = 1;

f = @(x,u) A*x + B*u + 0.2*(sin(x/5));

param_sys = struct('dim_x', dim_x, 'dim_u', dim_u, 'f', f);

한편 nonlinear MPC의 설계를 위한 parameter들을 설정합니다.

Q = eye(dim_x)*1;
R = eye(dim_u)*1;
N = 6;

u_max = 1;
u_min = -1;

특히 다음의 selection matrix

$$ \begin{split} S_{x,1} & = \left[\begin{array}{cccc|ccc} I & 0 & \cdots & 0 & 0 & \cdots & 0 \end{array}\right],\\ S_{x,2} & = \left[\begin{array}{cccc|ccc} 0 & I & \cdots & 0 & 0 & \cdots & 0 \end{array}\right]\\ & \vdots \end{split} $$

$$ \begin{split} S_{u,1} & = \left[\begin{array}{ccc|cccc} 0 & \cdots & 0 & I & 0 & \cdots & 0 \end{array}\right],\\ S_{u,2} & = \left[\begin{array}{ccc|cccc} 0 & \cdots & 0 & 0 & I & \cdots & 0 \end{array}\right]\\ & \vdots \end{split} $$

를 얻기 위해 다음의 for 문을 구동합니다.

S_x = [];
S_u = [];

for i = 1:N
	S_x_temp = [zeros(dim_x,(i-1)dim_x) eye(dim_x) zeros(dim_x, (N-i)dim_x)];
	S_x(i,:) = [S_x_temp zeros(dim_x, Ndim_u)];
	S_u_temp = zeros(dim_u, Ndim_x);
	S_u(i,:) = [S_u_temp zeros(dim_u,(i-1)*dim_u) eye(dim_u) zeros(dim_u, (N-i)*dim_u)];
end

위의 parameter들을 struct의 형태로 다음과 같이 묶습니다.

param_NMPC = struct('Q', Q, 'R', R, 'N', N, 'u_min', u_min, 'u_max', u_max, 'S_x', S_x, 'S_u', S_u);