哈工大 材料力学 MATLAB 梁 上机 大作业.pdf
本程序只支持静定结构的梁(左端悬臂梁、简支梁)函数输入格式:beamsolver(L,EI,supports,loads,maxdx);参量的输入格式:L=10.0EI=2e8supports=f,0,v,10.0-左端悬臂梁supports=p,2.0,r,8.0 -简支梁loads=f,2.0,1000,m,4.0,500,d,7.0,9.0,3.0,20,100maxdx=0.01输出为 V,M,vy,x 的一维行向量和三张坐标图-图 1:剪力 V 图,图 2:弯矩 M 图,图 3:挠度vy 图.范例:悬臂梁:纯受集中力:beamsolver(10.0,2e8,f,0,v,10.0,f,2.0,1000,0.01)纯受集中矩:beamsolver(10.0,2e8,f,0,v,10.0,m,4.0,500,0.01)纯受分布力(格式一):beamsolver(10.0,2e8,f,0,v,10.0,d,7.0,9.0,3.0,20,100,0.01)纯受分布力(格式二):beamsolver(10.0,2e8,f,0,v,10.0,d,(7.0:0.01:9.0);(0:0.01:2.0).2,0.01)受混合力:beamsolver(10.0,2e8,f,0,v,10.0,f,2.0,1000,m,4.0,500,d,7.0,9.0,3.0,20,100,0.01)简支梁:纯受集中力:beamsolver(10.0,2e8,p,2.0,r,8.0,f,5.0,1000,0.01)纯受集中矩:beamsolver(10.0,2e8,p,2.0,r,8.0,m,4.0,500,0.01)纯受分布力(格式一):beamsolver(10.0,2e8,p,2.0,r,8.0,d,7.0,9.0,3.0,20,100,0.01)纯受分布力(格式二):beamsolver(10.0,2e8,p,2.0,r,8.0,d,(7.0:0.01:9.0);(0:0.01:2.0).2,0.01)受混合力:beamsolver(10.0,2e8,p,2.0,r,8.0,f,5.0,1000,m,4.0,500,d,7.0,9.0,3.0,20,100,0.01)以上范例输出的剪力 V 图、弯矩 M 图都经过笔算检验完全正确。悬臂梁的挠度经检验为正确的,简支梁的挠度有误(整个程序的唯一错误)。function x,V,M,vy=beamsolver(L,EI,supports,loads,maxdx)%材料力学上机课作业(满分)%本 DOC 文件由 M 文件转换而成,可能有格式错误%班级;1036*(专业班级 1036*)%支持两种梁的模型:%1.左端悬臂梁%2.一端 pin 一端 roller 的简支梁%输入格式:beamsolver(L,EI,supports,loads,maxdx);%例如:L=10.0,EI=2e8,supports=f,0,v,10.0,loads=f,2.0,1000,m,4.0,500,d,7.0,9.0,3.0,20,100,maxdx=0.01%输出为三张坐标图,图 1:剪力 V 图,图 2:弯矩 M 图,图 3:挠度 vy 图.%fixed-freeif(supports11=f&supports21=v)n=1;M=linspace(0,0,L/maxdx);V=linspace(0,0,L/maxdx);while n=length(loads)%P-fixed-free-if loadsn1=f x=linspace(maxdx,L,L/maxdx);%将 x 分为小量 n1=loadsn2(1)/maxdx;%确定 x=L1 处对应的下标 V1=linspace(loadsn2(2),loadsn2(2),n1);%第一段剪力赋值 V2=zeros(1,L/maxdx-n1);%第二段剪力赋值 M1=-loadsn2(2)*(loadsn2(1)-x(1:n1);%第一段弯矩赋值 M2=zeros(1,L/maxdx-n1);%第二段弯矩赋值 M=M+M1,M2;%全梁的弯矩 V=V+V1,V2;%全梁的剪力 end%M-fixed-free-if loadsn1=m x=linspace(maxdx,L,L/maxdx);%将 x 分为小量 n1=loadsn2(1)/maxdx;%确定 x=L1 处对应的下标 M1=linspace(loadsn2(2),loadsn2(2),n1);%第一段弯矩赋值 M2=zeros(1,L/maxdx-n1);%第二段弯矩赋值 M=M+M1,M2;%全梁的弯矩 end%q-fixed-free-if loadsn1=d x=linspace(maxdx,L,L/maxdx);%将 x 分为小量 n1=loadsn2(1)/maxdx;%确定 x=L1 处对应的下标 n2=loadsn2(2)/maxdx;%确定 x=L2 处对应的下标 k=length(loadsn2)-4;A=size(loadsn2);if A(1)=1%如果是第一种 q 的输入情况 ks=1;q2=linspace(loadsn2(4),loadsn2(4),n2-n1+1);while ks=k k0=loadsn2(4+ks);q2=q2+k0*(x(n1:n2)-loadsn2(3);ks=ks+1;end q1=zeros(1,n1-1);q3=zeros(1,L/maxdx-n2);q0=q1,q2,q3;q=fliplr(q0);%求出 q Vq0=cumsum(q)*maxdx;Vq=fliplr(Vq0);%求出剪力 V Mq0=-cumsum(Vq0)*maxdx;Mq=fliplr(Mq0);%求出弯矩 M end if A(1)=2%如果是 q 的第二种输入情况 q2=loadsn2(2,:);%表示出 q2 n1=loadsn2(1,1)/maxdx;%定出 q 开始的坐标 B=length(loadsn2);%求 q 的长度 n2=loadsn2(1,B)/maxdx;%定出 q 结束的坐标 q1=zeros(1,n1-1);q3=zeros(1,L/maxdx-n2);q0=q1,q2,q3;%求出 q0 q=fliplr(q0);Vq0=cumsum(q)*maxdx;Vq=fliplr(Vq0);%求出剪力 V Mq0=-cumsum(Vq0)*maxdx;Mq=fliplr(Mq0);%求出弯矩 M end M=M+Mq;%全梁的弯矩 V=V+Vq;%全梁的剪力 end n=n+1;end V=V M=M A=cumsum(M)*maxdx/EI;%对弯矩积分求转角 vy=cumsum(A)*maxdx%对转角积分求挠度 subplot(3,1,1),plot(x,V),grid;%绘图 subplot(3,1,2),plot(x,M),grid;subplot(3,1,3),plot(x,vy),grid;end%分割线-%pin-roller-if(supports11=p|supports11=r)&(supports21=p|supports21=r)n=1;np=supports12/maxdx;nr=supports22/maxdx;M=linspace(0,0,L/maxdx);V=linspace(0,0,L/maxdx);while n=length(loads)%P-pin-roller-if loadsn1=f x=linspace(maxdx,L,L/maxdx);%将 x 分为小量 n1=loadsn2(1)/maxdx;%确定 x=L1 处对应的下标Nr=loadsn2(2)*(loadsn2(1)-supports12)/(supports22-supports12);if n1np&n1nr%力作用在支架右边 V1=zeros(1,np-1);V2=linspace(loadsn2(2)-Nr,loadsn2(2)-Nr,nr-np);V3=linspace(loadsn2(2),loadsn2(2),n1-nr);V4=zeros(1,L/maxdx-n1+1);V=V+V1,V2,V3,V4;M1=zeros(1,np-1);M2=(loadsn2(2)-Nr)*(x(np:nr-1)-supports12);M3=-loadsn2(2)*(loadsn2(1)-x(nr:n1-1);M4=zeros(1,L/maxdx-n1+1);M=M+M1,M2,M3,M4;end end%M-pin-roller-if loadsn1=m x=linspace(maxdx,L,L/maxdx);%将 x 分为小量 n1=loadsn2(1)/maxdx;%确定 x=L1 处对应的下标 if n1np&n1nr%弯矩作用在支架右边 Np=loadsn2(2)/(supports22-supports12);Nr=Np V1=zeros(1,np-1);V2=linspace(Np,Np,nr-np);V3=zeros(1,L/maxdx-nr+1);V=V+V1,V2,V3;M1=zeros(1,np-1);M2=Np*(x(np:nr-1)-supports12);M3=linspace(loadsn2(2),loadsn2(2),n1-nr);M4=zeros(1,L/maxdx-n1+1);M=M+M1,M2,M3,M4;%全梁的弯矩 end end%q-pin-roller-if loadsn1=d x=linspace(maxdx,L,L/maxdx);%将 x 分为小量 n1=loadsn2(1)/maxdx;%确定 x=L1 处对应的下标 n2=loadsn2(2)/maxdx;%确定 x=L2 处对应的下标 k=length(loadsn2)-4;A=size(loadsn2);if A(1)=1%如果是第一种 q 的输入情况 ks=1;q2=linspace(loadsn2(4),loadsn2(4),n2-n1+1);while ks=k k0=loadsn2(4+ks);q2=q2+k0*(x(n1:n2)-loadsn2(3);ks=ks+1;end q1=zeros(1,n1-1);q3=zeros(1,L/maxdx-n2);q0=q1,q2,q3;F=q0*maxdx;%等效为很多个力作用在杆上 nF=length(F);%找出 F 的最后一点值得坐标 X=1;while X=nF if F(X)=0 Nr=F(X)*(X-np)/(nr-np);if Xnp&Xnr%力作用在支架右边 V1=zeros(1,np-1);V2=linspace(F(X)-Nr,F(X)-Nr,nr-np);V3=linspace(F(X),F(X),X-nr);V4=zeros(1,L/maxdx-X+1);V=V+V1,V2,V3,V4;M1=zeros(1,np-1);M2=(F(X)-Nr)*(x(np:nr-1)-supports12);M3=-F(X)*(X*maxdx-x(nr:X-1);M4=zeros(1,L/maxdx-X+1);M=M+M1,M2,M3,M4;end end X=X+1;end end if A(1)=2%如果是 q 的第二种输入情况 q2=loadsn2(2,:);%表示出 q2 n1=loadsn2(1,1)/maxdx;%定出 q 开始的坐标 B=length(loadsn2);%求 q 的长度 n2=loadsn2(1,B)/maxdx;%定出 q 结束的坐标 q1=zeros(1,n1-1);q3=zeros(1,L/maxdx-n2);q0=q1,q2,q3;%求出 q F=q0*maxdx;%等效为很多个力作用在杆上 nF=length(F);%找出 F 的最后一点值得坐标 X=1;while X=nF if F(X)=0 Nr=F(X)*(X-np)/(nr-np);if Xnp&Xnr%力作用在支架右边 V1=zeros(1,np-1);V2=linspace(F(X)-Nr,F(X)-Nr,nr-np);V3=linspace(F(X),F(X),X-nr);V4=zeros(1,L/maxdx-X+1);V=V+V1,V2,V3,V4;M1=zeros(1,np-1);M2=(F(X)-Nr)*(x(np:nr-1)-supports12);M3=-F(X)*(X*maxdx-x(nr:X-1);M4=zeros(1,L/maxdx-X+1);M=M+M1,M2,M3,M4;end end X=X+1;end end end n=n+1;end V=V M=M A=cumsum(M)*maxdx/EI;%对弯矩积分求转角 vy=cumsum(A)*maxdx%对转角积分求挠度 subplot(3,1,1),plot(x,V),grid;%subplot(3,1,2),plot(x,M),grid;subplot(3,1,3),plot(x,vy),grid;end绘图