python - 使用 scipy 的 ode 求解器调整粘度
问题描述
为简单起见,考虑以下方程(Burges 方程):
scipy.integrate.ode.set_integrator("zvode", ..).integrate(T)
让我们使用带有可变时间步长求解器的scipy(在我的例子中)来解决它。
问题如下:如果我们在傅里叶空间中使用朴素的实现
nu * d2x(u[t])
如果时间步长太大,粘度项可能会导致过冲。这可能会导致解中出现大量噪声,甚至导致(假的)发散解(即使使用僵硬的求解器,在这个方程稍微复杂的版本上)。
一种对其进行正则化的方法是在 步骤 评估粘度项,t+dt
更新步骤变为
此解决方案在显式编程时效果很好。如何使用 scipy 的可变步长 ode 求解器来实现它?令我惊讶的是,我没有找到任何关于这个相当基本的棘手问题的文档......
解决方案
你实际上不能,或者在另一个极端,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)
推荐阅读
- digital-ocean - 如何为多个 LXC 容器配置唯一的公共 IP 地址?
- c# - 绑定数据未显示在网格中
- javascript - HTML 多选在 optgroup 文本之前添加可点击的输入复选框
- sql - designing a follower/following schema between two tables in SQL?
- python - 基于具有浮点数的一列对 2d numpy 数组进行排序
- javascript - HTML 画布功能不适用于移动设备
- azure-devops - 在发布管道期间将发布号添加到 Web.config
- ios - setValue:forUndefinedKey 在 AppDelegate
- python-3.x - Tensorflow 2.5 限制 GPU 内存使用
- .net-core - 在 AWS API Gateway 上的 .NET Core 3.1 上的 AWS Lambda 函数中使用 OData