首页 > 解决方案 > 使用 scipy 的 ode 求解器调整粘度

问题描述

为简单起见,考虑以下方程(Burges 方程):

汉堡方程

scipy.integrate.ode.set_integrator("zvode", ..).integrate(T)让我们使用带有可变时间步长求解器的scipy(在我的例子中)来解决它。

问题如下:如果我们在傅里叶空间中使用朴素的实现

在此处输入图像描述

nu * d2x(u[t])如果时间步长太大,粘度项可能会导致过冲。这可能会导致解中出现大量噪声,甚至导致(假的)发散解(即使使用僵硬的求解器,在这个方程稍微复杂的版本上)。

一种对其进行正则化的方法是在 步骤 评估粘度项,t+dt更新步骤变为

在此处输入图像描述

此解决方案在显式编程时效果很好。如何使用 scipy 的可变步长 ode 求解器来实现它?令我惊讶的是,我没有找到任何关于这个相当基本的棘手问题的文档......

标签: pythonscipyodescipy-optimizetimestep

解决方案


你实际上不能,或者在另一个极端,odeint或者ode->zvode已经对任何给定的问题这样做了。

首先,您需要分别给出等式的两个部分。显然,这不是求解器界面的一部分。查看 DDE 和 SDE 求解器,实际上需要对方程进行这样的划分。

第二种,odeint使用ode->zvode隐式多步方法,这意味着那里的值u(t+dt)和右边的值进入计算和底层的局部近似。

您仍然可以通过提供仅包含二阶导数项的雅可比函数来尝试将原始方法破解到求解器中,但很可能您不会获得改进。

您可以对 ODE 进行运算符分区并分别求解线性部分

vhat(k,t) = exp(nu*k^2*t)*uhat(k,t)

以便

d/dt vhat(k,t) = -i*k*exp(nu*k^2*t)*conv(uhat(.,t),uhat(.,t))(k)

推荐阅读