首页/文章/ 详情

Jocabian 矩阵在等参元中的应用

2月前浏览1607
   

概述

     

初学有限元等参元理论,里面的单元映射变换给我带来了很大的困扰,我始终不明白这些东西如何通过Jocabian矩阵换来换去的。

后来并没有继续一头扎进去思考里面的公式推导,想从思考新的方法论的角度来解决问题,开始反思之前学习过的内容有没有可能为现阶段的困难提供解决方案,最终决定把当下碰到的困难放到已经解决过的问题中去思考

然后想到了Jocabian行列式,Jocabian行列式广泛用于求解复杂的定积分问题,通过Jocabain行列式对定积分进行换元,就可以将复杂的被积函数或者积分区域进行化简,就解决了复杂积分问题。

为什么要引入等参元

     

总的来说,引入等参元是为了更高效和准确地表示复杂几何形状和提高计算精度。主要目的是为了解决复杂几何、非线性问题,提高有限元分析的精度和效率。等参元通过统一几何和物理场的表示,简化了计算和坐标变换过程,同时允许通过高阶形函数捕捉更复杂的物理现象。

具体来讲有以下几个方面:

1

处理复杂几何形状

在实际工程问题中,很多结构的几何形状是复杂的,例如弯曲的梁、曲面的壳结构等。传统的有限元单元,如矩形或三角形单元,难以准确描述这些复杂的几何形状。而等参元采用的是曲线边界,通过形函数的非线性映射能够精确描述复杂几何形状,使得有限元分析能够更好地适应各种实际结构。

2

统一表示几何和物理场

等参元引入的一个核心思想是使用相同的形函数来表示几何坐标和物理场变量(如位移、温度等)。传统的非等参元方法通常需要分别处理几何和物理场,计算复杂度较高,且容易引入误差。等参元通过统一表示,避免了这些问题。

3

提高精度和效率

等参元不仅能够更精确地描述几何形状,还可以通过增加形函数的阶数来提高有限元解的精度。例如,在弯曲结构或有较大几何变化的区域,等参元可以通过高阶形函数捕捉细节,获得更好的计算结果。同时,等参元允许将较少的单元用于复杂几何的建模,从而减少计算量。

4

方便坐标变换和数值积分

在有限元分析中,很多问题涉及从参考坐标系到实际坐标系的坐标变换(如从局部单元坐标到全局坐标)。等参元通过引入参数坐标系(通常为自然坐标系,如ξ、η等),使得这些变换变得更加简单和系统。

5

处理非线性问题

对于很多非线性问题,等参元提供了灵活的框架来处理复杂的边界条件和材料非线性。由于等参元能够精确表示非线性几何形状和应力-应变分布,它在解决非线性问题(如大变形、接触问题等)时表现尤为突出。

6

减少网格失配问题

当模型中有复杂的几何特征或不同部分之间需要过渡时,等参元通过使用相同的形函数来表达几何和物理量,能够减少网格划分中的失配问题。它允许采用不规则的网格划分,而不会导致精度下降或计算不稳定性。

定积分计算中的换元

     

假如有如下定积分问题

   

如果被积函数或者积分区域非常的复杂,如二重积分中出现弧形边界,这时候仅仅在直角坐标系中很难求解,可以尝试将定积分转化到极坐标系中求解,或者对积分变量进行换元,如下式

   

引入Jocabian矩阵以后,原积分可以变换为

   

其中,Jocabain矩阵对应的行列式为

   

直角坐标与极坐标互换

     

下面是一个直角坐标转换为极坐标的例子。假如有以下定积分

   

假设积分区域为

   

这个积分区域在直角坐标系中很复杂,直接用圆的直角坐标表达式求解分不太现实,就可以考虑进行坐标转换,把问题放到极坐标系中求解,引入

   

原定积分转化为

   

其中,Jocabian矩阵对应的行列式为

   

则最初的定积分就化简为

   

采用Jocabian矩阵完成等参变换

     

这里以三维8节点单元的刚度矩阵为例讲解如何采用Jocabian完成等参变换。八节点单元的单元刚度矩阵为

   

其中,B为应变-位移矩阵,为笛卡尔坐标x、y、z的函数,D这这里为线弹性材料矩阵,是常数。则整个被积函数可以可以表示为

   

且笛卡尔坐标与母单元坐标存在函数关系

   

因此,单元刚度矩阵可以表达为

   

且Jocabian矩阵为

   

通过Jocabian矩阵,就将刚度矩阵,即定积分转换到了母单元坐标系中,然后再利用数值积分手段,将连续的定积分转化为离散的数值求和

   

上面的高斯积分假设每个方向有两个积分点,H为积分权重。

反思

     

我们不可能为所有遇到的新问题提供全新的解决方案,无论是从个人/团体资源来讲,还是时间精力角度来讲,都是不现实的。

这时候就要求我们将眼光放到之前已经解过的问题上,对之前的工作进行反思和升华,与此同时将遇到的问题进行抽象或者具象,然后努力在二者之间寻找一个交汇点,到了这一步,我们遇到的问题往往可以处理成之前已经解决的问题的外延,或者是在过往问题的基础上附加了一些学科背景,总之,将一个无法解决的问题近似成已有解决方案的问题会让人感觉非常的踏实,也让我们解决现有的问题更加的有的放矢。

这里面有很多值得思考的问题

点击卡片 关注我们

     

来源:有限元先生
非线性理论材料曲面
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2024-10-19
最近编辑:2月前
外太空土豆儿
博士 我们穷极一生,究竟在追寻什么?
获赞 23粉丝 4文章 63课程 0
点赞
收藏
作者推荐

C++基础知识(一)

零注释注释是出现在程序任何位置的字符段,但是编译器在编译程序的时候会自动忽略注释。自己写的程序常常睡一觉就忘得七七八八了,需要写一些解释性的注释用于后期提醒自己程序的功能。C++有两种注释,分别是单行注释和多行注释,单行注释常常用于少量的解释语言,顾名思义,这种注释只能会出现在一行中。而多行注释则可以跨行,常常用于解释函数和大段程序的功能,以下分别介绍。单行注释以“//”开始,在一行中,所有双斜杠后面的内容都是注释,均不被编译器识别,即//双斜杠后面额内容都是注释下面是一段程序,里面插入了几处单行注释//注释可以出现在任何位置,这是出现在开头的注释#include<iostream>#include<string>usingnamespacestd;//这也是单行注释intmain(){///这是一行注释return0;}//注释可以出现在任何位置,这是出现在末尾的注释多行注释是以"/*"开始,以"*/"结束的注释,如/*这是多行注释的开始这也是注释,多行注释可以跨行这是多行注释的结尾*/下面是一段程序,里面插入了几处多行注释//注释可以出现在任何位置,这是出现在开头的注释#include<iostream>#include<string>usingnamespacestd;//这也是单行注释intmain(){///这是一行注释/*这是多行注释的开始这也是注释,多行注释可以跨行这是多行注释的结尾*/return0;}//注释可以出现在任何位置,这是出现在末尾的注释/*多行注释也可以出现在程序额任何位置*/壹常量常量是程序运行中不可改变的数据量。在解决问题的时候,有一些数据量是固定的,比如在数值仿真计算中,有一些物理量和数学常数都是不可以改变的,如圆周率、普朗克常数等等。在C++中声明常数有两种方式,首先是宏常量定义//#define常量名称常量数值#definepai3.14159265358979//上面一行语句定义了圆周率,后面//所有的程序都可以直接使用然后是“const”关键字修饰//const数据类型常量名=常量值constpai=3.14159265358979//上面一行语句定义了圆周率,后面//所有的程序都可以直接使用贰变量变量,顾名思义,相对于常量而言,是在程序运行过程中数值可能会改变且数值可以被改变的一类数据量,变量有很多种类型,如整型、浮点型等等,变量的命名方法为//数据类型变量名称=变量初始值;intpai=3.14159265358979doublepai=3.14159265358979//上面一行程序声明了一个双精度浮点型的数据需要注意的是,变量的初始值要和变量的数据类型对应,如果变量的数据类型是整型,那么变量的初始值也必须是整型,如下面的声明方式就是错误的intpai=3.14159265358979下面给出一个变量的数据类型如变量变量初始值不对应的例子#include<iostream>#include<string>usingnamespacestd;intmain(){///这里的数据类型如后面的变量初始值不相同,数据会出现误差intpai=3.14159265358979;cout<<pai<<endl;system("pause");return0;}这个程序的输出结果是“3”,只输出了数据的整数部分,小数部分被截断了,这在后续的程序运行中会导致无法预料的错误,必须杜绝这种使用方法变量名称也有相应的命名规则,具体的规则为*不能是关键字*只能由字母、数字、下划线组成*第一个字符必须为字母或下划线*字母区分大小写*变量在声明时,必须给出初始值,否则会报错>建议:命名时,争取做到见名知意的效果,方便自己和他人的阅读叁关键字关键字是C++语言默认保留的一些字段或者是标识符,这些标识符已经被C++语言默认制定某种东西了,就比如苹果只能指代苹果这种水果,地球只能用来指代我们生活的这个星球,这是都是默认的,自己定义的变量不能使用这些关键字,每个关键字都有自己的含义,如:int,指代的是整型数据,如:shorting指的是短整型主句类型,下面列举C++中的关键字,后续的学习过程中会逐渐涉及到asmdoifreturntypedefautodoubleinlineshorttypeidbooldynamic_castintsignedtypenamebreakelselongsizeofunioncaseenummutablestaticunsignedcatchexplicitnamespacestatic_castusingcharexportnewstructvirtualclassexternoperatorswitchvoidconstfalseprivatetemplatevolatileconst_castfloatprotectedthiswchar_tcontinueforpublicthrowwhiledefaultfriendregistertruetypedefdeletegotoreinterpret_casttrytypedef来源:有限元先生

未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习计划 福利任务
下载APP
联系我们
帮助与反馈