由于C++没有封装矩阵类,所以还是用到了《计算机常用数值算法与程序》(C++)一书中的头文件“Matrix.h”。对《有限单元法》书中的例题进行了编程验算,编程水平太菜。程序冗杂得不行了...
题目:给出了一个勾三股四的单元三角形,弹性模量E和泊松比v已知,单元厚度t=1。求单元的刚度矩阵;
思路:按照书本中的步骤,基本是单刚矩阵Ke=B‘*D*B*t*A;其中,B为单元应变矩阵,DB=S为单元应力矩阵。一步一步进行求解,程序如下:
#include<iostream> #include<cmath> #include"Matrix.h" //#include"Comm.h" using namespace std; void main(void) { double aijm(double x2,double x3,double y2,double y3); double bijm(double y2,double y3); double cijm(double x2,double x3); //求解参数ai,bj,am...的函数声明 double xi,xj,xm,yi,yj,ym; //i,j,m点逆时针排列 double ai,aj,am,bi,bj,bm,ci,cj,cm; //读取三角单元的三个顶点坐标 cout<<"xi,yi="; cin>>xi>>yi; cout<<"xj,yj="; cin>>xj>>yj; cout<<"xm,ym="; cin>>xm>>ym; //求解参数ai,aj,am,... ai=aijm(xj,xm,yj,ym); aj=aijm(xi,xm,yi,ym); am=aijm(xi,xj,yi,yj); bi=bijm(yj,ym); bj=bijm(ym,yi); bm=bijm(yi,yj); ci=cijm(xj,xm); cj=cijm(xi,xm); cm=cijm(xi,xj); //输出参数 cout<<"ai="<<ai<<"\taj="<<aj<<"\tam="<<am<<endl; cout<<"bi="<<bi<<"\tbj="<<bj<<"\tbm="<<bm<<endl; cout<<"ci="<<ci<<"\tcj="<<cj<<"\tcm="<<cm<<endl; /***********************************************/ double E=2*pow(10,5); //弹性模量MPa double v=0.2; //泊松比 double t=1; //单元厚度设为1 double A=3*4/2; //三角形单元的面积 /***********************************************/ /*求三角形单元的应变矩阵B=[Bi,Bj,Bm]*/ const double b[3][6]= { {bi,0,bj,0,bm,0}, {0,ci,0,cj,0,cm}, {ci,bi,cj,bj,cm,bm} }; matrix<double> B(&b[0][0],3,6); //前面没有加const,否则后面不能进行tanspose转置 B=B/(2*A); //得到应变矩阵B; cout<<endl<<"B="<<endl; MatrixLinePrint(B); //输出应变矩阵B; /*求应力矩阵S=DB=[si,sj,sm];*/ double E0,v0,CONSTANT; //平面应力问题 E0=E; v0=v; CONSTANT=E0/(2*A*(1-v0*v0)); //参量CONSTANT /************************************************* const double ssi[3][2]= { {bi,v0*ci}, {v0*bi,ci}, {(1-v0)*ci/2,(1-v0)*bi/2} }; const matrix<double> Si(&ssi[0][0],3,2); cout<<"Si="<<endl; MatrixLinePrint(Si); const double ssj[3][2]= { {bj,v0*cj}, {v0*bj,cj}, {(1-v0)*cj/2,(1-v0)*bj/2} }; const matrix<double> Sj(&ssj[0][0],3,2); cout<<"Sj="<<endl; MatrixLinePrint(Sj); const double ssm[3][2]= { {bm,v0*cm}, {v0*bm,cm}, {(1-v0)*cm/2,(1-v0)*bm/2} }; const matrix<double> Sm(&ssm[0][0],3,2); cout<<"Sm="<<endl; MatrixLinePrint(Sm); ****************************************/ //合成应力矩阵S; const double s[3][6]= { {bi,v0*ci,bj,v0*cj,bm,v0*cm}, {v0*bi,ci,v0*bj,cj,v0*bm,cm}, {(1-v0)*ci/2,(1-v0)*bi/2,(1-v0)*cj/2,(1-v0)*bj/2,(1-v0)*cm/2,(1-v0)*bm/2} }; matrix<double> S(&s[0][0],3,6); //定义应力矩阵S; S=S*CONSTANT; //得到应力矩阵S; cout<<"S="<<endl; MatrixLinePrint(S); //输出应力矩阵 /**************求B应变矩阵的转置BT********************/ matrix<double> BT(6,3); MatrixTranspose(B,BT); //将应变矩阵B转置,得到BT cout<<"BT="<<endl; MatrixLinePrint(BT); //输出转置应变矩阵 /**************求单元刚度矩阵Ke***********************/ matrix<double> Ke(6,6); //定义单元刚度矩阵 Ke=(BT*S)*t*A; //得到单元的刚度矩阵 cout<<"Ke="<<endl; MatrixLinePrint(Ke); //输出单刚矩阵 } /*********************************************************/ double aijm(double x2,double x3,double y2,double y3) { return x2*y3-x3*y2; } /*********************************************************/ double bijm(double y2,double y3) { return y2-y3; } /*********************************************************/ double cijm(double x2,double x3) { return -x2+x3; }
输入:
输出结果如下:
对比书中的结果一致,可以验证单元刚度矩阵的三个性质:对称性,奇异性,主元素大于0;
时间: 2024-10-18 22:56:45