본문 바로가기
Programming/Python

Python Control 라이브러리 사용법

by linuxgo 2025. 9. 4.

python-control은 파이썬에서 제어 시스템의 분석과 설계를 위한 강력한 도구입니다. MATLAB의 Control System Toolbox와 유사한 기능을 제공하며, 선형 및 비선형 시스템의 모델링, 시뮬레이션, 제어기 설계 등을 지원합니다. 이 문서에서는 설치 방법과 간단한 예제를 통해 기본적인 사용법을 알아봅니다.

1. 설치 방법

python-control 라이브러리는 NumPy, SciPy, Matplotlib에 의존하며, 일부 고급 기능은 Slycot을 필요로 합니다.

pip를 사용한 설치

pip install control
pip install slycot  # 선택 사항, 고급 기능(MIMO 등)에 필요

conda를 사용한 설치

Anaconda를 사용하는 경우:

conda install -c conda-forge numpy scipy matplotlib
conda install -c python-control -c cyclus slycot control

Slycot 설치 확인:

python -c "import slycot"

에러가 없으면 설치 성공입니다. Windows에서 Slycot 설치에 문제가 생길 수 있으니, 공식 GitHub를 참고하세요.

2. 기본 사용법: 간단한 2차 시스템 예제

전달함수 \( G(s) = \frac{1}{s^2 + 2s + 1} \)의 스텝 응답을 계산하고 플롯하는 예제를 살펴보겠습니다.

예제 코드

import control as ctrl
import matplotlib.pyplot as plt
import matplotlib as mpl

# MATLAB 스타일 설정 (폰트 대체)
plt.style.use('ggplot')
mpl.rcParams['font.family'] = 'DejaVu Sans'  # Arial 대신 기본 폰트 사용
mpl.rcParams['font.size'] = 12
mpl.rcParams['axes.linewidth'] = 1.2
mpl.rcParams['lines.linewidth'] = 2
mpl.rcParams['grid.color'] = 'gray'
mpl.rcParams['grid.linestyle'] = '--'
mpl.rcParams['grid.linewidth'] = 0.5

# 전달함수 정의: G(s) = 1 / (s^2 + 2s + 1)
num = [1]
den = [1, 2, 1]
sys = ctrl.TransferFunction(num, den)

# 스텝 응답 계산
t, y = ctrl.step_response(sys)

# 그래프 그리기
plt.figure(figsize=(8, 6))
plt.plot(t, y, 'b-', label='Step Response')
plt.title('Step Response of Second-Order System', fontsize=14, pad=15)
plt.xlabel('Time (s)', fontsize=12)
plt.ylabel('Output', fontsize=12)
plt.grid(True)
plt.legend()
plt.tight_layout()
plt.show()

python-control plot

설명: 이 코드는 전달함수 \( G(s) = \frac{1}{s^2 + 2s + 1} \)를 정의하고, 단위 스텝 입력에 대한 시간 응답을 계산해 그래프로 표시합니다.

3. 주요 기능

  • 시스템 모델링: 상태공간(state-space), 전달함수(transfer function) 모델.
  • 제어기 설계: PID, LQR, H2/H∞ 제어기, 루트 로커스 설계.
  • 분석 도구: 안정성 분석, 주파수 응답(Bode, Nyquist 플롯), 스텝/임펄스 응답.
  • 비선형 시스템: 비선형 시스템 시뮬레이션, 궤적 생성, 기술 함수 분석.

4. 추가 예제: Bode 플롯

Bode 플롯으로 주파수 응답을 확인합니다.

import control as ctrl
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np

# MATLAB 스타일 설정
plt.style.use('ggplot')
mpl.rcParams['font.family'] = 'DejaVu Sans'  # Arial 대신 기본 폰트
mpl.rcParams['font.size'] = 12
mpl.rcParams['axes.linewidth'] = 1.2
mpl.rcParams['lines.linewidth'] = 2
mpl.rcParams['grid.color'] = 'gray'
mpl.rcParams['grid.linestyle'] = '--'
mpl.rcParams['grid.linewidth'] = 0.5

# 전달함수 정의
sys = ctrl.TransferFunction([1], [1, 2, 1])

# Bode 플롯 생성
plt.figure(figsize=(8, 8))
ctrl.bode_plot(sys, dB=True, Hz=False, omega_limits=(0.1, 100))
plt.suptitle('Bode Plot of Second-Order System', fontsize=14, y=1.05)
plt.tight_layout()
plt.show()

이 코드는 시스템의 크기와 위상 플롯을 생성합니다.

5. 참고 자료

6. 결론

python-control은 제어 시스템 설계와 분석을 위한 강력한 도구로, MATLAB과 유사한 기능을 무료로 제공합니다. 간단한 모델링부터 복잡한 제어기 설계까지, 이 라이브러리를 활용해 다양한 제어 문제를 해결해 보세요