SymPy控制系统:传递函数与状态空间建模
概述
在现代控制工程中,传递函数(Transfer Function)和状态空间(State Space)是描述线性时不变系统(LTI System)的两种核心数学工具。SymPy作为强大的符号计算库,提供了完整的控制系统建模和分析功能,让工程师能够以符号方式处理复杂的控制问题。
传递函数基础
什么是传递函数?
传递函数是线性时不变系统在零初始条件下,输出信号的拉普拉斯变换与输入信号的拉普拉斯变换之比。对于连续时间系统,传递函数表示为:
$$H(s) = \frac{Y(s)}{X(s)} = \frac{b_ms^m + b_{m-1}s^{m-1} + \cdots + b_1s + b_0}{a_ns^n + a_{n-1}s^{n-1} + \cdots + a_1s + a_0}$$
其中 $s$ 是复频率变量。
SymPy中的传递函数创建
SymPy提供了多种创建传递函数的方法:
from sympy.physics.control import TransferFunction
from sympy.abc import s, t
# 方法1:直接创建
tf1 = TransferFunction(s + 2, s**2 + 3*s + 2, s)
# 方法2:从有理表达式创建
expr = (s + 5)/(3*s**2 + 2*s + 1)
tf2 = TransferFunction.from_rational_expression(expr)
# 方法3:从系数列表创建
num_coeffs = [1, 5] # 对应 s + 5
den_coeffs = [3, 2, 1] # 对应 3s² + 2s + 1
tf3 = TransferFunction.from_coeff_lists(num_coeffs, den_coeffs, s)
# 方法4:从零极点增益形式创建
zeros = [-2, -3] # 零点位置
poles = [-1, -4, -5] # 极点位置
gain = 2 # 增益
tf4 = TransferFunction.from_zpk(zeros, poles, gain, s)
传递函数的基本操作
# 获取分子分母多项式
numerator = tf1.num
denominator = tf1.den
# 计算极点零点
poles = tf1.poles()
zeros = tf1.zeros()
# 系统连接:串联、并联、反馈
tf_a = TransferFunction(s + 1, s**2 + 2*s + 1, s)
tf_b = TransferFunction(2, s + 3, s)
# 串联连接
series_tf = tf_a * tf_b
# 并联连接
parallel_tf = tf_a + tf_b
# 反馈连接
feedback_tf = tf_a.feedback(tf_b)
状态空间建模
状态空间表示
状态空间模型用一组一阶微分方程描述系统:
$$\dot{x}(t) = Ax(t) + Bu(t)$$ $$y(t) = Cx(t) + Du(t)$$
其中:
- $x(t)$ 是状态向量
- $u(t)$ 是输入向量
- $y(t)$ 是输出向量
- $A$ 是系统矩阵
- $B$ 是输入矩阵
- $C$ 是输出矩阵
- $D$ 是直接传递矩阵
SymPy状态空间实现
from sympy.physics.control import StateSpace
from sympy import Matrix
# 创建状态空间模型
A = Matrix([[-2, -1], [1, 0]])
B = Matrix([[1], [0]])
C = Matrix([[1, 0]])
D = Matrix([[0]])
ss = StateSpace(A, B, C, D)
# 状态空间基本属性
print("系统矩阵 A:", ss.A)
print("输入矩阵 B:", ss.B)
print("输出矩阵 C:", ss.C)
print("直接矩阵 D:", ss.D)
print("系统阶数:", ss.order)
print("系统类型:", "连续" if ss.is_continuous else "离散")
模型转换
# 传递函数转状态空间
tf = TransferFunction(s + 2, s**2 + 3*s + 2, s)
ss_from_tf = tf.to_StateSpace()
# 状态空间转传递函数
tf_from_ss = ss.to_TransferFunction()
# 系统特性分析
is_stable = ss.is_stable() # 稳定性判断
is_controllable = ss.is_controllable() # 可控性
is_observable = ss.is_observable() # 可观测性
实际应用案例
案例1:二阶系统分析
考虑一个典型的二阶系统:
$$H(s) = \frac{\omega_n^2}{s^2 + 2\zeta\omega_n s + \omega_n^2}$$
from sympy import symbols, pi
from sympy.physics.control import phase_margin, gain_margin
zeta, wn = symbols('zeta omega_n', positive=True)
tf_second_order = TransferFunction(wn**2, s**2 + 2*zeta*wn*s + wn**2, s)
# 频域分析
pm = phase_margin(tf_second_order.subs({zeta: 0.7, wn: 1}))
gm = gain_margin(tf_second_order.subs({zeta: 0.7, wn: 1}))
print(f"相位裕度: {pm.evalf():.2f}°")
print(f"增益裕度: {gm.evalf():.2f} dB")
案例2:PID控制器设计
from sympy.physics.control import PIDController
# PID控制器传递函数
Kp, Ki, Kd = symbols('K_p K_i K_d', real=True)
pid = PIDController(Kp, Ki, Kd, s)
# 被控对象
plant = TransferFunction(1, s*(s + 1), s)
# 闭环系统
closed_loop = (pid * plant).feedback(1)
# 稳定性分析(特定参数)
stable_system = closed_loop.subs({Kp: 1, Ki: 0.5, Kd: 0.2})
print("系统极点:", stable_system.poles())
高级功能
多变量系统(MIMO)
from sympy.physics.control import TransferFunctionMatrix
# 创建2x2 MIMO系统
tf11 = TransferFunction(s + 1, s**2 + 2*s + 1, s)
tf12 = TransferFunction(2, s + 3, s)
tf21 = TransferFunction(3, s + 4, s)
tf22 = TransferFunction(s + 2, s**2 + 3*s + 2, s)
tf_matrix = TransferFunctionMatrix([[tf11, tf12], [tf21, tf22]])
离散时间系统
from sympy.physics.control import DiscreteTransferFunction
from sympy.abc import z
# 离散传递函数
dtf = DiscreteTransferFunction(z - 0.5, z**2 - 1.5*z + 0.7, z, 0.1)
# 离散化方法
from sympy.physics.control import bilinear, forward_diff, backward_diff
continuous_tf = TransferFunction(1, s + 1, s)
discrete_bilinear = bilinear(continuous_tf, 0.1) # 双线性变换
discrete_forward = forward_diff(continuous_tf, 0.1) # 前向差分
discrete_backward = backward_diff(continuous_tf, 0.1) # 后向差分
性能对比表
特性 | 传递函数 | 状态空间 |
---|---|---|
建模复杂度 | 简单 | 中等 |
MIMO支持 | 有限 | 完善 |
初始条件 | 零初始条件 | 任意初始条件 |
数值稳定性 | 可能有问题 | 较好 |
控制器设计 | 频域方法 | 时域方法 |
实现难度 | 低 | 中到高 |
最佳实践建议
-
模型选择原则:
- 单输入单输出系统优先使用传递函数
- 多变量系统使用状态空间表示
- 需要处理初始条件时选择状态空间
-
数值稳定性:
# 避免高阶多项式导致的数值问题 tf_high_order = TransferFunction(1, s**10 + 1, s) # 转换为状态空间可能更稳定 ss_stable = tf_high_order.to_StateSpace()
-
符号计算优势:
# 参数化分析 parametric_tf = TransferFunction(K, s**2 + 2*zeta*wn*s + wn**2, s) # 符号化稳定性分析 stability_condition = parametric_tf.is_stable()
总结
SymPy的控制系统模块提供了从基础到高级的完整建模工具链。无论是简单的传递函数分析还是复杂的状态空间设计,SymPy都能以符号计算的方式提供精确的数学支持。通过合理选择模型表示形式并结合SymPy的符号计算能力,工程师可以更深入地理解系统特性,设计出更优的控制策略。
掌握SymPy的控制系统功能,不仅能够提升建模效率,更能通过符号计算获得对系统行为的深刻洞察,为复杂工程问题的解决提供强有力的数学工具支持。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考