一、前言
我经常需要绘制根轨迹、Nyquist 图之类的图象,MATLAB 启动确实是有点慢,可以使用 Python 的 control 库来迅速的画出所需的图象。
下面是简单的例子。
二、画图
(一)准备工作
- 安装 control 库:
1
pip install control
- 导入所需要的库
下面的库都是后续操作所要使用的: 1
2
3
4
5import control as ctrl
import numpy as np
import matplotlib.pyplot as plt
import sympy as sp
from functools import reduce
tf2latex 用于将传递函数转换成 LaTeX 字符串,方便后续使用。
1
2
3
4
5
6
7
8
9
10# Transfer Function 2 LaTex
def tf2latex(sys):
# Transfer Function to sympy expression
s = sp.symbols('s')
num = sp.Poly(sys.num[0][0], s).as_expr()
den = sp.Poly(sys.den[0][0], s).as_expr()
sys_expr = num / den
# sympy expression to LaTex
sys_latex = sp.latex(sys_expr)
return sys_latex
(二)系统响应
对于闭环传递函数为
- 定义绘图函数
1 | # Draw Impulse Response |
- 定义传递函数并绘图
1 | # Define Transfer Function |
- 图象
(三)根轨迹
对于开环传递函数为
定义函数
1
2
3
4
5
6# Draw Root Locus
def root_locus(sys):
title = f'Root Locus of $' + tf2latex(sys) + '$'
ctrl.root_locus(sys, title='')
plt.title(title, y=1.05)
plt.show()定义传递函数并绘图
1 | # Define Transfer Function |
- 图象
(四)Bode 图
对于开环传递函数为
- 定义函数
1 | # Draw Bode Plot |
- 定义传递函数并绘图
1 | # Define Transfer Function |
- 图象
(五)Nyquist 图
对于开环传递函数为
- 定义函数
1 | # Draw Nyquist Plot |
- 定义传递函数并绘图
1 | # Define Transfer Function |
- 图象
三、说明
完整代码见 barkure/py-control。