MPC란?
모델 예측 제어(Model Predictive Control, MPC)는 고급 제어 전략 중 하나로, 미래의 예측을 기반으로 현재의 제어 입력을 최적화한다. 이 블로그 글에서는 Python의 cvxpy 라이브러리를 사용하여 MPC를 구현하는 방법을 소개한다.
MPC는 미래의 출력을 예측하고, 이를 바탕으로 최적의 제어 입력을 계산한다. 이 과정은 시스템의 현재 상태를 시작점으로 하여, 미래의 특정 시간 동안의 최적 경로를 계산하는 것을 포함한다.
cvxpy 소개
cvxpy는 복잡한 최적화 문제를 쉽게 해결할 수 있도록 도와주는 Python 라이브러리이다. 선형 및 비선형 문제, 제약 조건이 있는 문제 등 다양한 유형의 최적화 문제를 해결할 수 있다.
cvxpy를 이용한 mpc 구현
MPC를 구현하기 위해서는 먼저 시스템의 모델을 정의해야 한다. 이 모델은 시스템의 동적 행동을 나타내는 A, B, C, D 행렬로 표현된다. 목적 함수와 제약 조건을 설정한 후, cvxpy를 사용하여 이 최적화 문제를 해결한다. 전체적인 코드는 아래와 같고, 자신이 풀고자 하는 문제에 맞게 파라미터들을 변경해서 풀면 된다.
- 시스템 파라미터 정의:
- A, B, C, D 행렬은 시스템의 동역학을 정의한다. 여기서 A는 상태 전이 행렬, B는 입력 행렬, C는 출력 행렬, D는 직접 전달 행렬이다.
- x0는 시스템의 초기 상태를 나타낸다.
- MPC 파라미터 설정:
- horizon은 예측 지평선을 나타내며, 이는 MPC가 미래의 얼마나 많은 시간 단계를 고려할지 결정한다.
- Q, R, S는 각각 상태, 입력, 출력에 대한 비용을 나타내는 가중치 행렬이다.
- 변수 정의:
- x, u, y는 각각 상태, 제어 입력, 출력에 대한 변수이다.
- 목적 함수 및 제약 조건 정의:
- 목적 함수는 상태, 입력, 출력의 제곱합으로 구성되며, 이를 최소화하는 것이 목표다.
- 제약 조건은 시스템 동역학과 초기 상태를 반영한다.
- 최적화 문제 해결:
- 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)
'공부 > 파이썬(Python)' 카테고리의 다른 글
파이썬 IDE 란 무엇인가? 파이썬 IDE 종류를 알아보자 (1) | 2023.12.11 |
---|---|
Thonny/파이썬 IDE 추천/가볍게 코딩과 디버깅을 하기 좋은 도구 (0) | 2023.12.07 |
[Python] 파이썬 시간 측정/계산 방법, 프로그램 수행 시간 계산 (0) | 2023.01.14 |
파이썬 주석 단축기(Ctrl + /)가 작동이 안될 때 (0) | 2022.02.04 |
주피터 노트북(Jupyter Notebook)에서 줄 번호(Line Number) 보이게 설정하기 (0) | 2020.10.20 |