如何在Python中对传递函数矩阵求逆?
Python中实现传递函数矩阵的求逆与频域分析(替代MATLAB对应功能)
问题背景
在MATLAB中可直接创建传递函数矩阵并执行求逆、绘制Bode图操作:
s = tf('s') G11 = (s + 1)/(s + 2) G12 = 1/(2*s + 1) G21 = 1/(3*s + 1) G22 = 1/(4*s + 1) A = [G11 G12; G21, G22] Ai = inv(A) bode(A)
但尝试用Python+numpy+control工具箱复现时,numpy.linalg.inv无法处理传递函数对象矩阵,报错:
UFuncTypeError: Cannot cast ufunc 'inv' input from dtype('O') to dtype('float64') with casting rule 'same_kind'
且直接用numpy.array包装传递函数矩阵后,control.bode也无法正常工作。
解决方法
不要用numpy处理传递函数矩阵,而是直接使用control工具箱自身的矩阵操作能力,它原生支持传递函数对象的矩阵运算:
可运行代码
import control as co # 创建复频率变量 s = co.tf('s') # 定义单个传递函数 G11 = (s + 1)/(s + 2) G12 = 1/(2*s + 1) G21 = 1/(3*s + 1) G22 = 1/(4*s + 1) # 用control.mat构造传递函数矩阵(也可直接用列表嵌套,control会自动识别) A = co.mat([[G11, G12], [G21, G22]]) # 使用control.inv求传递函数矩阵的逆 Ai = co.inv(A) # 直接传入传递函数矩阵绘制Bode图 co.bode(A)
关键说明
control工具箱的mat函数专门用于构造由传递函数/状态空间对象组成的矩阵,替代numpy.array的包装control.inv是针对动态系统矩阵的求逆函数,支持传递函数矩阵,而numpy.linalg.inv仅处理数值型数组control.bode可以直接接收control库的矩阵对象,无需转换为numpy数组
扩展操作
control工具箱还支持其他针对传递函数矩阵的线性代数操作,例如:
- 求行列式:
co.det(A) - 求迹:
co.trace(A) - 矩阵乘法:
A @ A(Python 3.5+支持的矩阵乘法运算符)
内容的提问来源于stack exchange,提问作者David Daminelli
相关产品推荐
相关产品推荐

