二维反应扩散系统的求解器。
rdsolver的Python项目详细描述
#反应扩散求解器[构建状态](https://travis-ci.org/justinbois/rdsolver.svg?branch=master)](https://travis ci.org/justinbois/rdsolver)
\单元测试通过,但覆盖率不完整,集成测试也不完整。这个包解决了一个简单的问题:二维反应扩散动力学。具体来说,它解决了pdes系统的
!【rd pde】(imgs/rd_pde.png)
注意,上面的方程中的相似指数的求和不是假设的;只执行显式求和。坐标是笛卡尔坐标,边界条件是周期性的。
由于[此问题](https://github.com/jupyter widgets/ipywidgets/issues/1678),您可能需要使用“widgetsnbextension”的2.0.0版。要使用“conda”包管理器安装它,需要执行以下操作:conda install widgetsnbextension=2.0.0您的浏览器在呈现图形时可能有问题,因此您应该像这样启动jupyter笔记本:
````
jupyter笔记本--notebookApp.iopub_data_rate_limit=10000000
```
我使用谱微分和可变时间步长隐式/显式(vsimex)时间步长使用crank-nicholson/adams-bashforth方法。这种方法的缺点如下,最好通过考虑选择这些方法的原因来理解其优点。
因此,如果我们可以做隐式步进,我们可以采取更大的步骤,因为隐式方法有一个更容易的稳定区域。问题是,非线性问题使隐式时间步进变得困难,因为我们必须解一个非线性方程组才能使时间步进。解决这一问题的一个典型方法是将方程线性化,并根据线性化模型采取步骤。
然后我们可以对线性部分进行隐式时间步进(包括求解一个*线性*方程组),对非线性部分进行显式时间步进。这是我们在反应扩散方程中的典型例子。扩散部分是硬的,而化学反应部分不是。在这里求解的方程组中,我们把生物应用中常见的由扩散项和自发产生和降解项给出的线性部分,从由函数*f<;sub>;i<;sub>;*(*c*<;sub>;1<;sub>;,*c*<;sub>;2<;给出的其余非线性反应项中分离出来;/sub>;,…)。
因此,对于每个时间步,我们使用crank nicholson步隐式地为线性项步进,使用adams bashforth步显式地为非线性项步进。
通过采取可变大小的步骤,我们可以在解变化不大的情况下采取更大的步骤,在变化不大的情况下采取更短的步骤,这样我们就可以在不浪费步骤的情况下解动力学。我使用一个PID控制器来调整步长,以便在每个步长的解中达到一个(小的)目标相对变化。
使用光谱方法有两大好处。首先,线性系统在隐式时间步长下的解变得微不足道。这使得计时**更加高效。其次,谱方法给出的导数非常精确,网格点较少。网格点越少,时间步长越快。
我们可以用谱方法在切比雪夫网格上计算非周期边界条件,这是一个未来的改进。目前,我们将解限制在周期域上。
首先,需要仔细选择初始条件。重要的是,你不能只做随机扰动。函数必须严格周期性和光滑性。同样,如果浓度分布有非常剧烈的变化,光谱法也会失败。
\单元测试通过,但覆盖率不完整,集成测试也不完整。这个包解决了一个简单的问题:二维反应扩散动力学。具体来说,它解决了pdes系统的
!【rd pde】(imgs/rd_pde.png)
注意,上面的方程中的相似指数的求和不是假设的;只执行显式求和。坐标是笛卡尔坐标,边界条件是周期性的。
由于[此问题](https://github.com/jupyter widgets/ipywidgets/issues/1678),您可能需要使用“widgetsnbextension”的2.0.0版。要使用“conda”包管理器安装它,需要执行以下操作:conda install widgetsnbextension=2.0.0您的浏览器在呈现图形时可能有问题,因此您应该像这样启动jupyter笔记本:
````
jupyter笔记本--notebookApp.iopub_data_rate_limit=10000000
```
我使用谱微分和可变时间步长隐式/显式(vsimex)时间步长使用crank-nicholson/adams-bashforth方法。这种方法的缺点如下,最好通过考虑选择这些方法的原因来理解其优点。
因此,如果我们可以做隐式步进,我们可以采取更大的步骤,因为隐式方法有一个更容易的稳定区域。问题是,非线性问题使隐式时间步进变得困难,因为我们必须解一个非线性方程组才能使时间步进。解决这一问题的一个典型方法是将方程线性化,并根据线性化模型采取步骤。
然后我们可以对线性部分进行隐式时间步进(包括求解一个*线性*方程组),对非线性部分进行显式时间步进。这是我们在反应扩散方程中的典型例子。扩散部分是硬的,而化学反应部分不是。在这里求解的方程组中,我们把生物应用中常见的由扩散项和自发产生和降解项给出的线性部分,从由函数*f<;sub>;i<;sub>;*(*c*<;sub>;1<;sub>;,*c*<;sub>;2<;给出的其余非线性反应项中分离出来;/sub>;,…)。
因此,对于每个时间步,我们使用crank nicholson步隐式地为线性项步进,使用adams bashforth步显式地为非线性项步进。
通过采取可变大小的步骤,我们可以在解变化不大的情况下采取更大的步骤,在变化不大的情况下采取更短的步骤,这样我们就可以在不浪费步骤的情况下解动力学。我使用一个PID控制器来调整步长,以便在每个步长的解中达到一个(小的)目标相对变化。
使用光谱方法有两大好处。首先,线性系统在隐式时间步长下的解变得微不足道。这使得计时**更加高效。其次,谱方法给出的导数非常精确,网格点较少。网格点越少,时间步长越快。
我们可以用谱方法在切比雪夫网格上计算非周期边界条件,这是一个未来的改进。目前,我们将解限制在周期域上。
首先,需要仔细选择初始条件。重要的是,你不能只做随机扰动。函数必须严格周期性和光滑性。同样,如果浓度分布有非常剧烈的变化,光谱法也会失败。