ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

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

2026/9/16 10:50:48 拓冰建站 浏览量
【Numpy】第五部分:统计分析、搜索与逻辑判断(分析篇) 第五部分统计分析、搜索与逻辑判断分析篇在算法仿真结束后我们需要对实验结果如轨迹跟踪误差、系统能耗、参数估计收敛性进行全面的量化评估。本篇聚焦于如何利用 NumPy 进行高效的数据统计、极值定位以及异常状态如执行器饱和、算法发散的检测与处理。1. 描述性统计用于分析系统误差分布或传感器噪声特性。可以通过axis参数指定计算的维度例如计算多个智能体在各自时间轴上的平均误差。np.mean与np.median计算平均值与中位数。在处理包含偶发尖峰噪声的传感器数据时中位数的鲁棒性往往优于均值。Pythonimport 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.1np.var与np.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.16733200530681512. 极值与索引提取在控制性能评估中极值用于确定系统的最大超调量Overshoot而极值索引则用于定位该超调发生的具体时刻峰值时间。np.max与np.min提取数组中的最大值与最小值。Pythonsystem_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.4np.argmax与np.argmin返回极值所在的索引值。如果是一维数组返回相对时间步长如果是多维矩阵默认返回将其展平后的索引建议配合axis参数使用。Python# 定位峰值发生的时间步长 peak_time_step np.argmax(system_response) print(峰值发生时刻 (Time Step):, peak_time_step) # 峰值发生时刻 (Time Step): 23. 数据限幅与求和在实际物理系统中执行器如电机电压、无人机旋翼转速通常存在物理硬约束。数据限幅与求和是仿真环境中最常用的工程函数。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_max10.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.14np.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. 逻辑搜索与异常检测数据驱动算法如无模型自适应控制在参数估计时分母可能因为数据激励不足而趋近于零导致结果中出现NaN或Inf。掌握逻辑搜索函数能够有效防范和定位数值发散。np.isnan与np.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.any与np.all基于布尔数组进行全局逻辑判断。np.any只要有一个为 True 就返回 Truenp.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) # 编队是否全局收敛: Truenp.where极其强大的条件替换与索引搜索工具。用法 1三元运算的向量化np.where(condition, x, y)满足条件取 x不满足取 y。常用于切换控制策略或死区Dead-zone处理。用法 2搜索索引只传入condition返回所有满足条件的元素索引序列。Pythonerror_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]