shwning 发表于 2012-12-8 16:26

计算平板振动模态的程序

本帖最后由 shwning 于 2012-12-8 19:54 编辑

本人编的计算平板振动模态的程序,见附件。(部分参考MATLAB有限元结构动力学分析与工程应用),可计算,用到的子函数已给出。计算得到频率域理论值相差很大,振型很好。计算采用集中质量,一致质量矩阵哪位源程序课发给我,谢谢!同时请求找出计算频率过高的原因。
结构理论频率解:

1
2
3
4
5
6

(1,1)
(1,2)
(2,2)
(1,3)
(2,3)
(1,4)

98
245.7
393.1
491.4
638.8
835.4



% 静力学与固有特性分析
clear
clc
Optmass=1;
alpha=0.01;beta=0.02;   %比例阻尼:C=alpha*M+beta*K
% input basic data
no_elL=10;   %长度方向单元数:10
no_elW=10;   %宽度方向单元数:10
no_el=no_elL*no_elW;%单元数
no_nel=4;    %每个单元的节点数
no_dof=3;    %每个节点自由度数
no_node=(10+1)*(10+1);%系统的节点总数
sys_dof=no_node*no_dof;
% 材料和几何参数
prop(1)=2.1e11;   %杨氏模量
prop(2)=0.3;      %泊松比
prop(3)=7860;       %密度
prop(4)=0.5;      %板长度
prop(5)=0.5;      %板宽度
prop(6)=0.005;      %板厚度
% 节点坐标
xn=zeros(no_node,1); yn=zeros(no_node,1); zn=zeros(no_node,1);
dx=prop(4)/no_elL;dy=prop(5)/no_elW;
k=0;
for i=1:(no_elW+1)
    for j=1:(no_elL+1)
      yn(j+k*(no_elL+1))=(i-1)*dy;    %节点y轴坐标
      xn(j+k*(no_elL+1))=(j-1)*dx;    %节点x轴坐标
    end
    k=k+1;
end
gcoord=;
% 节点连接关系
ndconn=zeros(no_el,no_nel+1);
m=1;n=0;
for i=1:no_elW
    for j=1:no_elL
      ndconn(m,1)=m;
      ndconn(m,2)=m+n;
      ndconn(m,3)=m+n+1;
      ndconn(m,4)=m+n+1+11;
      ndconn(m,5)=m+n+11;
      m=m+1;
    end
    n=n+1;
end
% 加载
% ======静载荷
P=;
% 边界条件
for i=1:10
    connode(i,:)=;
    connode(i+10,:)=;
    connode(i+20,:)=;
    connode(i+30,:)=;
end
for i=1:10
    conval(i,:)=;
    conval(i+10,:)=;
    conval(i+20,:)=;
    conval(i+30,:)=;
end
%---------------------------------------------
% 初始化
k=zeros(no_nel*no_dof,no_nel*no_dof);
m=zeros(no_nel*no_dof,no_nel*no_dof);    %单元质量刚度矩阵
K=zeros(sys_dof,sys_dof);
M=zeros(sys_dof,sys_dof);                %系统质量刚度矩阵
F=zeros(sys_dof,1);                      %系统载荷向量
bcdof=zeros(sys_dof,1);
bcval=zeros(sys_dof,1);
index=zeros(no_nel*no_dof,1);
=quadEleStiffmat(prop,2);   %单元刚度矩阵
for th=1:no_el
    %--------------------------------------------
    nd(1)=ndconn(th,2);   %第th单元的节点1
    nd(2)=ndconn(th,3);   %第th单元的节点2
    nd(3)=ndconn(th,4);   %第th单元的节点3
    nd(4)=ndconn(th,5);   %第th单元的节点4
    %--------------------------------------------------
    index=femSysEleindex(nd,no_nel,no_dof);    %获得第th单元在系统矩阵中的位置
    K=femAssembmat(K,k,index);         %将第th单元的刚度矩阵组装到系统矩阵中
    M=femAssembmat(M,m,index);         %将第th单元的质量矩阵组装到系统矩阵中
end
% 施加边界条件
=femKcheck(K,M,F,bcdof,bcval);
=femSysAppBC(K0,M0,F0,bcdof0,bcval0);
=femMcheck(K1,M1,F1,bcdof0,bcval0);
% 阻尼矩阵
C=alpha*M2+beta*K2;
% 静力学分析
dispplate=K2\F2;
dispp=PostDeal(dispplate,Mi2,Ki0,[],sys_dof);
dispP=reshape(dispp(1:3:end),11,11);
figure(42),surfc(dispP)
% 内力分布
F=K*dispp;
F=reshape(F(1:3:end),11,11);
figure(43),surfc(F)
% 模态分析
=eig(K2,M2);
=sort(diag(D));
omega=sqrt(lambda);
Homega=omega/2/pi
%模态振型
%集中质量矩阵
for i=1:7
    Ys=PostDeal(V(:,i),Mi2,Ki0,[],sys_dof);
    ys=Ys(1:3:end);
    ys=reshape(ys,11,11);
    figure(i),surf(ys)
end
%================================
function =femCalConst(ConNode,ConVal,No_dof,Sys_dof)
bcdof=zeros(Sys_dof,1);      % initializing the vector bcdof
bcval=zeros(Sys_dof,1);      % initializing the vector bcval
=size(ConNode);         % calculate the constrained dofs
for ni=1:n1
    ki=ConNode(ni,1);
    bcdof((ki-1)*No_dof+(1:No_dof))=ConNode(ni,2:(No_dof+1));% the code for constrained dofs
                                                               % 施加约束取“1”
                                                               % 不施加约束取“0”
    bcval((ki-1)*No_dof+(1:No_dof))=ConVal(ni,2:(No_dof+1));   % the value at constrained dofs
end
%==========================================
function =quadEleStiffmat(prop,masschoose)
% //////////////////////////////
% E:杨氏模量
% poisson:泊松比
% density:密度
% a:单元x方向长度/2
% b:单元x方向长度/2
% t:薄板厚度
% masschoose:1-协调质量矩阵;2-集中质量矩阵
% -------------------
% k:刚度矩阵
% m:质量矩阵
% ///////////////////////////////
%刚度矩阵
E=prop(1);
poisson=prop(2);
density=prop(3);
a=prop(4)/2;
b=prop(5)/2;
t=prop(6);
k=cell(4,4);   %刚度矩阵
zeta=[-1 1 1 -1];%x方向
eta= [-1 -1 1 1];%y方向
a_b=(a/b)^2;b_a=(b/a)^2;
H=(1/60/a/b)*E*t*t*t/12/(1-poisson*poisson);
for i=1:4
    for j=1:4
      zeta0=zeta(i)*zeta(j); %x方向
      eta0=eta(i)*eta(j); %y方向
      %----------------------------------------------------------------
      H11=3*H*(15*(b_a*zeta0+eta0*a_b)+(14-4*poisson+5*b_a+5*a_b)*zeta0*eta0);
      H12=-3*H*b*((2+3*poisson+5*a_b)*zeta0*eta(i)+15*a_b*eta(i)+5*poisson*zeta0*eta(j));
      H13=3*H*a*((2+3*poisson+5*b_a)*eta0*zeta(i)+15*b_a*zeta(i)+5*poisson*eta0*zeta(j));
      %------------------------------------------------------------------
      H21=-3*H*b*((2+3*poisson+5*a_b)*zeta0*eta(j)+15*a_b*eta(j)+5*poisson*zeta0*eta(i));
      H22=H*b*b*(2*(1-poisson)*zeta0*(3+5*eta0)+5*a_b*(3+zeta0)*(3+eta0));
      H23=-15*H*poisson*a*b*(zeta(i)+zeta(j))*(eta(i)+eta(j));
      %-----------------------------------------
      H31=3*H*a*((2+3*poisson+5*b_a)*eta0*zeta(j)+15*b_a*zeta(j)+5*poisson*eta0*zeta(i));
      H32=-15*H*poisson*a*b*(zeta(i)+zeta(j))*(eta(i)+eta(j));
      H33=H*a*a*(2*(1-poisson)*eta0*(3+5*zeta0)+5*b_a*(3+zeta0)*(3+eta0));
      k{i,j}=;
    end
end
k=cell2mat(k);   %元胞数组转化为矩阵
%========================================
%质量矩阵
switch masschoose
    case 1
      %协调一致矩阵
      disp('采用协调一致矩阵');
      
    case 2
      %略去转动自由度上的质量
      disp('采用集中质量矩阵')
      m=zeros(12,12);
      w=a*b*t*density;
      m(1,1)=w;
      m(4,4)=w;
      m(7,7)=w;
      m(10,10)=w;
    otherwise
      disp('????????sorry, you only can input ''1-(协调一致矩阵) or 2-(单元质量矩阵)''');
      m=[];
end
%==================================
function index=femSysEleindex(elecond,numnodelement,numdofnode)
% 单元与系统之间的关联节点向量
% elecond:与某单元相连的节点
% numnodelement:单元节点数
% numdofnode:节点自由度数
% -----------------
% index:单元各节点向量在系统矩阵中位置
k=0;
for i=1:numnodelement
    start=(elecond(i)-1)*numdofnode;
    for j=1:numdofnode
      k=k+1;
      index(k)=start+j;
    end
end
%===========================
function =femAssembmat(KM,km,index)
% 质量矩阵和刚度矩阵的组装
% KM:组装后刚度矩阵和质量矩阵
% km:单元刚度矩阵和质量矩阵
% index:单元与系统关联向量
% %-------------------
% KM:组装后刚度矩阵和质量矩阵
%///////////////////////////////
numdofelement=length(index);
for i=1:numdofelement
    for j=1:numdofelement
      KM(index(i),index(j))=KM(index(i),index(j))+km(i,j);
    end
end
%================================
function =femKcheck(kk,mm,ff,bcdof,bcval)
% 检查总体刚度矩阵KK的主元是否为零
%--------------------------------------------------------------------------
=size(kk);
jk=0;
for ii=1:sdof1                         % loop for check of the zero main elements in kk
    check=kk(ii,ii);
    if check==0
      jk=jk+1;                                 % location of the zero main element
      kki(jk)=ii;                        % storring the location of the zero main element
    end
end
if jk~=0
    disp('main elements of kk:')                         % display the zero main element
    kkii=kki;
    disp('equal zero')
end
if jk==0
    kki=[];
    disp('=======main elements are not equal zero')
end
%--------------------------------------------------------------------------
%(2) eliminate the columns and rows in kk, mm, ff, bcdof, bcval
%--------------------------------------------------------------------------
if jk~=0
    for jj=jk:-1:1               % loop for moving the columns and rows associated with
      % the zero main element in the system matrix equation
      hh=sdof1-kki(jj);
      hr=kki(jj);
      for i=1:hh                              % exchanging the rows in the equation
            kt=kk(hr+i-1,:);
            mt=mm(hr+i-1,:);
            ft=ff(hr+i-1,:);
            bdt=bcdof(hr+i-1);
            bvt=bcval(hr+i-1,:);
            kk(hr+i-1,:)=kk(hr+i,:);
            mm(hr+i-1,:)=mm(hr+i,:);
            ff(hr+i-1,:)=ff(hr+i,:);
            bcdof(hr+i-1)=bcdof(hr+i);
            bcval(hr+i-1,:)=bcval(hr+i,:);
            kk(hr+i,:)=kt;
            mm(hr+i,:)=mt;
            ff(hr+i,:)=ft;
            bcdof(hr+i,:)=bdt;
            bcval(hr+i,:)=bvt;
      end
      for j=1:hh                           % exchanging the columns in the equation
            kt=kk(:,hr+j-1);
            mt=mm(:,hr+j-1);
            kk(:,hr+j-1)=kk(:,hr+j);
            mm(:,hr+j-1)=mm(:,hr+j);
            kk(:,hr+j)=kt;
            mm(:,hr+j)=mt;
      end
    end
end
sdof=sdof1-jk;
K=;                % eliminating the columns and rows of the kk
M=;             % eliminating the columns and rows of the mm
F=;                                    % eliminating the rows of the ff
bc_dof=;                        % eliminating the rows of the bcdof
bc_val=;                        % eliminating the rows of the bcval
%--------------------------------------------------------------------------
%===================================
function =femMcheck(kk,mm,ff,bcdof,bcval)
% 检查总体质量矩阵MM的主元是否为零
=size(kk);
jk=0;
for ii=1:sdof1                         % loop for check of the zero main elements in mm
    check=mm(ii,ii);
    if check==0
      jk=jk+1;                                 % location of the zero main element
      mmi(jk)=ii;                        % storing the location of the zero main element
    end
end
if jk==0
    mmi=[];
    disp('=======main elements are not equal zero')
end
%--------------------------------------------------------------------------
%(2) eliminate the columns and rows in kk, mm, ff, bcdof, bcval
%--------------------------------------------------------------------------
if jk~=0
    for jj=jk:-1:1               % loop for moving the columns and rows associated with
      % the zero main element in the system matrix equation
      hh=sdof1-mmi(jj);
      hr=mmi(jj);
      for i=1:hh                              % exchanging the rows in the equation
            kt=kk(hr+i-1,:);
            mt=mm(hr+i-1,:);
            ft=ff(hr+i-1,:);
            bdt=bcdof(hr+i-1);
            bvt=bcval(hr+i-1);
            kk(hr+i-1,:)=kk(hr+i,:);
            mm(hr+i-1,:)=mm(hr+i,:);
            ff(hr+i-1,:)=ff(hr+i,:);
            bcdof(hr+i-1)=bcdof(hr+i);
            bcval(hr+i-1)=bcval(hr+i);
            kk(hr+i,:)=kt;
            mm(hr+i,:)=mt;
            ff(hr+i,:)=ft;
            bcdof(hr+i)=bdt;
            bcval(hr+i)=bvt;
      end
      for j=1:hh                           % exchanging the columns in the equation
            kt=kk(:,hr+j-1);
            mt=mm(:,hr+j-1);
            kk(:,hr+j-1)=kk(:,hr+j);
            mm(:,hr+j-1)=mm(:,hr+j);
            kk(:,hr+j)=kt;
            mm(:,hr+j)=mt;
      end
    end
end
sdof=sdof1-jk;
K=;               % eliminating the columns and rows of the kk
M=;             % eliminating the columns and rows of the mm
F=;                                    % eliminating the rows of the ff
bc_dof=;                        % eliminating the rows of the bcdof
bc_val=;                           % eliminating the rows of the bcval
%--------------------------------------------------------------------------
%--------------------------------------------------------------------------
function =femSysAppBC(K,M,F,bcdof,bcval)
ni=length(bcdof);
sdof=size(K);

for ii=1:ni
   if bcdof(ii)==1
   for j=1:sdof
       K(ii,j)=0;
       K(j,ii)=0;
       M(ii,j)=0;
       M(j,ii)=0;
       F(j)=F(j)-bcval(ii)*K(j,ii);
   end
   K(ii,ii)=1;
   K(ii)=bcval(ii);
   end
end
%--------------------------------------------------------------------------
function Ys=PostDeal(X,Ch3,Ch2,Ch1,SysDof)
% 根据需要将计算结果还原到与原来节点对应位置;
% 应用工程中根据需要做适当修改
% 应该注意原始数据检查的顺序,因此在还原时应该按照相反地顺序进行
% ------------------------------
% Ys-还原后的数据
% --------------------------------
% X-需要还原的数据,以列形式输入
% Ki-刚度矩阵中被舍去的主元位置编号
% Mi-质量矩阵中被舍去的主元位置编号
% BCi-根据边界被舍去的位置编号
% SysDof-系统矩阵的大小
lengX=length(X);
lengCh3=length(Ch3);
lengCh2=length(Ch2);
lengCh1=length(Ch1);
X2=zeros((lengX+lengCh3),1);
Ch3=sort(Ch3);
i=1;j=1;
if lengCh3~=0
    for k=1:(lengX+lengCh3)
      if k==Ch3(j) & j<lengCh3;
            X2(k)=0;
            j=j+1;
      elseif i<=lengX
            X2(k)=X(i);
            i=i+1;
      end
    end
else
    X2=X;
end

X1=zeros((lengX+lengCh3+lengCh2),1);
Ch2=sort(Ch2);
i=1;j=1;
if lengCh2~=0
    for k=1:(lengX+lengCh3+lengCh2)
      if k==Ch2(j) & j<lengCh2;
            X1(k)=0;
            j=j+1;
      elseif i<=(lengX+lengCh3)
            X1(k)=X2(i);
            i=i+1;
      end
    end
else
    X1=X2;
end
Ys=zeros(SysDof,1);
Ch1=sort(Ch1);
i=1;j=1;
if lengCh1~=0
    for k=1:SysDof
      if k==Ch1(j) & j<lengCh1;
            Ys(k)=0;
            j=j+1;
      elseif i<=(lengX+lengCh3+lengCh2)
            Ys(k)=X1(i);
            i=i+1;
      end
    end
else
    Ys=X1;
end

shwning 发表于 2012-12-8 19:57

找到了一致质量单元矩阵,计算结果是正确的;只能认为计算频率的差异来源于采用集中质量矩阵带来的误差。

shwning 发表于 2012-12-8 21:25

%协调一致矩阵
      disp('采用协调一致矩阵');
      m=zeros(12,12);
      mass=density*t*A/12600;
      m=[1727 466*b -461*a 613 199*b 274*a 197 -116*b 116*a 613 -274*b -199*a;
            466*b 160*b*b -126*a*b 199*b 80*b*b 84*a*b 116*b -60*b*b 56*a*b 274*b -120*b*b -84*a*b;
            -461*a -126*a*b 160*a*a -274*a -84*a*b -120*a*a -116*a 56*a*b -60*a*a -199*a 84*a*b 80*a*a;
            613 199*b -274*a 1727 461*b 461*a 613 -274*b 199*a 197 -116*b -116*a;
            199*b 80*b*b -84*a*b 461*b 160*b*b 126*a*b 274*b -120*b*b 84*a*b 116*b -60*b*b -56*a*b;
            274*a 84*a*b -120*a*a 461*a 126*a*b 160*a*a 199*a -84*a*b 80*a*a 116*a*a -56*a*b -60*a*a;
            197 116*b -116*a 613 274*b 199*a 1727 -461*b 461*a 613 -199*b -274*a;
            -116*b -60*b*b 56*a*b -274*b -120*b*b -84*a*b -461*b 160*b*b -126*a*b -199*b 80*b*b 84*a*b;
            116*a 56*a*b -60*a*a 199*a 84*a*b 80*a*a 461*a -126*a*b 160*a*a 274*a -84*a*b -120*a*a;
            613 274*b -199*a 197 116*b 116*a*a 613 -199*b 274*a 1727 -461*b -461*a;
            -274*b -120*b*b 84*a*b -116*b -60*b*b -56*a*b -199*b 80*b*b -84*a*b -461*b 160*b*b 126*a*b;
            -199*a -84*a*b 80*a*a -116*a -56*a*b -60*a*a -274*a 84*a*b -120*a*a -461*a 126*a*b 160*a*a];
      m=mass*m;

lmx5230 发表于 2012-12-11 21:33

头大啊 亲们 乃们说的啥

ME! 发表于 2013-3-28 11:12

请问为什么是先检查刚度矩阵的主元是否为0,然后施加边界条件,再次检查质量矩阵的主元是否为0,这是什么意思,我是在徐斌书上看到这个的,他那个好像有点小小的错误吧

佳佳一乐 发表于 2013-4-24 18:18

{:{39}:}

简单摇摆 发表于 2013-7-15 20:21

谢谢啦很详细   好好学习下

幽冥1 发表于 2013-11-25 08:26

好人 好好学习下{:{10}:}

ZXinNCHU 发表于 2014-3-27 20:17

请问如果加的不是静载荷,是集中力载荷该如何编程呢

2009071506 发表于 2015-5-18 21:59

谢谢楼主分享。

Usedname 发表于 2015-5-19 08:33

根本看不懂啊!都是直接用ANSYS之类的软件做
页: [1]
查看完整版本: 计算平板振动模态的程序