与 RHS 时间相关的耦合非线性偏微分方程

计算科学 pde 非线性方程 时间积分
2021-12-21 14:48:44

我想对未知函数的以下2个耦合偏微分方程系统进行数值求解ψX(x,y,t)ψC(x,y,t)

tψX=iψCi|ψX|2ψX

tψC=iF(x,y)exp[i(kxpx+kypyωpt)]iψXi[δΔiκC]ψC

F(x,y)>0(通常是高斯函数),κC>0δR常数。

积分域是一个长度为 2L 的方形盒子,带有 PBC。

到目前为止,我已经尝试了 5 阶 Runge Kutta 方法,具有自适应时间步长,并在傅立叶空间中计算拉普拉斯项。

任何人都可以提出更强大/更快的替代方案吗?

1个回答

你如何选择你的时间步长?如果您的 Runge-Kutta 方法是明确的,您将需要采取Δt=O((Δx)2),这就是这种方法慢的真正原因。

为了及时行进,我建议使用运算符拆分方法,在这种方法中,您可以在积分 ODE 项和积分空间导数之间交替:

第 1 步:整合

tψX=iψCi|ψX|2ψXtψC=iF(x,y)iψXi[δiκC]ψC
超过一个时间步Δt使用显式 Runge-Kutta 方法。

第 2 步:整合

tψC=iΔψC
确切地说(在一个时间步长上Δt) 通过采用 FFT,乘以适当的相位因子,并采用逆 FFT。

由于第 2 步中的时间积分是精确的,因此时间步长的大小将仅基于第 1 步进行限制(并且该部分看起来并不僵硬)。整体精度将是一阶的。如有必要,您可以应用更高阶的拆分方法(查找二阶的Strang 拆分)。

为了施加正确的边界条件,您应该对空间部分使用隐式时间积分方法。隐式梯形或中点方法应该可以很好地工作,并且再次允许您采用任意大的时间步长。但是您需要使用高效的线性求解器。

可以在这个 IPython 笔记本(由我编写)中找到如何针对不同问题实现此类方法的详细示例(包括 Python 代码)。

例如,可以在Randall LeVeque 的有限差分书中找到对低阶分裂方法和其他替代方法的非常基本但有用的介绍