如何计算动态系统的无穷范数(H∞)与H₂范数?求Python实现方法
动态系统H∞与H₂范数计算及Python实现
范数定义确认
- H∞范数:你的猜测完全正确——对于线性时不变(LTI)系统,它就是系统频率响应的最大增益,也就是幅频特性曲线的峰值。如果是多输入多输出(MIMO)系统,则是传递函数矩阵在所有频率下的最大奇异值;单输入单输出(SISO)系统直接取幅频曲线的最高点即可。
- H₂范数:对应系统脉冲响应的L₂范数(即脉冲响应能量的平方根),也可通过频域积分(传递函数功率谱密度积分的平方根)或系统的可控/可观Gramian计算,主要反映系统的稳态能量特性。
Python实现方案(基于control库)
Python中最常用的控制工程库是control,直接用它的内置函数就能快速计算这两个范数。
1. 安装依赖
pip install control
2. 定义系统模型
不管是无控还是受控系统,都可以用传递函数或状态空间形式定义:
import control as ctrl # 示例:无控SISO系统(传递函数G(s) = 1/(s² + 0.5s + 1)) G_unc = ctrl.TransferFunction([1], [1, 0.5, 1]) # 示例:受控系统(加入PID控制器的单位反馈闭环系统) K_pid = ctrl.TransferFunction([1, 0.5, 0.2], [1, 0]) # PID控制器传递函数 G_ctrl = ctrl.feedback(G_unc * K_pid, 1) # 构造闭环系统
3. 计算H∞范数
用ctrl.hinfnorm()函数,返回结果包含范数值和达到峰值的频率:
# 无控系统H∞范数计算 hinf_unc, peak_freq_unc = ctrl.hinfnorm(G_unc) print(f"无控系统H∞范数: {hinf_unc:.4f}, 峰值对应频率: {peak_freq_unc:.4f} rad/s") # 受控系统H∞范数计算 hinf_ctrl, peak_freq_ctrl = ctrl.hinfnorm(G_ctrl) print(f"受控系统H∞范数: {hinf_ctrl:.4f}, 峰值对应频率: {peak_freq_ctrl:.4f} rad/s")
4. 计算H₂范数
用ctrl.h2norm()函数直接计算:
# 无控系统H₂范数 h2_unc = ctrl.h2norm(G_unc) print(f"无控系统H₂范数: {h2_unc:.4f}") # 受控系统H₂范数 h2_ctrl = ctrl.h2norm(G_ctrl) print(f"受控系统H₂范数: {h2_ctrl:.4f}")
关键注意点
- 系统稳定性:H∞和H₂范数仅对稳定的LTI系统有定义,计算前可以用
ctrl.isstable(G_unc)验证系统是否稳定,不稳定系统会导致函数报错或返回无效值。 - MIMO系统兼容:上述函数同样支持MIMO系统,只需用
ctrl.StateSpace定义多输入多输出的状态空间模型即可。 - 峰值验证:可以结合伯德图验证H∞范数的正确性,比如绘制幅频曲线后把计算出的范数值作为参考线:
import matplotlib.pyplot as plt # 绘制无控系统伯德图并标注H∞范数 mag, phase, omega = ctrl.bode(G_unc, plot=True, label='Uncontrolled System') plt.axhline(hinf_unc, color='red', linestyle='--', label=f'H∞ Norm = {hinf_unc:.4f}') plt.legend() plt.title('Bode Plot with H∞ Norm Marker') plt.show()
内容的提问来源于stack exchange,提问作者Igor Gonzaga
相关产品推荐
相关产品推荐

