|
楼主 |
发表于 2014-9-10 09:32
|
显示全部楼层
- clear;format long
- %%%%%%%%%%%%%%%%%%%%%%%%%
- %声明为全局变量
- global mn;
- fni=input('有理分式多项式法-输入数据批文件名:','s');
- fid=fopen(fni,'r');
- mn=fscanf(fid,'%d',1); %模态阶数
- df=fscanf(fid,'%f',1); %频率间隔
- fno=fscanf(fid,'%s',1); %输出数据文件名
- b=fscanf(fid,'%f',[2,inf]); %输出实测频响函数实虚部数值数组
- status=fclose(fid);
- %定义幂多项式的阶次
- nm=mn*2;
- %取频响函数长度
- n=length(b(1,:));
- %建立离散频率向量
- f=0:df:(n-1)*df;
- %建立离散圆频率向量
- w=2*pi*f;
- %建立归一化离散频率向量
- wi=w/max(w);
- %建立实测频响函数复数向量
- H=b(1,:)+i*b(2,:);
- %计算拟合频响函数的分子和分母系数向量
- [A,B]=invfreqs(H,wi,nm,nm,[],100);
- %幂多项式方程求根
- P=roots(B);
- %计算模态频率向量
- F1=abs(P)*max(w)/(2*pi);
- %计算阻尼比向量
- D1=-real(P)./(abs(P));
- %计算振型系数向量
- for k=1:mn
- if k==1
- p(1:nm-1)=P(2:nm);
- else
- p(1:k-1)=P(1:k-1);
- p(k:nm-1)=P(k+1:nm);
- end
- y=poly(p);
- S1(k)=polyval(A,P(k))/polyval(y,P(k));
- end
- %计算拟合的频响函数
- H1=freqs(A,B,wi);
- %绘制频响函数实部拟合曲线图
- figure(2)
- nn=1:n;
- subplot(2,1,1);
- plot(f,real(H(nn)),':',f,real(H1(nn)),'r');
- xlabel('频率(Hz)');
- ylabel('实部');
- legend('实测','拟合');
- grid on;
- %绘制频响函数虚部拟合曲线图
- subplot(2,1,2);
- plot(f,b(2,:),':',f,imag(H1(nn)),'r');
- xlabel('频率(Hz)');
- ylabel('虚部');
- legend('实测','拟合');
- grid on;
- %将模态频率从小到大排序
- [F2,I]=sort(F1);
- %剔除方程解中的非模态项和共轭项
- m=0;
- for k=1:nm-1
- if F2(k)~=F2(k+1)
- continue;
- end
- m=m+1;
- l=I(k);
- F(m)=F1(l); %模态频率
- D(m)=D1(l); %阻尼比
- S(m)=S1(l); %振型系数
- end
- %打开文件输出模态参数数据
- fid=fopen(fno,'w');
- fprintf(fid,'频率(Hz) 阻尼比(%%) 振型系数\n');
- for k=1:mn
- fprintf(fid,'%10.4f %10.4f %10.6f\n',F(k),D(k)*100.0,S(k));
- end
- status=fclose(fid);
- 这是程序代码
复制代码 |
|