033_Structure_Static_In_Matlab求解结构静力学问题两套方法

news2024/12/23 1:05:50

在这里插入图片描述

结构静力学问题

静力学问现在是已经很简单的问题,在材料各向同性的情况下,对于弹性固体材料,很容易通过有限元求解。特别是线弹性问题,方程的矩阵形式可以很容易的写出(准确得说是很容易通过有限元表达),然后通过求解线性方程组得到结果。

基本上,求解的就是如下形式的方程:

m ∂ 2 u ∂ t 2 + d ∂ u ∂ t − ∇ ⋅ ( c ∇ u ) + a u = f m \frac{\partial^2 u}{\partial t^2} + d \frac{\partial u}{ \partial t} - \nabla \cdot (c \nabla u) + a u = f mt22u+dtu(cu)+au=f

其中, m m m是质量矩阵, c c c是阻尼矩阵, a a a是刚度矩阵, f f f是外力矩阵, u u u是不同问题中的因变量,结构问题中是位移,热传导问题中是温度,电磁场问题中是电势。而方程中的 d d d只有在时变问题中才会出现,是一个时间相关的粘性系数。

当然,当方程的变量有多个时,方程就可以写成矢量的形式:

m ∂ 2 u ∂ t 2 + d ∂ u ∂ t − ∇ ⋅ ( c ⊗ ∇ u ) + a u = f \mathbf{m} \frac{\partial^2 \mathbf{u}}{\partial t^2} + \mathbf{d} \frac{\partial\mathbf{u}}{\partial t} - \nabla \cdot (\mathbf{c} \otimes \nabla \mathbf{u}) + \mathbf{a} \mathbf{u} = \mathbf{f} mt22u+dtu(cu)+au=f

相应的系数就变成矩阵或者向量,式中的 ⊗ \otimes 也就是张量积或者叫克罗内克积、Kronecker乘积。

接下来我们先介绍下传统方式的求解结构静力学问题,然后介绍新的统一模型的求解方式。

Matlab PDE Toolbox传统形式

这个工具箱最早的时候就实现了固体结构静力学、热传导、电磁场等问题的求解。

工具箱把不同领域的问题分成了不同的模型,采用同一个接口createpde来创建模型。这个接口的第一个参数是模型的名字,根据名称返回不同的模型对象。

  • structural:结构问题
  • thermal:热传导问题
  • electromagnetic:电磁场问题

每种问题,又包含了若干不同的分析类型,就拿结构问题来说,有:

"static-solid" | "static-planestress" | "static-planestrain" | "static-axisymmetric" | "transient-solid" | "transient-planestress" | "transient-planestrain" | "transient-axisymmetric" | "modal-solid" | "modal-planestress" | "modal-planestrain" | "modal-axisymmetric" | "frequency-solid" | "frequency-planestress" | "frequency-planestrain" | "frequency-axisymmetric"

首先,我们创建一个结构模型。

% 创建PDE模型
model = createpde('structural', 'static-solid');

model
model = 

  StructuralModel - 属性:

              AnalysisType: "static-solid"
                  Geometry: []
        MaterialProperties: []
                 BodyLoads: []
        BoundaryConditions: []
      ReferenceTemperature: []
    SuperelementInterfaces: []
                      Mesh: []
             SolverOptions: [1x1 pde.PDESolverOptions]

这个StructuralModel对象中,有各种属性,可以很容易的猜出其含义。比如MaterialProperties就是材料属性,BodyLoads就是体力,BoundaryLoads就是边界力,BoundaryConditions就是边界条件。

下面我们找一个最简单的问题,就是一个悬臂梁的问题,然后求解。

% 定义几何
gm = multicuboid(15, 1, 1);
model.Geometry = gm;
% 几何模型
figure
pdegplot(model, 'FaceLabels', 'on', 'FaceAlpha', 0.5);
title('Geometry with Face Labels - Domain Specific Modeling');

在这里插入图片描述

我们这里专门把面的编号写出来,方便后面的边界条件的设置。

材料特性都是瞎写的。

% 指定材料属性
structuralProperties(model, 'YoungsModulus', 210E9, 'PoissonsRatio', 0.3, 'MassDensity', 7800);

接下来就是产生网格,然后求解。

% 生成网格
generateMesh(model, 'Hmax', 0.2);

网格的最大边长设为0.1,这个值是可以调整的,这个值越小,网格越密,计算结果越精确,但是计算量也越大。

% 绘制网格
figure
pdeplot3D(model);
title('Mesh with Hmax = 0.2');

在这里插入图片描述

边界条件,我们把梁的右边固定,左边施加一个力。还记得加上重力的影响。看到我们这个力是一个向量,斜向下拉。

% 应用边界条件
structuralBC(model, 'Face', 3, 'Constraint', 'fixed');
structuralBoundaryLoad(model, 'Face', 5, 'SurfaceTraction', [0; -1E5; -1E5]);

% 重力
structuralBodyLoad(model, 'GravitationalAcceleration', [0; 0; -9.81]);

调用函数solve求解。

% 求解PDE
result = solve(model);

首先我们可以绘制整体的位移大小,基本上,就是经典的悬臂梁的感觉。不过,1米的悬臂梁还是很强很强的……

% 后处理结果
pdeplot3D(model, 'ColorMapData', result.Displacement.Magnitude);

title('Displacement Magnitude - Static Analysis - Domain Specific Modeling');

在这里插入图片描述

当然我们还可以计算应力,然后绘制应力的分布,应力集中的方式也很明显。

vonMisesStress = result.VonMisesStress;
pdeplot3D(model, 'ColorMapData', vonMisesStress);

title('VonMisesStress-Structural Static-Domain Specific Model');

在这里插入图片描述

统一求解框架

从2023a开始,Matlab开始引入了一个统一的求解框架来替代传统的各个专业的模型。这与工业软件的大的趋势也是一致的,多学科融合、数字化双创等等。

利用统一个数模、或者同一套网格,来求解不同的问题,这样可以减少重复工作,提高效率。

这个框架入口,就是femodel。就上面的悬臂梁问题,我们可以用这个框架来求解。

model = femodel(AnalysisType = "structuralStatic", Geometry = gm);

model
model = 

  1x1 femodel array

Properties for analysis type: structuralStatic

            AnalysisType: "structuralStatic"
                Geometry: [1x1 fegeometry]
      MaterialProperties: [0x1 materialProperties]

   Boundary Conditions
                  FaceBC: [0x6 faceBC]
                  EdgeBC: [0x12 edgeBC]
                VertexBC: [0x8 vertexBC]

   Loads
                CellLoad: [0x1 cellLoad]
                FaceLoad: [0x6 faceLoad]
                EdgeLoad: [0x12 edgeLoad]
              VertexLoad: [0x8 vertexLoad]

   Other Parameters
    ReferenceTemperature: []
           SolverOptions: [1x1 pde.PDESolverOptions]

  Show <a href="matlab:if exist('model','var'), displayAllProperties(model); else, disp('无法显示变量 model 的属性,因为该变量不再存在。'), end">所有属性</a>

这个对象也没有什么特别的,其属性也很容易从名字看出内容。

绘制模型的函数一点都没变……也能够认识这个对象

pdegplot(model, FaceLabels='on', FaceAlpha=0.5);
title('Geometry with Face Labels Displayed - femodel');

在这里插入图片描述

设置材料属性,采用了属性赋值的形式,并提供了一个新的函数materialProperties来设置材料属性。

划分网格的函数没有改变,唯一变化的时候必须把模型对象传递出去,不会直接在位修改输入参数的属性,这说明这个对象并不是handle对象。

最后,产生的网格记录在了model.Geometry.Mesh中,这个对象是一个FEMesh对象,这个对象也是一个新的对象,用来表示网格。

model.MaterialProperties = materialProperties('YoungsModulus', 210E9, 'PoissonsRatio', 0.3, 'MassDensity', 7800);
model = generateMesh(model);
pdeplot3D(model.Geometry.Mesh);

model.Geometry.Mesh

title('Mesh with default parameters - femodel');
ans = 

  FEMesh - 属性:

             Nodes: [3x1267 double]
          Elements: [10x600 double]
    MaxElementSize: 0.6027
    MinElementSize: 0.3013
     MeshGradation: 1.5000
    GeometricOrder: 'quadratic'

在这里插入图片描述

设置边界条件的方式也略有不同,从调用函数修改为了属性赋值的方式。我们可以看到,边界条件变成了一个数组。

  • FaceBC:面的边界条件,对应faceBC对象/函数
  • EdgeBC:边的边界条件,对应edgeBC对象/函数
  • VertexBC:点的边界条件,对应vertexBC对象/函数

载荷条件、初值条件等等也是类似的。

从这三个对象的数组,也可以看到模型包含面、线、点三种对象的数目。当然,设置边界条件的时候,也是按照这个顺序来设置的。

当然,载荷有一个体积载荷,对应CellLoad属性和cellLoad对象/函数。

model.FaceBC(3) = faceBC(Constraint='fixed');

model.FaceLoad(5) = faceLoad(SurfaceTraction=[0; -1E5; -1E5]);

model.CellLoad = cellLoad(Gravity=[0; 0; -9.81]);

当然,我们如果对于Matlab结构数组的操作比较熟悉,也可以对多个对象进行操作,比如设置多个边界条件。

比如面边界,经过我们设置之后,可以看到:

model.FaceBC
ans = 

  1x6 faceBC array

Properties for analysis type: structuralStatic

Index    Constraint    XDisplacement    YDisplacement    ZDisplacement
  1          []             []               []               []      
  2          []             []               []               []      
  3        fixed            []               []               []      
  4          []             []               []               []      
  5          []             []               []               []      
  6          []             []               []               []      

  Show <a href="matlab:if exist('ans','var'), displayAllProperties(ans); else, disp('无法显示变量 ans 的属性,因为该变量不再存在。'), end">所有属性</a>
model.FaceBC(2:4) = faceBC(Constraint='fixed');

model.FaceBC
ans = 

  1x6 faceBC array

Properties for analysis type: structuralStatic

Index    Constraint    XDisplacement    YDisplacement    ZDisplacement
  1          []             []               []               []      
  2        fixed            []               []               []      
  3        fixed            []               []               []      
  4        fixed            []               []               []      
  5          []             []               []               []      
  6          []             []               []               []      

  Show <a href="matlab:if exist('ans','var'), displayAllProperties(ans); else, disp('无法显示变量 ans 的属性,因为该变量不再存在。'), end">所有属性</a>

这样就很容易的设置了多个边界条件。

接下来就是基本一样的求解过程,调用solve函数,然后绘制结果。

% 先把面边界条件设回去,不然三个面被固定,结果会很好玩的
model.FaceBC([2, 4]) = faceBC();

ret = solve(model);

pdeplot3D(model.Geometry.Mesh, ColorMapData=ret.Displacement.Magnitude);
title('Displacement Magnitude-Structural Static-femodel');

在这里插入图片描述

vonMisesStress = ret.VonMisesStress;

pdeplot3D(model.Geometry.Mesh, ColorMapData=vonMisesStress);

title('VonMisesStress-Structural Static-femodel');

在这里插入图片描述

总的来说,统一接口的方式,也并没有什么大的不同之处。我感觉可能会让共享数模来分析不同学科的交叉问题会更加直观一些。当然,后面再学习的时候,建议还是直接从femodel开始,因为这个是未来的发展方向。

虽然,资料确实比较少,例子也还有好多没有调整过来。

总结

求解静力学问题,求解过程和结果都没有什么让人惊喜的地方。

下面,在讨论一个周期加载的问题,这个问题是一个动力学问题。

我们就直接用统一建模框架来做。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2230448.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

01.如何用DDD重构老项目

学习资料来源&#xff1a;DDD独家秘籍视频合集 https://space.bilibili.com/24690212/channel/collectiondetail?sid1940048&ctype0 文章目录 动机DDD与重构实践重构? 重写从一开始就采用DDD重构步骤1. 添加领域模块2.分离出有价值的代码3.迁移到领域模块4.重复2,3 动机 …

v-on:注册事件(可用@代替:@事件名)

目录 1.v-on&#xff1a; 2.页面效果 3.结构 v-on&#xff1a; (1)作用&#xff1a;注册事件添加监听提供处理逻辑 (2)语法&#xff1a; &#xff08;后&#xff1a;提供处理逻辑&#xff09; ①v-on:事件名"内联语句" ②v-on:事件名"methods中的函数名 一、…

基于OSS搭建在线教育视频课程分享网站

OSS对象存储服务是海量、安全、低成本、高持久的存储服务。适合于存储大规模非结构化数据&#xff0c;如图片、视频、备份文件和容器/虚拟机镜像等。 安装nginx wget https://nginx.org/download/nginx-1.20.2.tar.gz yum -y install zlib zlib-devel gcc-c pcre-devel open…

C++ | Leetcode C++题解之第520题检测大写字母

题目&#xff1a; 题解&#xff1a; class Solution { public:bool detectCapitalUse(string word) {// 若第 1 个字母为小写&#xff0c;则需额外判断第 2 个字母是否为小写if (word.size() > 2 && islower(word[0]) && isupper(word[1])) {return false;…

SpringBoot中@Validated或@Valid注解校验的使用

文章目录 SpringBoot中Validated或Valid注解校验的使用1. 添加依赖2. 使用示例准备2-1 测试示例用到的类2-2 实体Dto&#xff0c;加入校验注解2-2 Controller 3. 示例测试4. Valid 和 Validated注解详解4-1 常用规则注解4-2 分组验证4-2-1 示例准备4-2-2 Controller接口4-2-3 P…

Rust 力扣 - 1297. 子串的最大出现次数

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 越短的子串出现的次数越多&#xff0c;我们只需要求某个长度为min_size的子串出现的次数&#xff0c;并且该子串中不重复字符小于等于max_letters的数量 遍历长度长度为min_size的子串&#xff0c;然后将不重复…

【机器学习】25. 聚类-DBSCAN(density base)

聚类-DBSCAN-density base 1. 介绍2. 实现案例计算 3. K-dist4. 变化密度5. 优缺点 1. 介绍 DBSCAN – Density-Based Spatial Clustering of Applications with Noise 与K-Means查找圆形簇相比&#xff0c;DBSCAN可以查找任意形状和复杂形状的簇&#xff0c;如S形、椭圆、半圆…

yocto中bitbake -e的作用

bitbake -e > bb.log是Yocto项目中一个常用的命令操作&#xff0c;以下是对它的详细解释&#xff1a; 1. 命令的组成部分 -e&#xff1a;这是bitbake命令的一个选项。-e选项的作用是让bitbake输出环境变量信息。这些环境变量包含了与当前构建任务相关的大量参数&#xff0…

如何在Apple Vision Pro上打造成功的沉浸式叙述应用

随着科技的进步,沉浸式叙述应用正在成为一种全新的娱乐方式。Apple Vision Pro的发布,标志着空间计算技术迈上了新的台阶。本文将探讨如何在Vision Pro上构建一款类似Encounter Dinosaur的沉浸式叙述应用,具体通过分析《Out There》这款作品,总结出一系列关键点,帮助创作者…

android定时器循环实现轮播图

说明&#xff1a; android定时器加for循环实现轮播图 效果&#xff1a; step1: package com.example.iosdialogdemo;import android.os.Bundle; import android.os.Handler; import android.widget.ImageView; import android.widget.TextView;import androidx.appcompat.ap…

使用onnxruntime-web 运行yolov8-nano推理

ONNX&#xff08;Open Neural Network Exchange&#xff09;模型具有以下两个特点促成了我们可以使用onnxruntime-web 直接在web端上运行推理模型&#xff0c;为了让这个推理更直观&#xff0c;我选择了试验下yolov8 识别预览图片&#xff1a; 1. 跨平台兼容性 ONNX 是一种开…

一键AI换衣-可图AI试衣

我们的真的实现了穿衣自由了吗&#xff1f;上传一张人物图片和衣服的图片&#xff0c;就能实现一键换衣。 这就是可图AI试衣项目 魔塔地址&#xff1a;https://www.modelscope.cn/studio ... lors-Virtual-Try-On 参考&#xff1a; 一键AI换衣-可图AI试衣 https://www.jinsh…

【elkb】创建用户和角色

在使用中我们不能把超管的用户信息给到所有者&#xff0c;我们需要为不用的使用场景创建不同的用户。 登录管理员用户 打开管理页面 创建角色 点击角色&#xff0c;创建角色 填写角色信息 设置Kibana 权限 最后点击创建角色 创建用户 点击用户--->创建用户 填写信息 登录…

LeetCode --- 421周赛

题目列表 3334. 数组的最大因子得分 3335. 字符串转换后的长度 I 3336. 最大公约数相等的子序列数量 3337. 字符串转换后的长度 II 一、数组的最大因子得分 数据范围足够小&#xff0c;可以用暴力枚举移除的数字&#xff0c;得到答案&#xff0c;时间复杂度为O(n^2)&#…

《Java核心技术 卷I》第4章 对象与类

第4章 对象与类 面向对象程序设计(Object-Oriented Programming&#xff0c;OOP)。 实现一个简单的Web浏览器可能2000个过程&#xff0c;采用面向对象设计风格大约100个类&#xff0c;每个类平均包含20个方法。 类 类(class)是构造对象的模板或蓝图&#xff0c;我们可以将类…

【JavaScript】axios 二次封装拦截器(接口、实例、全局)

学习 coderwhy 老师结合 ts 二次封装 axios 目录结构 config config\index.ts // export const BASE_URL "http://codercba.com:9002"; export const TIME_OUT 10000;// 1. 根据环境变量区分接口地址 // let BASE_URL: string; // if (process.env.NODE_ENV &qu…

c++:vector模拟实现

一、vector成员变量 库里实现用的就是这三个成员变量&#xff0c;咱们实现跟库里一样&#xff0c; namespace myvector {template<class T>class vector{public://vecttor的迭代器是原生指针typedef T* iterator;typedef const T* const_iterator; private:iterator _sta…

数字后端零基础入门系列 | Innovus零基础LAB学习Day8

###LAB15 Detail Routing for Signal Integrity, Timing, Power and Design for Yield 这个章节虽然标题有点长&#xff0c;但不要被它吓到&#xff0c;其实这个章节就是Innovus工具的绕线Routing。只不过这个阶段做Route不是仅仅是把所有的逻辑连接&#xff0c;用实际的金属层…

发现研究的组织是自己所在组织,有点慌

donnyhuang 2019-5-29 23:34 我们做业务建模研究的组织可以是自己所在的组织吗&#xff1f;例如&#xff0c;如果我想做一个组件来来提高研发效能&#xff0c;那我研究的组织是我们部门的研发线可以吗&#xff1f; 因为最近做一个设备管理的建模&#xff0c;发现研究的组织是自…

将数学学生搞糊涂的糊涂话:面积(路程)是一种对应规则(关系)

黄小宁 将一种关系与构成此关系的成员、要素混为一谈是非常低级的常识性错误。问题是学生们做梦都不敢怀疑课本会有这样的错误。有战士与班长之间构成一种上下级关系&#xff0c;战士必须服从上级的指挥。将构成此关系中的班长说成是关系本身显然是概念性错误。同样&#xff0c…