前面的工作完成以后,使用generateMesh函数对模型进行网格剖分。网格剖分的过程,是一个对几何模型进行离散化的过程,通过该过程,用网格节点处的有限个解代替原模型上的无限个解,将相对复杂的问题转化为相对简单的问题。[大谦MATLAB,dqmatlab点com]
一、generateMesh函数
generateMesh函数的语法格式为:
- generateMesh(model) 对模型进行网格剖分。
- generateMesh(model,Name,Value) 用Name和Value匹配对修改网格剖分过程。Name和Value匹配对的设置如表1-2所示。
- mesh = generateMesh(___) 返回网格对象到MATLAB工作空间。
表1-2 Name和Value匹配对的设置
| Name | Value | 说 明 |
|---|---|---|
| GeometricOrder | 'quadratic' (默认值) | 'linear' | 单元的几何阶次 |
| Hgrad | 1.5(默认值)|1和2之间的数 | 网格生长速率 |
| Hmax | 正数 | 最大网格边长 |
| Hmin | 非负数 | 最小网格边长 |
| Hface | 用元胞数组表示,元胞数组中编号为奇数的元素用正整数或向量表示面的编号,编号为偶数的元素指定对应面的大小 | 指定选定面的大小 |
| Hedge | 与上面类似,面的编号改为边的编号 | 指定选定边的大小 |
| Hvertex | 与上面类似,边的编号改为顶点的编号 | 指定选定顶点的大小 |
使用generateMesh函数的第2种语法格式时,Name参数的值取时生成线性单元,值为时生成二次单元。图5-1中为二维线性单元和二次单元,图5-2中为三维线性单元和二次单元。可见,在三角形单元或四面体单元中,线性单元仅在单元顶点处获得节点,二次单元除了在单元顶点处获得节点,还在相邻顶点连线的中点处获得节点。默认时使用二次单元。
图5-1 二维线性单元和二次单元
图5-2 三维线性单元和二次单元
Hgrad参数用于控制采用生长法生成网格时的生成速率。该参数的取值界于1和2之间,默认值为1.5。
Hmax和Hmin参数可以指定网格的最大边长和最小边长,可用于控制网格的整体精度,参数的值更小时将生成更密的网格。
Hface, Hedge和Hvertex参数可以在指定的面、边和顶点处对网格进行加密。
二、绘制网格:pdemesh函数
用generateMesh函数创建网格后,使用pdemesh函数绘制网格的图形。pdemesh函数的语法格式为:
- pdemesh(model) 绘制model指定的PDE模型的二维或三维网格。
- pdemesh(mesh) 绘制模型的Mesh属性值mesh定义的网格。
- pdemesh(nodes,elements) 绘制节点和单元定义的网格。nodes是一个矩阵,大小为2x节点数或3x节点数。elements是表示单元与组成单元的节点之间关联关系的矩阵,大小为每个单元的节点数乘以单元个数。
- pdemesh(model,u) 绘制解数据的三维图。该语法仅用于二维几何模型。
- pdemesh(___,Name,Value) 指定Name和Value匹配对绘制网格或解数据的图形。Name和Value匹配对的设置如表1-3所示。
- pdemesh(p,e,t) 用网格数据p, e和t绘制网格。p, e和t分别表示网格的点数据、边数据和三角形单元数据。
- pdemesh(p,e,t,u) 用网格绘制PDE节点或三角形数据u的图形。如果u是列向量,绘制节点数据;如果u是行向量,绘制三角形数据。使用pdeplot函数或pdeplot3D函数可以获得更多控制。
- h = pdemesh(___) 返回图形的句柄。
表1-3 Name和Value匹配对的设置
| Name | Value | 说 明 |
|---|---|---|
| NodeLabels | 'off' (默认) | 'on' | 节点标签 |
| ElementLabels | 'off' (默认) | 'on' | 单元标签 |
| FaceAlpha | 1 (默认) | 0-1 | 面的透明度 |
| EdgeColor | 颜色短名称 | 颜色长名称 | RGB分量组合 | 边的颜色 |
| FaceColor | [0 1 1] |颜色短名称 | 颜色长名称 | RGB分量组合 | 面的颜色 |
表1-3中EdgeColor参数和FaceColor参数分别设置边和面的颜色,颜色的设置有使用颜色短名称、颜色长名称和RGB分量组合等3种方法,如表1-4中所示。
表1-4 颜色的设置
| 颜色短名称 | 颜色长名称 | RGB分量组合 |
|---|---|---|
| y | yellow | [1 1 0] |
| m | magenta | [1 0 1] |
| c | cyan | [0 1 1] |
| r | red | [1 0 0] |
| g | green | [0 1 0] |
| b | blue | [0 0 1] |
| w | white | [1 1 1] |
| k | black | [0 0 0] |
三、示例:生成网格并绘图
【例18】下面首先用polyshape函数创建PDE模型的几何模型。
>> t = pi/12:pi/12:2*pi;
>> pg = polyshape({[-0.9638 0.8717 0.8717 -0.9638], 0.4424*cos(t)-0.0082}, ...
{[0.5312 0.5312 -0.4589 -0.4589], 0.1859*sin(t)+0.0296})
>> tr = triangulation(pg)
>> model = createpde;
>> tns = tr.Points';
>> tes = tr.ConnectivityList';
>> geometryFromMesh(model,tns,tes);
可用pdegplot函数绘制几何模型,效果如图4-9所示。
用generateMesh函数进行网格剖分。
>> mesh=generateMesh(model)
mesh =
FEMesh - 属性:
Nodes: [2×1124 double]
Elements: [6×514 double]
MaxElementSize: 0.0834
MinElementSize: 0.0417
MeshGradation: 1.5000
GeometricOrder: 'quadratic'
返回的mesh是一个FEMesh对象,引用该对象的属性可以获取节点数据、单元数据、最大单元大小(即最大单元边长)、最小单元大小(即最小单元边长)、网格生长速率和单元阶次。
用pdemesh函数绘制网格。
>> pdemesh(model)
生成图5-3。
图5-3 网格剖分
下面绘制网格并给网格添加单元标签。用ylim函数调整y坐标轴显示范围。
>> pdemesh(model,'ElementLabels','on')
>> ylim([-0.5,0.5])
生成图5-4。
图5-4 在网格上添加单元标签
生成网格时用Hmax参数将单元最大边长从原来的0.0834设置为0.04,用pdemesh函数绘制网格。
>> m=generateMesh(model,'Hmax',0.04);
>> pdemesh(m)
生成图5-5。对比图5-3,现在网格明显进行了整体加密。
图5-5 对网格进行整体加密
对网格整体进行加密可以获得更精确的解,但也会加大计算量,需要计算更长时间才能得到问题的解。所以实际应用中常常只对特殊部位进行网格加密。
下面生成网格时用Hedge参数指定第2条边附近的网格大小设置为0.001,用pdemesh函数绘制网格。
>> m2 = generateMesh(model,'Hedge',{2,0.001})
>> pdemesh(m2)
生成图5-6。可见,图中网格只在第2条边附近进行了网格加密。
图5-6 对网格进行局部加密