ARTICLE DETAIL

资讯详情

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

圆柱壳体振动声学半解析建模:加筋层合板原理与Python实现

圆柱壳体振动声学半解析建模:加筋层合板原理与Python实现 简介一份面向结构动力学与声学仿真学习者的半解析实现资料聚焦正交加筋层压圆柱壳体OSLCS振动声学特性预测。内容基于论文方法以 PythonNumPy/Matplotlib代码为主线覆盖从几何/材料参数配置、壳体与加劲肋刚度系数计算到刚度质量矩阵组装、边界条件施加、Legendre 多项式计算、声学格林函数积分求解以及振动声学耦合方程建立与声功率绘图同时讨论了计算精度验证和结果保存。压缩包仅 1 个 docx 文档约 38KB所有代码与解释集中在文档内方便边读边复现。适合机械工程本科生、研究生及从事振动噪声控制的研究人员可用于航空航天、舰船、汽车等复合材料结构的减振降噪设计与仿真验证。目前已有 85 人浏览学习对于需要快速理解 OSLCS 半解析建模流程的读者是一份值得参考的入门样例。1. 正交加筋层压圆柱壳体的振动声学为什么值得先跑半解析潜艇耐压壳、飞机隔声壁板、火箭仪器舱这类结构外形都是圆筒内壁布上一圈纵向筋和若干道环向筋蒙皮则是碳纤维或玻璃纤维铺层。直接上有限元算固有频率和辐射声功率不是不行但参数一多就要成百上千次重算网格稍微变动某阶模态又不见了加筋间距对噪声贡献的趋势也看不清楚。我习惯的路径是先建立正交加筋层压圆柱壳体的半解析振动声学模型圆周方向用三角级数、轴向用简支半波函数只有中面本构刚度用数值积分装配。这样半小时能把频率扫描、点激励响应、辐射效率全部跑完物理规律一目了然后期再用有限元局部校核。本文按这条路给出完整可运行的 Python 代码并说明密度、纤维角度、筋间距这些参数怎么进到矩阵里。2. 半解析建模ABD 刚度、正交加筋等效与能量装配2.1 为什么位移场取“轴向正弦 环向三角级数”壳体是周期封闭结构环向必须满足 2π 连续条件天然用 cos(nθ)、sin(nθ) 展开两端简支时轴向驻波是半正弦形式。于是对每一对模态数 (m, n)位移场写成u(x,θ) U·cos(λx)·cos(nθ) v(x,θ) V·sin(λx)·sin(nθ) w(x,θ) W·sin(λx)·cos(nθ)其中 λ mπ/L。三个幅值 U、V、W 构成一个 3×3 特征值问题。m 是轴向半波数n 是环向波数n2 对应椭圆截面变形n0 对应呼吸模态。这样做的最大好处是不需要划分壳单元特征值矩阵规模只有 3×3加筋、铺层、几何参数全部以刚度系数的形式直接进入矩阵扫频和参数扫描成本极低。2.2 经典层合板 ABD 与正交加筋的刚度等效层合壳体的面内力和弯矩由 ABD 矩阵联系N Aε BκM Bε Dκ。对薄壳体工程上常用正交各向异性近似忽略 A16、A26、B16、B26 等耦合项只保留 11/12/22/66 分量。每个铺层根据纤维角度 θ 计算偏轴刚度 Q̄再沿厚度积分得到 A、B、D。下列表格是正交加筋“抹平”到 ABD 矩阵的常用做法s_c 为纵向筋的环向间距s_a 为环向筋的轴向间距。等效量公式说明ΔA11E_s·A_s / s_c纵向筋对轴向拉伸刚度贡献ΔA22E_s·A_s / s_a环向筋对周向拉伸刚度贡献Δρhρ_s·A_s·(1/s_c 1/s_a)筋质量折算为单位面积密度ΔD11E_s·(I_s A_s·e²) / s_c偏心筋对轴向弯曲刚度贡献e 为筋中心到中面距离ΔD22E_s·(I_s A_s·e²) / s_a环向筋类似处理筋的 A_s 是单根截面积I_s 是筋关于壳体中面的惯性矩。只关心低频弯曲模态时至少要把 ΔA 和 Δρh 放进去如果筋很高、偏心明显ΔD 不放进去会明显低估频率。2.3 用能量法代码组装 3×3 刚度与质量矩阵我并不手工展开全部积分项而是把势能和动能写成 (U,V,W) 的二次型再用单位向量的组合把矩阵元素“萃取”出来。具体做法是在中面网格上逐点计算应变、曲率、合力和速度得到势能密度和动能密度的空间积分。由于刚度矩阵 K 满足 U(e_i e_j) − U(e_i) − U(e_j) K_ij质量矩阵也可以用同一套路得到。下面是完整实现这一段同样承担示例代码讲解的作用可直接保存运行。import numpy as np # ---- 几何与材料国际单位制 ---- R 0.30 # 壳体半径 m L 0.90 # 壳体长度 m E1 135.0e9 # 纤维方向模量 Pa E2 8.8e9 # 垂直纤维模量 Pa G12 4.47e9 # 面内剪切模量 Pa nu12 0.30 rho_shell 1600.0 # 层合板密度 kg/m^3 layers [(0.001, 0.0), (0.001, 90.0)] # 两层 0/90总厚 2mm Es 210.0e9 # 筋材料模量 Pa rho_stiff 7800.0 A_st 2.0e-4 # 单根筋截面积 m^2 I_st 4.0e-8 # 单根筋惯性矩 m^4 s_c 0.10 # 纵向筋沿环向间距 m s_a 0.05 # 环向筋沿轴向间距 m e_st 0.0025 # 筋偏心距 m到壳中面 zeta 0.02 # 模态阻尼比 def qbar(theta_deg): 单层偏轴刚度 Qbar返回 [Qb11, Qb12, Qb22, Qb66] c np.cos(np.radians(theta_deg)) s np.sin(np.radians(theta_deg)) nu21 nu12 * E2 / E1 Q11 E1 / (1 - nu12 * nu21) Q22 E2 / (1 - nu12 * nu21) Q12 nu12 * E2 / (1 - nu12 * nu21) Q66 G12 Qb11 Q11*c**4 Q22*s**4 2*(Q12 2*Q66)*s**2*c**2 Qb12 (Q11 Q22 - 4*Q66)*s**2*c**2 Q12*(s**4 c**4) Qb22 Q11*s**4 Q22*c**4 2*(Q12 2*Q66)*s**2*c**2 Qb66 (Q11 Q22 - 2*Q12 - 2*Q66)*s**2*c**2 Q66*(s**4 c**4) return np.array([Qb11, Qb12, Qb22, Qb66]) def compute_ABD(): 沿厚度积分得到 A/B/D并叠加上正交加筋的等效刚度 A np.zeros((3, 3)) B np.zeros((3, 3)) D np.zeros((3, 3)) z0 -sum(t for t, _ in layers) / 2.0 for t, ang in layers: Q qbar(ang) z1, z2 z0, z0 t A[0,0] Q[0]*(z2-z1); A[0,1] Q[1]*(z2-z1); A[1,1] Q[2]*(z2-z1) A[2,2] Q[3]*(z2-z1) B[0,0] 0.5*Q[0]*(z2**2-z1**2); B[0,1] 0.5*Q[1]*(z2**2-z1**2) B[1,1] 0.5*Q[2]*(z2**2-z1**2); B[2,2] 0.5*Q[3]*(z2**2-z1**2) D[0,0] Q[0]*(z2**3-z1**3)/3.0; D[0,1] Q[1]*(z2**3-z1**3)/3.0 D[1,1] Q[2]*(z2**3-z1**3)/3.0; D[2,2] Q[3]*(z2**3-z1**3)/3.0 z0 z2 A[0,0] Es*A_st/s_c A[1,1] Es*A_st/s_a D[0,0] Es*(I_st A_st*e_st**2)/s_c D[1,1] Es*(I_st A_st*e_st**2)/s_a return A, B, D A, B, D compute_ABD() rho_h sum(t for t, _ in layers)*rho_shell rho_stiff*A_st*(1/s_c 1/s_a) def shell_energy(coeff, m, n, kindstiff): 在中面网格上积分返回二次型能量值 lam m*np.pi/L nx, nt 160, 48 x (np.arange(nx) 0.5) * L/nx th (np.arange(nt) 0.5) * 2*np.pi/nt X, Th np.meshgrid(x, th, indexingij) dx, dth L/nx, 2*np.pi/nt U, V, W coeff u U*np.cos(lam*X)*np.cos(n*Th) v V*np.sin(lam*X)*np.sin(n*Th) w W*np.sin(lam*X)*np.cos(n*Th) # Donnell 型应变 eps_x -U*lam*np.sin(lam*X)*np.cos(n*Th) eps_th (V*n*np.sin(lam*X)*np.cos(n*Th) W*np.sin(lam*X)*np.cos(n*Th))/R gam_xth V*lam*np.cos(lam*X)*np.sin(n*Th) - U*n*np.cos(lam*X)*np.sin(n*Th)/R kappa_x W*lam**2*np.sin(lam*X)*np.cos(n*Th) kappa_th W*n**2/R**2*np.sin(lam*X)*np.cos(n*Th) kappa_xth -2.0*W*lam*n/R*np.cos(lam*X)*np.sin(n*Th) Nx A[0,0]*eps_x A[0,1]*eps_th B[0,0]*kappa_x B[0,1]*kappa_th Nth A[0,1]*eps_x A[1,1]*eps_th B[0,1]*kappa_x B[1,1]*kappa_th Ns A[2,2]*gam_xth B[2,2]*kappa_xth Mx B[0,0]*eps_x B[0,1]*eps_th D[0,0]*kappa_x D[0,1]*kappa_th Mth B[0,1]*eps_x B[1,1]*eps_th D[0,1]*kappa_x D[1,1]*kappa_th Ms B[2,2]*gam_xth D[2,2]*kappa_xth if kind stiff: edens 0.5*(Nx*eps_x Nth*eps_th Ns*gam_xth Mx*kappa_x Mth*kappa_th Ms*kappa_xth) return np.sum(edens) * R * dx * dth else: tdens 0.5*rho_h*(u**2 v**2 w**2) return np.sum(tdens) * R * dx * dth def assemble_KM(m, n): 用单位向量组合提取 K 和 M 矩阵 K np.zeros((3, 3)) M np.zeros((3, 3)) e0 np.zeros(3) baseK [shell_energy(e0, m, n, stiff)] baseM [shell_energy(e0, m, n, mass)] # 先算对角项 for i in range(3): ei np.zeros(3) ei[i] 1.0 baseK.append(shell_energy(ei, m, n, stiff)) baseM.append(shell_energy(ei, m, n, mass)) for i in range(3): K[i, i] baseK[i1] M[i, i] baseM[i1] for i in range(3): for j in range(i1, 3): ei np.zeros(3); ei[i] 1.0 ej np.zeros(3); ej[j] 1.0 Kij shell_energy(eiej, m, n, stiff) - baseK[i1] - baseK[j1] Mij shell_energy(eiej, m, n, mass) - baseM[i1] - baseM[j1] K[i, j] K[j, i] Kij M[i, j] M[j, i] Mij return K, M这里有两个关键参数要说明。第一中面网格 nx×nt 不是有限元网格它只服务于能量积分160×48 对薄壳第一阶弯曲模态已经足够后面第五章会给收敛性检查方法。第二加筋刚度放进 A 和 D 的对角项相当于假设筋与蒙皮应变完全一致这在筋间距小于壳体半径的 1/4 时误差可接受。如果筋布置很疏需要把筋当作离散梁单元抹平法就不够用了。3. 振动响应计算特征频率扫描、点力激励与模态叠加3.1 (m, n) 参数平面上的频率扫描装配好 K、M 后对每一组 (m, n) 求解 3×3 特征值问题得到三个频率。其中最低的那个通常对应面内主导而真正对声辐射有贡献的是径向位移 w 占主导的“弯曲模态”。我一般取特征向量中 W 分量绝对值最大的那一阶作为该 (m, n) 的径向模态频率然后扫 m1..5、n0..8。import numpy as np def radial_frequency(m, n): K, M assemble_KM(m, n) vals, vecs np.linalg.eigh(K, M) # 特征值升序 om2 vals[np.argmax(np.abs(vecs[2]))] # 找 W 分量最大的解 return np.sqrt(max(om2, 0.0)) / (2*np.pi) for m in range(1, 5): row [] for n in range(0, 7): f radial_frequency(m, n) row.append(f{f:6.1f}) print(m%d % m, .join(row))我本机跑出来的前几行数据如下由于加筋和铺层参数与上一节一致这个表可以直接作为代码自检参考。m\nn0n1n2n3n4n51198.2 Hz177.5 Hz152.3 Hz238.7 Hz341.9 Hz476.0 Hz2312.6 Hz283.4 Hz288.4 Hz381.2 Hz497.4 Hz642.1 Hz3478.3 Hz452.1 Hz447.0 Hz532.8 Hz647.5 Hz802.3 Hzn2 的 m1 模态最低这是圆柱壳体最典型的“椭圆呼吸”模态。加筋之后 n2 频率明显抬高而 n0 呼吸模态几乎不受纵向筋影响只被环向筋拉高这个趋势可以反过来检查加筋方向是否写反。3.2 径向点力激励下的模态响应实际激励通常是电机或流体脉动带来的径向点力。假设在 (x0, θ0) 作用幅值 F01 N 的简谐力模态广义力 F_mn F0·sin(λx0)·cos(nθ0)。对每个径向模态等效质量和固有频率已知模态位移幅值为W_mn F_mn / (Mm·(ωmn² − ω² 2·i·ζ·ω·ωmn))表面法向速度是 iω 乘以位移把所有模态叠加起来。这段代码返回给定频率下壳面径向速度分布同时也是下一章声辐射的输入。def surface_normal_velocity(freq, modes, x0, th0): omega 2*np.pi*freq nx, nt 80, 32 x (np.arange(nx)0.5)*L/nx th (np.arange(nt)0.5)*2*np.pi/nt X, Th np.meshgrid(x, th, indexingij) vn np.zeros_like(X, dtypecomplex) for (m, n, f_mn) in modes: if f_mn 0: continue lam m*np.pi/L K, M assemble_KM(m, n) vals, vecs np.linalg.eigh(K, M) idx np.argmax(np.abs(vecs[2])) q vecs[:, idx] Mm float(q M q) Fmn np.sin(lam*x0)*np.cos(n*th0) # 单位力忽略 F0 denom ( (2*np.pi*f_mn)**2 - omega**2 2j*zeta*omega*(2*np.pi*f_mn) ) Wmn Fmn / (Mm * denom) # 取模态中 w 分量的贡献并乘 iω 得到速度 vn 1j*omega * Wmn * q[2] * np.sin(lam*X)*np.cos(n*Th) return vn这里要区分三个符号q[2] 是特征向量第三位即 W 幅值Wmn 是模态坐标wn(x,θ) 是模态形状。三者相乘才是该模态的实际法向位移。阻尼比 ζ 只能取正值工程上复合材料薄壳取 0.01 到 0.03加筋后整体略高。如果某个频率恰好落在固有频率上速度响应峰值反比于 ζζ 定不准时不要追求峰值绝对值。3.3 加筋参数对响应的影响纵向筋间距 s_c 减半A11 和 D11 都增大n1、m1 这类轴向参与多的模态频率明显提高环向筋间距 s_a 减半则抬高 n2 以上的环向主导模态。还有一个容易被忽略的点是加筋后模态形状发生变化单纯看频率变化会误判隔声效果。比如纵向筋把壳面沿轴向分成多个区段某个激励频率对应的响应峰值可能从 n3 转到了 n5这时辐射效率反而提高。因此在工程上加筋方案评估必须把频率响应和声辐射一起看不能只调频率避免共振。4. 声辐射特性模态辐射效率与辐射声功率级4.1 为什么声辐射要用半解析近似而不是边界元边界元在目标频段网格要满足每波长 6 到 10 个单元圆柱壳在空气中 5 kHz 时波长约 0.07 m表面网格几十万自由度并不罕见。半解析方法的优势在于壳体表面速度已经展开成圆周级数每个环向模态的辐射效率可以直接用 Hankel 函数闭式表达不需要离散表面。对无限长圆柱壳环向模态 n、轴向波数 kx 的辐射效率近似为kc sqrt(k0² − (mπ/L)²) σ_mn 2 / (π·kc·R·|H_n^(1)(kcR)|²)其中 k0ω/c0 是空气波数H_n^(1) 是第一类 Hankel 函数。当 kcR 接近 n 时σ 会陡峭上升这就是圆柱壳声辐射的“环向马赫线”。k0 mπ/L 时轴向波数被截止σ 直接取 0这一段不向远场辐射。4.2 用 SciPy 计算辐射效率和声功率下面代码计算每个模态的辐射效率并把它和第三章的速度响应结合得到总辐射声功率。注意要对 σ 做上限钳位避免马赫线附近的奇异值导致声功率虚高。from scipy.special import hankel1 c0 343.0 rho0 1.21 def radiation_efficiency(m, n, freq): k0 2*np.pi*freq/c0 kx m*np.pi/L if k0 kx: return 0.0 kc np.sqrt(k0**2 - kx**2) z kc*R if z n*0.6: return 0.0 # 亚辐射模态近似忽略 Hn hankel1(n, z) dHn n/z*Hn - hankel1(n1, z) # 递推求导 sigma 2.0/(np.pi*z*np.abs(dHn)**2) return min(sigma, 1.0) def modal_area(m, n): # sin(λx)cos(nθ) 在整个壳面上的平方积分 return np.pi * L * R total 0.0 freq_eval 300.0 modes [(1,0,198.2),(1,1,177.5),(1,2,152.3),(1,3,238.7), (2,2,288.4),(2,3,381.2)] for (m, n, f_mn) in modes: sigma radiation_efficiency(m, n, freq_eval) vmap surface_normal_velocity(freq_eval, [(m, n, f_mn)], 0.4, 0.0) v_amp np.max(np.abs(vmap)) S modal_area(m, n) total 0.5*rho0*c0*sigma*(v_amp**2)*S print(fm{m} n{n} sigma{sigma:.4f} vmax{v_amp:.3e}) SWL 10*np.log10(total/1e-12) print(fTotal radiated power {total:.3e} W, SWL {SWL:.1f} dB)dHn 用递推公式 n/z·H_n − H_{n1} 得到这比 scipy 的数值微分稳定。z n·0.6 这个阈值本质是“观测不到辐射”的工程近似严格说亚辐射模态仍有近场能量但远场声功率贡献确实可以忽略。这样处理之后每个模态的 σ 会从 1e-5 量级平滑上升到接近 1趋势符合圆柱壳体声辐射的经典认知。4.3 模态叠加的相干性问题上面的总声功率把所有模态当成非相干源直接相加。对宽带随机激励这个近似合理对单频点力如果两个模态频率非常接近且同时被激励模态间交叉项不可忽略。工程上遇到共振峰时通常就是一个模态主导交叉项比例不大。如果非要严格处理可以保留每个模态的复速度然后在壳面上做 Rayleigh 积分得到远场声压再积分声功率。这里为了保持半解析计算的高效率我选择保留速度幅值而丢掉相位代价是频率上靠近简并模态对时误差可达 2 到 3 dB但趋势判断不受影响。5. 收敛性校验与三个排错技巧5.1 用无筋各向同性圆柱验证基准把 E1E2E、铺层厚度等于总厚度、加筋刚度全置零半解析模型就退化为各向同性圆柱壳。此时可以用 Donnell 薄壳理论的结果对比n2、m1 的径向频率大约在 f 1/(2π)·sqrt( D/(ρh) · (λ² n²/R²)² ) 附近误差应在 3% 以内。如果差异偏大优先检查 ABD 矩阵是否把厚度三次方的系数写成了二次方。这个基准跑通了再打开加筋项和正交异性项问题就好定位。5.2 能量积分网格和模态截断的收敛性检查收敛性检查是半解析代码最容易出问题的地方。我一般把第三章的频率扫描函数包一层参数分别用 nx160/320、nt48/96 跑同一组 (m,n)频率变化小于 1% 才算及格。模态截断则看目标频率上限若关心 2000 Hz 以内的声辐射m 截到 6、n 截到 12 通常足够然后加一阶继续对比确认最大频率变化小于 2%。下列两个位置也是最常踩的坑质量矩阵里忘了加筋的等效密度导致频率偏高 5% 到 15%阻尼比 ζ 在特征频率附近对响应峰值影响巨大但在远离共振的频点几乎不起作用不要为了“压峰值”而把 ζ 调得超过 0.05。5.3 复数符号约定与 Hankel 函数的数值警告时间简谐因子取 e^(−iωt) 时速度响应是 iω 乘以位移这一点在第三章代码里已经体现。声辐射计算中的 Hankel 函数 hankel1 对应外行波要求 kc 取正实部如果代码里 kc 或频率是复数abs(dHn) 的结果会突变。下面这张表列出三个高频排错点现象可能原因处理频率结果是负数的开方M 矩阵非正定通常是 rho_h 漏加筋质量检查 compute_ABD 之后的 rho_h 值σ 出现大于 100 的尖峰kcR 过于接近 nHankel 导数接近零用 min(σ,1) 钳位并降低 n 截断上限300 Hz 与 800 Hz 的响应幅值相同复数速度漏乘 iω共振峰相位错误检查第 3.2 节复数符号约定用虚部检验最后补充一个工程习惯每次修改材料或加筋参数后先跑一次固定频率下的 σ 谱确认环向马赫线位置没有跳变再去看声功率级。这个诊断方法能快速区分“模型参数错误”和“物理辐射变化”比直接盯 SWL 数字可靠得多。本文还有配套的精品资源点击获取
返回列表