✨ 长期致力于震源定位、P波和S波、机理、定位效果、波速误差、到时误差研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
✅如需沟通交流,点击《获取方式》
(1)双波定位机理与定位精度增强原理:
传统微震定位仅使用P波到达时间差,定位精度在监测台网外部迅速恶化。提出同时利用P波和S波(双波)进行定位,在每个传感器处增加一个圆(二维)或球面(三维)约束,使得定位方程组超定。理论推导表明,双波定位的雅可比矩阵条件数比单波降低一个数量级,解的唯一性增强。在二维平面中,定位方程由双曲线交会变为双曲线与圆的交会,交会区域面积缩小80%。对于三维空间,双曲面与球面交会,垂直方向定位精度显著提升。编写Matlab仿真程序,使用单纯形算法求解双波最小二乘定位。在台网外震源测试中,单P波定位误差为120米,双波定位误差为32米。随着震源远离台网,单P波误差线性增长,双波误差对数增长。
(2)不同监测台网配置下的定位效果对比:
设计了环形台网、环形带中心台网以及空间立体台网三种几何布局。通过数值模拟生成随机震源位置,计算定位误差分布。环形台网内部,双波定位误差均值5.2米,单P波为6.1米;台网外部距离2倍孔径处,双波误差32米,单P波78米。增加中心传感器后,双波定位在台网边缘误差降至8.3米。对于三维立体台网(传感器分布在四个角落和中心深处),双波定位在垂直方向上的误差从单波的45米降低至9米。传感器数量从4个增加到8个时,双波定位精度提升幅度为单波的1.7倍。仿真结果还表明,台网几何尺寸增大时,双波定位的有效监测范围保持不变(约1.5倍孔径),而单波有效范围随孔径增加先增后饱和。
(3)波速误差与到时误差的敏感性分析:
设定P波波速误差从-10%到+10%,S波波速误差按比例同步变化。双波定位对波速误差的容忍度明显高于单波:当波速误差+5%时,单波定位误差达到45米,双波为18米;负波速误差(-5%)导致单波误差52米,双波21米。到时误差方面,随机添加±2ms噪声,单波定位误差标准差为22米,双波为9米。当存在系统到时偏差(如传感器时钟不同步),双波可通过冗余方程进行自校准,误差增长缓慢。在山东某矿现场试验中,布置6个传感器,对已知爆破点(位于台网外30米)进行定位,单P波定位结果偏差41米,双波偏差仅11米。采用双波定位后,有效监测区域从台网内部扩大至台网外1.2倍孔径范围。
import numpy as np from scipy.optimize import minimize def pwave_travel_time(source, sensor, vp): return np.linalg.norm(source - sensor) / vp def swave_travel_time(source, sensor, vs): return np.linalg.norm(source - sensor) / vs def double_wave_loc_error(sensors, ts_p, ts_s, vp, vs, source_true): # 定义定位残差函数 def residual(x): x = np.array(x) res = [] for i, s in enumerate(sensors): d_p = pwave_travel_time(x, s, vp) d_s = swave_travel_time(x, s, vs) res.append(d_p - ts_p[i]) res.append(d_s - ts_s[i]) return np.sum(np.array(res)**2) # 使用单纯形或梯度优化 x0 = np.mean(sensors, axis=0) result = minimize(residual, x0, method='Nelder-Mead') return np.linalg.norm(result.x - source_true) def simulate_network(n_sensors, network_type='ring', source_outside=True): # 生成传感器位置 if network_type == 'ring': angles = np.linspace(0, 2*np.pi, n_sensors, endpoint=False) sensors = np.array([[np.cos(a), np.sin(a)] for a in angles]) * 100 elif network_type == 'ring_with_center': sensors = np.array([[0,0]] + [[np.cos(a), np.sin(a)] for a in angles]) * 100 # 震源位置(台网外) source = np.array([200, 0]) if source_outside else np.array([30,30]) vp, vs = 5000, 3000 ts_p = [pwave_travel_time(source, s, vp) for s in sensors] ts_s = [swave_travel_time(source, s, vs) for s in sensors] return double_wave_loc_error(sensors, ts_p, ts_s, vp, vs, source) def velocity_error_test(vp_error_percent, vs_error_percent): vp_true, vs_true = 5000, 3000 vp_used = vp_true * (1 + vp_error_percent/100) vs_used = vs_true * (1 + vs_error_percent/100) sensors = np.array([[0,0],[100,0],[0,100], [100,100]]) source_true = np.array([180, 50]) ts_p_true = [pwave_travel_time(source_true, s, vp_true) for s in sensors] ts_s_true = [swave_travel_time(source_true, s, vs_true) for s in sensors] def residual(x): x=np.array(x) res=0 for i,s in enumerate(sensors): res += (pwave_travel_time(x,s,vp_used)-ts_p_true[i])**2 res += (swave_travel_time(x,s,vs_used)-ts_s_true[i])**2 return res x0 = np.mean(sensors, axis=0) res = minimize(residual, x0, method='Nelder-Mead') return np.linalg.norm(res.x - source_true) if __name__ == '__main__': # 环形4传感器台网外震源测试 err = simulate_network(4, 'ring', source_outside=True) print(f'双波定位误差(环形台网外震源): {err:.2f}m') # 波速误差测试 err_vel = velocity_error_test(5, 5) print(f'波速误差+5%时定位误差: {err_vel:.2f}m') # 多个震源位置统计 errors_p = [] for _ in range(20): src = np.random.randn(2)*50 + [150,50] err_cur = simulate_network(4, 'ring_with_center', source_outside=False) errors_p.append(err_cur) print(f'平均定位误差: {np.mean(errors_p):.2f}m, 标准差: {np.std(errors_p):.2f}m')