본문 바로가기

공부/파이썬(Python)

모델예측제어(MPC)와 cvxpy를 이용한 구현 방법

MPC란?

모델 예측 제어(Model Predictive Control, MPC)는 고급 제어 전략 중 하나로, 미래의 예측을 기반으로 현재의 제어 입력을 최적화한다. 이 블로그 글에서는 Python의 cvxpy 라이브러리를 사용하여 MPC를 구현하는 방법을 소개한다.

 

MPC는 미래의 출력을 예측하고, 이를 바탕으로 최적의 제어 입력을 계산한다. 이 과정은 시스템의 현재 상태를 시작점으로 하여, 미래의 특정 시간 동안의 최적 경로를 계산하는 것을 포함한다.

 

cvxpy 소개

cvxpy는 복잡한 최적화 문제를 쉽게 해결할 수 있도록 도와주는 Python 라이브러리이다. 선형 및 비선형 문제, 제약 조건이 있는 문제 등 다양한 유형의 최적화 문제를 해결할 수 있다.

 

cvxpy를 이용한 mpc 구현

MPC를 구현하기 위해서는 먼저 시스템의 모델을 정의해야 한다. 이 모델은 시스템의 동적 행동을 나타내는 A, B, C, D 행렬로 표현된다. 목적 함수와 제약 조건을 설정한 후, cvxpy를 사용하여 이 최적화 문제를 해결한다. 전체적인 코드는 아래와 같고, 자신이 풀고자 하는 문제에 맞게 파라미터들을 변경해서 풀면 된다. 

 

  1. 시스템 파라미터 정의:
    • A, B, C, D 행렬은 시스템의 동역학을 정의한다. 여기서 A는 상태 전이 행렬, B는 입력 행렬, C는 출력 행렬, D는 직접 전달 행렬이다.
    • x0는 시스템의 초기 상태를 나타낸다.
  2. MPC 파라미터 설정:
    • horizon은 예측 지평선을 나타내며, 이는 MPC가 미래의 얼마나 많은 시간 단계를 고려할지 결정한다.
    • Q, R, S는 각각 상태, 입력, 출력에 대한 비용을 나타내는 가중치 행렬이다.
  3. 변수 정의:
    • x, u, y는 각각 상태, 제어 입력, 출력에 대한 변수이다.
  4. 목적 함수 및 제약 조건 정의:
    • 목적 함수는 상태, 입력, 출력의 제곱합으로 구성되며, 이를 최소화하는 것이 목표다.
    • 제약 조건은 시스템 동역학과 초기 상태를 반영한다.
  5. 최적화 문제 해결:
    • cp.Problem을 사용하여 최적화 문제를 정의하고 solve 메소드로 해를 구한다.

 

import cvxpy as cp
import numpy as np
import matplotlib.pyplot as plt

# 시스템 행렬 정의
A = np.array([[0.8, 0.1], [0, 0.9]])   # 상태 전이 행렬
B = np.array([[0.1, 0], [0, 0.1]])     # 입력 행렬
C = np.eye(2)                          # 출력 행렬
D = np.zeros((2, 2))                   # 직접 전달 행렬
x0 = np.array([0.5, -0.5])             # 초기 상태

# MPC 파라미터
horizon = 10                           # 예측 지평선
Q = np.eye(2) * 10                     # 상태 비용
R = np.eye(2)                          # 입력 비용
S = np.eye(2) * 5                      # 출력 비용

# 변수 정의
x = cp.Variable((2, horizon + 1))      # 상태 변수
u = cp.Variable((2, horizon))          # 제어 입력 변수
y = cp.Variable((2, horizon))          # 출력 변수

# 목적 함수 및 제약 조건 정의
constraints = [x[:, 0] == x0]          # 초기 상태 제약 조건
objective = 0
for t in range(horizon):
    objective += cp.quad_form(x[:, t], Q) + cp.quad_form(u[:, t], R) + cp.quad_form(y[:, t], S)
    constraints += [x[:, t + 1] == A @ x[:, t] + B @ u[:, t]]
    constraints += [y[:, t] == C @ x[:, t] + D @ u[:, t]]

# 최적화 문제 정의 및 해결
problem = cp.Problem(cp.Minimize(objective), constraints)
problem.solve(solver=cp.SCS, verbose=True)