基于ASTM标准的MATLAB高效雨流计数算法
项目介绍
本项目提供了一个遵循ASTM E1049-85(疲劳分析中循环计数的标准规范)的高性能雨流计数算法实现。该算法能够将复杂的、变幅的载荷时间序列转化为一系列离散的简谐循环,并统计其应力幅值、均值及循环次数。这为后续的疲劳损伤累计(如Miner线性损伤理论)和寿命预测提供了关键的基础数据。通过优化底层寻址和堆栈处理逻辑,该算法在大规模工业传感器数据处理中表现出卓越的计算效率。
功能特性
- 标准化实现:严格遵循国际通用的ASTM E1049-85雨流计数准则。
- 高效预处理:内置自动极值提取算法,有效去除冗余采样点,保留对疲劳损伤有贡献的波峰和波谷。
- 精准循环识别:采用改进的堆栈三点法,能够精确识别闭合的全循环和非闭合的半循环(余数序列)。
- 多维度统计:输出结果包含每个循环的幅值(Range)、均值(Mean)、循环计数(Count,1.0或0.5)以及在原始序列中的索引位置。
- 直观可视化:提供包括原始信号极值轨迹、幅值-均值散点图、幅值分布直方图以及幅值-均值联合分布热图(马尔可夫矩阵)在内的全方位结果展示。
使用方法
- 在MATLAB环境下运行主函数。
- 程序将自动生成一个包含多频率成分和随机噪声的模拟应力信号。
- 算法将对该信号执行预处理和雨流计数。
- 计算完成后,MATLAB工作区将生成详细的循环统计矩阵,并自动弹出包含四个子图的可视化窗口供分析参考。
- 控制台会实时输出原始数据规模、极大值点压缩率及统计得到的总循环数等关键信息。
系统要求
- MATLAB R2016b 或更高版本(以支持
histcounts2 等绘图函数)。 - 无需额外工具箱,基于MATLAB基础函数库实现。
核心实现逻辑说明
1. 信号预处理(极值点提取)
算法的第一步是消除信号中的非极值点。由于疲劳循环仅由应力水平的转折点决定,算法通过计算一阶差分的符号变化来捕捉波峰和波谷。针对实际工况中存在的平坦区域(即连续相等的应力点),算法进行了特殊处理,确保在不丢失极值特征的前提下极大限度地压缩数据规模,从而减轻后续堆栈运算的负担。
2. 雨流计数逻辑(三点法推演)
算法的核心采用了高效的堆栈逻辑执行ASTM E1049-85标准:
- 入栈机制:将极值点依次压入索引栈和数值栈。
- 规则判定:当栈内至少存在三个点时,计算倒数第二个间距 $X$ 和最新间距 $Y$。
- 循环提取:若满足 $X le Y$,说明在 $X$ 范围内形成了一个闭合循环。算法记录该循环的幅值为 $X$,均值为该区间的中心值,计数为1.0。随后,将构成该循环的中间两个点从栈中弹出。
- 持续迭代:弹出点后,算法会继续检查栈顶剩余点是否仍满足判定逻辑,直到不满足 $X le Y$ 为止。
3. 余数处理(半循环认定)
在处理完整个载荷序列后,栈中通常会残留一串无法闭合的发散序列。根据ASTM标准,这些剩余的线段被视为半循环。算法会遍历残留堆栈,计算相邻点之间的每一段行程,并将其赋予0.5的循环权重,确保载荷序列中的能量损耗得到完整统计。
关键技术细节分析
函数:提取极值点 (extract_extremes)
该函数不仅查找
diff(y) 的符号切换,还特别处理了信号开头和结尾的边界条件。通过将原始索引与数值同步保存,确保了后续分析中循环发生的具体时间点可追溯。
函数:雨流计数核心逻辑 (rainflow_counting_logic)
这是算法的灵魂。相比传统的四点法,三点法配合堆栈操作在处理长序列时具有更高的内在效率。通过循环内的
while 嵌套,算法可以在一次遍历中提取出所有嵌套的闭合循环。预分配内存的
rf_results 矩阵极大地减少了动态扩容带来的开销,使得处理万级、十万级极值点时依然保持极高的响应速度。
数据可视化与统计
算法通过
scatter 的透明度设置和
imagesc 渲染的联合分布热图,直观地展示了载荷循环在幅值和均值两个维度上的集中趋势。这种马尔可夫矩阵形式的输出对于编制疲劳试验程序载荷谱具有重要的工程价值。