ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

FSDT层合板有限元分析:从ABBD刚度矩阵到四节点板单元实现

FSDT层合板有限元分析:从ABBD刚度矩阵到四节点板单元实现 简介基于一阶剪切变形理论FSDT的复合材料层压板有限元分析程序以Matlab编写面向航空航天、机械、土木等领域中学习材料力学、结构力学及数值分析的高年级本科生和研究生适用于课程设计、期末大作业与毕业设计。程序采用参数化编程用户可灵活调整材料属性、几何尺寸和加载条件重新计算得到层压板变形与应力分布兼顾厚板剪切效应比薄板理论更贴近工程实际。压缩包共18个文件大小837KB包含12个m源码文件、3张结构示意图、1个PDF说明文档以及html和rtf格式辅助资料源码与文档分工明确便于阅读和二次开发。代码注释清晰、模块划分完整覆盖刚度矩阵计算、方程组求解、非线性本构定义等关键环节。已有104人学习下载适合需要结合理论完成有限元模拟与结构分析任务的学生和工程技术人员。1. 这个 zip 里的 FSDT 有限元分析在算什么从层合板方程到能跑的板单元做复合材料层压板强度或变形分析的工程师迟早会接触 FSDT 这个缩写。FSDT一阶剪切变形理论处理的是经典层合板理论CLT算不准的一类问题当板的跨度厚度比小于 20或者铺层里出现较软的面外剪切层CLT 假设的中面法线始终垂直于中面就不再成立横向剪切变形会显著影响位移和应力分布。这个 zip 里的东西就是把 FSDT 的偏微分方程落成四边形板单元的有限元分析程序输入铺层角度和材料参数输出位移、应变和每一层内部的应力。它适合两类人写论文或做结构课设需要基准算例的研究生以及要用复合材料板做工程校核的工程师——前提是你愿意花半天把理论过一遍而不是把程序当黑匣子。这篇笔记就按我自己的实现路径把从材料刚度到验证收尾的每一步讲清楚代码可以直接抄但坑也要一个个说清。2. 从材料主轴到 ABBD 矩阵FSDT 层压板刚度计算的两个步骤2.1 位移场假设与应变位移关系比 CLT 多出的两个剪切项FSDT 的位移场是三个中面位移和两个转角u(x, y, z) u₀(x, y) z·φx(x, y) v(x, y, z) v₀(x, y) z·φy(x, y) w(x, y, z) w₀(x, y)这里 φx 和 φy 代表横截面法线绕 y 轴和 x 轴的转角它们不再等于 -∂w/∂x 和 -∂w/∂y这正是与 CLT 的根本区别。把位移场代入几何方程得到六组应变分量面内膜应变三项、弯曲曲率三项、横向剪切两项。横向剪切应变 γxz ∂w/∂x φxγyz ∂w/∂y φy是 FSDT 额外引入的。当板很薄时剪切刚度项在总势能里占主导解会自然趋近 φx -∂w/∂x也就是退化为 CLT。在写单元刚度矩阵之前必须先算好层压板截面刚度。对每一层在材料主方向1 轴为纤维方向上平面应力状态下的缩减刚度矩阵 Q 是Q11 E1 / (1 - ν12·ν21) Q22 E2 / (1 - ν12·ν21) Q12 ν12·E2 / (1 - ν12·ν21) Q66 G12其中 ν21 ν12·E2 / E1。这一层的 Q 矩阵要旋转到全局坐标x 为板面内方向旋转后的 Qbar 与铺层角 θ 有关Qbar T(θ)·Q·T(θ)ᵀ。截面刚度 A、B、D 就是对 Qbar 沿厚度做积分。因为层压板是逐层铺设的积分可以按每层的上下表面 z 坐标分段求和。剪切部分 S 也走同样的旋转逻辑只是只涉及 G13、G23。2.2 用 MATLAB 写 ABBD铺层旋转、厚度积分与剪切修正系数这一段给出可直接用的 ABBD 计算函数。我建议所有几何和刚度单位统一成 N 与 mm这样应力自然就是 MPa避免后面数量级混乱。function lam fsdt_abd(E1, E2, G12, G13, G23, nu12, layer_deg, t_ply) % FSDT 层压板截面刚度计算 % 输入 % E1, E2 : 单层纵向/横向弹性模量, N/mm^2 % G12, G13, G23 : 面内与横向剪切模量, N/mm^2 % nu12 : 主泊松比 % layer_deg : 铺层角向量, 单位度, 从底部到顶部排列 % t_ply : 单层厚度, mm % 输出 % lam.A, lam.B, lam.D : 面内/耦合/弯曲刚度 (N/mm, N, N*mm) % lam.S : 横向剪切刚度 (N/mm), 已乘剪切修正系数 % lam.Qbar : 各层旋转刚度 cell, 后处理应力恢复用 nu21 nu12 * E2 / E1; den 1 - nu12 * nu21; Q [E1/den nu12*E2/den 0 nu12*E2/den E2/den 0 0 0 G12]; nlayer length(layer_deg); z zeros(nlayer1, 1); z(1) -nlayer * t_ply / 2; for k 1:nlayer z(k1) z(k) t_ply; end A zeros(3,3); B zeros(3,3); D zeros(3,3); S zeros(2,2); Qbar_cell cell(nlayer,1); for k 1:nlayer th layer_deg(k); c cosd(th); s sind(th); T [c^2 s^2 2*c*s s^2 c^2 -2*c*s -c*s c*s c^2 - s^2]; Qbar T \ Q / T; % 等价于 T*Q*T, 用T的逆避免手推转置 Qbar_cell{k} Qbar; z0 z(k); z1 z(k1); A A Qbar * (z1 - z0); B B 0.5 * Qbar * (z1^2 - z0^2); D D (1/3) * Qbar * (z1^3 - z0^3); % 横向剪切项旋转: 只涉及 44/55 分量 Q44 G23; Q55 G13; S S [Q44*c^2 Q55*s^2 (Q55-Q44)*c*s (Q55-Q44)*c*s Q44*s^2 Q55*c^2] * (z1 - z0); end ks 5/6; % 剪切修正系数, 见第5.4节讨论 lam.A A; lam.B B; lam.D D; lam.S ks * S; lam.Qbar Qbar_cell; end这个函数有几个参数细节值得说明。第一旋转矩阵 T 把材料主方向刚度变换到全局坐标我用的是 T\Q/T 而不是直接乘 TQT因为 Q 旋转的标准形式里 T 包含 2 倍项两种写法结果一致但前者不容易记错系数。第二B 矩阵只有当铺层关于中面不对称时才非零对称铺层如 [0/90]s 的 B 会非常小这是判断代码是否写对的一个快速手段。第三剪切修正系数默认取 5/6这个值对均质板严格成立对多向层压板是近似后面会单独讨论。调用方式很简单比如 T300/5208 材料、每层 0.125 mm、[0/90/90/0] 四层E1 132500; E2 10800; G12 5650; G13 5650; G23 3400; nu12 0.24; lam fsdt_abd(E1, E2, G12, G13, G23, nu12, [0 90 90 0], 0.125); disp(lam.D)注意这里 E1 用的 132500 MPa对应 132.5 GPa这是 T300/5208 的典型参数。算出的 D 矩阵第一项 D11 大约在几万 N·mm 量级如果单位写乱第一步就会发现数值离谱。3. 四节点板单元B 矩阵、高斯积分和剪切锁死3.1 每节点 5 个自由度Q4 单元的形函数与应变插值有了截面刚度接下来是单元层面。FSDT 板单元最常见的组合是四节点双线性单元每个节点有 5 个自由度u、v、w、φx、φy。形函数是标准的双线性函数N1 (1-ξ)(1-η)/4N2 (1ξ)(1-η)/4N3 (1ξ)(1η)/4N4 (1-ξ)(1η)/4单元内任意一点的位移由节点位移插值得到。为了组装单元刚度矩阵需要把应变向量 ε [εx εy γxy κx κy κxy γxz γyz]ᵀ 与节点位移 d 的关系写成 B·d。B 矩阵分三块膜应变块3 行、弯曲应变块3 行、横向剪切块2 行。膜应变只有面内位移 u、vεx ∂u/∂xεy ∂v/∂yγxy ∂u/∂y ∂v/∂x。弯曲应变来自转角κx ∂φx/∂xκy ∂φy/∂yκxy ∂φx/∂y ∂φy/∂x。剪切应变就是前面说的 ∂w/∂x φx、∂w/∂y φy。这里有个容易错的地方同一节点的 φx、φy 同时出现在弯曲和剪切两块里组装 B 矩阵时千万别漏了自由度列的位置。3.2 选择性减缩积分刚度矩阵里最容易写错的矩阵块FSDT 四节点板单元的经典坑是剪切锁死。如果弯曲项和剪切项都用 2×2 高斯积分在板很薄时剪切项会对挠度产生过度约束导致位移严重偏小网格加密也救不回来。标准做法是选择性减缩积分SRI膜和弯曲刚度用 2×2 积分横向剪切刚度用 1×1 积分单元中心一个积分点。这样剪切项在单元内是常数锁死现象基本消除代价是可能产生零能模式好在四节点板加边界约束后通常稳定。单元刚度矩阵的表达式是 Ke ∫ Bᵀ·C·B dA其中 C 是块对角矩阵C [A B 0 B D 0 0 0 S]这里的 A、B、D 来自上一章的 lamS 是 2×2 剪切刚度。下面给出完整的单元刚度函数直接可抄。function Ke q4_fsdt_stiffness(xy, lam) % 四节点 FSDT 板单元刚度矩阵 % 输入 % xy : 4x2 节点坐标矩阵, 每行 [x y], 节点顺序逆时针 % lam : fsdt_abd 输出的刚度结构体 % 输出 % Ke : 20x20 单元刚度矩阵 xi [-1/sqrt(3), 1/sqrt(3)]; % 2x2 积分点 wi [1, 1]; Ke zeros(20, 20); for i 1:2 for j 1:2 [dN, Jdet] q4_dN_dxy(xi(i), xi(j), xy); B q4_b_matrix(dN, xi(i), xi(j)); C [lam.A lam.B zeros(3,2) lam.B lam.D zeros(3,2) zeros(2,3) zeros(2,3) lam.S]; Ke Ke B * C * B * Jdet * wi(i) * wi(j); end end % 剪切项用 1x1 中心积分, 避免剪切锁死 [dN0, Jdet0] q4_dN_dxy(0, 0, xy); Bs [dN0(1,3) 0 dN0(1,4) 0 0 0 dN0(1,3) 0 dN0(1,5) 0 dN0(1,4) 0 0 dN0(1,6) 0 0 dN0(1,4) 0 0 dN0(1,7)]; % 占位, 见下方说明 % 实际剪切B矩阵在 q4_b_matrix 里单独取行 Ke Ke q4_shear_stiffness(dN0, Jdet0, lam.S) * 4; end上面的框架代码里我故意留了一个占位实际工程中我不会这样写死而是把 B 矩阵拆分。更清晰的做法是写成两个独立函数一个负责膜弯部分一个负责剪切部分见下面的完整版本。function Ke q4_fsdt_stiffness(xy, lam) xi [-1/sqrt(3), 1/sqrt(3)]; wi [1, 1]; Ke zeros(20, 20); for i 1:2 for j 1:2 [dN, Jdet] q4_dN_dxy(xi(i), xi(j), xy); Bm q4_b_membrane_bending(dN); Cmb [lam.A lam.B lam.B lam.D]; Ke Ke Bm * Cmb * Bm * Jdet * wi(i) * wi(j); end end [dN0, Jdet0] q4_dN_dxy(0, 0, xy); Bs q4_b_shear(dN0); Ke Ke Bs * lam.S * Bs * Jdet0 * 4; end function [dN, Jdet] q4_dN_dxy(xi, eta, xy) % 计算双线性形函数对 x,y 的导数与雅可比行列式 N [ (1-xi)*(1-eta)/4, (1xi)*(1-eta)/4, ... (1xi)*(1eta)/4, (1-xi)*(1eta)/4 ]; dNxi [ -(1-eta)/4, (1-eta)/4, (1eta)/4, -(1eta)/4 ]; dNeta [ -(1-xi)/4, -(1xi)/4, (1xi)/4, (1-xi)/4 ]; J [dNxi; dNeta] * xy; Jdet det(J); dN J \ [dNxi; dNeta]; % dN(1,:) 对x导数, dN(2,:) 对y导数 end function Bm q4_b_membrane_bending(dN) % 膜应变3行 弯曲应变3行, 自由度顺序 u v w fx fy Bm zeros(6, 20); dNx dN(1,:); dNy dN(2,:); for i 1:4 col_u (i-1)*5 1; col_v col_u 1; col_fx col_u 3; col_fy col_u 4; Bm(1, col_u) dNx(i); Bm(2, col_v) dNy(i); Bm(3, col_u) dNy(i); Bm(3, col_v) dNx(i); Bm(4, col_fx) dNx(i); Bm(5, col_fy) dNy(i); Bm(6, col_fx) dNy(i); Bm(6, col_fy) dNx(i); end end function Bs q4_b_shear(dN) % 横向剪切2行, 自由度顺序 u v w fx fy Bs zeros(2, 20); dNx dN(1,:); dNy dN(2,:); for i 1:4 col_w (i-1)*5 2; col_fx col_w 2; col_fy col_w 3; % 注意 w 在第三个自由度位置 col_u (i-1)*5 1; col_w col_u 2; col_fx col_w 1; col_fy col_w 2; Bs(1, col_w) dNx(i); Bs(1, col_fx) 1; % 形函数本身, 不含导数 Bs(2, col_w) dNy(i); Bs(2, col_fy) 1; end end这段代码里最需要注意的是自由度编号。我用的是每节点 5 自由度连续编号u、v、w、φx、φy。剪切 B 矩阵里 φx、φy 对应的是形函数本身而不是导数因为应变公式 γxz ∂w/∂x φx 里转角项是零阶项。很多人把这一项写成导数导致剪切刚度完全错掉。另外1×1 积分点的权重是 2×2 积分里权重的总和即 4所以最后乘了 4这是因为在自然坐标下面积分 ∫∫dξdη 的数值为 41×1 高斯点权重就是 4。关于锁死的物理理解当板很薄时剪切刚度 S 远大于弯曲刚度 D如果剪切项每个积分点都被精确强制为零就相当于给 w 和 φ 之间加了过强约束单元无法表达纯弯曲变形。把剪切项降为 1 个积分点相当于只要求剪切应变在单元平均意义下接近零弯曲模式得以释放。这也是 FSDT 四节点单元最常见的处理方案其他替代路径是 MITC4 单元或加内部自由度但 SRI 对规则网格足够。4. 组装、约束与求解从网格到层内应力的完整路径4.1 网格生成与自由度编号让每节点 5 自由度不乱拿到单元刚度后主流程就是标准的有限元组装。对 nx×ny 的规则网格节点编号可以按先 x 后 y 的顺序排节点 i 的全局编号是 (i-1) 行里按列推进。每个节点 5 个自由度所以节点 i 的自由度起始位置是 (i-1)*5 1。组装时把单元局部自由度的贡献累加到全局 K 矩阵对应位置。function [K, node_coord, elem_node] build_fsdt_mesh(nx, ny, Lx, Ly, lam) % 生成规则四边形网格并组装全局刚度 % nx, ny : x 与 y 方向的单元数 % Lx, Ly : 板的长与宽 mm nnode (nx1)*(ny1); ndof nnode * 5; K zeros(ndof, ndof); node_coord zeros(nnode, 2); elem_node zeros(nx*ny, 4); idx 0; for iy 1:ny1 for ix 1:nx1 idx idx 1; node_coord(idx, :) [(ix-1)*Lx/nx, (iy-1)*Ly/ny]; end end eid 0; for iy 1:ny for ix 1:nx eid eid 1; n1 (iy-1)*(nx1) ix; n2 n1 1; n3 n2 (nx1); n4 n3 - 1; elem_node(eid, :) [n1 n2 n3 n4]; xy node_coord([n1 n2 n3 n4], :); Ke q4_fsdt_stiffness(xy, lam); dofs zeros(1, 20); for k 1:4 base (elem_node(eid,k)-1)*5; dofs((k-1)*51:k*5) base1 : base5; end K(dofs, dofs) K(dofs, dofs) Ke; end end end这个函数把网格生成和组装合在一起适合快速验证。参数 nx、ny 控制网格密度Lx、Ly 是板面几何尺寸lam 来自上一章的截面刚度。自由度编号连续排在节点后面组装时用 base 计算每个节点的 5 个全局自由度不容易错位。如果你想改用三角形单元或 MITC4只需要替换 q4_fsdt_stiffness 和网格连接关系主流程不用动。4.2 简支边界的约束处理最少约束与求解FSDT 板的简支边界有几种定义方式。做验证题时我用的是 Navier 解对应的简支条件板边 w 0同时和边界相切的面内位移为零法线转角自由。对矩形板这意味着四条边都约束 wx 0 和 x a 边约束 vy 0 和 y b 边约束 u。之所以不把所有面内位移都约束在边上是为了避免引入额外的面内约束导致挠度偏刚。function [U, R] solve_fsdt(K, node_coord, nx, ny, Lx, Ly, q0) % 施加均布载荷与简支边界并求解 nnode size(node_coord, 1); ndof nnode * 5; F zeros(ndof, 1); tol 1e-6; % 均布载荷: 等效节点力按每单元4等分近似 for e 1:nx*ny % 从 node_coord / elem_node 取单元节点 % 这里略去, 由主脚本传入 elem_node end % 边界约束 fixed []; for i 1:nnode x node_coord(i,1); y node_coord(i,2); wdof (i-1)*5 3; % w 自由度 if abs(x) tol || abs(x-Lx) tol fixed [fixed, wdof, (i-1)*5 2]; % w 与 v end if abs(y) tol || abs(y-Ly) tol fixed [fixed, wdof, (i-1)*5 1]; % w 与 u end end fixed unique(fixed); free setdiff(1:ndof, fixed); U zeros(ndof, 1); U(free) K(free, free) \ F(free); R K * U - F; % 支反力 end这段代码的载荷施加我简化了实际主脚本里需要先通过 elem_node 找到每个单元节点再把均布载荷 q0 按面积四等分加到对应 w 自由度上。边界约束部分有一个工程判断x 0 边约束 v 是因为那条边的法线方向是 x面内切向是 v约束切向位移与 Navier 简支条件一致而法向位移 u 在简支边上应该自由。如果你把四条边的所有面内位移都约束掉算出的中心挠度在厚板情形会偏低几个百分点这在验证解析解时会变成莫名其妙的误差。4.3 层内应力恢复位移解只是半成品位移解算完FSDT 程序的真正价值在于给出每一层内部的应力分布。做法是取单元高斯点或用单元中心近似先由位移算应变再由该层的 Qbar 乘应变得到应力。注意每一层要用自己的材料主轴旋转刚度这是与均质板最大的不同。function stress recover_layer_stress(U, node_coord, elem_node, lam, t_ply, z_target) % 恢复某单元中心、指定厚度位置 z_target 处的层内应力 % z_target 相对中面, 单位 mm stress zeros(nx*ny, 3); for e 1:nx*ny xy node_coord(elem_node(e,:), :); [dN, Jdet] q4_dN_dxy(0, 0, xy); % 取单元中心的位移与应变 dofs get_elem_dofs(elem_node(e,:)); ue U(dofs); Bm q4_b_membrane_bending(dN); strain Bm * ue; % 前6行: 膜应变曲率 eps_m strain(1:3); kappa strain(4:6); % 找 z_target 所在层 for k 1:length(lam.Qbar) z0 -length(lam.Qbar)*t_ply/2 (k-1)*t_ply; z1 z0 t_ply; if z_target z0 z_target z1 sigma lam.Qbar{k} * (eps_m z_target * kappa); stress(e,:) sigma; end end end end这里的关键是 eps_m 和 kappa 的组合方式某一层 z 处的面内应变 膜应变 z × 曲率。FSDT 的应变沿厚度线性分布但每层刚度不同所以应力沿厚度是分段的折线。如果你画出的 σx 分布是一条连续直线那说明程序把层压板当成了均质板肯定哪里写错了。应力恢复一般不需要像刚度积分那样做 2×2 高斯点取单元中心就够工程使用要做精细应力分布再改用节点应力磨平。5. FSDT 代码避坑5 个让结果直接翻车的细节5.1 剪切锁死明明理论对挠度却偏小 10 倍以上现象a/h 50 的薄板用四节点单元算中心挠度结果比理论值小一个数量级加密网格从 8×8 加到 64×64 还是只有理论值的一半左右。原因剪切项用了全积分。FSDT 里剪切刚度 S 比弯曲刚度 D 大很多薄板弯曲时剪切应变本应接近零全积分强制每个积分点都满足这个约束把弯曲变形锁住了。这是单元数学性质决定的不是边界或载荷问题。解决把剪切项改为 1×1 减缩积分即第 3 章中的 SRI 方案。改完后跑同一算例挠度误差直接回到 1% 以内。如果不想用 SRI可以换 MITC4 单元它通过重构剪切应变场避免锁死但对编程能力要求高一截。工程上我的习惯是先 SRI 跑通再用 MITC4 做校核。5.2 铺层角符号约定混乱θ 和 -θ 的标准怎么定现象算 [±45]s 层压板结果和 [0/90]s 差不多或者把 [45/-45]s 的铺层顺序反转结果居然完全不变。原因旋转矩阵里 θ 的正方向约定不一致。有的资料定义 θ 从 x 轴逆时针转向 1 轴有的定义从 1 轴转向 x 轴方向反了45 和 -45 就互换了。如果各层都用了同一套约定对称铺层反转顺序确实可能看不出差异但对非对称铺层结果会错得很隐蔽。解决在代码开头统一注释写明约定我给的是「θ 为全局 x 轴逆时针旋转到材料 1 轴的角度」同时写一个自检函数算 [45]s 和 [-45]s 的 D 矩阵D16 与 D26 符号应当相反。看到符号相反说明旋转方向没有写反。5.3 单位失配GPa 和 mm、N 搭配出的数量级错觉现象材料参数用 GPa 输入几何用 mm算出的挠度比预期小 1000 倍或者应力大 1000 倍。原因GPa 是 10⁹ Pa也就是 10⁹ N/m²而 mm 是 10⁻³ m。如果刚度矩阵里的模量是 10⁹ 量级面积是 mm² 量级厚度是 mm 量级最后 D 的单位就是 N·mm 与 GPa·mm³ 混在一起差出 10³ 或 10⁶ 的倍数。解决全部用 N 与 mm 体系模量用 MPa即 N/mm²几何用 mm载荷用 N应力输出就是 MPa。T300/5208 的 E1 写成 132500 而不是 132.5这样 D 矩阵量级在 10⁴10⁵ N·mm挠度在 mm 量级一眼看出合不合理。我发现很多同学的代码错在只统一了长度没统一力。5.4 剪切修正系数不是随便取 5/6 就完事现象a/h 10 的厚层压板程序结果比文献参考值偏刚 10% 以上换了一种铺层误差方向还会变。原因5/6 只对均质各向同性板严格成立。复合材料层压板的横向剪切应力沿厚度分布不是抛物线修正系数与铺层顺序、每层的 G13/G23 比值有关。用 5/6 得到的是近似结果厚板时误差会被放大。解决工程验证阶段先取 5/6 跑通流程要做精细分析可以采用每层修正的方法把各层剪切刚度按应变能等效原理加权得到一个等效的厚度方向剪切修正系数。简单做法是提高网格密度的同时用 5/6 与 1 两个值各算一次如果差异小于 2%说明剪切修正系数不是控制因素如果差异大说明这个题不能只用简单系数。这条经验在写论文时尤其有用——审稿人看到你只用 5/6 会质疑你给出两个值的对比就说明你对边界清楚。5.5 边界约束过紧多约束一个自由度结果全变现象简支方板算出的挠度比 Navier 解小 3%5%网格加密也没改善。原因把简支边上的面内法向位移也约束了。FSDT 板的简支条件有多种理论定义Navier 解用的是 w 0 切向面内位移约束法向面内位移自由。如果你把所有边界的 u、v 全约束相当于在边界加了膜约束板变刚。解决按第 4.2 节的约束方式处理x 边约束 vy 边约束 u四条边都约束 w同时对刚体位移再补一个角点的 u、v 约束。改完误差通常立刻降到 1% 内。如果你不是对解析解而是只想要边界条件简单那就用对称边界条件但不要混用两套约定否则后处理应力会在边界附近出现奇怪的峰值。6. 用经典解析解验证正交层压板算例与参数敏感性6.1 CLT Navier 解与本程序对比先证明薄板极限正确FSDT 代码写完后第一件事不是急着算工程模型而是拿一个解析解把程序钉死。最稳妥的验证题是四边简支的正交层压方板铺层 [0/90/90/0]材料用 T300/5208边长 a b 1000 mm单层厚度 0.125 mm。均布载荷 q0 1 N/mm²取这么大是为了数值好看线性问题无所谓量级。CLT Navier 解的中心挠度公式是w_max Σ(m,n 奇数) 16·q0 / (π²·m·n) · 1 / [π⁴·(D11·(m/a)⁴ 2·(D122·D66)·(m/a)²·(n/b)² D22·(n/b)⁴)]这个级数取 m、n 各到 51 项就足够收敛。把上面的程序跑一遍然后取不同的长厚比 a/h 做对比。a/h 100 时FSDT 结果与 CLT 解析解应当非常接近误差主要来自单元离散一般 16×16 网格在 1% 以内。a/h 10 时FSDT 结果会比 CLT 大 5%15%因为横向剪切变形释放了额外的挠度这正是 FSDT 应该抓住的物理量。如果 a/h 100 时误差还大于 2%优先检查剪切锁死和第 5.2 节的旋转方向如果薄板对但厚板对不上检查剪切修正系数与剪切应变 B 矩阵里的零阶项。% 验证主脚本: 薄板极限 nx 16; ny 16; Lx 1000; Ly 1000; t_ply 0.125; layer [0 90 90 0]; lam fsdt_abd(132500, 10800, 5650, 5650, 3400, 0.24, layer, t_ply); q0 1.0; [K, node_coord, elem_node] build_fsdt_mesh(nx, ny, Lx, Ly, lam); % 组装载荷与边界后求解, 得到中心挠度 % 对比 CLT 级数解, 打印误差百分比这里我不建议用 4×4 网格就下结论。四节点板单元对挠度偏刚网格粗时会低于解析解加密后逐渐收敛。8×8 网格误差大约 3%5%16×16 到 1% 左右32×32 在 0.5% 以内。验证的目的不是让一次运行误差最小而是确认误差随网格加密单调减小——单调收敛是程序正确性最有力的证据。如果出现误差振荡基本可以断定某个自由度编号或边界约束写错了。6.2 长厚比与铺层顺序的敏感度测试FSDT 的价值边界验证完薄板极限接下来做一组参数扫描顺便界定 FSDT 相对于 CLT 的适用边界。保持材料相同分别取 a/h 4、10、20、50、100算 [0/90]s、[±45]s、[0/±45/90]s 三种铺层记录中心挠度。结果会有几个明显的趋势a/h 大于 30 后FSDT 与 CLT 之差小于 2%这时用 CLT 完全够a/h 在 10 到 20 之间FSDT 挠度比 CLT 大 5%15%差异以剪切变形成分主导a/h 小于 10FSDT 的剪切效应超过 20%CLT 已经不可用。[±45]s 铺层会比 [0/90]s 表现出更强的剪切效应因为 ±45 铺层的面内刚度对纤维方向不敏感横向剪切相对占比更高。如果某个铺层顺序在 a/h 20 时差异已经超过 15%说明该层压板的剪切模量低于常规碳纤维可能是玻璃纤维或软夹芯这类问题用 FSDT 计算时一定要保留剪切修正系数的讨论。做完这组敏感性测试你对程序的信任程度会明显不一样。我的经验是验证不是走个过场而是在动手处理真实模型前把程序的边界条件、单元行为和参数敏感度都摸一遍。之后算耦合弯曲的层压板或开口板时心里才有底。希望这份实现笔记帮到你少走我当年走过的弯路。本文还有配套的精品资源点击获取
返回列表