You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算动态系统的无穷范数(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 10:39:34