使用scipy's ode求解器调节粘度

问题描述 投票:0回答:1

考虑为简单起见以下方程式(Burgers方程式:]]

Burgers equation

让我们使用带有可变时步求解器的scipy(在我的情况下为scipy.integrate.ode.set_integrator("zvode", ..).integrate(T))解决它。

问题如下:如果使用傅立叶空间中的简单实现] >>

enter image description here

然后,如果时间步长太大,则粘度项nu * d2x(u[t])可能会导致过冲。这可能会在解决方案中产生相当大的噪声,甚至导致(伪)发散解(即使使用刚性求解器,对于此等式稍微复杂一点)。

一种方法[[使其规范化

是在步骤t+dt中评估粘度项,而更新步骤变为]

enter image description here

此解决方案在明确编程时效果很好。我如何使用scipy的可变步长ode求解器来实现它?

令我惊讶的是,我还没有找到关于这个相当棘手的问题的任何文档...[为简单起见,请考虑以下方程式(Burgers方程):让我们使用带有变量的scipy(在我的情况下为scipy.integrate.ode.set_integrator(“ zvode”,..)。integrate(T))求解。 ..

您实际上不能,或者在另一个极端,odeint已经对任何给定的问题执行了此操作。

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

至第二,odeint使用隐式多步方法,这意味着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)

python scipy ode scipy-optimize timestep
1个回答
0
投票
您实际上不能,或者在另一个极端,odeint已经对任何给定的问题执行了此操作。

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

© www.soinside.com 2019 - 2024. All rights reserved.