基于matlab的非线性薛定谔方程的数值算法研究
基于matlab的非线性薛定谔方程的数值算法研究

(48)
同Step1的方法,解方程(48),得到: ~ ~ U ( z , ) U (0, ) exp[P0 i | U (0, T ) | 2 z ] (49) ~ ~ 式中 U (0, ) 是初值 U (0, T ) 的傅立叶变换,将U ( z , ) 进行反傅立叶变换就得到了 U ( z , T ) 。方程(49)的求解公式为: ~ U ( z , T ) F{exp[ P0i | U (0, T ) | 2 z ] F [U (0, T )]} (410)
1. 引 言
非线性薛定谔方程是研究光脉冲在光纤中传输的基本方程, 大多数文献都是直接引用 非 线性薛定谔方程,采用分步傅里叶法数值求解非线性薛定谔方程。本文从通过MATLAB编 程来求解非线性薛定谔方程,并给出了分步傅里叶法数值求解算法程序。 MATLAB是美国MathWorks公司自20世纪80年代中期推出的数学软件, 优秀的数值计算 能力和卓越的数据可视化能力使其很快在数学软件中脱颖而出。 随着版本的不断升级, 它 在 数值计算及符号计算功能上得到了进一步完善。到目前为止,MATLAB已经发展成为多学 科、多种工作平台的功能强大的大型软件。
ˆ 的方程如下: 线性算符 D
U z
i 2U 2 T 2 U 2
(44)
用傅立叶变换方法,得到一个常微分方程(45):
~ U ~ i (i ) 2 ~ U U z 2 4
解方程(45)得:
(45)
i 2 2 ~ ~ (46) U ( z , ) U (0, ) exp[ z] 4 ~ ~ 式中 U (0, ) 是初值 U (0, T ) 的傅立叶变换,将U ( z , ) 进行反傅立叶变换就得到了 U ( z , T ) 。方程(46)的求解公式为:
MATLAB中的非线性优化算法详解

MATLAB中的非线性优化算法详解在计算机科学和工程领域,非线性优化是一个非常重要的问题。
它涉及到在给定一些约束条件下,寻找使得目标函数取得最优值的变量取值。
MATLAB作为一种强大的数值计算工具,提供了多种非线性优化算法来解决这个问题。
本文将详细介绍一些常用的非线性优化算法,并探讨它们的特点和适用场景。
1. 数学背景在介绍非线性优化算法之前,我们先来了解一下非线性优化的基本数学背景。
一个非线性优化问题可以表示为以下形式:minimize f(x)subject to g(x) ≤ 0h(x) = 0其中,f(x)是目标函数,g(x)是不等式约束条件,h(x)是等式约束条件。
x是优化变量。
目标是找到x使得f(x)取得最小值,并且满足约束条件。
2. 黄金分割法黄金分割法是一种经典的非线性优化算法。
它基于一个简单的原则:将搜索区间按照黄金分割比例分为两段,并选择一个更优的区间进行下一次迭代。
该算法的思想简单明了,但是它的收敛速度比较慢,特别是对于高维问题。
因此,该算法在实际应用中较少使用。
3. 拟牛顿法拟牛顿法是一类比较常用的非线性优化算法。
它通过近似目标函数的梯度信息来进行迭代优化。
拟牛顿法的核心思想是构造一个Hessian矩阵的近似矩阵,来更新搜索方向和步长。
其中,DFP算法和BFGS算法是拟牛顿法的两种典型实现。
DFP算法是由Davidon、Fletcher和Powell于1959年提出的,它通过不断迭代来逼近最优解。
该算法的优点是收敛性比较好,但是它需要存储中间结果,占用了较多的内存。
BFGS算法是由Broyden、Fletcher、Goldfarb和Shanno于1970年提出的。
它是一种变种的拟牛顿法,通过逼近Hessian矩阵的逆矩阵来求解最优解。
BFGS算法在存储方面比DFP算法更加高效,但是它的计算复杂度相对较高。
4. 信赖域法信赖域法是一种迭代优化算法,用于解决非线性优化问题。
它将非线性优化问题转化为一个二次规划问题,并通过求解这个二次规划问题来逼近最优解。
matlab数值薛定谔方程

matlab数值薛定谔方程薛定谔方程是描述量子力学中粒子的行为的基本方程。
在数值计算中,我们可以使用数值方法来求解薛定谔方程。
下面我将从多个角度来回答关于在MATLAB中数值求解薛定谔方程的问题。
1. 数值方法的选择:在MATLAB中,我们可以采用多种数值方法来求解薛定谔方程,其中常用的方法包括有限差分法、有限元法和谱方法等。
选择合适的数值方法取决于问题的特点和计算资源的可用性。
2. 离散化:在数值计算中,我们需要将薛定谔方程离散化为有限个点上的代数方程。
通常,我们会将空间离散化为网格,并在每个网格点上计算波函数的值。
时间离散化则是通过迭代的方式逐步求解时间演化。
3. 有限差分法:有限差分法是一种常见的数值方法,它将导数近似为有限差分。
在薛定谔方程中,我们可以将二阶导数近似为中心差分,然后使用差分方程来求解离散化的薛定谔方程。
4. 有限元法:有限元法是一种广泛应用于偏微分方程求解的数值方法。
在薛定谔方程中,我们可以使用有限元法将波函数表示为一组基函数的线性组合,并通过求解线性方程组来确定系数。
5. 谱方法:谱方法是一种基于函数展开的数值方法,它使用一组特定的基函数来表示波函数。
在薛定谔方程中,我们可以使用傅里叶级数或其他正交多项式作为基函数,并通过求解线性方程组来确定系数。
6. 边界条件:在数值求解薛定谔方程时,我们需要指定合适的边界条件。
常见的边界条件包括固定边界条件和周期性边界条件,具体取决于问题的物理背景。
7. 算法实现:在MATLAB中,我们可以使用内置的数值计算函数和工具箱来实现数值求解薛定谔方程。
例如,可以使用MATLAB的PDE Toolbox来求解偏微分方程,或者使用MATLAB的FFT函数来进行傅里叶变换。
总结起来,数值求解薛定谔方程是一个复杂而重要的问题,需要根据具体情况选择合适的数值方法并进行适当的离散化和边界条件处理。
MATLAB提供了丰富的数值计算工具和函数,可以帮助我们实现数值求解薛定谔方程的算法。
Matlab中的非线性优化和非线性方程求解技巧

Matlab中的非线性优化和非线性方程求解技巧在科学和工程领域中,我们经常会遇到一些复杂的非线性问题,例如最优化问题和方程求解问题。
解决这些问题的方法主要分为线性和非线性等,其中非线性问题是相对复杂的。
作为一种强大的数值计算工具,Matlab提供了许多专门用于解决非线性优化和非线性方程求解的函数和方法。
本文将介绍一些常用的Matlab中的非线性优化和非线性方程求解技巧。
非线性优化是指在给定一些约束条件下,寻找目标函数的最优解的问题。
在实际应用中,往往需要根据实际情况给出一些约束条件,如等式约束和不等式约束。
Matlab中的fmincon函数可以用于求解具有约束条件的非线性优化问题。
其基本语法如下:[x,fval] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)其中,fun是目标函数,x0是初始值,A、b是不等式约束矩阵和向量,Aeq、beq是等式约束矩阵和向量,lb、ub是变量的上下边界。
x表示最优解,而fval表示最优解对应的目标函数值。
另外,非线性方程求解是指寻找使得方程等式成立的变量值的问题。
Matlab中提供的fsolve函数可以用于求解非线性方程。
其基本语法如下:x = fsolve(fun,x0)其中,fun是方程函数,x0是初始值,x表示方程的解。
除了fmincon和fsolve函数之外,Matlab还提供了一些其他的非线性优化和非线性方程求解函数,例如lsqnonlin、fminunc等,这些函数分别适用于无约束非线性优化问题和带约束非线性方程求解问题。
除了直接调用这些函数外,Matlab还提供了一些可视化工具和辅助函数来帮助我们更好地理解和解决非线性问题。
例如,使用Matlab的优化工具箱可以实现对非线性优化问题的求解过程可视化,从而更直观地观察到优化算法的收敛过程。
此外,Matlab还提供了一些用于计算梯度、雅可比矩阵和海塞矩阵的函数,这些函数在求解非线性问题时非常有用。
基于matlab的非线性方程组求解的方法

于非 线性方 程组
,
可 建 立 如 下 适 值 函 数:
(1)
有了 适 应 度, 就 可 以衡 量 种群 中 N 组 数
值的好 坏, 并从中 选择 n ( n <N) 组作 为迭 代初
值。很 显然, 对 于式( 1 ) 所描 述的 适 值函 数,
其适应度 f i t ne s s 的值越 小, 则该组数值离准
科技资讯 2008 NO. 14 SCI ENCE & TECHNOLOGY I NF ORMATI ON 基 于 ma t l a b 的 非 线 性 方 程 组 求 解 的 方 法
学术论坛
侯建志 1 战 丽娜 2 施毅 3 ( 1. 河 北省老区 建设促进 会 河 北石家 庄 0 5 0 0 0 0 ; 2 . 江麓机电 有限公 司技术中 心 湖南湘潭 4 1 1 1 0 0 )
商业 广告, 它 的推出 不仅为 了推销 产 品, 还 建 立 企 业 的 形象 。 但 是, 从 目 前 电视 上出现 的一些恶 俗广告来看 , 很多 企业已 经在品 牌的路上 迷失了方向 , 这些 企业如 果不是 没有做品牌 的打算的 话, 那就是 还 没 有 意 识 到 低俗 的 广 告 已 经 在 无 形 中 将 产 品的品 牌形象打入 了万丈深 渊, 等到发 现 的那一天已经 悔之晚矣。
并 联 机 构 在 工 作 空间 内 的 位 置 解 。 例 如 给
定一 组杆 长( 1 0 76 . 3 53 5 , 1 06 0. 8 74 6, 1 05 9.
8 01 4, 10 7 5. 46 29 , 1 0 69 . 3 92 0) , 取 种群大 小
为 20 万 , n 值 为 4 0 , 建 立 适 值 函 数
(完整版)基于MATLAB的快速傅里叶的非线性薛定谔方程

GP方程很好的描述BEC的行为
iht
r,t
h2 2m
2
Vext
r
g
r,t
2
r,t
非线性项
G-P方程是非线性薛定谔(Nonlinear Schrödinger)方程的一种, 这类方程大多都只能通过数值办法求解。
2020/2/14
理论物理
7/50
Outline
➢ Matlab程序的实现 ➢ Matlab实例
2020/2/14
理论物理
8/50
III. 算符劈裂算法
Gross-Pitaevskii (G-P)方程:
iht
r,
t
h2 2m
2
Vext
r
g r,t 2
非线性项
r,t
it r,t H Tˆ Vˆextnon r,t
2020/2/14
理论物理
5/50
Outline
➢ 玻色-爱因斯坦凝聚 (BECs) ➢ Gross-Pitaevskii (G-P) 方程 ➢ 算符劈裂算法 (Operator-Splitting methods)
虚时演化 实时演化
➢ 傅里叶变换(离散DFT和快速FFT)
离散傅里叶变换(DFT)算法 快速傅里叶变换(FFT)算法
➢ Matlab程序的实现 ➢ Matlab实例
2020/2/14
理论物理
6/50
II. Gross-Pitaevskii (G-P) 方程
薛定谔(Schrödinger)方程:
数值分析 第二章 基于MATLAB的科学计算—非线性方程(组)

科学计算—理论、方法及其基于MATLAB 的实现与分析解非线性方程(组)(一)直接法二分法:设方程()0=x f 在区间[]b a ,上有唯一解,并且()()0<b f a f ,如方程()f x x x x x =-++=3223030.sin .(1)首先要确定适当的包含根的区间,这可以依据闭区间上连续函数的介值定理来确定,例如,()f 1110=-+<sin ,()f 222090=->sin .,所以方程 (1)至少有一个实根属于区间[]12,,图1表明区间[]12,中只含有一个根,显然方程 (1)的根不易直接求得。
在区间[-1,0]、[0,1]和[1,2]的情形,如下图1所示 例1 plotNL_fun01.mplotNL_fun01clearx=-1:0.05:2;f=x.^3-2.3*x.^2+x.*sin(x)+0.3; plot(x,f,'r',x,0*x,'k')title('The Image of f(x)=x^3-2.3*x^2+x*sin(x)+0.3') xlabel('\fontsize {12} \fontname {宋体} 图1') axis square二分法的求根过程:用*x 表示方程()0=x f 在区间[]b a ,上的根,对于给定的精度要求0>ε,取区间[]b a ,的中点21ba x +=,并按下式进行判断: ()()()()()⎪⎩⎪⎨⎧∈⇒<∈⇒<=⇒=],[0],[001*11*1*11b x x b f x f x a x a f x f x x x f (2) 以()()01<a f x f 为例,如果ε≤-2ab ,那么区间[]1,x a 内的任何一点都可以作为方程()0=x f 的近似根。
二分法适用于一个方程的场合,收敛速度是线性的,二分次数的估计:()b aN b a N-≤⇒≥--22εεln ln ln (3) 2、黄金分割法:在区间[]b a ,内取对称的两点:()()()⎩⎨⎧-+=--+=a b a x a b a x ββ211 (4) 使得()()()()()618.025125101102221≈+-=−−→−±-=⇒=-+⇒--=--=--=--->ββββββββa b a b ab a x a x a x a b a b按这种方法选取点1x 和2x ,每次去掉的区间长度至少是原区间长度的0.618倍,()()()()()()()()⎪⎪⎩⎪⎪⎨⎧∉∈⇒<⋃∉∈⇒<∉∈⇒<=⇒==⇒=],[],[0],[],[],[0],[],[0002*2*221*21*211*1*1*22*11x a x b x x b f x f b x x a x x x x x f x f b x x x a x a f x f x x x f x x x f (5) 适用于一个方程的场合,收敛速度是线性的,迭代次数的估计:()()215lnln ln 215--->⇔<⎪⎪⎭⎫ ⎝⎛--a b N a b Nεε (6) (二)迭代法首先将方程(组)写成等价的迭代形式:()()0f x x x ϕ=⇔= (7)由此确定了相应的迭代法:()[]10,n n x x x a b ϕ+=⎧⎪⎨∀∈⎪⎩ (8)迭代收敛的图像解释对于非线性方程(组)的迭代法来说,同样面临收敛性问题,为说明收敛性条件,先看下面的例子:例2:让我们来求如下方程的根()f x x x x x =-++=3223030.sin .下面,我们采用迭代法求方程 (1)位于区间]01[,-中的根,为此构造迭代算法如下:()()x x xx g x -+==3.2sin 3.0 (9)()()x g x x x x n n nn n +==+-10323.sin ., n =12,, (10)在区间]01[,-中任取一个迭代初值x 0,如取初值8.00-=x .执行下面的程序:EqutIteration.m:open EqutIteration.m EqutIterationN =29下面欲求1.5附近的根,为此分别取初值4.10=x ,9.10=x ,迭代的结果如下:open Ex_IteraConv01 Ex_IteraConv01N = 31收敛性定理:(收敛的充分性条件)设方程()f x =0在[]a b ,上存在唯一解,()x g x =是方程的等价形式,如果1、()g x 在[]a b ,上连续可微; 2、对任何x a b ∈[],,()g x a b ∈[],; 3、()'≤<g x L 1,则对任何x a b 0∈[],,由迭代算法()x g x n n +=1, (11)生成的序列{}x n 收敛于方程()f x =0在[]a b ,上的唯一解。
matlab数值薛定谔方程

matlab数值薛定谔方程摘要:I.引言- 介绍薛定谔方程- 介绍matlab 数值求解方法II.薛定谔方程的数值求解方法- 有限差分法- 有限元法- 谱方法III.matlab 数值求解薛定谔方程的步骤- 准备薛定谔方程的数值模型- 选择数值求解方法- 编写matlab 代码- 运行代码,分析结果IV.结果与讨论- 结果展示- 结果分析- 结果验证V.结论- 总结matlab 数值求解薛定谔方程的方法- 展望未来的研究方向正文:I.引言薛定谔方程是量子力学中的一个基本方程,用于描述一个微观粒子在给定势能场中的运动状态。
然而,由于薛定谔方程本身是一个偏微分方程,它的求解在大多数情况下是非常困难的。
matlab 作为一种强大的科学计算软件,可以用于数值求解薛定谔方程。
本文将介绍薛定谔方程的数值求解方法,以及如何使用matlab 进行数值求解。
II.薛定谔方程的数值求解方法薛定谔方程的数值求解方法主要有以下几种:1.有限差分法:将薛定谔方程的解表示为离散的点,通过差分代替微分,将方程转化为一个线性代数方程组,从而求解薛定谔方程。
2.有限元法:将薛定谔方程的解表示为有限个基函数的线性组合,通过插值或逼近基函数,将方程转化为一个线性代数方程组,从而求解薛定谔方程。
3.谱方法:通过在一组基函数上将薛定谔方程进行投影,将方程转化为一个线性代数方程组,从而求解薛定谔方程。
III.matlab 数值求解薛定谔方程的步骤使用matlab 进行数值求解薛定谔方程的步骤如下:1.准备薛定谔方程的数值模型:首先需要根据实际问题建立薛定谔方程的数值模型,包括势能场、边界条件等。
2.选择数值求解方法:根据问题的特点和求解需求,选择合适的数值求解方法,如有限差分法、有限元法或谱方法。
3.编写matlab 代码:根据所选方法,编写matlab 代码,实现薛定谔方程的数值求解。
4.运行代码,分析结果:运行编写的matlab 代码,得到薛定谔方程的数值解。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
P0 ,P0 是入射脉冲的峰值功率,
此时方程(41)可改写为:
2
U i 2U U P0 i | U | 2 U 2 z 2 4 T
(42)
3. 分步傅立叶数值算法
目前, 采用分步傅立叶算法(Split step Fourier Method)求解非线性薛定谔方程的数值解应 用比较多。 分步傅立叶方法最早是在1937年开始应用的, 这种方法己经被证明是相同精度下 数值求解非线性薛定愕方程最快的方法,部分原因是它采用了快速傅立叶变换算法 (Fast Fourier Transform Algorithm)。基于MATLAB科学计算软件以及MATLAB强大的符号计算功 能,完全可以实现分步傅立叶数值算法来对脉冲形状和频谱进行仿真。
其中 F 和 F 分别表示傅立叶变换和反傅立叶变换运算。 Step2 非线性算符方程的求解
~
i z ~ U ( z , T ) F{exp[( 2 ) ] F [U (0, T )]} 2 2
Hale Waihona Puke (47)ˆ 的方程如下: 非线性部分 N
U P0 i | U | 2 U z
为了使用分步傅立叶法求解方程(42),将方程(42)写成以下形式:
U ˆN ˆ )U (D z
进一步,可以得出如下方程(43):
i 2U 2 T 2 ˆ D 2 ˆ P i | U | 2 N 0
(43)
然后,按照步骤 step1 和步骤 step2,依次计算方程(43)的线性算符和非线性算符。最后 在步骤 step3 中,运行步骤 step1 和步骤 step2 的 MATLAB 程序,得出线性算符和非线性算 符的精确数值解及其仿真曲线。 Step1 线性算符方程的求解
ˆ 0 ;第二步,再考虑线性作用,方程(2)式中的 N ˆ 0. D
这样方程(2)在这两步中可分别简化为:
U ˆ U D z U ˆ U N z
分步傅立叶法的数值算法。
(32)
得到了上面两个方程(32),就可以分别求解非线性作用方程和线性作用方程,然后讨论 由于方程(32)是一个偏微分方程,需要通过傅立叶变换把偏微分方程转换为代数方 程,进行运算。傅立叶变换的定义如下:
2. 非线性薛定谔方程
非线性薛定谔方程,简称 NLS 方程,是一个非线性偏微分方程,通常情况下无法求出 解析解,只能求出它的数值解。在含有非线性色散介质地脉冲传输问题中应用非常广泛。 非线性薛定谔方程的基本形式为:
iu t u xx 2 | u | 2 u
其中 u 是未知的复值函数.
(21)
光纤的非线性效应。
(31)
ˆ 是线性算符,代表介质的色散和损耗, N ˆ 是非线性算符,它决定了脉冲传输过程中 其中 D
一般来讲,沿光纤的长度方向,色散和非线性是同时作用的。分步傅立叶法假设在传输 过程中,光场每通过一小段距离 h ,色散和非线性效应可以分别作用,得到近似结果。也就 是说脉冲从 z 到 z h 的传输过程中分两步进行。第一步,只有非线性作用,方程(2)式中的
1. 引 言
非线性薛定谔方程是研究光脉冲在光纤中传输的基本方程, 大多数文献都是直接引用 非 线性薛定谔方程,采用分步傅里叶法数值求解非线性薛定谔方程。本文从通过MATLAB编 程来求解非线性薛定谔方程,并给出了分步傅里叶法数值求解算法程序。 MATLAB是美国MathWorks公司自20世纪80年代中期推出的数学软件, 优秀的数值计算 能力和卓越的数据可视化能力使其很快在数学软件中脱颖而出。 随着版本的不断升级, 它 在 数值计算及符号计算功能上得到了进一步完善。到目前为止,MATLAB已经发展成为多学 科、多种工作平台的功能强大的大型软件。
反复调整纵向传输步长 z 和横向脉冲取样点数 T 来保证计算精度。
4. 分步傅立叶数值算法的 MATLAB 实现
为了研究分步傅立叶法在 Matlab 上的实现,下面通过举例来说明 Matlab 在求解的非线 性薛定谔方程的优越性。 现待求解的非线性薛定谔方程如下:
A i 2 A A i | A | 2 A 0 z 2 4 T 2
(48)
同Step1的方法,解方程(48),得到: ~ ~ U ( z , ) U (0, ) exp[P0 i | U (0, T ) | 2 z ] (49) ~ ~ 式中 U (0, ) 是初值 U (0, T ) 的傅立叶变换,将U ( z , ) 进行反傅立叶变换就得到了 U ( z , T ) 。方程(49)的求解公式为: ~ U ( z , T ) F{exp[ P0i | U (0, T ) | 2 z ] F [U (0, T )]} (410)
~
2k (1 k N ) ,其中 T NT
是序列 x(n) 的采样时间间隔. 这种正反离散傅立叶变换的关系式为:
N
X (k ) DFT [ x(n)] x(n) exp( j
j 1
2 k n)(1 k N ) N
1 x(n) IDFT [ X (k )] N
3
其中 F 和 F 分别表示傅立叶变换和反傅立叶变换运算。 Step 3 算法在MATLAB中的实现 在Matlab中,设有限时长序列 x(n) 的长度为 N (1 n N ) ,它对应于一个频域内的长 度为N的有限长序列 X ( k )(1 k N ) . X ( k ) 对应的角频 ( k )
ˆ 的方程如下: 线性算符 D
U z
i 2U 2 T 2 U 2
(44)
用傅立叶变换方法,得到一个常微分方程(45):
~ U ~ i (i ) 2 ~ U U z 2 4
解方程(45)得:
(45)
i 2 2 ~ ~ (46) U ( z , ) U (0, ) exp[ z] 4 ~ ~ 式中 U (0, ) 是初值 U (0, T ) 的傅立叶变换,将U ( z , ) 进行反傅立叶变换就得到了 U ( z , T ) 。方程(46)的求解公式为:
Po;%输入光强,单位W alpha;%光纤损耗值,单位dB/km gamma;%光纤非线性参数 to;%初始脉冲宽度,单位秒 C;%第一次计算输入的啁啾参数 b2;%波数的倒数 cputime=0; tic; ln=1; i=sqrt(1); pi=3.1415926535; alph=alpha/(4.343); Ld=(to^2)/(abs(b2)); %扩散长度,单位是m Ao=sqrt(Po); %光振幅 tau = 4096e12:1e12: 4095e12; dt=1e12; h=1000;%步长 for ii=0.1:0.1:1.5 %不同的光纤长度不同,这个量可变 z=ii*Ld; u=Ao*exp(((1+i*(C))/2)*(tau/to).^2); figure(1) plot(abs(u),'r'); title('Input Pulse'); xlabel('Time'); ylabel('Amplitude'); grid on; hold on; l=max(size(u));
1
一般情况下,光脉冲沿光纤传播时受到色散和非线性效应的共同作用,假设当传输距离 很小的时候,两者相互独立作用,那么,根据这种思想可建立如下分步傅立叶数值算法的数 学模型: 把待求解的非线性薛定谔方程写成以下形式:
U ˆN ˆ )U (D z
(41)
其 中 , A( z , T ) 是 光 场 慢 变 复 振 幅 , z 是 脉 冲 沿 光 纤 传 播 的 距 离 ;
(1 / w km) 是非线性系数; T t 1 z , 1 1 / v g , v g 是群速度; ( ps / km) 是色散系数; (1 / km) ) 是 光 纤 损 耗 系 数 , 它 与 用 分 贝 表 示 的 损 耗 系 数 dB (dB / km) 的 关 系 为 : dB 4.343 .
2 X (k ) exp( j k n)(1 n N ) N j 1
N
(411)
然后用Matlab中的离散傅立叶变换(DFT)函数fft和离散傅立叶反变换(IDFT)的函数ifft来 实现方程(44),(48)式中的傅立叶和反傅立叶变换运算。进一步,得到方程(47),(410)的 数值解及仿真曲线。 实现分步傅立叶变换算法MATLAB的脚本文件程序如下:
~ F [U ( z , T )] U ( z , ) U ( z , T ) exp(iT )dT (33) 1 ~ 1 ~ F [U ( z , )] U ( z , T ) U ( z , ) exp(iT )dT 2 在计算 F [U ( z , T )] 时一般采用快速傅立叶变换(FFT)算。为了保证精度要求,一般还需要
4
fwhm1=find(abs(u)>abs(max(u)/2)); fwhm1=length(fwhm1); dw=1/l/dt*2*pi; w=(1*l/2:1:l/21)*dw; u=fftshift(u); %零延迟对中的谱 w=fftshift(w); %零延迟对中的谱 spectrum=fft(fftshift(u)); %快速离散傅立叶变换 for jj=h:h:z spectrum=spectrum.*exp(g1) ; %g1为线性算符e的指数表达式 f=ifft(spectrum); %快速离散反傅立叶变换 f=f.*exp(g2);%g2为非线性算符e的指数表达式 spectrum=fft(f); %快速离散傅立叶变换 spectrum=spectrum.*exp(g1) ; end f=ifft(spectrum); %快速离散反傅立叶变换 op_pulse(ln,:)=abs(f);%保存在所有间隔点上的输出脉冲 fwhm=find(abs(f)>abs(max(f)/2)); fwhm=length(fwhm); ratio=fwhm/fwhm1; pbratio(ln)=ratio; dd=atand((abs(imag(f)))/(abs(real(f)))); phadisp(ln)=dd;%保存脉冲相位 ln=ln+1; end toc; cputime=toc; figure(2); mesh(op_pulse(1:1:ln1,:)); title('Pulse Evolution'); xlabel('Time'); ylabel('distance'); zlabel('amplitude'); figure(3) plot(pbratio(1:1:ln1),'k'); xlabel('Number of steps'); ylabel('Pulse broadening ratio'); grid on; hold on; figure(5) plot(phadisp(1:1:ln1),'k'); xlabel('distance travelled'); ylabel('phase change'); grid on; hold on; disp('CPU time:'), disp(cputime);