简介这份资源面向光学仿真与光纤传感方向的学习者和研究者聚焦受激布里渊散射SBS这一非线性光学现象提供基于MATLAB的三波耦合方程求解与全分布式传感仿真脚本可用于理解泵浦光、信号光与布里渊散射光之间的能量转移机制并探究温度、压力、应变等物理量对散射特性的影响。压缩包为rar格式内含1个m脚本文件整体约2KB体量轻便便于直接运行与二次修改。目前已有609人学习下载说明其在相关课题中具有一定参考价值。读者可借助该脚本搭建SBS仿真流程调整泵浦功率、光纤长度与光波频率等参数观察布里渊散射强度的变化并与理论预期或实测数据对照从而验证三波耦合模型的准确性为光纤传感系统的性能优化与深入研究提供可复用的工具基础。1. 从一段 SBS 散射光纤数据说起三波耦合方程到底在算什么如果你手里有一份标注着 SBSa.rar 的散射光纤实验数据或者正在做受激布里渊散射SBS的光纤传感系统大概率绕不开一个核心问题泵浦波、斯托克斯波、声波这三者到底怎么在光纤里交换能量。三波耦合方程就是描述这个过程的那组偏微分方程它决定了布里渊增益谱的形状、阈值功率的位置以及传感信号的信噪比上限。很多人第一次接触时觉得它像黑匣子——参数一大堆仿真和实测对不上增益谱宽总是差那么几个兆赫兹。这篇笔记就是把我自己在光纤传感场景下推导、离散化、调参、验证的完整路径拆开讲清楚适合做分布式温度/应变传感的工程师也适合刚拿到散射光纤数据、想用三波耦合模型做反演的研究生。读完你能自己搭一套可复现的数值求解流程知道哪些参数必须实测、哪些可以经验取值以及仿真结果和实验谱对不上时先查哪里。2. 三波耦合方程在光纤传感里的物理图像与选型理由2.1 泵浦、斯托克斯、声波三者的能量交换机制受激布里渊散射本质上是泵浦光通过电致伸缩效应激发声波声波形成折射率光栅把泵浦光散射成反向传播的斯托克斯光。三波耦合方程就是把这三个波在光纤中的演化写成耦合振幅方程。在连续波或准连续波条件下忽略群速度色散的高阶项常见形式是三个一阶常微分方程分别描述泵浦光沿正向、斯托克斯光沿反向、声波振幅沿光纤的演化。关键物理量有三个布里渊增益系数 g_B、声子寿命 T_2对应布里渊增益带宽、以及泵浦和斯托克斯之间的频率失谐量。光纤传感之所以关心这个是因为布里渊频移对温度和应变都敏感而三波耦合方程给出的增益谱直接决定了 BOTDA 或 BOTDR 系统的空间分辨率和测量精度。如果你只做单点传感可能觉得方程复杂但一旦要做长距离分布式测量泵浦耗尽和斯托克斯放大就不能忽略必须用耦合方程而不是简单的洛伦兹拟合。2.2 为什么不能直接用稳态解析解做传感反演很多入门资料会给出小信号近似下的解析解增益随距离指数增长形式很简洁。但在实际光纤传感中泵浦功率往往超过阈值泵浦耗尽效应明显解析解会高估增益、低估谱宽。更麻烦的是声波方程里的弛豫项在脉冲宽度接近声子寿命时不能忽略否则算出来的布里渊增益谱对称性失真频移提取会有系统性偏差。我一般会先判断实验条件如果泵浦功率低于阈值的一半、脉冲宽度大于 50 ns可以用小信号解析解快速估算否则必须上数值求解。选型上连续波传感用稳态耦合方程就够脉冲 BOTDA 则需要保留时间导数项变成偏微分方程组。这一步选错后面参数调得再细也对不上实测。2.3 数值求解方法的选择有限差分还是分步傅里叶三波耦合方程在光纤传感场景下通常是一维边值问题边界条件在光纤两端分别给定泵浦和斯托克斯的注入功率。常见做法是打靶法配合四阶龙格库塔或者用有限差分把光纤分成 N 段每段内做迭代。分步傅里叶适合处理包含色散和非线性同时作用的宽带场景但对纯 SBS 传感来说有点杀鸡用牛刀而且边界处理麻烦。我一般用有限差分加松弛迭代空间步长取 1 米以内保证布里渊增益谱的频域采样足够密。时间步长在脉冲模式下取脉冲宽度的十分之一以下。这套方法在普通工作站上跑 10 公里光纤、100 个频点大约几分钟出结果足够做参数扫描。3. 用 Python 搭一套可复现的三波耦合数值求解流程3.1 方程离散化与边界条件处理先把连续波稳态三波耦合方程写清楚。设泵浦光沿 z 正向传播斯托克斯光沿 z 反向传播声波振幅用 A_s 表示。忽略光纤损耗的瞬时项方程可以写成import numpy as np def sbs_coupled_equations(z, y, g_B, alpha, delta_beta, P_pump_inj): 稳态三波耦合方程右端项 y[0]: 泵浦功率 P_p y[1]: 斯托克斯功率 P_s y[2]: 声波振幅 A_ac z: 沿光纤位置正向为泵浦传播方向 g_B: 布里渊增益系数单位 1/(W*m) alpha: 光纤损耗系数单位 1/m delta_beta: 相位失谐量单位 1/m P_p, P_s, A_ac y # 泵浦方程损耗 被斯托克斯消耗 dPp_dz -alpha * P_p - g_B * P_p * P_s # 斯托克斯方程反向传播符号取反损耗 从泵浦获得增益 dPs_dz alpha * P_s g_B * P_p * P_s # 声波方程弛豫项与相位失谐 dAac_dz 1j * delta_beta * A_ac - A_ac / (2 * 1e-9) P_p * np.conj(P_s) return np.array([dPp_dz, dPs_dz, dAac_dz])这段代码里泵浦方程和斯托克斯方程的符号差异来自传播方向相反。声波方程里的 1e-9 是声子寿命 T_2 的典型值对应约 10 ns实际光纤中 T_2 在 5 到 10 ns 之间需要根据光纤类型调整。delta_beta 是泵浦与斯托克斯的波矢失谐在传感中通常扫描这个量来获得布里渊增益谱。边界条件泵浦在 z0 处注入斯托克斯在 zL 处注入通常为很小的种子光或噪声。打靶法就是猜一个 z0 处的斯托克斯值积分到 zL看是否满足边界条件不满足就修正。3.2 打靶法迭代与增益谱扫描打靶法的核心是外层迭代修正初始猜测。下面是一个简化实现用 scipy 的 solve_ivp 做内层积分外层用割线法更新斯托克斯初值。from scipy.integrate import solve_ivp from scipy.optimize import brentq def solve_sbs_profile(L, g_B, alpha, delta_beta, P_pump_inj, P_s_seed, N1000): 求解给定失谐下的功率分布 L: 光纤长度单位 m P_s_seed: zL 处的斯托克斯种子功率 返回 z 数组和对应的泵浦、斯托克斯功率 z_eval np.linspace(0, L, N) def residual(P_s_guess): y0 [P_pump_inj, P_s_guess, 0.0] sol solve_ivp( lambda z, y: sbs_coupled_equations(z, y, g_B, alpha, delta_beta, P_pump_inj), [0, L], y0, t_evalz_eval, methodRK45, rtol1e-6, atol1e-9 ) # 返回 zL 处斯托克斯功率与种子功率的差 return sol.y[1, -1] - P_s_seed # 用 brentq 寻找使边界条件满足的初值 P_s_guess brentq(residual, 1e-6, P_pump_inj * 0.5, xtol1e-9) y0 [P_pump_inj, P_s_guess, 0.0] sol solve_ivp( lambda z, y: sbs_coupled_equations(z, y, g_B, alpha, delta_beta, P_pump_inj), [0, L], y0, t_evalz_eval, methodRK45, rtol1e-6, atol1e-9 ) return z_eval, sol.y[0], sol.y[1]这里 brentq 的搜索区间取 1e-6 到泵浦功率的一半是因为斯托克斯初值不可能超过泵浦否则物理上无意义。实际跑的时候如果 brentq 报区间端点函数值同号说明种子功率设置不合理或者泵浦功率太低导致没有增益。增益谱扫描就是在外层循环里改变 delta_beta对每个频点调用一次 solve_sbs_profile记录 zL 处的斯托克斯输出功率再除以种子功率取对数得到布里渊增益。3.3 关键参数表与经验取值下面这张表是我在普通单模光纤SMF-28传感实验中常用的参数范围不同光纤需要微调。参数符号典型值单位获取方式布里渊增益系数g_B1~21/(W·m)厂家数据或实验标定声子寿命T_25~10ns由增益谱宽反推光纤损耗alpha0.2dB/kmOTDR 实测布里渊频移nu_B10.8~11.0GHz实验谱峰位置泵浦注入功率P_pump1~10mW激光器设定斯托克斯种子P_seed1e-6~1e-3mW通常为瑞利散射噪声注意 g_B 和 T_2 不是独立的增益谱的峰值和宽度由它们共同决定。如果仿真谱比实测宽先检查 T_2 是否取小了如果峰值增益偏高先看 g_B 是否偏大。泵浦功率超过阈值后增益谱会展宽并出现饱和这是泵浦耗尽导致的不是参数错了。4. 仿真与实测对不上时先排查这五个坑4.1 增益谱峰值位置偏移超过 5 MHz现象仿真得到的布里渊频移和实测谱峰差了几个兆赫兹温度或应变反演结果系统性偏。原因通常是声波方程里的相位失谐项符号搞反了或者布里渊频移的初始值设错。解决先单独跑一个均匀光纤、小信号条件下的仿真和解析洛伦兹谱对比确认频移符号和数值正确。再检查代码里 delta_beta 的定义是否和实验扫描方向一致。我遇到过因为泵浦和斯托克斯的传播方向约定不同导致频移整体平移的情况改一行符号就对了。4.2 打靶法不收敛brentq 报区间同号现象求解器抛出 ValueError提示 f(a) 和 f(b) 同号。原因一般是斯托克斯种子功率设得太大超过了泵浦功率的一半或者泵浦功率太低实际增益为负。解决先把种子功率降到 1e-8 W 量级再逐步增加泵浦功率。如果仍然不收敛检查光纤损耗是否设得过大导致泵浦在到达末端前就衰减殆尽。另一个常见原因是空间步长太粗solve_ivp 的 rtol 和 atol 设得太松积分误差累积。把 rtol 降到 1e-8atol 降到 1e-12 试试。4.3 脉冲模式下增益谱出现振荡条纹现象用脉冲泵浦做仿真时增益谱上出现周期性振荡而实测谱是光滑的。原因是时间步长没有跟上脉冲宽度或者声波弛豫项被离散化引入数值振荡。解决时间步长取脉冲宽度的二十分之一以下空间步长取 1 米以内。如果仍然有振荡检查声波方程是否保留了完整的弛豫项有些简化模型直接令声波绝热跟随会丢掉高频振荡但脉冲窄到 10 ns 以下时绝热近似失效。我一般会在脉冲宽度小于 30 ns 时保留时间导数项用 Crank-Nicolson 格式离散。4.4 泵浦耗尽算不出来增益随功率线性增长现象仿真中增加泵浦功率斯托克斯输出一直线性增长没有饱和趋势。原因是方程里缺少泵浦耗尽项或者 g_B 设得太小导致耦合项在数值上被忽略。解决检查泵浦方程里是否有 -g_B * P_p * P_s 这一项符号是否正确。如果 g_B 取 1e-3 量级在 10 公里光纤上确实看不出耗尽需要取到 1 到 2 的量级。另外如果光纤损耗设得很大泵浦在末端已经衰减耗尽效应也会被掩盖。先确认参数在合理范围再检查方程。4.5 实测谱宽比仿真宽一倍以上现象实验测得的布里渊增益谱宽明显大于仿真结果导致频移提取精度下降。原因可能是泵浦激光器线宽太大或者光纤中存在应变梯度导致布里渊频移在空间上不均匀展宽。解决先测激光器线宽如果超过 1 MHz需要在仿真中卷积激光器谱。如果是应变梯度把光纤分成多段每段给不同的频移再叠加。我一般会先用小信号解析谱拟合实测谱提取等效展宽量再把这个展宽量加到仿真里而不是直接改 T_2因为 T_2 改变会影响峰值增益而展宽卷积不影响峰值。5. 从增益谱到传感反演一个可复用的频移提取技巧仿真跑通之后最终目的是从实测布里渊增益谱里提取频移再换算成温度和应变。很多人直接用谱峰位置但实测谱往往不对称峰值位置受泵浦耗尽和噪声影响精度不够。我一般用洛伦兹拟合加质心法交叉验证先对谱做洛伦兹拟合得到峰值位置再对谱的线性部分做质心计算两者差超过 1 MHz 就检查数据质量。下面是一个频移提取的代码片段假设你已经有了频率数组和增益数组。from scipy.optimize import curve_fit def lorentzian(f, f0, gamma, A, offset): 洛伦兹线型f0 为中心频率gamma 为半高半宽 return A * (gamma**2 / ((f - f0)**2 gamma**2)) offset def extract_brillouin_shift(freq, gain): 从增益谱提取布里渊频移 freq: 频率数组单位 GHz gain: 增益数组线性值 返回 f0, gamma, 拟合残差 # 初始猜测峰值位置、半宽、幅度、偏置 f0_guess freq[np.argmax(gain)] gamma_guess (freq[-1] - freq[0]) / 20 A_guess np.max(gain) - np.min(gain) offset_guess np.min(gain) p0 [f0_guess, gamma_guess, A_guess, offset_guess] try: popt, pcov curve_fit(lorentzian, freq, gain, p0p0, maxfev10000) residuals gain - lorentzian(freq, *popt) return popt[0], popt[1], np.sum(residuals**2) except RuntimeError: # 拟合失败时退化为质心法 centroid np.sum(freq * (gain - np.min(gain))) / np.sum(gain - np.min(gain)) return centroid, np.nan, np.nan这段代码的关键在于初始猜测。f0_guess 用峰值位置gamma_guess 用扫描范围除以 20这个经验值在 10 GHz 扫描范围、30 MHz 谱宽下比较稳。如果拟合失败质心法作为后备但质心法对不对称谱的偏差较大只能应急。拟合残差可以用来判断数据质量残差超过增益峰值的 5% 就说明谱形不是标准洛伦兹可能有应变梯度或泵浦耗尽。我一般会把残差和频移一起记录残差大的点直接标记为可疑不参与后续温度解调。实际传感反演时温度和应变对布里渊频移的响应系数分别是约 1 MHz/°C 和 0.05 MHz/με这两个系数需要实验标定不能直接抄文献值因为不同光纤的掺杂和涂层会影响。标定方法很简单把一段光纤放在温控箱里每隔 10°C 测一次谱拟合频移-温度直线应变标定用拉伸台每隔 200 με 测一次。标定完之后把仿真模型里的频移参数改成实测值再跑一遍增益谱和实测谱对比如果峰位和谱宽都对得上说明模型参数已经校准可以用于后续反演。这个闭环我每次做新光纤都会走一遍虽然费时间但能避免后面所有数据都偏的尴尬。希望帮到你。本文还有配套的精品资源点击获取