求解具有集中初始条件的扩散方程的最有效方法

计算科学 平流扩散 扩散
2021-11-28 17:48:16

我想求解扩散方程,即 ,边界条件为f(0) = f(1) = 0,初始条件为f是集中在一些小的 boxcar 函数大小为d \ll 1的区域。单位被缩放,以使扩散常数等于一。然后我想使用得到的解决方案来计算形式 \int dt \int dx F(f(x), f'(x)) 的积分, 其中F是某个函数(它实际上是f中的二次函数,带有一些x -相关系数,如果这有任何区别)。

f˙f=0
f(0)=f(1)=0fd1
dtdxF(f(x),f(x)),
Ffx

我尝试了两种不同的方法来做到这一点。首先是在傅里叶空间中解析求解扩散方程,然后将我的积分也写在傅里叶空间中并进行数值计算。第二个是数值求解扩散方程(我尝试了显式和隐式方法以及著名的 Crank-Nicolson 方法)。

在所有方法中,我最终都会遇到同样的问题:f的初始条件非常集中,这意味着我需要一个非常小的空间和时间离散化(对应于在 F 空间解决方案中考虑非常大的傅里叶模式)。另一方面,由于我还需要长时间求解方程(计算积分),所以我还需要考虑长时间的解。傅立叶空间方法并不快,因为我实际上需要以数字方式计算三个积分(两个傅立叶和,内核是从x积分计算的)。这使我的计算非常缓慢。

有没有更好的方法来做我刚才描述的事情?由于扩散方程非常简单,我觉得不能更快地做到这一点很愚蠢。我一直在考虑实现某种自适应网格,将其集中到小时间并接近初始条件,但这似乎是一件复杂的事情,要解决这样一个简单的问题。

1个回答

你永远不应该对扩散方程使用显式方法。隐式是无条件稳定的,并且同样易于实现。此外,如果您使用隐式方法(如后向 Euler 或 Crank-Nicolson),则 d 有多小也没关系。事实上,如果你愿意,你可以使用 dirac delta 函数。

就速度而言,使用三对角求解器(O(n) 复杂度)执行隐式方法应该非常快,尤其是对于 1D。如有必要,我可以发送一个简单的 Matlab 脚本。