基于MATLAB的分步傅里叶法非线性薛定谔方程数值求解系统
项目介绍
本项目是一个用于求解非线性薛定谔方程(NLSE)的高精度数值仿真平台,主要应用于非线性光学及光纤通信领域。该系统依托MATLAB环境,采用对称分步傅里叶法(Symmetric Split-Step Fourier Method, SSFM),模拟光脉冲在非线性色散介质(如光纤)中的传输和演化过程。
该仿真器不仅能够模拟基阶孤子的稳定传输,还能精确展示高阶孤子的周期性压缩与分裂现象。代码内置了自适应步长控制算法,在保证计算精度的同时优化了仿真效率,并提供了完善的后处理模块,用于分析脉冲的时频域特性、相位变化、脉宽演化及能量损耗。
功能特性
- 核心算法:采用对称分步傅里叶法(Linear-Nonlinear-Linear),相比非对称方法具有高达 $O(h^3)$ 的局部截断误差精度。
- 物理效应模拟:
*
色散效应:支持二阶群速度色散(GVD, $beta_2$)和三阶色散(TOD, $beta_3$)。
*
非线性效应:模拟自相位调制(SPM)引起的频谱展宽和相移。
*
损耗效应:包含光纤损耗自动化换算(dB/km 转 Np/km)及传输衰减模拟。
* 支持双曲正割脉冲(Sech,用于孤子模拟)和高斯脉冲(Gaussian)。
* 支持设置初始啁啾(Chirp)因子。
* 根据孤子阶数($N$)自动计算所需的峰值功率。
* 实现了“限制非线性相移”的自适应步长策略。
* 根据当前光场的峰值功率动态调整步长 $h$,在非线性效应显著的区域自动加密网格。
* 设定了最大和最小步长阈值,并确保仿真精确停止在光纤末端。
* 三维瀑布图展示时域和频域的演化过程。
* 输入输出脉冲波形与相位对比。
* 归一化RMS脉冲宽度与系统能量变化的统计曲线。
系统要求
- MATLAB R2016a 或更高版本(需支持基本的信号处理函数)。
- 无需额外工具箱,基于MATLAB原生矩阵运算和FFT库实现。
代码实现与逻辑详解 (main.m)
该项目的入口文件集成了参数配置、求解核心与绘图分析三大模块,具体实现逻辑如下:
1. 物理与仿真参数配置
代码首先建立物理模型,定义了光纤长度、色散系数(含反常色散与TOD)、非线性系数及损耗。特别之处在于它根据用户设定的
孤子阶数(N_sol)自动计算维持该阶孤子所需的初始峰值功率 $P_0$,公式依据 $N^2 = gamma P_0 T_0^2 / |beta_2|$。同时定义了时间窗口大小和FFT采样点数(默认为 $2^{11}$),确保频域分辨率足够。
2. 网格初始化与脉冲生成
系统构建了对偶的时域网格 $t$ 和角频率网格 $w$。代码利用
fftshift 的逻辑正确处理了MATLAB中FFT频率轴的负频排列问题。根据选择的脉冲类型(Sech或Gaussian),生成包含初始振幅、相位和啁啾的复振幅光场 $U_{in}$。
3. 自适应步长与SSFM主循环
这是仿真的核心部分,采用
while 循环推进传输距离 $z$:
- 步长自适应计算:每一步传输前,计算当前光场的峰值功率。为了限制单步内的非线性相移误差,步长 $h$ 被设定为与峰值功率成反比($h approx Phi_{max} / (gamma cdot P_{peak})$)。代码还增加了对 $h$ 的上下限截断保护,并确保最后一步准确对齐总长度 $L$。
- 对称分步算子实施:
1.
线性半步(频域):将光场做FFT变换至频域,乘以线性传递函数 $H_{linear} = exp((-alpha/2 + ibeta_2omega^2/2 + ibeta_3omega^3/6) cdot h/2)$,处理色散和半步损耗。
2.
非线性全步(时域):将光场IFFT变回时域,乘以非线性相移项 $exp(igamma|U|^2 h)$,模拟SPM效应。
3.
线性半步(频域):再次在频域执行剩余的半步色散与损耗计算。
- 状态更新与存储:更新当前距离 $z_{curr}$ 和光场 $U_{curr}$。设置了保存计数器,仅在满足间隔要求时记录数据,以节省内存。
4. 后处理分析模块
仿真结束后,自动调用分析函数进行可视化:
- 统计计算:对保存的每一步光场计算总能量(积分),并利用二阶矩方法计算脉冲的均方根(RMS)宽度,以定量描述脉冲的压缩或展宽。
- 图表绘制:
*
图1(时域瀑布图):绘制 $|A(z,t)|^2$,直观展示孤子在传输过程中的保持、压缩或分裂。
*
图2(频域瀑布图):绘制功率谱密度,观察频谱展宽或频率偏移。
*
图3(I/O对比):在同一坐标系下对比 $z=0$ 和 $z=L$ 处的脉冲强度及输出相位曲线(经去线性项和相位解卷绕处理)。
*
图4(特性曲线):双轴绘制归一化脉宽随距离的变化以及光纤损耗导致的能量衰减(dB)曲线。
使用方法
- 打开MATLAB,定位到项目所在目录。
- 打开
main.m 文件。 - 在代码顶部的 "1. 物理参数配置" 区域修改仿真条件:
* 修改
Pulse.N_sol 为
1 以观察基阶孤子的无畸变传输。
* 修改
Pulse.N_sol 为
3 或更高,观察高阶孤子的周期性呼吸效应。
* 调整
System.beta3 为非零值以研究三阶色散对脉冲对称性的破坏。
* 调整
Pulse.C 引入初始啁啾。
- 运行
main 函数,等待控制台输出仿真进度与耗时。 - 程序运行结束后将自动生成名为 "非线性薛定谔方程仿真结果" 的综合分析图表。