Python 微分方程求解中的高频噪声

Python 微分方程求解中的高频噪声,python,numpy,physics,scientific-computing,differential-equations,Python,Numpy,Physics,Scientific Computing,Differential Equations,我试图模拟一个简单的扩散基于 在最初的几个时间步中,一切看起来都很好,但随后我开始得到高频噪声,通过二阶导数放大的数值误差。因为似乎很难提高浮点精度,我希望我能做些别的事情来抑制它?我已经增加了用于构造二阶导数的点数。我没有时间详细研究你的解,但你似乎是在用一个。正如您所展示的,这很容易实现,但是如果您的时间步长太小,这可能会变得数值不稳定。唯一的解决方案是减少时间步长或提高空间分辨率 解释这一点的最简单方法是一维情况:假设你的注意力是空间坐标x和时间步长i的函数。如果你做了所有的数学运算(写

我试图模拟一个简单的扩散基于


在最初的几个时间步中,一切看起来都很好,但随后我开始得到高频噪声,通过二阶导数放大的数值误差。因为似乎很难提高浮点精度,我希望我能做些别的事情来抑制它?我已经增加了用于构造二阶导数的点数。

我没有时间详细研究你的解,但你似乎是在用一个。正如您所展示的,这很容易实现,但是如果您的时间步长太小,这可能会变得数值不稳定。唯一的解决方案是减少时间步长或提高空间分辨率

解释这一点的最简单方法是一维情况:假设你的注意力是空间坐标
x
和时间步长
i
的函数。如果你做了所有的数学运算(写下你的方程,用偏导数代替,应该很容易),你可能会得到如下结果:

C(x, i+1) = [1 - 2 * k] * C(x, i) + k * [C(x - 1, i) + C(x + 1, i)]
因此,下一步的一个点的集中度取决于它之前的值和它的两个相邻点的值。不难看出,当
k=0.5
时,每个点都会被其两个相邻点的平均值所取代,因此
[…,0,1,0,1,0,…]
的浓度分布在下一步将变成
[…,1,0,1,0,1,…]
。如果
k>0.5
,这样的剖面将以指数级放大。用更长的卷积计算二阶导数(我有效地使用了[1,-2,1]),但我想这不会改变不稳定性问题

我不知道正常扩散,但根据热扩散的经验,我猜
k
dt*扩散系数/dx^2
成比例。因此,您必须选择足够小的时间步长,以便模拟不会变得不稳定。要使模拟稳定,但仍尽可能快,请选择参数,使
k
略小于
0.5
。对于二维和三维情况,也可以得出类似的结论。实现这一点的最简单方法是增加
dx
,因为对于线性问题,您的总计算时间将按
1/dx^3
的比例缩放,对于二维问题,将按
1/dx^4
的比例缩放,对于三维问题,甚至按
1/dx^5
的比例缩放

有更好的方法来解决扩散方程,我相信这至少是解决热方程(这也是一个扩散问题)的标准。“问题”是这是一种方法,这意味着你必须解一组方程来计算你在下一个时间步的“浓度”,这是一个有点难实现的方法。但这种方法保证了数值稳定性,即使是在大的时间步长下

C(x, i+1) = [1 - 2 * k] * C(x, i) + k * [C(x - 1, i) + C(x + 1, i)]