简介:压缩包提供了一套与双光子吸收(TPA)计算和优化直接相关的MATLAB脚本集合,主要面向光学、凝聚态物理、化学及生物光子学方向的研究生、科研人员与高年级本科生,可用于TPA截面估算、吸收谱模拟、激发条件优化等任务。资源以zip格式打包,共9个文件,全部为.m脚本,整体仅11KB,体积非常精简,适合直接按函数模块取用或集成到现有实验中。从内容结构看,脚本按高斯贡献分解、策略一/策略二优化、截止功率计算、原始最大值定位、相位窗口分析、最优总和求解等功能划分,构成一条从TPA谱形分解到参数寻优的完整处理链。已有130人学习,尤其适合刚进入非线性光学模拟领域、需要可运行示例的读者,可借助这套代码快速理解双光子吸收效应的数值表征方法,并在此基础上结合具体材料模型进行二次开发。双光子吸收在生物成像、激光加工和光存储等领域应用广泛,这份小而精的脚本包为相关研究提供了便捷的起点。
1. 双光子吸收仿真:打开 tpa.zip 前先想清楚的问题
在代码资源站上,tpa.zip 这类压缩包几乎和“双光子”三个字绑定出现:解压后通常是一段非线性脉冲传播仿真的源码,多数用 MATLAB 或 Python 写的一维分布傅里叶法。问题在于,很多人把参数塞进去,跑出来的透射率曲线却和实验对不上,于是回头改步长、改分辨率、改边界,折腾半天,最后发现是双光子吸收项根本没被写进方程,或者单位换算错了三个数量级。下面这套思路把过程讲透:双光子吸收(TPA)在传播方程里为什么不是一个普通损耗项,分布傅里叶法怎么把这项处理得又快又稳,参数的物理单位怎么换算,以及那些看起来在“修代码”、实则被数值坑卡住的常见流坑。适合正在做超短脉冲传输、半导体波导器件或非线性光谱测量的人。如果你只想在现有仿真包基础上把 TPA 补进去,重点看第 3 章的写法和第 5 章的避坑清单;要自己搭一套能拟合实验数据的模型,从第 2 章开始读更稳。
2. TPA 仿真先从方程立住:非线性损耗项与求解器选型
为什么先讲方程?因为 tpa.zip 这类包里最容易出的问题就是“损耗项的单位和符号写错”。双光子吸收的物理并不复杂,但放进传播方程时,系数的来历、符号、归一化约定都会直接影响结果。这一章先把模型写清楚,再解释分布傅里叶法为什么是默认解法。
2.1 双光子吸收在传播方程里长什么样
对于沿 z 方向传播的慢变包络 A(z, T),同时考虑色散、自相位调制(SPM)和双光子吸收时,常见写法是:
∂A/∂z = -α/2 A - iβ₂/2 ∂²A/∂T² + iγ|A|²A - β_tpa/2 |A|²A
四个项从左到右依次是线性吸收损耗、群速度色散(GVD)、自相位调制带来的非线性相位、双光子吸收带来的非线性强度损耗。其中 γ 是 Kerr 非线性系数,β_tpa 是双光子吸收系数。这里最容易看错的是第四项:SPM 项的系数 iγ 是纯虚数,只改相位不耗能量;TPA 项的系数 -β_tpa/2 是负实数,对应“强度相关的损耗”,它让脉冲在峰值处衰减得最快、两翼衰减得慢。一个高斯脉冲走一段距离后峰会被压低,脉形从高斯慢慢变成平顶再塌陷。
物理根源是两个光子同时被介质吸收,吸收概率正比于光强的平方,所以损耗功率密度写成 β_tpa I²。单位上,β_tpa 常用 cm/GW,I 用 GW/cm²,乘起来恰好是无量纲速率。把强度 I 换成包络模平方 |A|² 并保持能量归一化约束时,方程里就会出现 -β_tpa/2 |A|²A。写方程时最常踩的坑有两个。第一个是直接把 β_tpa 当线性吸收系数 α 用,写成 -β_tpa A,这样算出来的透射率跟强度无关,完全失掉双光子吸收“越强越吸”的特征。第二个是系数 1/2 的来路:方程描述的是场包络幅度,而损耗发生在功率密度上,功率正比于 |A|²,所以幅度衰减率是功率衰减率的一半。这个 1/2 不能丢,丢了最终透射率会差出一个平方关系。
给出参考量级:近红外波段,典型半导体的 β_tpa 在 0.5~5 cm/GW,Kerr 系数 γ 在 1~100 W⁻¹m⁻¹,群速度色散 β₂ 在 -100~+100 ps²/km 之间。具体数值取决于材料与波长,仿真时最好查材料库或实测值,不要用某个包里的默认数据直接外推。很多 tpa.zip 里的默认参数来自某个特定实验,波长和脉宽与手头场景往往不匹配。
这里还有一个容易忽略的自检方法:从方程可以推能量守恒。|A|² 对时间积分后对 z 求导,SPM 和色散项贡献为零,只有 α 项和 β_tpa 项贡献负值。如果你写的代码跑出来能量不降甚至上升,那一定是符号或单位写错了。这个自检只需要在代码里加一行energy.append(np.sum(np.abs(A)**2)*dt),后面几章会一直用到它。
2.2 分布傅里叶法为什么是 TPA 仿真的默认解法
解决这个方程的标准做法是分布傅里叶法,也叫分步傅里叶法。思路是把 z 方向切成很多小段 Δz,在每一段内假定线性效应和非线性效应可以分开计算:先忽略非线性,只让色散和线性损耗在频域里作用;再忽略色散,只让 Kerr 和 TPA 在时域里作用。频域那一步用 FFT 完成,时域那一步只是逐点乘指数因子,所以单步开销是 O(N log N),比直接在时域做有限差分的网格推进快得多。
为什么不用时域 FDTD?超短脉冲在波导里传播几厘米到几十厘米,空间网格要覆盖整个传播长度,而时间网格要分辨光周期量级的变化,网格数轻易到几百万甚至上亿,一步时间推进还受 CFL 条件限制,实际慢到没法用。分布傅里叶法把时间方向的偏导变成频域乘法,色散项在频域是解析的,对这类慢变包络方程几乎是标准答案。求解器选型可以简单对比如下:
| 求解方式 | 单步复杂度 | 色散处理 | 适用场景 | 主要限制 |
|---|---|---|---|---|
| 分布傅里叶法 | O(N log N) | 频域解析精确 | 慢变包络、长距离传播 | 要求包络近似成立 |
| 时域有限差分 FDTD | O(N) 每网格点 | 需要数值差分 | 短距离、强非慢变 | 网格量大,CFL 限制 |
| 显式 Runge-Kutta 配 FFT | O(N log N) | 频域精确 | 可用,但步长偏保守 | 每步多次 FFT,较慢 |
实际程序里我习惯用对称分布傅里叶法:每一步先走 Δz/2 的线性段,然后走 Δz 的非线性段,再走 Δz/2 的线性段。对称安排的局部误差从 O(Δz) 降到 O(Δz²),同样的精度下步长可以放大好几倍。对脉冲传播来说,步长 Δz 的经验上限是取色散长度 L_D = T₀²/|β₂| 和非线性长度 L_NL = 1/(γP₀) 里较小者的十分之一到五分之一。TPA 项加入后会额外消耗能量,峰值功率沿 z 单调下降,实际误差往往比纯 Kerr 情形小,但保守起见仍按最小特征长度取步长。
有一个细节容易被忽视:非线性段里的 TPA 是实数损耗,所以要乘的是 exp(-β_tpa/2 |A|² Δz),不是乘相位因子。很多从纯 SPM 仿真改过来的人,在这里习惯性写了 exp(iγ|A|²Δz),把虚数单位带进去,TPA 变成了一种“相位扰动”,能量完全没掉,曲线自然不对。判断有没有写对的方法是关掉色散跑一炮:只有 TPA 和 SPM 时,脉宽应该几乎不变,总能量逐步下降,频谱变宽来自 SPM,而能量下降必须来自损耗项的实部。
3. 把 TPA 仿真跑起来:最小可运行代码与参数怎么设
这一章直接给一个能运行的 Python 版本。用 Python 是因为 tpa.zip 里的 MATLAB 代码虽然多,但 numpy/scipy 做 FFT 和后处理更顺手,而且容易被集成到自动化扫描里,比如后面第 6 章的参数反演。代码保持单文件,没有第三方非线性依赖。
3.1 先定介质与光源:一张能直接抄的参数表
仿真之前把下面这张参数表填好,大多数“结果不对”都出在单位换算上。长度单位统一用 m,功率单位用 W,双光子吸收系数先换算成 m/W,再结合有效模场面积 A_eff 变成一个组合系数,避免在代码里到处乘 1e-4、1e-9。
下面这套参数对应 1550 nm 波段、脉宽 100 fs、峰值功率 10 W 的脉冲,在某半导体波导里传播 1 cm:
| 参数 | 符号 | 数值 | 说明 |
|---|---|---|---|
| 峰值功率 | P0 | 10 W | 决定 TPA 损耗率 |
| 脉冲半高全宽 | T_FWHM | 100 fs | 换算 T0 = T_FWHM/1.665 |
| 群速度色散 | β₂ | -20 ps²/km | 反常色散,换算为 -20e-27 s²/m |
| Kerr 系数 | γ | 20 W⁻¹m⁻¹ | 高非线性波导典型量级 |
| 双光子吸收系数 | β_tpa | 1 cm/GW | 换算为 1e-11 m/W |
| 有效模场面积 | A_eff | 1 μm² | 来自模式仿真或解析近似 |
| 传播长度 | L | 1 cm | |
| 时间窗口 | Twin | 10 ps | 约 100 个脉宽 |
| 采样点数 | N | 2^14 | FFT 点数 |
参数说明:T0 是 1/e 强度的脉冲半宽,对高斯脉冲 T0 = T_FWHM/1.665。A 的归一化约定是 ∫|A|² dt = 脉冲能量,因此 |A|² 的单位是 W。组合 TPA 损耗系数 b2_eff = β_tpa / A_eff,单位是 (W·m)⁻¹。用这套参数算出来,峰值处 TPA 等效损耗率 b2_eff × P0 = 10 × 10 = 100 m⁻¹,传播 1 cm 总衰减 e⁻¹ ≈ 0.37,效果很明显。如果峰值功率只有 0.1 W,损耗率只有 1 m⁻¹,1 cm 内基本看不到 TPA 痕迹。所以判断一个参数组合有没有意义,先算 b2_eff × P0 × L,这个量级决定透射率曲线变化幅度。
有效模场面积 A_eff 不是随便填的。在波导里,A_eff = (∫|E|² dA)² / ∫|E|⁴ dA,通常由模式求解器给出。如果手头没有模式仿真,可以先按波导芯层几何尺寸估算,但误差会直接换算进透射率绝对值。后面拟合 β_tpa 时,A_eff 给错是最难排查的系统误差来源,建议单独标定一次。
3.2 分布傅里叶法主循环:可直接改参数的脚本
把下面代码存成 tpa_sim.py,直接运行就会生成 tpa_out.npz,里面有能量衰减曲线、输出脉冲和对应 z 坐标。
import numpy as np from numpy.fft import fft, ifft, fftfreq # ---- 物理参数(全部使用 SI 单位) ---- P0 = 10.0 # 峰值功率, W T_fwhm = 100e-15 # 脉冲半高全宽, s T0 = T_fwhm / 1.665 # 高斯脉冲 1/e 幅度半宽, s beta2 = -20e-27 # 群速度色散, s^2/m(-20 ps^2/km) gamma = 20.0 # Kerr 非线性系数, W^-1 m^-1 alpha = 0.0 # 线性吸收, m^-1,先关掉聚焦 TPA beta_tpa = 1e-11 # 双光子吸收系数, m/W(1 cm/GW) A_eff = 1e-12 # 有效模场面积, m^2(1 um^2) b2_eff = beta_tpa / A_eff # 等效 TPA 损耗系数, (W·m)^-1 L = 0.01 # 传播长度, m(1 cm) nz = 500 # 纵向步数 N = 2**14 # 时间采样点 Twin = 10e-12 # 时间窗口, s(约 100 个脉宽) # ---- 时间 / 频率网格 ---- t = np.linspace(-Twin/2, Twin/2, N, endpoint=False) dt = t[1] - t[0] f = fftfreq(N, dt) omega = 2 * np.pi * f # ---- 初始高斯包络:峰值 |A|^2 = P0 ---- A = np.sqrt(P0) * np.exp(-0.5 * (t/T0)**2) # ---- 频域线性算子 ---- lin_op = -alpha/2 - 1j * (beta2/2) * omega**2 dz = L / nz energy = [] for _ in range(nz): # 半个线性步:频域乘色散+线性损耗因子 A = ifft(fft(A) * np.exp(lin_op * dz/2)) # 非线性步:SPM 相位 + TPA 实数损耗 A = A * np.exp(1j * gamma * np.abs(A)**2 * dz - (b2_eff/2) * np.abs(A)**2 * dz) # 后半个线性步 A = ifft(fft(A) * np.exp(lin_op * dz/2)) energy.append(np.sum(np.abs(A)**2) * dt) np.savez('tpa_out.npz', z=np.arange(1, nz+1) * dz, energy=np.array(energy), A_final=A, t=t)代码逻辑说明:初始高斯包络用np.sqrt(P0)赋值,保证峰值 |A|² = P0,这样 |A|² 的单位严格是 W,γ 和 b2_eff 直接按 SI 数值使用即可。线性算子lin_op里的 β₂ 已换算成 s²/m:-20 ps²/km = -20 × 1e-24 s² / 1e3 m = -20e-27 s²/m。非线性步里第一项是纯虚相位,第二项是实数损耗,两项合并成一个 exp,因为 exp(a+b)=exp(a)exp(b),顺序不重要。但要注意这里 Δz 用的是整个 dz,而不是 dz/2,这是对称分布傅里叶法的标准形式:两个半线性步夹一个整非线性步。
参数怎么改:如果算到一半能量曲线出现锯齿或 NaN,第一反应不是缩小 nz,而是检查时间窗口 Twin 是否足够大。高斯脉冲在反常色散下会展宽,窗口太小会让能量“流出”计算域,能量积分越来越小,看起来很像 TPA 损耗。一般把 Twin 设成初始脉宽的 200 倍以上,并对非线性强的 case 每隔若干步检查一次 max(|A|²) 对应的半宽是否超过窗口的 1/10。还要记得频谱分辨率 Δf = 1/Twin,如果 Twin 太大而 N 不够,频域采样间隔不足,色散算子采样会失真。
3.3 从仿真结果里读透射率与脉冲形变
跑完脚本后先看能量曲线。把能量归一化 E(z)/E(0) 画出来,调好参数后 1 cm 处大约是 0.37。如果同时开着 SPM,峰值功率沿纵向不断降低,TPA 损耗率跟着降低,能量衰减会略微偏离单指数,表现出“先快后慢”的特征。这是 TPA 区别于线性吸收的信号:线性吸收的归一化能量衰减不随初始功率变化,而 TPA 的衰减曲线随 P0 增大明显变陡。做一次功率扫描,P0 分别取 1 W、3.16 W、10 W,如果三条归一化能量曲线几乎重合,说明 TPA 项没起作用;如果间距明显拉开且功率越大掉得越快,说明模型对了。
第二个要看的是脉冲时域形状。由于 TPA 对峰值损耗更大,脉冲峰会被削平,高斯轮廓逐渐变成类似抛物线顶。如果 SPM 和 GVD 同时存在,时域形状会和纯 TPA 不同,但“峰值损耗最强”这个趋势不会变。第三个是频谱:SPM 产生对称展宽,TPA 因为损耗随强度变化,频谱对称性会轻微破坏,出现红蓝不对称,这在实验中常作为 TPA 的诊断证据。仿真里如果看到频谱异常不对称且能量掉得很多,先检查是不是窗口溢出,再谈物理。
4. 结果判读与边界条件:双光子吸收与线性吸收、饱和效应的边界在哪
跑通最小代码之后,真正麻烦的是判读。仿真曲线“在动”不等于“物理对了”。这一章把 TPA 模型的有效边界讲清楚:什么时候 TPA 会盖过线性损耗,什么时候必须加三光子吸收和自由载流子吸收,以及常见的边界条件误用。
4.1 线性吸收与双光子吸收的分界:临界功率判据
用一个简单判据把两条损耗路径分开。线性吸收率是 α,单位 m⁻¹;TPA 的等效损耗率是 b2_eff × P(z,t),单位 m⁻¹。两者相等时对应一个临界功率:
P_crit = α / b2_eff
当瞬时功率远低于 P_crit 时,总损耗主要由 α 决定,能量曲线呈指数衰减;功率超过 P_crit 后,双光子吸收随功率增大而增强,损耗不再满足指数衰减。实验里测透射率随入射功率的变化就能区分:线性吸收区透射率基本不随 P0 变化;进入 TPA 区后,随 P0 增大透射率下降,在 log-log 坐标里,高功率段斜率和 β_tpa 有效长度相关。这个判据对实验设计很重要。在半导体波导中测 β_tpa,入射光功率太低时信号被 α 淹没,太高时又会出现三光子吸收和自由载流子吸收,所以最佳测量窗口在 P_crit 附近一到两个量级内。仿真时同理:如果 α 很大而 P0 很小,你会看到漂亮的指数衰减,但那是线性吸收,跟双光子没有关系。
还要区分峰值功率和平均功率。TPA 是瞬时强度平方效应,只有峰值功率有意义。同一台激光器,重频 1 MHz、脉宽 100 fs、平均功率 1 mW 时,峰值功率是 10 W;但如果重频提高到 100 MHz,平均功率不变,峰值功率还是 10 W——注意此时 TPA 损耗不变,但热效应和载流子累积效应会显著增强。仿真里如果只给了平均功率,必须先换算峰值功率:
P_peak = P_avg / (f_rep × T_FWHM)(对高斯脉冲还要乘一个约 1 的波形因子)
很多 tpa.zip 示例里直接拿平均功率当 P0,曲线被高估或低估几个数量级都不自知。
4.2 更高光强下的模型边界:三光子吸收、自由载流子吸收与饱和
双光子吸收系数 β_tpa 并不是常数。光强极高时会发生两种效应。第一是三光子吸收,损耗项写成类似 -b3/3 |A|⁴A,b3 单位是 W⁻²m⁻¹,强度再高时更高阶吸收也会依次出现。第二是自由载流子吸收(FCA):TPA 产生的电子-空穴对被后续光子吸收,形成一个与载流子密度成正比的附加损耗项。载流子寿命远大于脉冲宽度时,这项会“记住”前面脉冲积累的能量,表现为随脉冲重复频率升高而增强的损耗,也就是载流子累积效应。
如果实验测量显示透射率在低功率区符合 β_tpa 模型,高功率区又有额外损耗,最简单的扩展是在方程里增加 -σ_c N_c(z,t) A/2,其中 N_c 由速率方程 dN_c/dt = β_tpa I²/(2hν) 积分而来,σ_c 是自由载流子吸收截面。加这项后能量曲线会多出一个与脉冲历史相关的损耗尾巴。更精细的做法是把 β_tpa 写成强度相关的饱和表达式:
β_tpa(I) = β_tpa0 / (1 + I/I_sat)
这在宽带隙半导体里更符合实际。仿真阶段,我的建议是先不加高阶项,用最小模型把趋势跑出来,再用实验数据判断偏差方向;残差在低功率端大,多半是 β_tpa 或 A_eff 给错了;在高功率端大,才需要引入 FCA 或三光子吸收。一开始就全部加上,参数太多互相补偿,反而不容易收敛,拟合时更是灾难。
边界条件也有坑。分布傅里叶法隐含周期性边界条件,如果时间窗口不够宽,脉冲展宽后碰到边界会“绕回”窗口另一端,在能量曲线上表现为诡异的回升。检测方法是看最终时刻的 A_final 在窗口两侧是否趋近于 0;不趋近就把 Twin 加倍重跑,而不是靠加窗函数硬压。加窗会吃掉真实物理,尤其是对 TPA 这种强度相关效应,加窗后的峰值功率时间分布失真,损耗被低估。
5. 双光子吸收仿真避坑清单:五个常见流坑的现象、原因与解决
这一章集中写我实际跑 TPA 仿真时反复踩过的坑。每一条按现象、原因、解决三个层次写,方便你在出问题时直接对照排查。
5.1 能量曲线出现 NaN 或锯齿
现象:跑到中间某一步,energy 突然变成 nan,或者曲线像锯齿一样上下跳动。原因有二。一是非线性步的损耗因子 exp(-b2_eff × |A|² × dz/2) 在脉冲峰值处可能变得极小,如果 dz 太大,峰值样点一次衰减几十个数量级,浮点数下溢;二是时间窗口不足,脉冲展宽后能量在 FFT 里混叠,功率谱出现非物理振荡,时域 |A|² 跟着乱跳。解决:先把 nz 增大 10 倍看曲线是否平滑;仍不平滑就把 Twin 增大到 100 倍脉宽以上,N 提到 2^15。若问题依旧,检查 β_tpa 换算:1 cm/GW = 1e-11 m/W,A_eff 少写一个 1e-12,损耗率会差出数量级。
5.2 透射率只呈指数衰减,双光子特征消失
现象:把 P0 从小调到大,归一化能量曲线几乎重合,或者只是整体按比例下移。原因:把 TPA 项误写成 -b2_eff × A 的线性损耗形式,或者在代码里把 β_tpa 当成 α 用;另一个可能是 A_eff 设得过大,峰值强度太低,TPA 损耗率远小于 α。解决:做一次功率扫描验证。P0 依次取 1、3.16、10,如果归一化能量曲线明显不同且随 P0 增大变陡,说明 TPA 项在起作用;三条曲线完全重合就是写错了。这个测试应当写进回归用例,以后改参数时随时跑一遍。
5.3 仿真和实验的透射率绝对值对不上但趋势一致
现象:能量衰减的相对变化与实验一致,绝对数值差 2~5 倍,怎么调 β_tpa 都拉不平。原因:脉冲的时间形状不是高斯。实验超短脉冲可能是双曲正割或带啁啾,峰值功率相同但能量分布不同;另外 β_tpa 实测值随波长变化明显,用包里的默认值按另一个中心波长算,自然对不上。解决:先拟合实测脉冲自相关,把初始包络 A(0,t) 换成 sech 或实测插值形状,再反演 β_tpa,而不是拿高斯结果硬套实验。啁啾也要注意:如果输入脉冲有上啁啾,前几厘米的峰值会暂时变低,TPA 损耗比无啁啾情形小,拟合时初始啁啾必须作为已知量带入。
5.4 频谱异常不对称,能量掉得反常快
现象:输出频谱左或右出现一条长尾巴,能量损耗比理论估计大得多。原因:时间窗口溢出导致 FFT 周期性混叠,本质是频谱泄漏,不是 TPA 物理。分布傅里叶法对色散和 SPM 的对称性比较敏感,窗口边界反射会破坏频谱对称。解决:Twin 至少取初始脉宽的 200 倍;当脉冲被色散展宽 3 倍以上时,要加大 Twin 后重跑。判断标准是输出脉冲两翼幅度低于峰值的 1e-6。如果确实需要长时间窗口,可以考虑吸收边界层,但嵌进分布傅里叶法会破坏周期性假设,不如直接把窗口做大来得干净。
5.5 步长找不到稳定收敛区间
现象:nz 从 500 加到 5000 曲线不变,从 500 减到 100 就明显偏差,中间找不到平滑收敛区间。原因:对称分布傅里叶法的步长上限由最小特征长度决定。纯色散时 L_D = 18 cm 很大,纯 SPM 时 L_NL = 0.5 cm,但加上 TPA 后特征长度随功率实时变化,不能用固定 L_NL 去算。解决:把 dz 改成自适应。每走一步前先用试探 dz 算非线性相位增量 max(γ|A|²dz + b2_eff|A|²dz/2),超过阈值就减半重算,小于阈值的四分之一就加倍。这样既稳又省时间。阈值经验值:单步非线性相位改变不超过 0.05 rad,单步损耗因子不小于 0.9。
6. 进阶:用透射率曲线反演 β_tpa 的收敛流程
仿真跑到稳定只是第一步,真实需求往往是从测量数据里标定材料参数 β_tpa。常见做法是把第 3 章的传播函数封装成可调用形式,输入峰值功率和 β_tpa,输出透射率:
def solve_tpa(P0, b2_eff, gamma=20.0, nz=500): # 内部逻辑同第 3 章,返回归一化透射率 Tr ... return Tr然后对一组实测入射功率和透射率做最小二乘拟合。反演里最容易翻车的不是优化器,而是初始猜测和参数退化。我的习惯是先在 0.1~10 cm/GW 的 log 网格上粗扫,找到残差最低的区间,再用局部优化精扫;同时把 A_eff 和 γ 固定,只让 b2_eff 自由。第一次做这种反演时,我只用了三个功率点,结果三个点彼此矛盾,后来才意识到实验里没扣除线性吸收 α。于是把 α 也作为自由参数,发现 α 和 b2_eff 高度相关——低 α 高 b2 和高 α 低 b2 给出一模一样的曲线。解决办法是先测低功率段线性衰减独立定 α,再在高功率段反演 b2,否则拟合纯属看运气。
反演时数据要在“TPA 效应占主导”的功率区间取:每个功率点对应的 TPA 等效损耗至少是线性损耗的 2 倍以上。这个条件可以先用粗估参数预先扫描确认。还要保证测量模型和仿真模型用同一个能量归一化约定,透射率才可比。示数里保持 nz = 500 足够,因为迭代中损耗率变化平缓,粗拟合不需要高精度;最终确定参数后再用自适应步长精跑一次做验证。这套流程我反复用过多次,收敛稳定。如果你想更稳,就把功率扫描点从 3 个加到 10 个,并且每个点重复测量取平均,拟合残差能小一个量级。希望帮到你。
本文还有配套的精品资源,点击获取