有限元分析后处理涉及计算机图形学,以二维梁单元为例,其变形和内力是基于杆的位置的函数,由一系列的离散点组成矩阵绘制平面刚架的变形图和内力图的过程是:以划分的单元为基础逐个完成。在画某一单元的变形或内力图时,通常是以该单元起点为总体坐标系的坐标原点,杆轴沿着总体坐标系的轴正方向,杆轴上的离散点便是矩阵A的第一行,离散点对应的函数值便是矩阵A的第二行。▲图1矩阵A要通过缩放、旋转、平移操作,使之回到对应的位置上去,即图形与局部坐标一致。对于图1中的单元1,则需要作旋转操作(RA),而单元2则需要作平移操作(TA)。缩放操作则根据图形是否协调适当考虑。定义缩放矩阵旋转矩阵importmatplotlib.pyplotaspltimportnumpyasnpdefmain():plt.rcParams['font.sans-serif']=['MicrosoftYaHei']#这个字体能够支持中英文字符plt.rcParams['axes.unicode_minus']=False#正常显示负号#平面刚架x=[0,3,6]y=[0,4,4]xx=np.linspace(0,5,10)#梁划分为10个小段#每一个离散点的弯矩值m=[0.0,-0.395,-0.690,-0.887,-0.985,-0.985,-0.887,-0.690,-0.395,-0.0]#旋转矩阵R=np.array([[0.6,-0.8],[0.8,0.6]])#旋转变换Rxy=R@np.vstack((xx,m))#绘制刚架图fig,(ax0,ax1)=plt.subplots(nrows=1,ncols=2,sharex=True,figsize=(8,4))#绘制刚架图ax0.plot(x,y)#绘制单元1未旋转时的弯矩图ax0.plot(xx,m)ax0.set(title='旋转前的弯矩图')#绘制单元1旋转后的弯矩图ax1.plot(x,y)ax1.plot(Rxy[0,:],Rxy[1,:])ax1.set(title='旋转后的弯矩图')fig.savefig("z1.png",dpi=300)plt.show()if__name__=="__main__":main()▲图2对于平移来说,按照上述思路,定义平移矩阵却达不到预期效果。比如将一个点往右平移2,往上平移2,得到新的位置,但是,通过平移矩阵计算也就是说,仅凭一个矩阵是做不到的。▲图3a▲图3b▲图3c如图3a所示,将平面矩形增加一个维度,成为长方体。这个长方体发生剪切变形,如图3b所示。这个过程在数学上称为剪切变换,所用到的矩阵称为剪切矩阵。然后将三维图形投影到二维平面,即实现了原图像的平移,如图3c所示因此,需要扩充A矩阵,即增加一行则二维图形的平移矩阵经过矩阵乘法运算后,再去掉的第三行,即平移后的图形。这里第三行无实际意义,仅作为辅助计算。importmatplotlib.pyplotaspltimportnumpyasnpdefmain():plt.rcParams['font.sans-serif']=['MicrosoftYaHei']#这个字体能够支持中英文字符plt.rcParams['axes.unicode_minus']=False#正常显示负号#平面刚架x=[0,3,6]y=[0,4,4]xx=np.linspace(0,3,10)#梁划分为10个小段#每一个离散点的弯矩值m=[0.0,-0.395,-0.690,-0.887,-0.985,-0.985,-0.887,-0.690,-0.395,-0.0]ones=np.ones(10)#矩阵A增加维度,即第三行全为1A=np.vstack((xx,m,ones))#平移矩阵T=np.array([[1,0,3],[0,1,4],[0,0,1]])#平移变换Txy=T@A#绘制刚架图fig,(ax0,ax1)=plt.subplots(nrows=1,ncols=2,sharex=True,figsize=(8,4))#绘制刚架图ax0.plot(x,y)#绘制单元2未平移时的弯矩图ax0.plot(xx,m)ax0.set(title='平移前的弯矩图')#绘制单元2平移后的弯矩图ax1.plot(x,y)ax1.plot(Txy[0,:],Txy[1,:])ax1.set(title='平移后的弯矩图')fig.savefig("z2.png",dpi=300)plt.show()if__name__=="__main__":main()▲图4为了方便编程,将三种矩阵统一定义成形式。缩放矩阵旋转矩阵如果是三维图形,则需要将三种矩阵统一定义成形式。来源:数值分析与有限元编程