kingdom123 发表于 2012-10-14 22:38

[求助]用matlab编写newmark遇到的问题!!!

本人刚接触matlab编程计算结构动力响应问题,在用newmark直接积分法求解结构响应的时候,计算结果总是不对。计算的对象是一个梁单元,有4个自由度。打算做一个简单的例子,看能否计算出结构的动力响应。结果计算出来的位移越来越大。搞不清楚问题在哪里。以下是代码:请高手指点!

clc;clear;close;
Le=0.075;%梁单元长度
rou=2700;%密度
b=0.1;   %宽度
h=0.08;    %高度
E=735e9;   %弹性模量
C=0;       %阻尼为0
%-------------------------------------------
M=rou*b*h/420*;
%质量矩阵
I=b*h*h*h/12;
K=E*I/Le^3*;
%刚度矩阵
f=10;
F=f*Le/2*;
%外力F
u=';      %初始位移
v=';      %初始速度
a=inv(M)*(F-K*u(:,1)-C*v(:,1));%初始加速度
x(:,1)=u;             %位移
x1(:,1)=v;            %速度
x2(:,1)=a;            %加速度
%newmark参数
gama=0.5;
dt=0.01;
delta=0.25;
a0=1/(delta*dt^2);
a1=gama/(delta*dt);
a2=1/(delta*dt);
a3=1/(2*delta)-1;
a4=gama/delta-1;
a5=dt*(gama/(2*delta)-1);
a6=dt*(1-gama);
a7=gama*dt;
%等效刚度矩阵
K1=K+a0*M+a1*C;
t=1;      %迭代时间
MM=t/dt;    %迭代次数
time=0:dt:MM*dt;
for i=1:MM
      FF(:,i+1)=F+M*(a0*x(:,i)+a2*x1(:,i)+a3*x2(:,i))+C*(a1*x(:,i)+a4*x1(:,i)+a5*x2(:,i));
      x(:,i+1)=inv(K1)*FF(:,i+1);
      x2(:,i+1)=a0*(x(:,i+1)-x(:,i))-a2*x1(:,i)-a3*x2(:,i);
      x1(:,i+1)=x1(:,i)+a6*x2(:,i)+a7*x2(:,i+1);
end
plot(time,x(3,:))

happy 发表于 2012-10-18 10:24

这类问题排查比较麻烦,估计很少有人有兴趣参与
个人建议你自己先做一些必要的排查,包括:
1. 算例模型是否正确
2. 算例模型给的参数是否合理
3. 算法程序本身是否存在问题
4. 算法程序中的参数是否给的合理
其中前两个问题你完全可以自己先排查,因为算例比较简单,可以用ode之类的函数先算一下,是否能得到合理的结果

mgh_nx 发表于 2013-6-6 20:08

边界条件没有处理。

ME! 发表于 2013-6-14 22:01

参考 徐荣桥function exam8_2
% 本程序为第八章的第二个算例,采用平面梁单元计算两铰抛物线拱的在初始条件下
%自由振动,并对时程曲线结果进行FFT变换,求得的频率可与exam8_1.m的结果进行
%比较,以验证本程序的可靠性
%      输入参数: 无
%      输出结果: 位移,速度和加速度的时程曲线

% 定义全局变量
%      gNode ------ 节点坐标
%      gElement --- 单元定义
%      gMaterial -- 材料性质
%      gBC1 ------- 第一类约束条件
%      gK --------- 整体刚度矩阵
%      gDelta ----- 整体节点坐标

    PlaneFrameModel ;             % 定义有限元模型
    SolveModel ;                  % 求解有限元模型
    SaveResults('exam8_2.mat') ;% 保存计算结果
    DisplayResults ;            % 显示计算结果
return ;

function PlaneFrameModel
%定义平面杆系的有限元模型
%输入参数:
%      无
%返回值:
%      无
%说明:
%      该函数定义平面杆系的有限元模型数据:
%      gNode -------- 节点定义
%      gElement ----- 单元定义
%      gMaterial ---- 材料定义,包括弹性模量,梁的截面积和梁的抗弯惯性矩
%      gBC1 --------- 约束条件
%      gDeltaT ------ 时间步长
%      gTimeEnd ----- 计算结束时刻
%      gDisp -------- 位移时程响应
%      gVelo -------- 速度时程响应
%      gAcce -------- 加速度时程响应

    global gNode gElement gMaterial gBC1 gDeltaT gTimeEnd gDisp gVelo gAcce

    % 给定抛物线拱的几何特征
    L = 60 ;               %计算跨径(m)   
    f = 7.5 ;            %计算矢高(m)
   
    n = 100 ;            %单元数目
    x = -L/2:L/n:L/2 ;   %结点的x坐标
    a = f/L^2*4 ;
    y = - a * x.^2 ;       %结点的y坐标

    % 节点坐标
    gNode =
   
    % 单元定义
    gElement = zeros( n, 3 ) ;
    for i=1:n
      gElement( i, : ) = [ i, i+1, 1 ] ;
    end
   
    % 材料性质
    %         弹性模量   抗弯惯性矩   截面积   密度
    gMaterial = ;   %材料 1

    % 第一类约束条件
    %   节点号   自由度号    约束值
    gBC1 = [ 1,      1,      0.0
             1,      2,      0.0
             n+1,      1,      0.0
             n+1,      2,      0.0] ;
   
    gDeltaT = 0.01 ;
    gTimeEnd = 4096*gDeltaT;    % 计算时间为载荷通过所需时间的两倍
    timestep = floor(gTimeEnd/gDeltaT) ;

    % 定义位移,速度和加速度
    gDisp = zeros( (n+1)*3, timestep ) ;
    gVelo = zeros( (n+1)*3, timestep ) ;
    gAcce = zeros( (n+1)*3, timestep ) ;
   
    % 初始条件
    gDisp(:,1) = zeros( (n+1)*3, 1 ) ;
    gVelo(:,1) = ones( (n+1)*3, 1 ) ;
return
function ft = NodeForce( t )
% 计算在时刻 t 的结点载荷列阵
% 输入参数
%    t ------ 时刻
% 返回值
%   ft ------ t时刻的结点载荷列阵
    global gNode gElement gLoad gLoadVelo

    Load = gLoad*sin(2*pi*50*t) ;
    %Load = gLoad ;
    node_number = size( gNode, 1 ) ;
    ft = zeros( node_number*3, 1 ) ;
    xt = gNode(1,1) + gLoadVelo * t ;
    element_number = size( gElement, 1) ;
    for ie=1:element_number
      node = gElement( ie, 1:2 ) ;
      x = gNode( node, 1 ) ;
      y = gNode( node, 2 ) ;
      L = sqrt( (x(2)-x(1))^2 + (y(2)-y(1))^2 ) ;
      cosq = (x(2)-x(1))/L ;
      sinq = (y(2)-y(1))/L ;
      N = -Load*sinq ;
      P = -Load*cosq ;
      if x(1) <= xt & x(2) >=xt
            N1 = (x(2)-xt)/(x(2)-x(1)) * N ;
            N2 = (xt-x(1))/(x(2)-x(1)) * N ;
            dx = (xt-x(1))/cosq ;
            P1 = P*(1-3*(dx/L)^2+2*(dx/L)^3) ;
            P2 = P*( +3*(dx/L)^2-2*(dx/L)^3) ;
            M1 = P*dx*(1-2*dx/L+(dx/L)^2) ;
            M2 = P*dx*( -dx/L + (dx/L)^2) ;
            T = TransformMatrix( ie ) ;
            fe = T * ;
            ft( node(1)*3-2:node(1)*3 ) = fe(1:3) ;
            ft( node(2)*3-2:node(2)*3 ) = fe(4:6) ;
            break ;
      end
    end
return

function SolveModel
%求解有限元模型
%输入参数:
%   无
%返回值:
%   无
%说明:
%      该函数求解有限元模型,过程如下
%      1. 计算单元的刚度和质量矩阵,集成整体刚度和质量矩阵
%      2. 用Newmark法计算时程响应

    global gNode gElement gMaterial gBC1 gK gM gDeltaT gTimeEnd gDisp gVelo gAcce ft

    % step1. 定义整体刚度矩阵和节点力向量
    = size( gNode ) ;
    gK = sparse( node_number * 3, node_number * 3 ) ;
    gM = sparse( node_number * 3, node_number * 3 ) ;

    % step2. 计算单元刚度和质量矩阵,并集成到整体刚度和质量矩阵中
    = size( gElement ) ;
    for ie=1:1:element_number
      k = StiffnessMatrix( ie ) ;
      m = MassMatrix( ie ) ;
      AssembleGlobalMatrix( ie, k, m ) ;
    end

    % step3. 计算时程响应(Newmark法)
    % step3.1 初始计算
    gama = 0.5 ;
    beta = 0.25 ;
    C = zeros( size( gK ) ) ;
    = size( gK ) ;
    alpha0 = 1/beta/gDeltaT^2 ;
    alpha1 = gama/beta/gDeltaT ;
    alpha2 = 1/beta/gDeltaT ;
    alpha3 = 1/2/beta - 1 ;
    alpha4 = gama/beta - 1 ;
    alpha5 = gDeltaT/2*(gama/beta-2) ;
    alpha6 = gDeltaT*(1-gama) ;
    alpha7 = gama*gDeltaT ;
    K1 = gK + alpha0*gM + alpha1*C;
    timestep = floor(gTimeEnd/gDeltaT) ;
   
    % step3.2 对K1进行边界条件处理
    = size( gBC1 ) ;
    K1im = zeros(N,bc1_number) ;
    for ibc=1:1:bc1_number
      n = gBC1(ibc, 1 ) ;
      d = gBC1(ibc, 2 ) ;
      m = (n-1)*3 + d ;
      K1im(:,ibc) = K1(:,m) ;
      K1(:,m) = zeros( node_number*3, 1 ) ;
      K1(m,:) = zeros( 1, node_number*3 ) ;
      K1(m,m) = 1.0 ;
    end
    = lu(K1) ;   % 进行三角分解,节省后面的求解时间
   
    % step3.3 计算初始加速度
    gAcce(:,1) = gM\(-gK*gDisp(:,1)-C*gVelo(:,1)) ;
   
    % step3.4 对每一个时间步计算
    for i=2:1:timestep
      fprintf( '当前时间步:%d\n', i ) ;
      f1 = gM*(alpha0*gDisp(:,i-1)+alpha2*gVelo(:,i-1)+alpha3*gAcce(:,i-1)) ...
                  + C*(alpha1*gDisp(:,i-1)+alpha4*gVelo(:,i-1)+alpha5*gAcce(:,i-1)) ;
      % 对f1进行边界条件处理
       = size( gBC1 ) ;
      for ibc=1:1:bc1_number
            n = gBC1(ibc, 1 ) ;
            d = gBC1(ibc, 2 ) ;
            m = (n-1)*3 + d ;
            f1 = f1 - gBC1(ibc,3) * K1im(:,ibc) ;
            f1(m) = gBC1(ibc,3) ;
      end
      y = KL\f1 ;
      gDisp(:,i) = KU\y ;
      gAcce(:,i) = alpha0*(gDisp(:,i)-gDisp(:,i-1)) - alpha2*gVelo(:,i-1) - alpha3*gAcce(:,i-1) ;
      gVelo(:,i) = gVelo(:,i-1) + alpha6*gAcce(:,i-1) + alpha7*gAcce(:,i) ;
    end
return

function k = StiffnessMatrix( ie )
%计算单元刚度矩阵
%输入参数:
%   ie -------单元号
%返回值:
%   k----整体坐标系下的刚度矩阵
    global gNode gElement gMaterial
    k = zeros( 6, 6 ) ;
    E = gMaterial( gElement(ie, 3), 1 ) ;
    I = gMaterial( gElement(ie, 3), 2 ) ;
    A = gMaterial( gElement(ie, 3), 3 ) ;
    xi = gNode( gElement( ie, 1 ), 1 ) ;
    yi = gNode( gElement( ie, 1 ), 2 ) ;
    xj = gNode( gElement( ie, 2 ), 1 ) ;
    yj = gNode( gElement( ie, 2 ), 2 ) ;
    L = ( (xj-xi)^2 + (yj-yi)^2 )^(1/2) ;
    k = [E*A/L         0          0 -E*A/L         0          0
               012*E*I/L^36*E*I/L^2      0 -12*E*I/L^36*E*I/L^2
               0   6*E*I/L^2    4*E*I/L      0-6*E*I/L^2    2*E*I/L
          -E*A/L         0          0E*A/L         0          0
               0 -12*E*I/L^3 -6*E*I/L^2      012*E*I/L^3 -6*E*I/L^2
               0   6*E*I/L^2    2*E*I/L      0-6*E*I/L^2    4*E*I/L] ;
    T = TransformMatrix( ie ) ;
    k = T*k*transpose(T) ;
return

function m = MassMatrix( ie )
%计算单元质量矩阵
%输入参数:
%   ie -------单元号
%返回值:
%   m----整体坐标系下的质量矩阵
    global gNode gElement gMaterial
    m = zeros( 6, 6 ) ;
    E = gMaterial( gElement(ie, 3), 1 ) ;
    A = gMaterial( gElement(ie, 3), 3 ) ;
    ro = gMaterial( gElement(ie, 3 ), 4 ) ;
    xi = gNode( gElement( ie, 1 ), 1 ) ;
    yi = gNode( gElement( ie, 1 ), 2 ) ;
    xj = gNode( gElement( ie, 2 ), 1 ) ;
    yj = gNode( gElement( ie, 2 ), 2 ) ;
    L = ( (xj-xi)^2 + (yj-yi)^2 )^(1/2) ;
    m = ro*A*L/420*[140      0      0   70      0      0
                      0    156   22*L    0   54   -13*L
                      0   22*L4*L^2    0   13*L-3*L^2
                     70      0      0140      0       0
                      0   54   13*L    0    156   -22*L
                      0-13*L   -3*L    0-22*L4*L^2 ] ;
    T = TransformMatrix( ie ) ;
    m = T*m*transpose(T) ;
return

function AssembleGlobalMatrix( ie, ke, me )
%把单元刚度和质量矩阵集成到整体刚度矩阵
%输入参数:
%      ie--- 单元号
%      ke--- 单元刚度矩阵
%      me--- 单元质量矩阵
%返回值:
%      无
    global gElement gK gM
    for i=1:1:2
      for j=1:1:2
            for p=1:1:3
                for q =1:1:3
                  m = (i-1)*3+p ;
                  n = (j-1)*3+q ;
                  M = (gElement(ie,i)-1)*3+p ;
                  N = (gElement(ie,j)-1)*3+q ;
                  gK(M,N) = gK(M,N) + ke(m,n) ;
                  gM(M,N) = gM(M,N) + me(m,n) ;
                end
            end
      end
    end
return

function T = TransformMatrix( ie )
%计算单元的坐标转换矩阵( 局部坐标 -> 整体坐标 )
%输入参数
%      ie----- 节点号
%返回值
%      T ------- 从局部坐标到整体坐标的坐标转换矩阵
    global gElement gNode
    xi = gNode( gElement( ie, 1 ), 1 ) ;
    yi = gNode( gElement( ie, 1 ), 2 ) ;
    xj = gNode( gElement( ie, 2 ), 1 ) ;
    yj = gNode( gElement( ie, 2 ), 2 ) ;
    L = sqrt( (xj-xi)^2 + (yj-yi)^2 ) ;
    c = (xj-xi)/L ;
    s = (yj-yi)/L ;
    T=[ c-s   0   0   0   0
      s   c   0   0   0   0
      0   0   1   0   0   0
      0   0   0   c-s   0
      0   0   0   s   c   0
      0   0   0   0   0   1] ;
return



function SaveResults( file_out )
%保存计算结果
%输入参数:
%   无
%返回值:
%   无
    global gNode gElement gMaterial gBC1 gDeltaT gTimeEnd gLoad gLoadVelo gDisp gVelo gAcce
    save( file_out, 'gNode', 'gElement', 'gMaterial', 'gBC1',...
          'gDeltaT', 'gTimeEnd', 'gLoad', 'gLoadVelo', 'gDisp', 'gVelo', 'gAcce' ) ;
return

function DisplayResults
%显示计算结果
%输入参数:
%   无
%返回值:
%   无

    global gNode gElement gMaterial gBC1 gDisp gVelo gAcce gDeltaT gTimeEnd

    % 绘制时程曲线
    = size(gNode) ;
    t = 0:gDeltaT:gTimeEnd-gDeltaT ;
    d = gDisp((floor(node_number/4)*3)+2,:) ;
    v = gVelo((floor(node_number/4)*3)+2,:) ;
    a = gAcce((floor(node_number/4)*3)+2,:) ;
    tt = 0:gDeltaT/10:gTimeEnd-gDeltaT ;
    dd = spline(t,d,tt) ;%spline表示三次样条插值
    vv = spline(t,v,tt) ;
    aa = spline(t,a,tt) ;
    figure ;

       plot(tt, aa,'r' ) ;
      set(gca,'xlim',) ;grid on
    xlabel( 'time(s)') ; ylabel( 'acceleration(m)' ) ;
   
    % 对时程曲线进行FFT变换,获取频谱特性
    fd = fft( d ) ;
    figure ;
    df = 1/gTimeEnd ;%FFT变换的频率分辨率
    f = (0:length(d)-1)*df ;
    plot(f,abs(fd)) ;
    set(gca,'xlim',) ;
    title( 'L/4处挠度的频谱图' ) ;
    xlabel( '频率(Hz)') ;
    ylabel( '幅度' ) ;
return
页: [1]
查看完整版本: [求助]用matlab编写newmark遇到的问题!!!