尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

双光子吸收与Z-scan拟合:从物理原理到Python数据管线实战

发布时间:2026/9/26 18:50:37

资讯中心
01
ARTICLE

双光子吸收与Z-scan拟合:从物理原理到Python数据管线实战

双光子吸收与Z-scan拟合:从物理原理到Python数据管线实战
简介这是一份面向物理、光学及相关专业研究者的双光子吸收TPA计算与优化辅助代码包聚焦效率预测、激发波长筛选、强度依赖分析与最佳实验条件确定等问题。压缩包共9个文件全部为MATLAB脚本.m从光谱贡献分解、截止参数判定、最大值提取到频率窗口绘图覆盖了TPA仿真中常见的数值处理环节并内置两种优化策略供不同场景调用。包体仅11KB代码精简易读适合快速改编和嵌入个人科研流程。该资源已有128人学习下载适合正在开展非线性光学课程设计、材料双光子特性模拟或相关课题研究的学生及科研人员使用。通过学习这些脚本读者既能了解TPA计算中多峰贡献与截止功率的处理思路也能掌握阶段式优化方法的实现细节从而更高效地筛选和优化双光子吸收性能参数。1. tpa.zip 装的是什么双光子源码包的定位与使用边界从 en.pudn.com 搜到 tpa.zip 时大多数人先被“双光子”三个字吸引。TPA 在双光子语境下默认指 Two-Photon Absorption也就是双光子吸收。这个压缩包的核心任务是把实验测到的非线性透过率变化换算成能写进论文的双光子吸收系数 β。实践里 tpa.zip 这类命名极简的资源通常不是能直接跑的软件而是公式、数据和代码混在一起的碎片包。你得先判断它走的是 Z-scan 拟合、双光子聚合仿真还是成像 PSF 计算——三条路共用同一套光学模型但输入输出完全不同。这篇笔记写给正在做非线性光学测量、飞秒激光微加工、双光子显微成像的人。我会从 tpa.zip 出发把三种常见场景的物理模型、可复现代码和踩坑记录拆开目标只有一个别让一个来历不明的压缩包消耗你三天而是把它当起点半小时内重建出可靠的数据管线。2. 双光子吸收的Z-scan原理先算出三个中间量再谈拟合2.1 开孔Z-scan的透过率凹陷与级数公式Z-scan 是测双光子吸收最常用的方法。把样品放在聚焦高斯光束里沿光轴方向移动同时记录透过率。样品远离焦点时峰值光强低双光子吸收可忽略靠近焦点时光强达到 GW/cm² 量级双光子吸收导致透过率出现一个凹陷。开孔 Z-scanOpen-ApertureOA不遮挡透射光因此这个凹陷只反映吸收变化不包含折射信息。归一化透过率 ( T(z) ) 的严格表达式是无穷级数[ T(z) \sum_{m0}^{\infty} \frac{[-q_0(z)]^m}{(m1)^{3/2}}, \quad q_0(z) \frac{\beta I_0 L_{\rm eff}}{1(z/z_0)^2} ]其中 β 是双光子吸收系数( I_0 ) 是焦点处峰值光强( L_{\rm eff} ) 是有效作用长度( z_0 ) 是瑞利长度。级数收敛很快当 ( |q_0|1 ) 时取前几项就够小信号极限下( T(z) \approx 1 - q_0/(2\sqrt{2}(1(z/z_0)^2)) )这就是一个标准洛伦兹凹陷。为什么不用简单近似实际中 ( q_0 ) 经常在 0.2 到 0.5 之间近似误差已经超过 2%而实验噪声往往把这种误差掩盖掉。拟合代码里保留级数求和成本只多两行却能把仪器标定误差压到系统噪声以下。双光子吸收的几个关键参数如下符号物理含义推荐单位典型量级β双光子吸收系数cm/GW0.01~10( I_0 )焦点峰值光强GW/cm²10~100( L_{\rm eff} )有效作用长度cm样品厚度量级( z_0 )瑞利长度μm1~100( q_0 )非线性相位参数无量纲12.2 L_eff、I0、z0三个必须先定死的参数( L_{\rm eff} )、( I_0 )、( z_0 ) 这三个量决定拟合时哪些参数可以固定哪些必须留给拟合器。( L_{\rm eff} ) 定义为 ( (1-\exp(-\alpha L))/\alpha )其中 α 是线性吸收系数L 是样品厚度。如果 ( \alpha L \ll 1 )( L_{\rm eff} \approx L )但不少半导体在近红外有弱吸收( \alpha L ) 可能到 0.3直接拿样品厚度算会高估 β。( z_0 ) 由束腰半径 ( w_0 ) 和波长 λ 决定( z_0 \pi w_0^2 / \lambda )。注意 ( w_0 ) 是 1/e² 半径不是半高宽半径。用刀口法或 CCD 测光斑时如果得到的是半高宽 FWHM要除以 1.177 才是 ( w_0 )。这个系数虽然小但会影响 ( z_0 ) 近 40% 的标定值。( I_0 ) 是这里面最容易算错的量。常见公式[ I_0 \approx \frac{2E}{\pi w_0^2 \tau_{\rm FWHM}} ]E 是单脉冲能量( \tau_{\rm FWHM} ) 是脉冲宽度系数 2 来自高斯脉冲的时间包络积分。如果只知道平均功率和重复频率先换算成单脉冲能量。所有长度统一到 cm时间统一到 s光强自然落在 W/cm²再除以 1e9 变成 GW/cm²。把这些量先算好Z-scan 拟合里就只剩 ( q_0 ) 和 ( z_0 ) 两个待定参数。我的做法是( z_0 ) 由实测 ( w_0 ) 算死拟合时只留 ( q_0 )如果光束质量很好( z_0 ) 也放进拟合但必须给初始值加边界约束。3. 用Python复现TPA拟合从Z-scan数据提取双光子吸收系数3.1 最小二乘拟合级数求和 curve_fit拿到 Z-scan 实验数据后的第一步是把级数公式写成一个可调用的函数。下面这段代码直接替代 tpa.zip 里最核心的拟合部分import numpy as np from scipy.optimize import curve_fit def oa_zscan(z, q0, z0): 开孔Z-scan归一化透过率级数取前10项 x z / z0 q q0 / (1.0 x**2) t np.zeros_like(q) for m in range(10): t (-q)**m / (m 1.0)**1.5 return t # 实验数据z 单位 umT 为归一化到远场平均的透过率 z_data np.array([-800, -400, -200, -100, 0, 100, 200, 400, 800]) T_data np.array([1.0, 0.98, 0.93, 0.88, 0.85, 0.88, 0.93, 0.98, 1.0]) # 初始值谷深约0.15q0 ≈ 2*sqrt(2)*0.15 p0 [0.4, 150.0] popt, pcov curve_fit(oa_zscan, z_data, T_data, p0p0, maxfev10000) q0_fit, z0_fit popt print(fq0 {q0_fit:.4f}, z0 {z0_fit:.2f} um)代码的逻辑不复杂先计算每个 z 位置对应的 q 值再对 m 从 0 到 9 求和。curve_fit用 Levenberg-Marquardt 算法做最小二乘返回拟合参数和协方差矩阵。协方差矩阵对角线开根号就是参数标准差这个值比拟合曲线本身更能说明问题。代码里两个陷阱要留意。第一如果 ( q_0 ) 初始值接近 1级数在某些点会接近交错收敛10 项可能不够可以改成 20 项并把 m 从 0 加到 19。第二z 数据范围至少要覆盖 ±3( z_0 )否则半宽被截断( z_0 ) 拟合值会偏小。上面示例数据只有几个点真实实验建议每 10~20 μm 采一个点Z-scan 曲线越密拟合越稳。3.2 从q0反推β单位换算与功率标定拟合出的 ( q_0 ) 本身不是最终目标真正的目标是 β。反推公式很简单( \beta q_0 / (I_0 L_{\rm eff}) )。麻烦的是光强 ( I_0 ) 的单位换算。我一般会写两个小函数一个算峰值光强一个算 βdef peak_intensity_GWcm2(E_uJ, w0_um, tau_fs): 高斯脉冲峰值光强近似输入能量uJ/束腰um/脉宽fs输出GW/cm2 E_J E_uJ * 1e-6 area_cm2 np.pi * (w0_um * 1e-4)**2 tau_s tau_fs * 1e-15 I_Wcm2 2.0 * E_J / (area_cm2 * tau_s) return I_Wcm2 / 1e9 def beta_from_q0(q0, I_GWcm2, Leff_cm): 从q0反推β单位cm/GW return q0 / (I_GWcm2 * Leff_cm) # 例0.5 uJ 脉冲25 um 束腰100 fs 脉宽有效长度0.1 cm I0 peak_intensity_GWcm2(0.5, 25.0, 100.0) beta beta_from_q0(0.4, I0, 0.1) print(f峰值光强 {I0:.1f} GW/cm2, β {beta:.3f} cm/GW)注意峰值光强公式里的系数 2 是时间高斯脉冲的近似结果。如果你的激光器输出是平顶时间波形系数要换成约 1如果是椭圆偏振或者脉冲带啁啾还得再修正。这个 β 是宏观双光子吸收系数如果 tpa.zip 里给的是分子双光子吸收截面GM 单位那属于另一种体系两者相差一个样品浓度千万别混用。4. 把TPA思路搬到成像和加工双光子聚合体素与PSF估算4.1 双光子聚合I² 阈值体素的数值计算双光子聚合的物理和双光子吸收一脉相承——光引发剂需要同时吸收两个光子所以聚合速率正比于 ( I^2 )。聚焦高斯光束下只有 ( I^2 ) 超过阈值的那一小块区域才会固化这就是曝光体素。计算体素尺寸用网格扫描比解析公式更容易写对import numpy as np def voxel_size(I0, w0, z0, thresh_ratio, n_grid801): 计算双光子聚合有效体素尺寸单位与w0/z0一致 z np.linspace(-3*z0, 3*z0, n_grid) r np.linspace(0, 3*w0, n_grid) R, Z np.meshgrid(r, z) wz w0 * np.sqrt(1.0 (Z/z0)**2) I I0 * (w0/wz)**2 * np.exp(-2.0 * R**2 / wz**2) valid I**2 (I0 * thresh_ratio)**2 row_valid np.where(valid.any(axis1))[0] # 沿z方向有有效点的行 col_valid np.where(valid.any(axis0))[0] # 沿r方向有有效点的列 if row_valid.size 0 or col_valid.size 0: return 0.0, 0.0 r_half r[col_valid].max() z_half z[row_valid].max() return 2*r_half, 2*z_half # 例NA1.4 油镜在800nm下近似 w00.25um, z00.25um w0, z0 0.25, 0.25 d_r, d_z voxel_size(1.0, w0, z0, 0.3) print(f聚合体素横向尺寸 {d_r:.2f} um, 纵向尺寸 {d_z:.2f} um)代码里thresh_ratio是阈值强度与焦点峰值强度的比值不是功率阈值。网格密度用 801 点步长差不多 ( 6z_0/800 )足够捕获体素边界。想验证网格收敛可以把 n_grid 改成 1601 再跑一次结果差在 1% 以内就说明网格够了。这个数值结果对加工策略很有用。比如你要写一根亚微米线条体素横向尺寸决定了最小线宽纵向尺寸决定了分层切片间隔。算一次就知道曝光功率调高 20%体素会长大多少而不是靠试错。4.2 双光子成像I² PSF 与分辨率提升的量化双光子显微镜的荧光激发率同样正比于 ( I^2 )所以有效点扩散函数是单光子高斯 PSF 的平方。这带来一个直接结果横向半高宽缩小到单光子的 ( 1/\sqrt{2} )纵向也变窄。用上一节的网格思想可以快速算双光子 PSF 的 FWHMdef psf_fwhm(w0, z0, n_grid801): 双光子荧光PSF的半高宽基于I^2强度分布 z np.linspace(-2*z0, 2*z0, n_grid) r np.linspace(0, 3*w0, n_grid) R, Z np.meshgrid(r, z) wz w0 * np.sqrt(1.0 (Z/z0)**2) I2 (w0/wz)**4 * np.exp(-4.0 * R**2 / wz**2) # I^2 归一化到焦点1 half I2.max() / 2.0 z_valid np.where(I2.max(axis1) half)[0] r_valid np.where(I2.max(axis0) half)[0] return 2*r[r_valid].max(), 2*z[z_valid].max() # 例相同聚焦条件 w0, z0 0.25, 0.25 rf, zf psf_fwhm(w0, z0) print(f双光子PSF FWHM: 横向 {rf:.2f} um, 纵向 {zf:.2f} um)这段代码的I2.max(axis1)取每个 z 面上的峰值也就是沿光束轴的强度这样纵向 FWHM 就落在 z 轴上。横向同理。把不同物镜的数值代入可以画一条双光子分辨率随数值孔径变化的曲线比直接用经验公式更有底。需要注意的是PSF 变窄不代表成像一定更清晰。双光子激发的信号强度同时正比于 ( I^2 )这意味着对焦和功率稳定性要求更高。我在实际做显微成像时通常先把 PSF 数值算出来再反推需要的激光功率和采样间距避免一上来就把样品打漂白。5. TPA数据处理避坑指南5个常见翻车现场5.1 老代码跑不起来别硬修现象从 tpa.zip 解压出的脚本在新版本下报错要么UndefinedFunction要么SyntaxError而且错的位置都在读文件和画图不在核心公式。原因PUDN 这类站点很多资源是十几年前上传的Python 2 和老版 MATLAB 的语法已经变了。有些代码还依赖lhs、rhs之类的旧工具箱现在根本装不上。解决不要陷入逐行修改的泥潭。先把压缩包里带公式的 README 或论文截图提取出来照着公式用当前环境重写一个函数。我的血泪经验是老代码只有入口和数据结构值得参考核心算法重写反而比修补快。花两天修一个十年写错的循环不如花两小时重写。5.2 透过率曲线不对称零点没标定现象拟合曲线的谷底不在 ( z0 )残差一边正一边负而且变换初始值后偏移跟着变。原因位移平台的原点和激光焦点没对齐或者样品两端面有差异。Z-scan 里样品是移动的如果焦点位置在扫描行程的正中间偏一点整个曲线就会平移。解决先用低功率线性扫描测一个参考样品找出透过率最稳定区间或者用闭孔 Z-scan 的峰谷位置标定零点。标定后把 z 坐标整体平移再重新拟合。要注意不能只做对称化处理那样会把系统误差掩盖掉拟合出的 ( z_0 ) 也不可信。5.3 单位换算错了三个数量级现象算出的 β 和文献值对不上要么 0.001 要么 1000查半天发现只是数量级不对。原因光斑半径用 mm、脉宽用 ns、能量用 mJ最后换算到 cm/GW 体系时差了 ( 10^3 ) 或 ( 10^{-3} )。还有人不小心把 ( w_0 ) 直接当半径实际上有些商业软件给的是直径。解决锁定一套单位长度都用 cm时间都用 s能量都用 J光强 W/cm²β 最终是 cm/W。如果想报 cm/GW记住 ( 1\ \mathrm{cm/GW} 10^{-9}\ \mathrm{cm/W} )写脚本时把这个换算放进去能少一次返工。第一次算完拿一个已知样品比如 ZnSe验证量级再继续后面的实验。5.4 功率变化时透过率不是平方依赖现象改变入射功率凹陷深度随功率线性变化而不是平方变化或者一开始平方功率一高就饱和。原因单光子吸收、热透镜、激发态吸收混入双光子信号不纯。热透镜尤其隐蔽它会让光斑大小随功率变化开孔 Z-scan 也能看出透过率波动。解决拟合前先做功率系列。( \log(\Delta T) ) 对 ( \log(I_0) ) 的斜率应该接近 2。如果斜率是 1说明单光子吸收主导降低功率或换波长如果斜率大于 2可能有其他三阶非线性效应。这个检验比拟合本身更重要我通常把它作为数据处理的第一道关卡。5.5 q0 与 z0 强相关拟合结果飘现象多次拟合 ( z_0 ) 漂移很大( q_0 ) 也跟着变协方差矩阵里相关系数接近 0.98。原因( z_0 ) 决定曲线半宽( q_0 ) 决定深度当数据范围不够或噪声大时两个参数在拟合器中互相补偿。拟合器本身没有物理判断力。解决用刀口法或直接查物镜参数算 ( w_0 )再算出 ( z_0 ) 并固定只拟合 ( q_0 )。如果必须同时拟合给 ( z_0 ) 一个上下界比如实测值 ±20%最后检查协方差矩阵。相关系数接近 1 就说明实验数据信息量不够要么加密采样要么测量光束质量别硬报结果。6. 把TPA拟合做成通用脚本闭环验证与输出约定6.1 用模拟数据做闭环测试在把真实数据交给拟合函数之前先用已知参数造一套模拟数据取 ( q_00.3 )、( z_0100\ \mu m )按同一个oa_zscan函数生成 z 序列再加 1% 高斯噪声然后拟合。如果拟合值能还原 ( q_00.3±0.01 )说明脚本本身没有单位或索引错误。rng np.random.default_rng(0) z_sim np.linspace(-400, 400, 81) T_sim oa_zscan(z_sim, 0.3, 100.0) rng.normal(0, 0.01, z_sim.size) popt_sim, pcov_sim curve_fit(oa_zscan, z_sim, T_sim, p0[0.2, 80.0]) print(popt_sim, np.sqrt(np.diag(pcov_sim)))如果还原误差大于 20%优先检查 p0 和数据范围再检查级数截断项数。这个闭环测试花三十秒能规避大多数翻车。我自己每次换机器、换数据格式后都会跑一遍。6.2 文件格式与参数输出约定我会把实验数据固定成 CSV 两列z、T。脚本读入后直接打印 ( q_0 )、( z_0 )、β、( I_0 )、( L_{\rm eff} ) 和各自的置信区间。好处是以后任何一台新扫描装置只要导出 CSV就能直接套用。拟合曲线和原始数据保存成 PNG方便写报告时对照。当初我从 tpa.zip 这类包里吃到过教训花了一天修一个十年前写错的循环后来才明白代码碎片的价值只在公式和数据结构不在那一堆耦合的绘图命令。现在我的习惯是拿到任何双光子相关压缩包先抽物理公式再重建最小实现最后用模拟数据验证。希望这个流程也能把你的时间花在实验和物理判断上。希望帮到你。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。