导读:有限元分析是一种强大的数值分析方法,能处理复杂几何、材料特性及边界条件,将连续体离散求解,解决传统解析法难应对的复杂工程问题。设计阶段,它可预测产品性能,模拟不同方案,助力工程师优化设计、降本增效。同时,能快速提供工程解决方案,预测极端条件下结构行为,提高工程效率与可靠性。在科研领域,广泛用于多学科探索新现象规律。从职业发展看,掌握该技能可提升个人竞争力,利于就业与职业成长。
本文通过实际案例有限元分析,让读者洞察有限元分析在解决各类复杂问题时所展现出的强大功能与独特魅力。进而引发读者内心深处对有限元分析学习的浓厚兴趣,激发大家主动探索这一领域的热情。以下是正文:
1、问题描述
起重机的垂直部分和水平部分由铝制成(E=60GPa,截面面积为2 cm2)。对角桁架单元由钢制成(E=200GPa,截面面积为3 cm2)。在如图所示处施加载荷P=7000N。同时支撑节点假设是固定的,所以是没有位移的。我们考虑使用直接刚度法求解。写出每个杆单元的刚度矩阵,再进行装配。
求:结构的变形形状(需要绘图),最大垂直位移、最大压应力和最大拉应力的大小和位置,以及两个支撑节点上的约束力。
2、理论分析
为了解决这个复杂桁架结构。取每个杆为杆单元,写出其刚度矩阵
然后装配小刚度矩阵到大刚度矩阵[K]中。列出位移和力的关系式:
[K][δ]=[F]
将外力和节点边界条件(支撑节点位移为0,以及一个节点只有一个位移,所以连接这个节点的杆单元的该节点位移需要相同)带入此关系式中,即可求得位移、应力、应变、以及最大应力等。
3、桁架单元和节点的编号以及结点坐标的定义
黑色为节点坐标
红色为节点编号
紫色为单元编号
4、程序与注解
import numpy as np
import pandas as pd
import torch
import math
import matplotlib.pyplot as plt
%matplotlib inline
nod=pd.read_excel('./input1.xlsx', sheet_name='Sheet1', header=None) #导入input数据,每列所代表的含义,前两列为节点坐标,之后X方向的约束,Y方向的约束,X方向的力,Y方向的力
material=pd.read_excel('./input1.xlsx', sheet_name='Sheet2', header=None)#前两列单元左右节点编号,杨氏模量,泊松比
#单元和节点都导入完毕
material
material = np.array(material)
nod = np.array(nod)#将单元和节点函数转换为array格式
print(material)
#单元刚度矩阵已经建立完毕
#装配成总刚
n=23#节点数
ne=43#单元数
K=np.zeros([2*n,2*n])
element_stiffness = np.zeros([ne, 4, 4])
for m in range(ne):
i=int(material[m,0])#第i个单元左、右节点编号
j=int(material[m,1])
xi=nod[i-1,0]
yi=nod[i-1,1]
xj=nod[j-1,0]
yj=nod[j-1,1]#第i个单元左右节点的x、y坐标
L=math.sqrt(pow((xj-xi),2)+pow((yj-yi),2))#计算第m个杆单元长度
# print(L)
s=(yj-yi)/L#杆单元sin值
c=(xj-xi)/L#杆单元cos值
ea=material[m,2]*material[m,3]/L#单元刚度矩阵前系数AE/L
ke=ea*torch.tensor([[c*c,c*s,-c*c,-c*s],[s*c,s*s,-s*c,-s*s],[-c*c,-c*s,c*c,c*s],[-c*s,-s*s,s*c,s*s]])#计算每个单元刚度矩阵
ke = np.array(ke)
element_stiffness[m,:,:]=ke #一个杆单元在整体坐标下的单元刚度矩阵,下面四行代码是将所有杆变成在整体坐标下的单元刚度矩阵 :代表所有行和所有列
K[2*i-1-1:2*i,2*i-1-1:2*i]=K[2*i-1-1:2*i,2*i-1-1:2*i]+ke[0:2,0:2]
K[2*i-1-1:2*i,2*j-1-1:2*j]=K[2*i-1-1:2*i,2*j-1-1:2*j]+ke[0:2,2:4]
K[2*j-1-1:2*j,2*i-1-1:2*i]=K[2*j-1-1:2*j,2*i-1-1:2*i]+ke[2:4,0:2]
K[2*j-1-1:2*j,2*j-1-1:2*j]=K[2*j-1-1:2*j,2*j-1-1:2*j]+ke[2:4,2:4]
Stiffness_save=np.zeros((2*n,2*n))
Stiffness_save[:]=K#储存全局刚度矩阵,K的变化不能令其更改Stiffness_save的值
Stiffness_save
element_stiffness
K
F = np.zeros([2*n, 1]).astype(np.float64) #边界条件处理,采用对角元乘大数法
for lop in range(n):
F[2*lop,0]=F[2*lop,0]+nod[lop,4]
F[2*lop+1,0]=F[2*lop+1,0]+nod[lop,5]
if nod[lop,2]>=1:#如果该节点x方向有约束
K[2*lop,2*lop]=100000000*K[2*lop,2*lop]
if nod[lop,3]>=1:#如果该节点y方向有约束
K[2*lop+1,2*lop+1]=100000000*K[2*lop+1,2*lop+1]
F
k_inverse =np.linalg.inv(K)#调用numpy进行函数的矩阵的求逆
# print(k_inverse)
u=np.matmul(k_inverse,F)#矩阵的乘法
Force=np.matmul(Stiffness_save,u)#求出节点支反力
force_of_support_nodes=Force[0:4]
force_of_support_nodes#查看节点支反力
k_inverse[0,0]
u=np.matmul(k_inverse,F)#求出节点位移向量
Force=np.matmul(Stiffness_save,u)#求出节点支反力
force_of_support_nodes=Force[0:4]
force_of_support_nodes#查看节点支反力
u
element_force=np.zeros((ne,1))#储存单元内力
element_stress=np.zeros((ne,1))#储存单元应力
for lop in range(n):
i=int(material[lop,0])
j=int(material[lop,1])
E=material[lop,2]#第lop个杆单元杨氏模量
A=material[lop,3]#第lop个杆单元截面积
xi=nod[i-1,0]
yi=nod[i-1,1]
xj=nod[j-1,0]
yj=nod[j-1,1]
L=math.sqrt(pow((xj-xi),2)+pow((yj-yi),2))#计算第lop个杆单元长度
s=(yj-yi)/L#杆单元sin值
c=(xj-xi)/L#杆单元cos值
element_force[lop,0]=E*A/L*((u[2*j-2,0]-u[2*i-2,0])*c+(u[2*j-1,0]-u[2*i-1,0])*s)#求杆单元内力
element_stress[lop,0]=E*((u[2*j-2,0]-u[2*i-2,0])*c+(u[2*j-1,0]-u[2*i-1,0])*s)/L#求杆单元应力
max_tensile_stress=np.amax(element_stress)
max_compressive_stress=np.amax(element_stress)
max_tensile_stress,max_compressive_stress#输出最大拉、压应力
u_yaxis=np.zeros(n)#储存竖向位移
for i in range(n):
u_yaxis[i]=u[2*i+1]
max_u_vertical=np.min(u_yaxis)#得到最大竖向位移
row=np.argmin(u_yaxis)#返回最大竖向位移位置
max_u_X=nod[row,0]
max_u_Y=nod[row,1]
max_u_vertical,max_u_X,max_u_Y#查看最大竖向位移节点的x,y坐标
#将上述结果写入csv文档
r1=[max_u_vertical,max_u_X,max_u_Y]
r2=[max_tensile_stress,max_compressive_stress]
r3=force_of_support_nodes
print(r1,r2,r3)
import csv
with open("Output.csv", "w") as csvfile:
writer = csv.writer(csvfile,lineterminator='\n')
writer.writerow(["最大竖向位移","最大竖向位移x坐标","最大竖向位移y坐标"])
writer.writerows([r1])
writer.writerow(["最大拉应力","最大压应力"])
writer.writerows([r2])
writer.writerow(["1节点x方向反力","1节点y方向反力","2节点x方向反力","2节点y方向反力"])
writer.writerows([r3])
max_u_vertical
#绘制变形前桁架
X=np.zeros(2)
Y=np.zeros(2)
X_after=np.zeros(2)
Y_after=np.zeros(2)
plt.figure(figsize=(6,9))
print(type(material))
for lop in range(ne):
i=int(material[lop,0])#第lop个单元左、右节点编号
j=int(material[lop,1])
X[0],X[1]=nod[i-1,0],nod[j-1,0]
Y[0],Y[1]=nod[i-1,1],nod[j-1,1]
X_after[0]=X[0]+u[2*i-2,0]
X_after[1]=X[1]+u[2*j-2,0]
Y_after[0]=Y[0]+u[2*i-1,0]
Y_after[1]=Y[1]+u[2*j-1,0]
plt.plot(X,Y,color='b',linewidth=2.5,marker='o',markerfacecolor='w',markeredgecolor='b')
plt.plot(X_after,Y_after,color='g',linewidth=2.5,linestyle='--',marker='o',markerfacecolor='r',markeredgecolor='y')
plt.savefig("./Output_deformed_shape.jpg")
plt.show()
5、结果与数据
(1)最大垂直位移为0.4468m,23节点
(2)最大压应力为-210MPa,18单元
(3)最大拉应力为175MPa ,19单元
(4)支撑点1支座反力水平分量为0N,竖直分量为-35KN。
(5)支撑点2支座反力水平分量为0N,竖直分量为42KN。
总之,通过使用有限元法解决桁架问题,我们可以了解有限元法的原理,掌握python的编程方法和操作环境以及将问题模块化处理的思路。将问题的已知条件转化python语言,并列出边界条件和协调性条件,计算出所求未知物理量。
显然,有限元法的基本思路是首先将系统离散化处理,对于该问题的桁架结构,是将其分解为杆单元和节点,这一步决定了有限元方法的精确度。利用公式单元刚度矩阵,并根据几何关系利用直接刚度法,将每个单元装配在系统刚度矩阵中。题中几何关系所示的边界条件是支撑节点的位移为零,以及外加载荷节点的外力是7000N。程序将方程解决后即可的出未知节点的位移、应变以及支座反力。
强烈推荐用户订阅我的视频课程《有限元分析核心理论与实践技能13讲》,它涵盖基础理论知识,包括理解有限元分析原理(基本思想、数学与力学基础等)与掌握求解流程(前处理、求解计算、后处理);注重专业技能提升,如通过实践提升建模、计算及结果分析能力;强调工程应用实践,用于解决复杂工程问题并优化设计改进产品;关注跨学科融合与拓展,既与其他力学学科结合做多学科耦合分析,又跨多个领域应用以拓展知识和能力;还有良好的职业发展前景,行业对有限元分析专业人才需求不断增加,掌握该技能可提升个人在相关领域的职业竞争力。
本课程为付费用户提供VIP群交流、答疑服务、持续加餐内容、提供定制化培训和咨询服务、仿真人才库高新内推就业、仿真秀还提供奖学金、学完此课程,推荐学习者报名参加工信部教考中心认证的——工程仿真技术(CAE分析职业能力登记评价证书)。课程大纲安排如下:
可回放,开发票,奖学金,加餐
讲师提供vip交流群/答疑/相关学习资料
扫码立即试看
注:本课程为付费用户提供VIP群交流、答疑服务、持续加餐内容、提供定制化培训和咨询服务、仿真人才库高新内推就业、仿真秀还提供奖学金、学完此课程,推荐学习者报名参加工信部教考中心认证的——工程仿真技术(CAE分析职业能力登记评价证书)。以下是我讲课部分PPT:
仿真秀读者福利
仿真秀,致力于为每一位学习者提供优质的仿真资源与技术服务支持,让您的仿真学习之旅更加顺畅,欢迎在公 众号对话框与我互动交流!以下资料供用户永久免费下载哦(见下图)。
下载地址在仿真秀APP公 众号菜单-资料库-资料下载-进入百度云盘群下载,不会失效,且永久免费更新。
扫码进技术群领仿真资料包
可免费参加技术直播
(完)
来源:仿真秀App