【Numpy】第五部分:统计分析、搜索与逻辑判断(分析篇)
2026/9/16 10:50:47 网站建设 项目流程

第五部分:统计分析、搜索与逻辑判断(分析篇)

在算法仿真结束后,我们需要对实验结果(如轨迹跟踪误差、系统能耗、参数估计收敛性)进行全面的量化评估。本篇聚焦于如何利用 NumPy 进行高效的数据统计、极值定位以及异常状态(如执行器饱和、算法发散)的检测与处理。

1. 描述性统计

用于分析系统误差分布或传感器噪声特性。可以通过axis参数指定计算的维度(例如计算多个智能体在各自时间轴上的平均误差)。

  • np.meannp.median:计算平均值与中位数。在处理包含偶发尖峰噪声的传感器数据时,中位数的鲁棒性往往优于均值。

    Python

    import numpy as np # 模拟某智能体在 5 个采样点的跟踪误差 (存在一个突变噪声 10.0) errors = np.array([0.1, 0.15, -0.05, 10.0, 0.02]) print("平均误差:", np.mean(errors)) # 平均误差: 2.044 print("误差中位数:", np.median(errors)) # 误差中位数: 0.1
  • np.varnp.std:计算方差与标准差,常用于评估控制算法的稳态抖振(Chattering)水平或噪声强度。

    Python

    # 模拟稳态下的一段噪声序列 noise = np.array([-0.2, 0.1, 0.3, -0.1, 0.0]) print("噪声方差:", np.var(noise)) # 噪声方差: 0.027999999999999997 print("噪声标准差:", np.std(noise)) # 噪声标准差: 0.1673320053068151

2. 极值与索引提取

在控制性能评估中,极值用于确定系统的最大超调量(Overshoot),而极值索引则用于定位该超调发生的具体时刻(峰值时间)。

  • np.maxnp.min:提取数组中的最大值与最小值。

    Python

    system_response = np.array([0.0, 0.8, 1.4, 1.1, 0.98, 1.0]) # 查找响应曲线的最高点(峰值) peak_value = np.max(system_response) print("系统峰值:", peak_value) # 系统峰值: 1.4
  • np.argmaxnp.argmin:返回极值所在的索引值。如果是一维数组,返回相对时间步长;如果是多维矩阵,默认返回将其展平后的索引(建议配合axis参数使用)。

    Python

    # 定位峰值发生的时间步长 peak_time_step = np.argmax(system_response) print("峰值发生时刻 (Time Step):", peak_time_step) # 峰值发生时刻 (Time Step): 2

3. 数据限幅与求和

在实际物理系统中,执行器(如电机电压、无人机旋翼转速)通常存在物理硬约束。数据限幅与求和是仿真环境中最常用的工程函数。

  • np.clip:将数组中的元素强行限制在指定的上下界之间。这是模拟控制算法中“执行器饱和(Actuator Saturation)”的最直接手段。

    Python

    # 算法计算出的理想控制输入 u(k) ideal_control_inputs = np.array([-5.0, 2.5, 12.0, 8.0]) # 模拟电机电压限幅:最大 ±10V actual_inputs = np.clip(ideal_control_inputs, a_min=-10.0, a_max=10.0) print("限幅后的实际输入:", actual_inputs) # 限幅后的实际输入: [-5. 2.5 10. 8. ]
  • np.sum:计算数组元素的总和。在控制理论中,常用于计算绝对误差积分 (IAE) 或误差平方积分 (ISE) 等性能指标。

    Python

    # 计算误差平方和 (Sum of Squared Errors) squared_errors = np.array([0.01, 0.04, 0.09]) ise = np.sum(squared_errors) print("误差平方和:", ise) # 误差平方和: 0.14
  • np.cumsum:计算累加和。返回一个与原数组等长的数组,每个元素是截止到当前位置的所有元素之和。非常适合用于离散时间下的 PID 积分项计算或绘制累计能耗曲线。

    Python

    # 离散跟踪误差序列 e(k) e_k = np.array([0.5, 0.3, 0.1, -0.1]) # 离散积分累加和(未乘采样时间 Ts) integral_e = np.cumsum(e_k) print("累计误差积分序列:", integral_e) # 累计误差积分序列: [ 0.5 0.8 0.9 0.8]

4. 逻辑搜索与异常检测

数据驱动算法(如无模型自适应控制)在参数估计时,分母可能因为数据激励不足而趋近于零,导致结果中出现NaNInf。掌握逻辑搜索函数能够有效防范和定位数值发散。

  • np.isnannp.isinf:返回布尔型掩码数组,用于检测数据中是否包含非数字(Not a Number)或无穷大。

    Python

    # 伪偏导数更新中分母极小导致的发散现象 ppd_estimates = np.array([2.1, 1.5, np.nan, np.inf, 1.8]) # 检测 NaN print("是否为 NaN:", np.isnan(ppd_estimates)) # 是否为 NaN: [False False True False False] # 检测无穷大 print("是否为 Inf:", np.isinf(ppd_estimates)) # 是否为 Inf: [False False False True False]
  • np.anynp.all:基于布尔数组进行全局逻辑判断。np.any只要有一个为 True 就返回 True;np.all要求全部为 True 才返回 True。常用于算法终止条件判断或异常阻断机制。

    Python

    # 异常安全检查:如果估计值中包含任何 NaN 或 Inf,则触发报警 if np.any(np.isnan(ppd_estimates)) or np.any(np.isinf(ppd_estimates)): print("警告:参数估计发散!") # 警告:参数估计发散! # 收敛性检查:判断所有编队误差是否都小于 0.05 formation_errors = np.array([0.02, 0.01, 0.04]) is_converged = np.all(formation_errors < 0.05) print("编队是否全局收敛:", is_converged) # 编队是否全局收敛: True
  • np.where:极其强大的条件替换与索引搜索工具。

    • 用法 1(三元运算的向量化)np.where(condition, x, y),满足条件取 x,不满足取 y。常用于切换控制策略或死区(Dead-zone)处理。
    • 用法 2(搜索索引):只传入condition,返回所有满足条件的元素索引序列。

    Python

    error_signal = np.array([0.5, -0.2, 0.01, -0.05]) # 用法 1:实现控制死区 (Dead-zone),绝对误差小于 0.1 时强行视为 0 processed_error = np.where(np.abs(error_signal) < 0.1, 0.0, error_signal) print("死区处理后的误差:", processed_error) # 死区处理后的误差: [ 0.5 -0.2 0. -0. ] # 用法 2:找出所有偏离期望位置超过 0.3 的智能体索引 # 注意返回的是一个元组,通常取 [0] 解包 large_error_indices = np.where(np.abs(error_signal) > 0.3)[0] print("误差超标的元素索引:", large_error_indices) # 误差超标的元素索引: [0]

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询