声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 4361|回复: 3

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

[复制链接]
发表于 2012-10-14 22:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
本人刚接触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*[156 22*Le 54 -13*Le;22*Le 4*Le^2 13*Le -3*Le^2;54 13*Le 156 -22*Le;-13*Le -3*Le^2 -22*Le 4*Le^2];
%质量矩阵
I=b*h*h*h/12;
K=E*I/Le^3*[12 6*Le -12 6*Le;6*Le 4*Le^2 -6*Le 2*Le^2;-12 -6*Le 12 -6*Le;6*Le 2*Le^2 -6*Le 4*Le^2;];
%刚度矩阵
f=10;
F=f*Le/2*[1;Le/6;1;-Le/6;];  
%外力F
u=[0 0 0 0]';      %初始位移
v=[0 0 0 0]';      %初始速度
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,:))

本帖被以下淘专辑推荐:

回复
分享到:

使用道具 举报

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

评分

1

查看全部评分

发表于 2013-6-6 20:08 | 显示全部楼层
边界条件没有处理。
发表于 2013-6-14 22:01 | 显示全部楼层
参考 徐荣桥
  1. function exam8_2
  2. % 本程序为第八章的第二个算例,采用平面梁单元计算两铰抛物线拱的在初始条件下
  3. %  自由振动,并对时程曲线结果进行FFT变换,求得的频率可与exam8_1.m的结果进行
  4. %  比较,以验证本程序的可靠性
  5. %      输入参数: 无
  6. %      输出结果: 位移,速度和加速度的时程曲线

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

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

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

  36.     global gNode gElement gMaterial gBC1 gDeltaT gTimeEnd gDisp gVelo gAcce

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

  45.     % 节点坐标
  46.     gNode = [x'  y']
  47.    
  48.     % 单元定义
  49.     gElement = zeros( n, 3 ) ;
  50.     for i=1:n
  51.         gElement( i, : ) = [ i, i+1, 1 ] ;
  52.     end
  53.    
  54.     % 材料性质
  55.     %           弹性模量   抗弯惯性矩   截面积   密度
  56.     gMaterial = [2.06e11,  0.03622,   0.0815,  1435.2/0.0815];   %  材料 1

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

  67.     % 定义位移,速度和加速度
  68.     gDisp = zeros( (n+1)*3, timestep ) ;
  69.     gVelo = zeros( (n+1)*3, timestep ) ;
  70.     gAcce = zeros( (n+1)*3, timestep ) ;
  71.    
  72.     % 初始条件
  73.     gDisp(:,1) = zeros( (n+1)*3, 1 ) ;
  74.     gVelo(:,1) = ones( (n+1)*3, 1 ) ;
  75. return
  76. function ft = NodeForce( t )
  77. % 计算在时刻 t 的结点载荷列阵
  78. % 输入参数
  79. %    t ------ 时刻
  80. % 返回值
  81. %   ft ------ t时刻的结点载荷列阵
  82.     global gNode gElement gLoad gLoadVelo

  83.     Load = gLoad*sin(2*pi*50*t) ;
  84.     %Load = gLoad ;
  85.     node_number = size( gNode, 1 ) ;
  86.     ft = zeros( node_number*3, 1 ) ;
  87.     xt = gNode(1,1) + gLoadVelo * t ;
  88.     element_number = size( gElement, 1) ;
  89.     for ie=1:element_number
  90.         node = gElement( ie, 1:2 ) ;
  91.         x = gNode( node, 1 ) ;
  92.         y = gNode( node, 2 ) ;
  93.         L = sqrt( (x(2)-x(1))^2 + (y(2)-y(1))^2 ) ;
  94.         cosq = (x(2)-x(1))/L ;
  95.         sinq = (y(2)-y(1))/L ;
  96.         N = -Load*sinq ;
  97.         P = -Load*cosq ;
  98.         if x(1) <= xt & x(2) >=xt
  99.             N1 = (x(2)-xt)/(x(2)-x(1)) * N ;
  100.             N2 = (xt-x(1))/(x(2)-x(1)) * N ;
  101.             dx = (xt-x(1))/cosq ;
  102.             P1 = P*(1-3*(dx/L)^2+2*(dx/L)^3) ;
  103.             P2 = P*( +3*(dx/L)^2-2*(dx/L)^3) ;
  104.             M1 = P*dx*(1-2*dx/L+(dx/L)^2) ;
  105.             M2 = P*dx*( -dx/L + (dx/L)^2) ;
  106.             T = TransformMatrix( ie ) ;
  107.             fe = T * [N1;P1;M1;N2;P2;M2] ;
  108.             ft( node(1)*3-2:node(1)*3 ) = fe(1:3) ;
  109.             ft( node(2)*3-2:node(2)*3 ) = fe(4:6) ;
  110.             break ;
  111.         end
  112.     end
  113. return

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

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

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

  129.     % step2. 计算单元刚度和质量矩阵,并集成到整体刚度和质量矩阵中
  130.     [element_number,dummy] = size( gElement ) ;
  131.     for ie=1:1:element_number
  132.         k = StiffnessMatrix( ie ) ;
  133.         m = MassMatrix( ie ) ;
  134.         AssembleGlobalMatrix( ie, k, m ) ;
  135.     end

  136.     % step3. 计算时程响应(Newmark法)
  137.     % step3.1 初始计算
  138.     gama = 0.5 ;
  139.     beta = 0.25 ;
  140.     C = zeros( size( gK ) ) ;
  141.     [N,N] = size( gK ) ;
  142.     alpha0 = 1/beta/gDeltaT^2 ;
  143.     alpha1 = gama/beta/gDeltaT ;
  144.     alpha2 = 1/beta/gDeltaT ;
  145.     alpha3 = 1/2/beta - 1 ;
  146.     alpha4 = gama/beta - 1 ;
  147.     alpha5 = gDeltaT/2*(gama/beta-2) ;
  148.     alpha6 = gDeltaT*(1-gama) ;
  149.     alpha7 = gama*gDeltaT ;
  150.     K1 = gK + alpha0*gM + alpha1*C;
  151.     timestep = floor(gTimeEnd/gDeltaT) ;
  152.    
  153.     % step3.2 对K1进行边界条件处理
  154.     [bc1_number,dummy] = size( gBC1 ) ;
  155.     K1im = zeros(N,bc1_number) ;
  156.     for ibc=1:1:bc1_number
  157.         n = gBC1(ibc, 1 ) ;
  158.         d = gBC1(ibc, 2 ) ;
  159.         m = (n-1)*3 + d ;
  160.         K1im(:,ibc) = K1(:,m) ;
  161.         K1(:,m) = zeros( node_number*3, 1 ) ;
  162.         K1(m,:) = zeros( 1, node_number*3 ) ;
  163.         K1(m,m) = 1.0 ;
  164.     end
  165.     [KL,KU] = lu(K1) ;   % 进行三角分解,节省后面的求解时间
  166.    
  167.     % step3.3 计算初始加速度
  168.     gAcce(:,1) = gM\(-gK*gDisp(:,1)-C*gVelo(:,1)) ;
  169.    
  170.     % step3.4 对每一个时间步计算
  171.     for i=2:1:timestep
  172.         fprintf( '当前时间步:%d\n', i ) ;
  173.         f1 = gM*(alpha0*gDisp(:,i-1)+alpha2*gVelo(:,i-1)+alpha3*gAcce(:,i-1)) ...
  174.                   + C*(alpha1*gDisp(:,i-1)+alpha4*gVelo(:,i-1)+alpha5*gAcce(:,i-1)) ;
  175.         % 对f1进行边界条件处理
  176.         [bc1_number,dummy] = size( gBC1 ) ;
  177.         for ibc=1:1:bc1_number
  178.             n = gBC1(ibc, 1 ) ;
  179.             d = gBC1(ibc, 2 ) ;
  180.             m = (n-1)*3 + d ;
  181.             f1 = f1 - gBC1(ibc,3) * K1im(:,ibc) ;
  182.             f1(m) = gBC1(ibc,3) ;
  183.         end
  184.         y = KL\f1 ;
  185.         gDisp(:,i) = KU\y ;
  186.         gAcce(:,i) = alpha0*(gDisp(:,i)-gDisp(:,i-1)) - alpha2*gVelo(:,i-1) - alpha3*gAcce(:,i-1) ;
  187.         gVelo(:,i) = gVelo(:,i-1) + alpha6*gAcce(:,i-1) + alpha7*gAcce(:,i) ;
  188.     end
  189. return

  190. function k = StiffnessMatrix( ie )
  191. %  计算单元刚度矩阵
  192. %  输入参数:
  193. %     ie -------  单元号
  194. %  返回值:
  195. %     k  ----  整体坐标系下的刚度矩阵
  196.     global gNode gElement gMaterial
  197.     k = zeros( 6, 6 ) ;
  198.     E = gMaterial( gElement(ie, 3), 1 ) ;
  199.     I = gMaterial( gElement(ie, 3), 2 ) ;
  200.     A = gMaterial( gElement(ie, 3), 3 ) ;
  201.     xi = gNode( gElement( ie, 1 ), 1 ) ;
  202.     yi = gNode( gElement( ie, 1 ), 2 ) ;
  203.     xj = gNode( gElement( ie, 2 ), 1 ) ;
  204.     yj = gNode( gElement( ie, 2 ), 2 ) ;
  205.     L = ( (xj-xi)^2 + (yj-yi)^2 )^(1/2) ;
  206.     k = [  E*A/L           0          0 -E*A/L           0          0
  207.                0  12*E*I/L^3  6*E*I/L^2      0 -12*E*I/L^3  6*E*I/L^2
  208.                0   6*E*I/L^2    4*E*I/L      0  -6*E*I/L^2    2*E*I/L
  209.           -E*A/L           0          0  E*A/L           0          0
  210.                0 -12*E*I/L^3 -6*E*I/L^2      0  12*E*I/L^3 -6*E*I/L^2
  211.                0   6*E*I/L^2    2*E*I/L      0  -6*E*I/L^2    4*E*I/L] ;
  212.     T = TransformMatrix( ie ) ;
  213.     k = T*k*transpose(T) ;
  214. return

  215. function m = MassMatrix( ie )
  216. %  计算单元质量矩阵
  217. %  输入参数:
  218. %     ie -------  单元号
  219. %  返回值:
  220. %     m  ----  整体坐标系下的质量矩阵
  221.     global gNode gElement gMaterial
  222.     m = zeros( 6, 6 ) ;
  223.     E = gMaterial( gElement(ie, 3), 1 ) ;
  224.     A = gMaterial( gElement(ie, 3), 3 ) ;
  225.     ro = gMaterial( gElement(ie, 3 ), 4 ) ;
  226.     xi = gNode( gElement( ie, 1 ), 1 ) ;
  227.     yi = gNode( gElement( ie, 1 ), 2 ) ;
  228.     xj = gNode( gElement( ie, 2 ), 1 ) ;
  229.     yj = gNode( gElement( ie, 2 ), 2 ) ;
  230.     L = ( (xj-xi)^2 + (yj-yi)^2 )^(1/2) ;
  231.     m = ro*A*L/420*[140      0      0   70      0      0
  232.                       0    156   22*L    0     54   -13*L
  233.                       0   22*L  4*L^2    0   13*L  -3*L^2
  234.                      70      0      0  140      0       0
  235.                       0     54   13*L    0    156   -22*L
  236.                       0  -13*L   -3*L    0  -22*L  4*L^2 ] ;
  237.     T = TransformMatrix( ie ) ;
  238.     m = T*m*transpose(T) ;
  239. return

  240. function AssembleGlobalMatrix( ie, ke, me )
  241. %  把单元刚度和质量矩阵集成到整体刚度矩阵
  242. %  输入参数:
  243. %      ie  --- 单元号
  244. %      ke  --- 单元刚度矩阵
  245. %      me  --- 单元质量矩阵
  246. %  返回值:
  247. %      无
  248.     global gElement gK gM
  249.     for i=1:1:2
  250.         for j=1:1:2
  251.             for p=1:1:3
  252.                 for q =1:1:3
  253.                     m = (i-1)*3+p ;
  254.                     n = (j-1)*3+q ;
  255.                     M = (gElement(ie,i)-1)*3+p ;
  256.                     N = (gElement(ie,j)-1)*3+q ;
  257.                     gK(M,N) = gK(M,N) + ke(m,n) ;
  258.                     gM(M,N) = gM(M,N) + me(m,n) ;
  259.                 end
  260.             end
  261.         end
  262.     end
  263. return

  264. function T = TransformMatrix( ie )
  265. %  计算单元的坐标转换矩阵( 局部坐标 -> 整体坐标 )
  266. %  输入参数
  267. %      ie  ----- 节点号
  268. %  返回值
  269. %      T ------- 从局部坐标到整体坐标的坐标转换矩阵
  270.     global gElement gNode
  271.     xi = gNode( gElement( ie, 1 ), 1 ) ;
  272.     yi = gNode( gElement( ie, 1 ), 2 ) ;
  273.     xj = gNode( gElement( ie, 2 ), 1 ) ;
  274.     yj = gNode( gElement( ie, 2 ), 2 ) ;
  275.     L = sqrt( (xj-xi)^2 + (yj-yi)^2 ) ;
  276.     c = (xj-xi)/L ;
  277.     s = (yj-yi)/L ;
  278.     T=[ c  -s   0   0   0   0
  279.         s   c   0   0   0   0
  280.         0   0   1   0   0   0
  281.         0   0   0   c  -s   0
  282.         0   0   0   s   c   0
  283.         0   0   0   0   0   1] ;
  284. return



  285. function SaveResults( file_out )
  286. %  保存计算结果
  287. %  输入参数:
  288. %     无
  289. %  返回值:
  290. %     无
  291.     global gNode gElement gMaterial gBC1 gDeltaT gTimeEnd gLoad gLoadVelo gDisp gVelo gAcce
  292.     save( file_out, 'gNode', 'gElement', 'gMaterial', 'gBC1',  ...
  293.           'gDeltaT', 'gTimeEnd', 'gLoad', 'gLoadVelo', 'gDisp', 'gVelo', 'gAcce' ) ;
  294. return

  295. function DisplayResults
  296. %  显示计算结果
  297. %  输入参数:
  298. %     无
  299. %  返回值:
  300. %     无

  301.     global gNode gElement gMaterial gBC1 gDisp gVelo gAcce gDeltaT gTimeEnd

  302.     % 绘制时程曲线
  303.     [node_number,dummy] = size(gNode) ;
  304.     t = 0:gDeltaT:gTimeEnd-gDeltaT ;
  305.     d = gDisp((floor(node_number/4)*3)+2,:) ;
  306.     v = gVelo((floor(node_number/4)*3)+2,:) ;
  307.     a = gAcce((floor(node_number/4)*3)+2,:) ;
  308.     tt = 0:gDeltaT/10:gTimeEnd-gDeltaT ;
  309.     dd = spline(t,d,tt) ;%spline表示三次样条插值
  310.     vv = spline(t,v,tt) ;
  311.     aa = spline(t,a,tt) ;
  312.     figure ;

  313.        plot(tt, aa,'r' ) ;
  314.         set(gca,'xlim',[0,2]) ;grid on
  315.     xlabel( 'time(s)') ; ylabel( 'acceleration(m)' ) ;
  316.    
  317.     % 对时程曲线进行FFT变换,获取频谱特性
  318.     fd = fft( d ) ;
  319.     figure ;
  320.     df = 1/gTimeEnd ;  %FFT变换的频率分辨率
  321.     f = (0:length(d)-1)*df ;
  322.     plot(f,abs(fd)) ;
  323.     set(gca,'xlim',[2,10]) ;
  324.     title( 'L/4处挠度的频谱图' ) ;
  325.     xlabel( '频率(Hz)') ;
  326.     ylabel( '幅度' ) ;
  327. return
复制代码
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-11-28 08:17 , Processed in 0.082206 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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