资讯动态

收敛约束法+Python:巷道支护建模从公式到代码全解析

发布时间:2026/10/9 8:55:57 来源:尧图企业网站定制
巷道支护这事放在十年前老师傅们都是靠经验拍板围岩差一点就多打几根锚杆喷层再厚两公分。后来随着监测数据积累大家逐渐意识到支护设计不应该是“拍脑袋”而是一条可以被计算、被预测的力学曲线。这篇博文要聊的“巷道支护建模”就是用数学建模的方式把围岩和支护之间的相互作用量化出来再通过代码实现成一套可以反复使用的分析工具。它不解决“用什么支护形式”的全部问题但能帮你快速回答三个最要命的问题不支护会坏到什么程度支护后能稳定在什么状态调整支护刚度或时机到底有没有用如果你是采矿工程、隧道工程方向的学生或者正在做巷道支护设计、现场监测方案的技术人员这篇文章值得看完。我会把从理念到代码的完整路径拆开讲清楚包括每一个公式的物理意义、每一段代码的写法以及我自己在实际调试中踩过的坑。1. 项目拆解支护建模到底在解决什么问题1.1 现场痛点与建模目标矿山巷道开挖以后围岩应力重新分布。说白了原来由岩体自身承担的那部分压力随着开挖面出现开始向深部转移巷道周边一圈的岩体就处于“卸载”状态。如果不管它塑性区会不断扩大顶板冒落、片帮甚至断面整体失稳事故就是这么来的。所以支护的本质是给围岩一个“反力”阻止塑性区无限发展。但问题在于这个反力给多大什么时候给给早了支护结构承担的压力太大成本浪费给晚了围岩已经松弛破坏支护起不了作用照样塌。传统的工程类比法靠的是以往工程经验能应付常规条件但遇到深井、软岩、构造破碎带这些复杂工况经验往往不够用。这时就需要建模把围岩看成连续介质把支护看成弹性约束用解析公式或数值方法求解平衡状态。“巷道支护建模”的目标不是精确复现每一条裂缝而是回答工程上最关心的那个平衡点——围岩变形到多大时、支护压力到多大时系统能稳定下来。有了这个平衡点设计方案、支护参数、施工时机就都有了量化依据。1.2 收敛约束法一条曲线说明白的事啃过岩体力学的朋友应该都听过收敛约束法这是目前解析法里最经典的支护分析手段。它的思路非常直白把围岩和支护拆成两条曲线来表述。第一条叫围岩特征曲线也叫Ground Reaction Curve。它表达的是在给定的支护压力下巷道周边最终会产生的径向位移是多少。压力越大位移越小压力趋近于零位移达到最大值。这条曲线是围岩自身“脾气”的体现。第二条叫支护特征曲线即Support Characteristic Curve。它表达的是支护结构在被压缩的过程中能够提供的支护压力随位移如何增长。位移越大支护压力越大近似是一条直线斜率就是支护刚度。工程系统的平衡状态就是这两条曲线的交点。为什么这么说你可以把围岩当成一个不停往外扩张的弹簧支护当成一个往里压的弹簧两个弹簧顶在一起最终停在力平衡的位置。交点处的位移就是现场能测到的最终收敛量交点处的压力就是支护结构实际承受的荷载。用这个框架去理解“及时支护”“让压支护”这些概念会清晰很多。1.3 为什么用 Python 做工程计算以前这类解析计算工程上常用Excel或者手算。Excel做单个断面还行但要做多方案比选、参数敏感性分析表格就变得非常笨重。我的选择是用Python。原因有三条。第一Python的科学计算生态很成熟NumPy处理数组、SciPy求解非线性方程、Matplotlib绘图三件套就能完成从计算到可视化的闭环。第二代码本身就是文档参数、公式、单位都看得清清楚楚不像Excel单元格之间隐藏着各种跳转逻辑几个月后再打开自己都看不懂。第三容易扩展以后想把围岩参数改成随机分布做可靠性分析或者把计算逻辑封装成Web服务都是现成的基础。这次的项目就是一个完整的收敛约束法计算器。输入岩体力学参数和支护参数输出平衡状态、塑性区半径还附带可视化和参数敏感性分析。这就是“从理念到代码实现”的全部内容。2. 核心公式与参数体系代码前的数学准备2.1 围岩特征曲线的分段表达围岩特征曲线不是一条简单的直线它会经历弹性阶段和塑性阶段。刚开始支护压力足够大时围岩处于弹性状态位移与压力呈线性关系[ u \frac{a(p_0 - p_i)}{2G} ]其中(a)是巷道半径(p_0)是原岩应力(p_i)是支护压力(G)是岩体剪切模量。这个公式其实就是弹性力学里的厚壁圆筒位移解物理意义很直接径向应力差越大位移越大。但实际工程中支护压力小于某个临界值后巷道周边围岩进入塑性状态位移和压力的关系变成非线性。这个临界压力就是初始破坏的判据[ p_{cr} p_0(1-\sin\varphi) - c\cos\varphi ]当支护压力低于(p_{cr})巷道周边开始出现塑性区。塑性区半径用修正的卡斯特纳公式计算[ R_p a \left[\frac{(p_0 c\cot\varphi)(1-\sin\varphi)}{p_i c\cot\varphi}\right]^{\frac{1-\sin\varphi}{2\sin\varphi}} ]得到塑性区半径后围岩位移为[ u \frac{R_p^2(p_0\sin\varphi c\cos\varphi)}{2Ga} ]这条分段函数就是代码里围岩特征曲线的灵魂。实现时只要判断(p_i)和(p_{cr})的关系选择走弹性分支还是塑性分支即可。我用一组典型参数实际算过巷道半径3米原岩应力20MPa中等强度岩体弹性模量5GPa粘聚力1.5MPa内摩擦角30度无支护时塑性区半径能达到6.26米周边位移约36.9毫米。这个数值已经足够说明问题的严重性。2.2 支护特征曲线与组合刚度支护特征曲线的核心是支护刚度(K_s)即单位径向位移产生的支护压力增量。实际巷道支护往往是“喷层锚杆”的组合体系我这次按并联处理也就是两者同时受力组合刚度直接相加。喷射混凝土层的刚度公式采用弹性厚壁圆筒解[ K_{shot} \frac{E_c\left[a^2 - (a-t)^2\right]}{(1\nu_c)\left[(1-2\nu_c)a^2 (a-t)^2\right]} ]其中(E_c)是喷射混凝土弹性模量(\nu_c)是泊松比(t)是喷层厚度。我试过用这个公式和薄壁近似(E_ct/(a(1-\nu_c^2)))对比在厚度占比不大的情况下两者误差在5%以内但厚壁公式适用范围更广。锚杆的简化刚度公式[ K_{bolt} \frac{E_b A_b}{L_b S_l S_c} ]这里(E_b)是锚杆弹性模量(A_b)是锚杆截面积(L_b)是锚杆长度(S_l)、(S_c)分别是排距和间距。必须坦白说这个公式把锚杆当成简单的弹性拉杆没有考虑锚杆与围岩之间的粘结滑移、锚固端受力机制结果会偏乐观。但它用来估算锚杆对组合刚度的数量级贡献已经够用。后面我会再讲怎么修正。回到那个典型参数喷射混凝土层厚10厘米弹性模量20GPa算出来喷层刚度712MPa/m直径22毫米、长度3米的锚杆按1米乘1米的间排距布设锚杆刚度25.3MPa/m。组合刚度约737MPa/m。可以看到喷射混凝土占了绝对主导锚杆的直接刚度贡献反而不大——这其实暴露了简化模型的局限锚杆的真正作用更多体现在提高围岩自身强度增加粘聚力和内摩擦角而不仅仅是提供机械阻力。这一点在工程上要尤其注意。2.3 关键参数的取值方法模型好不好用参数取值占一半。我最常被问到的问题就是这些参数哪里来我的建议是按“实验室数据现场经验反分析”三管齐下。原岩应力(p_0)优先用地应力实测数据没有实测时浅部可以用自重应力估算比如埋深乘以容重深部要考虑构造应力修正。岩体的弹性模量、粘聚力、内摩擦角从岩体力学试验取但注意室内岩石试验结果要打折因为岩体里有节理裂隙工程上通常打0.3到0.7的折减系数。喷射混凝土的弹性模量和泊松比相对固定C25混凝土弹性模量大约取28GPa但井下喷层早期强度增长慢设计阶段可以保守取20GPa。参数有了不要直接跑先做一次手算校核。我每次写这类计算代码之前都会把关键工况用计算器估一遍数量级再让程序输出对比。如果差一个数量级肯定是代码或参数有问题如果差一倍以内说明程序基本可信。这个习惯帮我避免过无数次“程序跑通了、结果却是错的”的尴尬。2.4 平衡点求解思路有了围岩特征曲线和支护特征曲线求平衡点就是一个一维求根问题。我定义函数[ f(p_i) u_{rock}(p_i) - \left(u_0 \frac{p_i}{K_s}\right) ]其中(u_0)是支护安装时围岩已经发生的位移也就是“支护时机”。(u_0p_i/K_s)是支护结构在压力(p_i)下对应的变形等于支护安装时的初始位移加上支护被压缩的增量。围岩位移等于支护压缩量时系统达到平衡。我不直接手算这个交点而是用SciPy的brentq方法在([0, p_0])区间上求根。需要注意如果f(0)已经小于0说明(u_0)比无支护时的极限位移还大支护根本没有起到“早约束”的作用求根前必须先加这个判断否则brentq会报符号错误或者给出物理上无意义的解。3. 代码实现全流程从函数到可视化3.1 环境准备与代码结构这次代码只需要最基础的库安装一行命令搞定pip install numpy scipy matplotlib我用的是Python 3.10环境但只要是3.8以上版本跑起来应该都没有问题。代码结构上我不喜欢写一个几百行的脚本从头到尾。而是把计算逻辑拆成独立函数参数定义区、围岩特征曲线函数、支护刚度函数、平衡求解函数、可视化函数。这样每一块都能单独调试以后换参数、扩功能也方便。整个代码跑完只需要几秒但它的价值在于可以反复改参数做实验岩体不好的工况、喷层厚一点的工况、锚杆加密的工况都能秒出结果。这套东西拿到项目前期讨论方案比翻表格快得多。3.2 围岩特征曲线函数实现先看岩体参数定义和围岩特征曲线函数import numpy as np import matplotlib.pyplot as plt from scipy.optimize import brentq # ---- 岩体参数 ---- a 3.0 # 巷道半径 m p0 20.0 # 原岩应力 MPa E_r 5000.0 # 岩体弹性模量 MPa nu_r 0.25 # 岩体泊松比 c 1.5 # 粘聚力 MPa phi np.radians(30.0) # 内摩擦角 rad G E_r / (2 * (1 nu_r)) c_cot_phi c / np.tan(phi) sin_phi np.sin(phi) cos_phi np.cos(phi) # 临界支护压力 p_cr p0 * (1 - sin_phi) - c * cos_phi def rock_displacement(p_i): 给定支护压力 p_i (MPa)返回巷道周边径向位移 u (m) if p_i p_cr: # 弹性状态 u a * (p0 - p_i) / (2 * G) else: # 弹塑性状态先算塑性区半径 ratio (p0 c_cot_phi) * (1 - sin_phi) / (p_i c_cot_phi) Rp a * ratio ** ((1 - sin_phi) / (2 * sin_phi)) u Rp**2 * (p0 * sin_phi c * cos_phi) / (2 * G * a) return u这里要注意单位统一。我全部采用MPa和米所以模量的单位是MPa位移算出来是米。跑之前先打印一下中间量比如G、p_cr确认数量级合理。我见过不少同学把弹性模量按GPa输入结果算出来的位移差了三个数量级最后怎么都调不对。还有一个细节phi 0时公式里会出现除零这在摩尔库仑准则的极限情况下是会发生的问题。实际工程岩体内摩擦角很少低于15度所以代码里我没有做特殊处理。如果你要大规模跑随机参数建议在函数入口加一个phi 0的断言。3.3 支护刚度与平衡点计算接下来是支护参数和平衡点求解# ---- 支护参数 ---- Ec 20000.0 # 喷射混凝土弹性模量 MPa nu_c 0.2 # 喷射混凝土泊松比 t 0.1 # 喷层厚度 m Eb 200000.0 # 锚杆弹性模量 MPa db 0.022 # 锚杆直径 m Lb 3.0 # 锚杆长度 m S_l 1.0 # 排距 m S_c 1.0 # 间距 m u0 0.015 # 支护安装时围岩已发生的位移 m def shotcrete_stiffness(aa, tt, Ecc, nuc): 喷射混凝土层刚度 MPa/m ai aa - tt return Ecc * (aa**2 - ai**2) / ( (1 nuc) * ((1 - 2 * nuc) * aa**2 ai**2) ) def rockbolt_stiffness(Ebb, dia, LL, spacing): 锚杆分布等效刚度 MPa/m简化拉杆模型 A np.pi * (dia / 2)**2 return Ebb * A / LL / (spacing**2) K_shot shotcrete_stiffness(a, t, Ec, nu_c) K_bolt rockbolt_stiffness(Eb, db, Lb, S_l * S_c) K_s K_shot K_bolt print(f喷层刚度 K_shot {K_shot:.1f} MPa/m) print(f锚杆刚度 K_bolt {K_bolt:.1f} MPa/m) print(f组合刚度 K_s {K_s:.1f} MPa/m) def equilibrium(): 求解支护平衡点返回 (平衡压力 MPa, 平衡位移 m) def f(p): return rock_displacement(p) - (u0 p / K_s) # 支护过晚导致无解时返回 None if f(1e-6) 0: return None p_eq brentq(f, 1e-6, p0) return p_eq, rock_displacement(p_eq) res equilibrium() print(f临界支护压力 p_cr {p_cr:.2f} MPa) print(f无支护时围岩位移 {rock_displacement(0) * 1000:.1f} mm) if res: p_eq, u_eq res print(f平衡支护压力 {p_eq:.2f} MPa) print(f平衡位移 {u_eq * 1000:.1f} mm) else: print(警告支护安装时机过晚模型无平衡解)跑出来的结果在我那组典型参数下是临界支护压力8.70MPa无支护位移36.9毫米平衡压力2.58MPa平衡位移18.5毫米。这个18.5毫米意味着如果巷道开挖到15毫米时及时施作喷层和锚杆最终位移能控制在18.5毫米左右支护结构承压2.58MPa。相比无支护时的36.9毫米位移降了一半。这就是支护建模能直观告诉你的东西。这里我要多解释一句f(1e-6) 0这个判断。当(u_0)接近或超过36.9毫米时支护安装时围岩已经完成大部分变形支护结构几乎无法再提供有效约束数学上就没有平衡点。实际工程中这种情况对应的场景是因为故障导致巷道空顶时间过长喷层上晚了你再怎么加粗喷层围岩已经松了效果都很差。3.4 可视化把力学曲线画出来光有数字不够直观把曲线画出来现场讨论方案时一张图比一堆数字有用得多。# ---- 绘制围岩特征曲线与支护特征曲线 ---- p_arr np.linspace(0, p0, 300) u_arr np.array([rock_displacement(p) for p in p_arr]) u_max rock_displacement(0) # 支护特征曲线只在 u u0 时有效 u_sup np.linspace(0, u_max * 1.05, 200) p_sup np.where(u_sup u0, K_s * (u_sup - u0), 0) plt.figure(figsize(8, 6)) plt.plot(u_arr * 1000, p_arr, lw2, label围岩特征曲线 (GRC)) plt.plot(u_sup * 1000, p_sup, lw2, ls--, label支护特征曲线 (SCC)) if res: p_eq, u_eq res plt.scatter(u_eq * 1000, p_eq, colorred, zorder5) plt.annotate(f平衡点\n({u_eq * 1000:.1f} mm, {p_eq:.2f} MPa), xy(u_eq * 1000, p_eq), xytext(u_eq * 1000 4, p_eq 2), arrowpropsdict(arrowstyle-, colorgray)) plt.xlabel(巷道周边径向位移 (mm)) plt.ylabel(支护压力 (MPa)) plt.title(收敛约束法分析巷道支护平衡状态) plt.grid(True, alpha0.3) plt.legend() plt.xlim(0, u_max * 1050 / 1000) plt.show()跑完以后你能看到一条向右下弯曲的GRC曲线和一条从(u_0)位置向右上方倾斜的SCC直线交点就是红色标注的平衡点。围岩特征曲线有明显的形状变化靠近左侧大压力、小位移接近直线那是弹性段右段开始弯得厉害对应塑性区发育段。如果支护特征曲线和GRC的交点落在塑性段说明虽然稳定但塑性区已经不小了需要留意。我常顺手再画一张塑性区半径随支护压力变化的曲线def plastic_radius(p_i): if p_i p_cr: return a ratio (p0 c_cot_phi) * (1 - sin_phi) / (p_i c_cot_phi) return a * ratio ** ((1 - sin_phi) / (2 * sin_phi)) plt.figure(figsize(8, 5)) Rp_arr np.array([plastic_radius(p) for p in p_arr]) plt.plot(p_arr, Rp_arr, lw2) plt.axhline(ya, colorgray, ls--, label巷道半径) plt.xlabel(支护压力 (MPa)) plt.ylabel(塑性区半径 (m)) plt.title(支护压力对塑性区扩展的抑制效果) plt.grid(True, alpha0.3) plt.legend() plt.show()这张图非常直观支护压力从0增加到(p_{cr})的过程塑性区半径从6.26米一路降到巷道半径3米再增加压力塑性区不再缩小因为围岩已经回到弹性状态。这就解释了为什么支护不需要无限强——只要支护压力超过临界值再多加刚度对控制塑性区已经没有额外收益反而白白增加成本。3.5 参数敏感性分析代码跑通以后最有价值的应用是敏感性分析。我经常改三个参数支护时机(u_0)、喷层厚度(t)、原岩应力(p_0)。支护时机的影响最直观。我分别取(u_0)等于5毫米、15毫米、25毫米跑平衡点结果整理成表格支护时机 (u_0)平衡压力 (MPa)平衡位移 (mm)5 mm及时支护5.2912.215 mm正常工况2.5818.525 mm严重滞后1.0526.2这个趋势非常清楚支护越早平衡点越靠左上方也就是位移越小但支护压力越大支护越晚围岩自己先释放了大量变形支护需要承担的荷载变小但最终位移变大塑性区变深。工程上这就是“及时支护”和“让压支护”的定量权衡。如果围岩比较碎扛不住大变形就必须早支护、强支护如果围岩整体性好允许一定变形释放压力可以适当让压用柔性支护。原岩应力的影响也同样值得看。把(p_0)从15MPa、20MPa调到25MPa围岩特征曲线整体右移平衡位移从约14毫米、18.5毫米增加到大约23毫米。这说明深部巷道对支护的承载力和变形适应能力要求更高不能拿浅部参数硬套。代码里做一个循环把参数改掉重跑很快就能得到一组对比曲线。敏感性分析的代码写起来并不复杂核心就是把这几个参数改成循环变量把刚才的计算过程封装成一个函数传参调用即可。我自己会用一个小函数返回平衡结果def run_case(u0_val, t_val, p0_valNone): # 这里把全局参数替换重新计算 K_s 和平衡点 ...这种封装的好处是以后接新项目只要围着参数表换数据结果自动出来。4. 常见问题排查与实操心得4.1 曲线没有交点问题出在哪用brentq求根时最常遇到的就是报“f(a) and f(b) must have different signs”。对应到物理世界就是SCC曲线和GRC曲线没有交点。大多数人第一反应是改求根区间但我建议先想清楚物理上为什么不相交。原因无非两种。第一支护安装时机太晚(u_0)大于无支护时的极限位移此时围岩自己都稳定不了支护形同虚设第二组合刚度太小SCC曲线斜率太缓和GRC的塑性段交不进去。遇到这种情况代码里先打印u_max和u0再打印K_s基本就能定位。我的建议是在函数里加一层保护如果f(1e-6) 0直接返回警告而不是让程序崩溃。还有一个小坑p0作为求根区间上限如果设置成支护压力可能超过原岩应力的情形阶跃函数会出现假根。物理上支护压力不可能大于原岩应力所以求根区间上限固定为p0没毛病但要注意不要让支护参数组合出超过p0的平衡压力。4.2 塑性区半径计算结果异常跑出来的塑性区半径明显偏大或者偏小时先从两个方向排查。第一个是参数单位。我见过有人把泊松比填成0.3但弹性模量用的GPa结果剪切模量差了1000倍。统一用MPa之后数值正常多了。第二个是公式边界。当(p_i)非常接近0时卡斯特纳公式的比值会变得很大塑性区半径异常膨胀但这是公式的数学性质不是bug。关键是判断这时围岩是否已经失去工程意义——塑性区半径超过巷道半径2到3倍说明围岩整体失稳你在设计的不是支护方案而是抢险方案。另外如果内摩擦角取的特别小指数(1 - sin_phi) / (2 * sin_phi)会变得很大轻微的压力变化都会导致塑性区半径剧烈波动。这不是代码问题是岩体参数太差导致的模型敏感可以和地质人员确认参数后再定。4.3 支护时机 u0 对工程方案的启发刚才的敏感性分析已经显示(u_0)从5毫米变到25毫米平衡位移从12.2毫米变到26.2毫米。这个结论在方案设计时怎么用第一确定合理的空顶时间。如果现场监测反馈巷道周边位移在开挖后几天内就快速超过15毫米那就必须调整掘进和支护的工序衔接比如缩短空顶距离、增加临时支护。第二设计柔性支护方案时要有意识地允许围岩先释放一部分位移也就是设计一个合理的(u_0)而不是零时刻就上刚性衬砌。刚性衬砌虽然能把位移压得很小但支护压力巨大衬砌可能被压坏柔性支护允许围岩适度变形反而让支护受力更均衡。我在现场最深的体会是(u_0)不是一个可以直接测出来的“参数”而是一个工程决策变量。你决定初喷在开挖后8小时还是24小时进行本质上就是在选择(u_0)。所以每次用代码算完我都会反问一句这个(u_0)对应到现场施工步距和工序上可不可行4.4 现场应用时的避坑建议最后说几条我在实际项目里踩过或者看别人踩过的坑。千万不要让模型计算结果直接替代现场监测。模型给的是趋势和量级现场才是最终裁判。我在的一个项目里模型算出来平衡位移20毫米现场实测22毫米差距不大但个别破碎带段实测到了35毫米。后来分析是那段岩体存在隐伏断层参数选得太乐观。所以模型的正确用法是先用它做方案比选再在现场用位移计、锚杆应力计验证发现问题后反分析调整参数拿修正后的模型继续指导施工。锚杆刚度的简化处理要心里有数。前面算了锚杆对组合刚度的贡献只有25.3MPa/m相比喷层的712MPa/m小得多。但工程上锚杆依然有效原因在于它改善的是围岩自身参数让(c)、(\varphi)提高从而让整条围岩特征曲线下移而不是靠机械刚度直接扛。如果你的项目以锚杆支护为主建议把锚杆提高围岩强度这一层纳入模型或者直接上数值模拟软件否则你会严重低估锚杆的作用。还有个细节喷层厚度对刚度的影响不是线性的。我从5厘米加到10厘米刚度变化看得见但从10厘米加到15厘米刚度增幅明显放缓。因为刚度公式里厚度是平方项的关系越厚边际收益越低。现场做设计时别一味加厚喷层优化锚杆参数、控制支护时机往往性价比更高。参数敏感性分析不能只跑一种工况。我每次交付计算结果时都会附上三个最不利工况高原岩应力、低围岩强度、滞后支护。这三个工况任何一个出问题方案就要重新评估。用代码跑这种多工况比选是非常快的事情但能帮现场避开大量风险。这个项目做完以后我又在它的基础上扩展了支护结构强度校核模块——光有刚度和平衡点还不够还得看混凝土喷层会不会压碎、锚杆会不会拉断。如果你也想深入可以沿着这个方向继续做。但第一步先把收敛约束法的代码吃透这张“围岩-支护平衡图”画明白了后面的路就顺了。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑