隧道爆破施工是现代工程建设中常用的方法,但爆破产生的振动会对周围结构和地质环境产生影响。本文介绍一个基于Python的邻近巷道爆破振动模拟系统,该系统通过数值计算模拟爆破引起的应力波传播过程,并提供多种可视化方式展示振动效应。本研究对于理解爆破振动机理、评估爆破安全距离以及优化爆破参数具有重要意义。
爆破引起的应力波在岩体中的传播可通过弹性波动理论描述。在均匀介质中,应力波的传播速度与材料的弹性模量和密度有关:
$$v = \sqrt{\frac{E}{\rho}}$$
其中,$v$为波速,$E$为弹性模量,$\rho$为岩体密度。
爆破产生的应力波随距离衰减,可以用以下模型描述:
$$\sigma(r,t) = \sigma_0 \cdot \frac{1}{r^n} \cdot e^{-\alpha(t-t_a)} \cdot \cos(\omega(t-t_a))$$
其中,$\sigma(r,t)$为距离爆源$r$处、时间$t$时的应力值,$\sigma_0$为初始应力,$n$为几何衰减系数,$\alpha$为材料衰减系数,$t_a$为应力波到达时间,$\omega$为应力波频率。
该模拟系统由以下几个主要模块组成:
1. 核心计算模块:计算应力波传播和振动响应
2. 二维可视化模块:生成平面应力波传播动画
4. 振动时程分析模块:分析监测点的振动特性
以下是系统中三维应力波传播计算的核心代码片段:
def calculate_stress_wave(self, distance, time):
"""计算应力波"""
# 避免除以零
if distance < 0.1:
distance = 0.1
wave_velocity = self.wave_velocity
arrival_time = distance / wave_velocity * 1000 # 到达时间 (ms)
# 如果应力波尚未到达该点
if time < arrival_time:
return 0
# 应力波衰减模型
attenuation = 1.5 # 衰减系数
max_stress = self.blast_energy / (4 * np.pi * distance**2) * 1e-6 # 应力最大值 (MPa)
decay_time = (time - arrival_time) / 2
stress = max_stress * np.exp(-attenuation * decay_time) * np.cos(2 * np.pi * 0.1 * decay_time)
return max(0, stress)
该函数实现了应力波传播的计算,考虑了波速、到达时间、几何衰减和材料衰减等因素。
本系统采用三维空间模型模拟隧道爆破环境,包含主巷道和邻近巷道两条相交的隧道结构:
# 巷道参数
self.main_tunnel = {
'start': (0, 50, 30),
'end': (100, 50, 30),
'radius': 3
}
self.nearby_tunnel = {
'start': (50, 0, 30),
'end': (50, 85, 30),
'radius': 3
}
```
系统通过以下方法生成巷道的几何表面:
# 巷道参数
self.main_tunnel = {
'start': (0, 50, 30),
'end': (100, 50, 30),
'radius': 3
}
self.nearby_tunnel = {
'start': (50, 0, 30),
'end': (50, 85, 30),
'radius': 3
}
```
系统通过以下方法生成巷道的几何表面:
```python
def generate_tunnel_points(self, tunnel, num_points=50):
"""生成巷道表面的点"""
start_x, start_y, start_z = tunnel['start']
end_x, end_y, end_z = tunnel['end']
radius = tunnel['radius']
# 巷道中心线上的点
if start_x == end_x: # y方向巷道
t = np.linspace(start_y, end_y, num_points)
center_points = np.array([[start_x, y, start_z] for y in t])
else: # x方向巷道
t = np.linspace(start_x, end_x, num_points)
center_points = np.array([[x, start_y, start_z] for x in t])
# 生成圆周上的点
tunnel_points = []
for center in center_points:
cx, cy, cz = center
if start_x == end_x: # y方向巷道
# 在xz平面上生成圆
for theta in np.linspace(0, 2*np.pi, 16):
x = cx + radius * np.cos(theta)
z = cz + radius * np.sin(theta)
tunnel_points.append([x, cy, z])
else: # x方向巷道
# 在yz平面上生成圆
for theta in np.linspace(0, 2*np.pi, 16):
y = cy + radius * np.cos(theta)
z = cz + radius * np.sin(theta)
tunnel_points.append([cx, y, z])
return np.array(tunnel_points)
系统提供了两种应力波传播可视化方式:二维平面和三维空间。三维可视化采用等值面技术,通过散点图展示应力波前沿的传播过程:
def create_isosurface_points(self, time_idx, threshold=1e-8):
"""创建特定时间点的应力等值面点"""
current_time = time_idx * self.time_step
# 创建均匀网格
nx = int(self.model_size[0] / self.grid_size) + 1
ny = int(self.model_size[1] / self.grid_size) + 1
nz = int(self.model_size[2] / self.grid_size) + 1
x = np.linspace(0, self.model_size[0], nx)
y = np.linspace(0, self.model_size[1], ny)
z = np.linspace(0, self.model_size[2], nz)
# 存储超过阈值的点
iso_points = []
iso_values = []
# 计算网格点的应力值
for i in range(nx):
for j in range(ny):
for k in range(nz):
point = (x[i], y[j], z[k])
# 跳过巷道内的点
if in_tunnel(point):
continue
# 计算到爆破点的距离
distance = self.calculate_distance(point, self.blast_point)
# 计算应力值
stress = self.calculate_stress_wave(distance, current_time)
# 如果应力值超过阈值,保存点和值
if stress > threshold:
iso_points.append(point)
iso_values.append(stress)
return np.array(iso_points), np.array(iso_values)
```
系统在模型中设置了多个监测点,用于记录振动时程曲线:
# 监测点设置
self.monitor_points = [
{'name': 'P1', 'position': (52, 52, 30), 'description': '爆破点附近'},
{'name': 'P2', 'position': (50, 70, 30), 'description': '邻近巷道壁面'},
{'name': 'P3', 'position': (80, 50, 30), 'description': '远场点'}
]
```
通过计算每个监测点在各时间点的位移,系统生成了振动时程曲线动画:
```python
# 计算每个监测点在各时间点的位移
for t_idx in range(self.time_points):
current_time = t_idx * self.time_step
for mp_idx, mp in enumerate(self.monitor_points):
# 计算到爆破点的距离
distance = self.calculate_distance(mp['position'], self.blast_point)
# 计算应力
stress = self.calculate_stress_wave(distance, current_time)
# 位移模型 (简化)
disp = stress * 1e-4 * np.exp(-0.1 * distance) * np.sin(2 * np.pi * 0.1 * current_time)
displacement[t_idx, mp_idx] = disp * 1000 # 转换为mm
```
通过模拟分析,我们观察到以下应力波传播特性:
1. 应力波在均匀介质中呈球面扩散
2. 当应力波遇到巷道空腔时,会发生反射和绕射现象
3. 应力波强度随距离呈非线性衰减
4. 在巷道交叉区域,应力波叠加效应明显
监测点振动时程曲线显示:
1. 爆破点附近监测点P1振幅最大,但衰减也最快
2. 邻近巷道壁面监测点P2受到反射波影响,振动持续时间较长
3. 远场点P3振幅较小,但低频成分比例增大
本研究通过Python数值模拟技术,实现了邻近巷道爆破振动的动态可视化。研究结果表明:
1. 应力波在巷道交叉区域的传播行为复杂,需要考虑多重反射和绕射
2. 巷道几何形状对应力波传播有显著影响
3. 监测点位置的选择对振动监测结果有决定性影响
未来研究方向包括:
1. 引入非均质岩体模型,考虑岩层分布对应力波传播的影响
2. 优化数值计算方法,提高模拟精度和计算效率
3. 结合实测数据进行模型验证和参数标定
4. 开发基于机器学习的爆破参数优化方法
1. Dowding, C.H. (1985). Blast Vibration Monitoring and Control. Prentice-Hall.
2. Khandelwal, M., & Singh, T.N. (2009). Prediction of blast-induced ground vibration using artificial neural network. International Journal of Rock Mechanics and Mining Sciences, 46(7), 1214-1222.
3. Saharan, M.R., & Mitri, H.S. (2008). Numerical procedure for dynamic simulation of discrete fractures due to blasting. Rock Mechanics and Rock Engineering, 41(5), 641-670.
4. Zhao, J., & Cai, J.G. (2001). Transmission of elastic P-waves across rock fractures with nonlinear characteristics. Rock Mechanics and Rock Engineering, 34(1), 3-22.
5. Hunter, J.D. (2007). Matplotlib: A 2D graphics environment. Computing in Science & Engineering, 9(3), 90-95.