MATLAB有限元分析:杆件结构实现

    学校上课的作业,之前给过不少同学,明天结课考试也不知道还能复习啥,整理一下代码吧。非常按部就搬刚度矩阵叠加出来的……个人认为写得还可以的地方:     1. 利用了Matlab里稀疏矩阵sparse()的特性构造整体刚度矩阵,可以少写几个字     2. 查书,用边界条件解决了奇异的问题,也是这招帮几个同学de了bug     3. 能解决大部分平面刚架有限元问题——本来是梁单元改出来的代码,改回去也可以吧! 写的不太好的地方有:     1. 不怎么写代码了,Matlab很多特性不清楚,感觉分块叠加整体刚度矩阵的部分可以写得更简洁,用不着四个循环==     2. 没有画图,只是单纯算了结果。毕竟老师不要图嘛。

    代码用了两个例子测试,分别是《有限元分析——ANSYS理论与应用(第四版)》例4.5(例1)和北航材料力学第二册刚度矩阵章节的例题(例2.1与2.2),自己多分了几个节点,电子版有学号水印就不发了。下面是代码:

% bilibili没有Matlab代码块,晕!
F=[0 0 0 0 0 0 0 -4000 80000 0 0 0 0 0 0 0 0 0]'  % 节点载荷
la=[10*12/2 10*12/2 3*12 3*12 3*12];  % 单元长度
Ea=[30000000 30000000 30000000 30000000 30000000];  % 单元弹性模量
Ia=[204 204 204 204 204];% 单元惯性矩
Aa=[7.65 7.65 7.65 7.65 7.65];% 单元面积
sitaa=[0 0 3*pi/2 3*pi/2 3*pi/2]% 单元转角
flag=[1 2 3 16 17 18];% 0位移标志
n=6;% 单元刚度矩阵大小
node=[1 2
    2 3
    3 4
    4 5
    5 6]% 哪两个节点间有杆件
a=asseml(Aa,la,Ea,Ia,flag,sitaa,F,n,node)

F=[0 0 0 20000 -20000 -40000000 0 0 0 0 0 0]'
la=[1000 1000 1000]
Ea=[210000 210000 210000]
Aa=[2000 2000 2000]
Ia=[3000800 3000000 3000000]
sitaa=[0 0 3*pi/2]
flag=[1 2 3 7 8 9 10 11 12]
node=[1 2
    2 3
    2 4]
a=asseml(Aa,la,Ea,Ia,flag,sitaa,F,n,node)

F=[0 0 0 0 0 0 20000 -20000 -40000000 0 0 0 0 0 0]'
la=[500 500 1000 1000]
Ea=[210000 210000 210000 210000]
Aa=[2000 2000 2000 2000]
Ia=[3000800 3000000 3000000 3000000]
sitaa=[0 0 0 3*pi/2]
flag=[1 2 3 10 11 12 13 14 15]
node=[1 2
    2 3
    3 4
    3 5]
a=asseml(Aa,la,Ea,Ia,flag,sitaa,F,n,node)


function kt=matx(A,l,E,I,sita)
    kk=[A*E/l 0 0 -A*E/l 0 0
        0 12*E*I/(l^3) 6*E*I/(l^2) 0 -12*E*I/(l^3) 6*E*I/(l^2)
        0 6*E*I/(l^2) 4*E*I/l 0 -6*E*I/(l^2) 2*E*I/l
        -A*E/l 0 0 A*E/l 0 0
        0 -12*E*I/(l^3) -6*E*I/(l^2) 0 12*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=[cos(sita) sin(sita) 0 0 0 0
        -sin(sita) cos(sita) 0 0 0 0
        0 0 1 0 0 0
        0 0 0 cos(sita) sin(sita) 0
        0 0 0 -sin(sita) cos(sita) 0
        0 0 0 0 0 1];

    kt=(T')*kk*(T);

end

function ans=asseml(Aa,la,Ea,Ia,flag,sitaa,F,n,node)
is=[];
js=[];
vs=[];
    for t=1:length(la)
        x=node(t,1);
        y=node(t,2);
        kt=matx(Aa(t),la(t),Ea(t),Ia(t),sitaa(t));
        for i=1:3
            for j=1:3
                is=[is 3*(x-1)+i];
                js=[js 3*(x-1)+j];
                vs=[vs kt(i,j)];
            end
            for j=4:6
                is=[is 3*(x-1)+i];
                js=[js 3*(y-1)+j-3];
                vs=[vs kt(i,j)];
            end
        end
        for i=4:6
            for j=1:3
                is=[is 3*(y-1)+i-3];
                js=[js 3*(x-1)+j];
                vs=[vs kt(i,j)];
            end
            for j=4:6
                is=[is 3*(y-1)+i-3];
                js=[js 3*(y-1)+j-3];
                vs=[vs kt(i,j)];
            end
        end
    end
kk=full(sparse(is,js,vs))
for i=flag
    for j=1:(3*(length(la)+1))

        kk(i,j)=0;
    end
    kk(i,i)=1;
end
ans=kk\F;

end

运行结果:

例1

例2.1

例2.2

附上一份没有用应变能的手写推导,字很丑,有空拿tex整理一下:

matepad paper挺好用的,已经一两个月没开过ipad了……

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空