单元刚度矩阵 C++

  由于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

单元刚度矩阵 C++的相关文章

等参单元和数值积分

https://www.taodocs.com/p-120594397.html http://www.doc88.com/p-0951440228882.html http://www.docin.com/p-1714264883.html https://wenku.baidu.com/view/df78c1e3360cba1aa811da45.html  ( 单元刚度矩阵组装及整体分析 ) 单元刚度矩阵单元方程推导(https://wenku.baidu.com/view/2deb67c5

稳态热传导的有限元分析

在分析工程问题时,经常要了解工件内部的温度分布情况,例如发动机的工作温度.金属工件在热处理过程中的温度变化.流体温度分布等.物体内部的温度分布取决于物体内部的热量交换,以及物体与外部介质之间的热量交换,一般认为是与时间相关的.物体内部的热交换采用以下的热传导方程(Fourier方程)来描述,         (6-1) 式中为密度,kg/m3: 为比热容,:为导热系数,:T为温度,℃:t为时间,s:为内热源密度,w/m3. 对于各向同性材料,不同方向上的导热系数相同,热传导方程可写为以下形式,

我对有限元法的理解(修订版1.0)

温故而知新. --<论语> 这里只讨论基于位移(注1)的有限元方法,它最终建立的是关于位移为未知量的方程组.也就是说,在推导过程中涉及到的其他未知物理量都要转化为位移的表达. 推导过程中用到的关键物理定律,虚功原理或最小势能原理.由于这两者在某些情形下是等价的,这里只以虚功原理为例进行说明.所谓的虚功原理,是说对于静态平衡的系统,力(注2)在虚位移上所做的功等于应力在虚应变上所作的功[1]. 本段来具体解释虚功原理中涉及到的概念和方程.先来看功.在标量的情形下,功等于力和其作用距离的乘积,而在

《有限元分析基础教程》(曾攀)笔记一-二维杆单元有限元程序(基于Python)

曾攀老师的<有限元分析基础教程>第三章有二维杆单元的推导,并结合一个例题进行了解析解和基于Matlab的程序求解.但是我感觉书中的MATLAB代码有点罗嗦,而且一些实现方法也比较麻烦,比如已经知道了杆单元的起点和终点坐标,仍然需要另外给出单元局部坐标与整体坐标的夹角,这完全没必要.于是我就用Python重构了这段程序,当然并不是把书中的MATLAB代码翻译成python(事实上完全可以这么干,而且很快!).比如我使用了面向对象的思想,把杆单元写成了一个类,这样思路比较清晰. #! /usr/b

我对有限元的理解

温故而知新.                                                                          ----<论语> 这里只讨论基于位移(注1)的有限元方法,它最终建立的是关于位移为未知量的方程组.也就是说,在推导过程中涉及到的其他未知物理量都要转化为位移的表达. 推导过程中用到的关键物理定律,虚功原理或最小势能原理.由于这两者在某些情形下是等价的,这里只以虚功原理为例进行说明.所谓的虚功原理,是说对于静态平衡的系统,力(注2)在虚位

如何把Excel中的单元格等对象保存成图片

对于Excel中的很多对象,比如单元格(Cell),图形(shape),图表(chart)等等,有时需要将它们保存成一张图片.就像截图一样. 最近做一个Excel相关的项目,项目中遇到一个很变态的需求, 需要对Excel中的一些对象进行拍图,比如,对一个单元格设置一些颜色之后拍图,或者对一个图表,报表拍成图片.经过比较曲折的经历,终于还是完成了.拿出来分享一下. 要做Excel,首先当然是查看Excel的com对象模型.地址在这里: http://msdn.microsoft.com/en-us

第四单元练习题

<<<第四单元练习>>> 1.在student用户下执行find /etc -name passwd 命令,并管理其输出要求如下: * 显示所有正确输出,屏蔽错误输出 * 保存正确数出到/mnt/find.out,错误数出到/mnt/find.err中 * 建立/mnt/find.all文件,并且保存所有输出到此文件中 * 再次保存所有输出到/mnt/find.all中,并且保持源文件内容 * 屏蔽此命令的所有输出 * 显示此命令的所有输出并保存输出到桌面上的任意文件中

[从产品角度学EXCEL 03]-单元格的秘密

这是<从产品角度学EXCEL>系列——单元格的秘密. 前言请看: 0 为什么要关注EXCEL的本质 1 EXCEL是怎样运作的 2 EXCEL里的树形结构 或者你可以去微信公众号@尾巴说数 获得连载目录. 本文仅由尾巴本人发布于特定网站.不接受任何无授权转载,如需转载,请先联系我,非常感谢. 在讲了excel的树形结构之后,我们终于要进入正题,研究单元格的秘密了. 当我们打开excel的时候,首先映入眼帘的就是一大片格子,这就是单元格. 在excel里,单元格承担了几乎所有的存储信息的功能.你

Excel单元格内容太多会覆盖遮住下一单元格范围

Excel单元格内容太多会覆盖遮住下一单元格范围分步阅读 Excel中的单元格内容,有着不同的对齐方式.用户可根据自己的需求,在处理数据的时候,自行设置所需要的对齐方式. 当您在处理数据的时候,如果设置不当,就会遇到这样的问题:Excel单元格内容太多会覆盖遮住下一单元格范围. 可以通过如下的方法来解决. 方法/步骤 如下图,B2单元格,仅输入了几个中文,但是,由于列的宽度不够,因此,该单元格的内容会延伸到下一单元格并覆盖了下一单元格的范围.从而影响了下一单元格的输入与修改. 此时,我们需要的方