声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

12
返回列表 发新帖
楼主: 比丘尼萧竹

[随机振动] 基于随机子空间方法模态参数识别的相关matlab程序(可用哦,我在

[复制链接]
发表于 2014-12-10 15:59 | 显示全部楼层
我也在做这方面 谢谢啦
回复 支持 反对
分享到:

使用道具 举报

发表于 2015-5-20 11:13 | 显示全部楼层
确实有些乱,需要整理一下!
发表于 2015-12-26 20:34 | 显示全部楼层
谢谢楼主!!!!
发表于 2017-3-20 13:58 | 显示全部楼层
谢谢楼主!!!!
发表于 2017-3-21 09:00 | 显示全部楼层
  1. %1、噪声添加程序  y向加速度
  2. %读取数据文件
  3. clc;clear
  4. [FileName,PathName]=uigetfile('*.txt','Select the TimeVy File');  %显示选择时程文件的对话框
  5. File=strcat(PathName,FileName);  %把数横向连接成单个字符串
  6. fip=fopen(File,'r');
  7. TimeVy=load('-ascii',File);                    %载入时程信息
  8. [TimePointNum,MesNodeTotalNum]=size(TimeVy);   %这个矩阵与hankel块方向不同,下面为转置
  9. MesNodeTotalNum=MesNodeTotalNum-1;             %第一列为时间序列
  10. TimePointNum=TimePointNum;
  11. Baizaosheng=wgn(TimePointNum,MesNodeTotalNum,1);

  12. %产生TimePointNum行1列的随机数
  13. Zero1=zeros(TimePointNum,1);
  14. Kuozhan=[Zero1,Baizaosheng];
  15. B=0.05*Kuozhan;       %加入5%的噪声
  16. C=TimeVy+B;   
  17. save TimeVy2.mat C -ascii;  %保存白噪声

  18. %2、奇异值分解
  19. %读取数据文件   
  20. clc;clear
  21. [FileName,PathName]=uigetfile('*.txt','Select the TimeVy File');
  22. File=strcat(PathName,FileName);
  23. fip=fopen(File,'r');
  24. TimeVy=load('-ascii',File);
  25. [TimePointNum,MesNodeTotalNum]=size(TimeVy);
  26. MesNodeTotalNum=MesNodeTotalNum-1;            
  27. TimePointNum=TimePointNum;                    

  28. %输入计算参数
  29. %创建输入对话框
  30. prompt={'TOEPLITZ矩阵块数M(>=采样频率/(2*结构基频)):'};  %j>20M
  31. dlg_title='Input Parameter of Calculate';              %输入计算参数
  32. num_lines=1;
  33. def={'100'};
  34. answer=inputdlg(prompt,dlg_title,num_lines,def);
  35. %获取输入的值
  36. M=str2num(answer{1,1});                                %将字符串转化为数值
  37. j=TimePointNum-2*M;                %Hankel矩阵最后一个矩阵块对应坐标为(2*i,j),即2*i+j需<=TimePointNum                              
  38. Hankel=zeros((2*M+1)*MesNodeTotalNum,j);            
  39. for ti=1:j
  40.       m=0
  41.       for tii=1:(2*M+1)
  42.            km=ti+tii-1;
  43.             m=m+1;
  44. %计算每次赋值在所在行的起始位置
  45.            beginy=(m-1)*MesNodeTotalNum+1;
  46. %计算每次赋值在所在行的结束位置
  47.           endy=m*MesNodeTotalNum;
  48.           Hankel(beginy:endy,ti)=TimeVy(km,2:(MesNodeTotalNum+1))';
  49.       end
  50. end
  51. Yp=Hankel(1:M*MesNodeTotalNum,:);
  52. Yf=Hankel(M*MesNodeTotalNum+1:2*M*MesNodeTotalNum,:);
  53. Yf2=Hankel((M+1)*MesNodeTotalNum+1:(2*M+1)*MesNodeTotalNum,:);
  54. Teop1=Yf*Yp'/j;
  55. %组成第一个Toeplitz矩阵
  56. [U,S,V]=svd(Teop1);
  57. S1=diag(S);

  58. %在窗口中绘制矩阵奇异值分解结果图
  59. cla
  60. newplot                   %为后续的图形命令创建图形窗口和坐标轴,并返回当前坐标轴的句柄
  61. subplot(1,1,1)            %作为一个二维曲线绘制函数,它的功能是:将一个窗口分为若干块,在选中的某一块内可以绘制图形
  62. plot(S1,'k*');            %S1Y用黑色的星号表示

  63. ylabel('Singular value');
  64. xlabel('Order of system');
  65. title('Singular value decomposition results ');











  66. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  67. % Baizaosheng=wgn(TimePointNum,MesNodeTotalNum,1);
  68.                                 %产生TimePointNum %行1列的随机数
  69. %  Zero1=zeros(TimePointNum,1);
  70. %  Kuozhan=[Zero1,Baizaosheng];
  71. %  B=0.15*Kuozhan;       %加入5%的噪声
  72. %  TimeVy=TimeVy+B;   

  73. %3、协方差驱动SSI模态参数识别程序;           %TimeVy需为偶数
  74. clc;clear
  75. %[FileName,PathName]=uigetfile('*.txt','Select the TimeVy File');
  76. %File=strcat(PathName,FileName);
  77. %fip=fopen(File,'r');
  78. %TimeVy=load('-ascii',File);
  79. load b16z2_Waveform.txt                %%%%%%%%%%%%%%%%%%%%%%%%%%
  80. TimeVy=b16z2_Waveform(1:5120,1:16);    %%%%%%%%%%%%%%%%%%%%%%%%%%
  81. %yacc=[];
  82. [TimePointNum,MesNodeTotalNum]=size(TimeVy);
  83. MesNodeTotalNum=MesNodeTotalNum-1;            
  84. TimePointNum=TimePointNum;     

  85. prompt={'TOEPLITZ矩阵块数M(>=采样频率/(2*结构基频)):','系统阶数N(<i*实际测点数):'};
  86. dlg_title='Input Parameter of Calculate';
  87. num_lines=1;
  88. def={'50','30'};                                 %系统阶数N=2*n
  89. answer=inputdlg(prompt,dlg_title,num_lines,def);
  90. M=str2num(answer{1,1});
  91. N=str2num(answer{2,1});

  92. j=TimePointNum-2*M;
  93. Hankel=zeros((2*M+1)*MesNodeTotalNum,j);
  94. for ti=1:j
  95.       m=0
  96.       for tii=1:(2*M+1)
  97.            km=ti+tii-1;
  98.             m=m+1;
  99. %计算每次赋值在所在行的起始位置
  100.            beginy=(m-1)*MesNodeTotalNum+1;
  101. %计算每次赋值在所在行的结束位置
  102.           endy=m*MesNodeTotalNum;
  103.           Hankel(beginy:endy,ti)=(TimeVy(km,2:(MesNodeTotalNum+1)))';
  104.       end
  105. end

  106. Yp=Hankel(1:M*MesNodeTotalNum,:);
  107. Yf=Hankel(M*MesNodeTotalNum+1:2*M*MesNodeTotalNum,:);
  108. Yf2=Hankel((M+1)*MesNodeTotalNum+1:(2*M+1)*MesNodeTotalNum,:);
  109. %组成第一个Toeplitz矩阵
  110. Teop1=Yf*Yp'/j;
  111. %组成第二个Toeplitz矩阵
  112. Teop2=Yf2*Yp'/j;

  113. %Hankel=[];

  114. [U,S,V]=svd(Teop1);

  115. %提取前N阶奇异值分解结果
  116. U_de=U(:,1:N);
  117. S_de=S(1:N,1:N);
  118. V_de=V(:,1:N);

  119. %计算C,A矩阵的估计
  120. O_GJ=U_de*S_de^0.5;
  121. C_GJ=O_GJ(1:MesNodeTotalNum,:);
  122. A_GJ=S_de^-0.5*(U_de')*Teop2*V_de*S_de^-0.5;

  123. %U_de=[];
  124. %S_de=[];
  125. %V_de=[];

  126. %计算状态矩阵A的特征值和特征向量
  127. [V_of_A,D_of_A]=eig(A_GJ);                %对系统矩阵A进行特征值分解

  128. %D_of_A=zeros(N,N);
  129. %V_of_A=zeros(N,N);
  130. %for i=1:N/2
  131. %D_of_A(i,i)=D_of_A1(i*2-1,i*2-1);
  132. %V_of_A(:,i)=V_of_A1(:,i*2-1);
  133. %end
  134. %for i=N/2+1:N
  135. %D_of_A(i,i)=D_of_A1(i*2-N,i*2-N);
  136. %V_of_A(:,i)=V_of_A1(:,i*2-N);
  137. %end

  138. %计算系统的特征值和特征向量
  139. freqency_of_Sample=1/(TimeVy(2,1)-TimeVy(1,1));        %采样频率
  140. fs=freqency_of_Sample;
  141. T=1/freqency_of_Sample;                                %采样时间  
  142. Total_mode_jieShu=N;                                   %模型阶数
  143.   %计算振型                       
  144.   MODE=C_GJ*V_of_A;                                    %阵型矩阵=C*(A的复特征向量)
  145.   %计算频率
  146. for i=1:N
  147.     LN_lamuda(i,1)=log(D_of_A(i,i))/T;
  148.     Re_Abs(i,1)=abs(real(LN_lamuda(i,1)));             %abs求绝对值
  149.     Im_Abs(i,1)=abs(imag(LN_lamuda(i,1)));
  150.   Freq(i,1)=abs(LN_lamuda(i,1))/2/pi;

  151.   %计算阻尼比
  152.   Dpro(i,1)=Re_Abs(i,1)/abs(LN_lamuda(i,1));
  153. end

  154. %将实部和虚步分别归一化
  155. for opp_index=1:Total_mode_jieShu

  156.    min_of_real=min(real(MODE(:,opp_index)));
  157.    max_of_real=max(real(MODE(:,opp_index)));

  158.    min_of_imag=min(imag(MODE(:,opp_index)));
  159.    max_of_imag=max(imag(MODE(:,opp_index)));

  160.    if max_of_real~=min_of_real                       %~=表示不等于

  161.        Mode_value_Total_of_real_GYH=2*(real(MODE(:,opp_index))-min_of_real)/(max_of_real-min_of_real)-1;
  162.    else
  163.        Mode_value_Total_of_real_GYH=zeros(MesNodeTotalNum,1);
  164.    end

  165.    if max_of_imag~=min_of_imag

  166.        Mode_value_Total_of_imag_GYH=2*(imag(MODE(:,opp_index))-min_of_imag)/(max_of_imag-min_of_imag)-1;

  167.    else
  168.        Mode_value_Total_of_imag_GYH=zeros(MesNodeTotalNum,1);
  169.    end

  170.        MODE(:,opp_index)=Mode_value_Total_of_real_GYH+Mode_value_Total_of_imag_GYH*sqrt(-1);

  171.    if imag(MODE(:,opp_index))~=0;
  172.    
  173.        MODE(:,opp_index)=imag(MODE(:,opp_index));

  174.    else
  175.      
  176.        MODE(:,opp_index)=real(MODE(:,opp_index));   
  177.    end

  178. end

  179. %N_MODE=2         %%%%%%%%%绘制一阶振型
  180. %MODE_N=MODE(:,N_MODE);
  181. %ylabel('振型');
  182. %xlabel('节点号');

  183. %plot(MODE_N,'k*');
  184. %ylim([-4 4])                             %y轴的范围

  185. %clear prompt answer def dlg_title beginy acc6 freqency_of_Sample...
  186. %      endy V_de V U_de Yp Yf2 Yf num_lines min_of_real...
  187. %      min_of_imag tii ti opp_index km j i max_of_real...
  188. %      max_of_imag m U MesNodeTotalNum M Mode_value_Total_of_imag_GYH...
  189. %      N Mode_value_Total_of_real_GYH Im_Abs C_GJ A_GJ...
  190. %      Hankel TimeVy T Teop1 TimePointNum Teop2 Re_Abs...
  191. %      O_GJ S Total_mode_jieShu S_de D_of_A LN_lamuda V_of_A


  192. %%%%%%%%%%%%%%%%%%%%%%真实模态判断%%%%%%%%%%%%%%%%%%%%%%%%
  193. M2=length(Freq);
  194. mm2=1;
  195. for m2=1:M2
  196.      if (Freq(m2)<=(0.5*fs))&(Freq(m2)>0)&(Dpro(m2)>0)&(Dpro(m2)<0.1)
  197.          Freq2(mm2)=Freq(m2);
  198.          Dpro2(mm2)=Dpro(m2);
  199.          MODE2(:,mm2)=MODE(:,m2);
  200.          mm2=mm2+1;
  201.      end
  202. end

  203. [Freq3,IX]=sort(Freq2);                   %将Freq2按行升序排列,IX是排序的位置信息
  204. for m3=1:length(Freq3)
  205.     Dpro3(m3)=Dpro2(IX(m3));
  206.     MODE3(:,m3)=MODE2(:,IX(m3));
  207. end

  208. %%%%%%%%%重频合并%%%%%

  209. %%重频判断系数
  210. crtifreq=1;
  211. crtidamping=5;
  212. crtimodeshape=98;                         %相同模态判断

  213. M3=length(Freq3);
  214. dualfreq=ones(1,M3);
  215. for m3=1:M3
  216.      for n3=m3+1:M3
  217.          X=MODE3(:,m3);
  218.          Y=MODE3(:,n3);
  219.          MAC_shape=(X'*Y)^2/((X'*X)*(Y'*Y));         %樊江玲文章中的式(4-48)
  220.          if (((Freq3(m3)-Freq3(n3))*100/Freq3(m3))<crtifreq)...
  221.                 &(((Dpro3(m3)-Dpro3(n3))*100/Dpro3(m3))<crtidamping)...
  222.                 &(MAC_shape*100>crtimodeshape)
  223.          dualfreq(n3)=0;
  224.          
  225.          end
  226.      end
  227. end
  228. indicefreq=find(dualfreq);               %find就是找到符号某一条件的数的下标
  229. M4=length(indicefreq);
  230. for m4=1:M4
  231.    Freq4(m4)=Freq3(indicefreq(m4));
  232.    Dpro4(m4)=Dpro3(indicefreq(m4));
  233.    MODE4(:,m4)=MODE3(:,indicefreq(m4));  
  234. end

  235. %clear Freq2 Freq3 Freq Dpro Dpro2 Dpro3 MAC_shape MODE MODE2...
  236. %      M4 IX M2 M3 indicefreq m2 dualfreq fs mm2 n3 m3 m4...
  237. %      crtimodeshape MODE3 crtidamping crtifreq X Y


  238. %%%%%%%%%%%%%%%%%%%%%%<函数>模态参数识别绘图函数%%%%%%%%%%%%%
  239. N_MODE=6        %%%%%%%%%绘制一阶振型
  240. MODE_N=MODE4(1:8,N_MODE);
  241. ylabel('振型');
  242. xlabel('节点号');

  243. plot(MODE_N,'b-');                          %蓝色实线
  244. ylim([-4 4])
  245.       

  246. %%%%%%%%%%%%%%%%%%%%%%%%稳定图%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


  247. clc;clear
  248. load b16b1_Waveform.txt
  249. TimeVy=b16b1_Waveform(1:5120,1:9);
  250. %yacc=[];
  251. [TimePointNum,MesNodeTotalNum]=size(TimeVy);
  252. MesNodeTotalNum=MesNodeTotalNum-1;            
  253. TimePointNum=TimePointNum;     

  254. prompt={'TOEPLITZ矩阵块数M(>=采样频率/(2*结构基频)):','系统阶数N(<i*实际测点数):'};
  255. dlg_title='Input Parameter of Calculate';
  256. num_lines=1;
  257. def={'50','2'};                                 %系统阶数N=2*n
  258. answer=inputdlg(prompt,dlg_title,num_lines,def);
  259. M=str2num(answer{1,1});

  260. j=TimePointNum-2*M;
  261. Hankel=zeros((2*M+1)*MesNodeTotalNum,j);
  262. for ti=1:j
  263.       m=0
  264.       for tii=1:(2*M+1)
  265.            km=ti+tii-1;
  266.             m=m+1;
  267. %计算每次赋值在所在行的起始位置
  268.            beginy=(m-1)*MesNodeTotalNum+1;
  269. %计算每次赋值在所在行的结束位置
  270.           endy=m*MesNodeTotalNum;
  271.           Hankel(beginy:endy,ti)=(TimeVy(km,2:(MesNodeTotalNum+1)))';
  272.       end
  273. end

  274. Yp=Hankel(1:M*MesNodeTotalNum,:);
  275. Yf=Hankel(M*MesNodeTotalNum+1:2*M*MesNodeTotalNum,:);
  276. Yf2=Hankel((M+1)*MesNodeTotalNum+1:(2*M+1)*MesNodeTotalNum,:);
  277. %组成第一个Toeplitz矩阵
  278. Teop1=Yf*Yp'/j;
  279. %组成第二个Toeplitz矩阵
  280. Teop2=Yf2*Yp'/j;

  281. %Hankel=[];

  282. [U,S,V]=svd(Teop1);

  283. freqency_of_Sample=1/(TimeVy(2,1)-TimeVy(1,1));
  284. fs=freqency_of_Sample;
  285. T=1/freqency_of_Sample;


  286. p=1;
  287. %%%%%%%%%%%%%%
  288. N_min=2;     %
  289. N_max=40;    %
  290. %%%%%%%%%%%%%%
  291. S_freq=-ones((N_max-N_min)/2+1,N_max);
  292. S_damp=-ones((N_max-N_min)/2+1,N_max);

  293. for N_system=N_min:2:N_max

  294.     U_N=U(:,1:N_system);
  295.     V_N=V(:,1:N_system);
  296.     S_N=S(1:N_system,1:N_system);

  297.     A_N=S_N^-0.5*(U_N')*Teop2*V_N*S_N^-0.5;

  298.     [V_N,D_N]=eig(A_N);               % 求矩阵A的全部特征值,构成对角阵D,并求A的特征向量构成V的列向量


  299.     [i,j]=size(D_N);

  300.   for m=1:i
  301.       Eignvalue(1,m)=D_N(m,m);           %转化为Eignvalue的行向量
  302.   end

  303.     Eignvalue_Ac=log(Eignvalue)/T

  304.     Freq_N=abs(Eignvalue_Ac)/2/pi;
  305.     Damp_N=-real(Eignvalue_Ac)./abs(Eignvalue_Ac);

  306.   for q=1:N_system
  307.       S_freq(p,q)=Freq_N(1,q);
  308.       S_damp(p,q)=Damp_N(1,q);
  309.   end

  310.     p=p+1

  311. end



  312. %for a=1:N_max
  313.    
  314.     %for b=1:(N_max-N_min)/2

  315.       % if abs((S_freq((N_max-N_min)/2,a)-S_freq(b,a))/S_freq((N_max-N_min)/2,a))>=0.05|abs((S_damp((N_max-N_min)/2,a)-S_damp(b,a))/S_damp((N_max-N_min)/2,a))>=0.05   %%%%%%%%%

  316.       % S_freq(b,a)=-1
  317.       % end
  318.    % end
  319. %end


  320. %%%%%%%%%绘制%%%%%%%%%%
  321. Ref=8; %%%%%%%%%%%%%%%%%%%%%%%%%%
  322. y_axis=N_min:2:N_max;
  323. nfft=TimePointNum;
  324. %[Pxy,f]=csd(TimeVy(:,Ref),TimeVy(:,9),nfft,fs,hanning(nfft),nfft/2,'mean');
  325. [Pxx,f]=pwelch(TimeVy(:,Ref),hanning(nfft),nfft/2,nfft,fs);      %谱分析函数,pxx和f分别为功率谱密度和频率

  326. [AX,handel_fre,handle_spec]=plotyy(S_freq,y_axis,f,Pxx);
  327. set(get(AX(1),'Ylabel'),'String','Number of Singular Values(N)','fontweight','bold')
  328. set(get(AX(2),'Ylabel'),'String','Power Spectral Density(dB)','fontweight','bold')
  329. set(get(AX(1),'Xlabel'),'String','Frequency,Hz','fontweight','bold')
  330. title('Stability diagram','fontweight','bold')
  331. set(AX(1),'Xlim',[0 fs/2])                   %xlim表示x轴的限值
  332. set(AX(2),'Xlim',[0 fs/2])
  333. set(handel_fre,'LineStyle','*');
  334. set(handel_fre,'color','r');

  335. set(AX(2),'Ylim',[0 0.0001])
复制代码


您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-4-25 03:46 , Processed in 0.105435 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表