SymPy控制系统:传递函数与状态空间建模

SymPy控制系统:传递函数与状态空间建模

【免费下载链接】sympy 一个用纯Python语言编写的计算机代数系统。 【免费下载链接】sympy 项目地址: https://gitcode.com/GitHub_Trending/sy/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 "离散")

模型转换

mermaid

# 传递函数转状态空间
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支持有限完善
初始条件零初始条件任意初始条件
数值稳定性可能有问题较好
控制器设计频域方法时域方法
实现难度中到高

最佳实践建议

  1. 模型选择原则

    • 单输入单输出系统优先使用传递函数
    • 多变量系统使用状态空间表示
    • 需要处理初始条件时选择状态空间
  2. 数值稳定性

    # 避免高阶多项式导致的数值问题
    tf_high_order = TransferFunction(1, s**10 + 1, s)
    # 转换为状态空间可能更稳定
    ss_stable = tf_high_order.to_StateSpace()
    
  3. 符号计算优势

    # 参数化分析
    parametric_tf = TransferFunction(K, s**2 + 2*zeta*wn*s + wn**2, s)
    # 符号化稳定性分析
    stability_condition = parametric_tf.is_stable()
    

总结

SymPy的控制系统模块提供了从基础到高级的完整建模工具链。无论是简单的传递函数分析还是复杂的状态空间设计,SymPy都能以符号计算的方式提供精确的数学支持。通过合理选择模型表示形式并结合SymPy的符号计算能力,工程师可以更深入地理解系统特性,设计出更优的控制策略。

掌握SymPy的控制系统功能,不仅能够提升建模效率,更能通过符号计算获得对系统行为的深刻洞察,为复杂工程问题的解决提供强有力的数学工具支持。

【免费下载链接】sympy 一个用纯Python语言编写的计算机代数系统。 【免费下载链接】sympy 项目地址: https://gitcode.com/GitHub_Trending/sy/sympy

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值