【有料】随机振动中雨流计数法实现疲劳分析

本文由 徐冬冬 撰写,黄琳琳 排版。
在本文当中我们将给大家介绍如何去实现随机疲劳分析当中的雨流计数法。
一:雨流计数法基础
ASTM E1049-85介绍了疲劳分析当中用到的几种计数方法(level crossing counting, peak counting, simple-range counting, rangepair counting, rain flow counting),并且论述了每种方法的具体实践过程。因为雨流计数法得出的结果和实际加载历程相同,结果也比较接近真实值,故而一般都用雨流计数法。ASTM E1049-85当中的rainflow counting 计出来的是整循环和半循环。这也是最初的雨流计数法。为了避免半循环,我们采用ASTM E1049-85当中的simplified rainflow counting,这种方法的特点是先把信号顺序略作改变、使得最大值提前到第一个位置。然后开始循环计数。这样计出来的循环没有半循环,只有整循环。
信号的预处理包括2部分:
Part I:最大值提前
Part II:峰值谷值交替
黑圈中的点直接去除
下图展示的是对信号完整的预处理过程:
红色信号是原始信号,灰色信号是最大值提前后的信号,蓝色信号是提取的峰值谷值交替的信号。
下图是处理数据的历程图
经过了预处理的算法就可以开始正式的统计。
二、雨流计数法的程序及程序解释
附件cpp文件当中包括了一个雨流计数法的函数,函数定义如下:
voidRainFlowCounting(double*A,intL,int N1,int N2,double **R)
A代表需要分析的应力信号段,L代表应力信号段的长度,N1是均值等分的份数,N2是幅值等分的份数,R用来存储结果。R是个二维数组,R中存储的数如下:
R[0][0]存储了统计过程中发现的全部载荷历程的数目。
R[1][1]存储了统计历程中所有载荷历程的均值。
R[0][1],R[1][0]全部赋值0,没有意义。
R[2][0],R[3][0],R[4][0]…….R[N1+1][0]分别代表每个均值组的下限,
R[2][1],R[3][1],R[4][1]…….R[N1+1][1]分别代表每个均值组的上限。
R[0][2],R[0][3],R[0][4]…….R[0][N2+1]分别代表每个幅值组的下限,
R[1][2],R[1][3],R[1][4]…….R[1][N2+1]分别代表每个幅值组的上限。
二维数组当中余下的值是代表当同时满足
的应力循环的频次。
调用过程的具体过程参见cpp文件,以下做简要说明。注意:头文件必须包括<vector>,同时红色标记的3行定义了二维数组。
//从a.dat读取应力数据,最后分析的结果输出到b.dat
ofstreammyfile1("b.dat");
ifstreammyfile("a.dat");
intL=500000; //信号长度
clock_tstart,finish;
doubletotaltime;
start=clock();
double*A=new double[L];
for(inti=0;i<L;i++)
myfile>>A[i];
//First,Movethe signal
intN1,N2;
N1=16;N2=16;
//N1代表均值分的个数
//N2代表幅值分的个数
double **R=newdouble* [N1+2]; //**R用来存储结果,并且**R只能按照这一种格式来写
for(intk=0;k<N1+2;k++)
R[k]=new double[N2+2];
//调用雨流计数法的函数。
RainFlowCounting(A,L,N1,N2,R);
//以下是往外输出结果的部分。
cout<<"上两行是幅值"<<endl;
cout<<"左边两行是均值"<<endl;
finish=clock();
totaltime=double(finish-start)/CLOCKS_PER_SEC;
myfile1<<"%%total time is :"<<totaltime<<endl;
myfile1<<"%%"<<"第一行是幅值下限,第二行是幅值上限"<<endl;
myfile1<<"%%"<<"第一列是均值下限,第二列是均值上限"<<endl;
myfile1<<"%%"<<"第一行第一列的数字代表的是总载荷历程数"<<endl;
for(int k1=0;k1<=N1+1;k1++)
{
for(intk2=0;k2<=N2+1;k2++)
{
cout<<R[k1][k2]<<" ";
myfile1<<setw(12)<<R[k1][k2]<<"";
}
myfile1<<endl;
cout<<endl;
}
输出结果如下:
三、正确性验证
Matlab官网提供了RainFlowCounting的程序(评分4.5,评价数53)。利用这个程序的计算结果和C++的结果进行对比。备注: Matlab的结果第一行是幅值,第二行是均值,第三行是循环次数。最后2个0.5次应该合并成1次。C++结果第一列是幅值,第二列是均值,全是整循环,循环次数为1。
MATLAB code:
clc
clearall
length=20;
s=10*randn(length,1)+rand(length,1);
s(1)=max(s)+0.1;
s(length)=s(1);
savea.dats-ascii
clc
clearall
tic
loada.dat
tp=sig2ext(a);
rf=rainflow(tp)
toc
案例1:
20个点
结果完全一致。
案例2:
30个点
两者结果完全一致。
来源:CAE仿真大视界公众号

工程师必备
- 项目客服
- 培训客服
- 平台客服
TOP
