在找到本地最大值之前,我可以与 scipy 的 odeint 集成吗?

Posted

技术标签:

【中文标题】在找到本地最大值之前,我可以与 scipy 的 odeint 集成吗?【英文标题】:Can I integrate with scipy's odeint until a local max is found? 【发布时间】:2015-08-16 08:34:45 【问题描述】:

这是我在这里的第一个问题,所以请放轻松。我想知道是否有一种方法可以仅在找到指定变量的局部最大值之前集成 ODE 系统。这里有更多细节:

让我们调用我们的 ODE 系统dX/dt = F(X) where X(t) = [x1(t), x2(t), ... , xn(t)]。假设这个系统的解在任何地方都被一个稳定的极限环 C 吸引,但在一个不稳定的不动点 p 处。选择一些初始条件 X0 而不是 p,而不是 C。我们希望遵循解的轨迹:

dX/dt = F(X), X(0) = X0    (*)

直到 x1(t) 达到它的第一个局部最大值。

进展: 使用 scipy.integrate.odeint 我能够找到极限循环 C 及其周期 T 的解,但是从任意点开始,我能够解决此问题的唯一方法是求解 (*) 为 ' long time'(可能是 4*T),并且假设这是一个足够长的时间,在事后确定 x1 的第一个局部最大值。我的大型项目需要多次执行此操作,因此我试图尽可能减少计算时间。似乎必须有一种更快的方法来做到这一点,而无需编写我自己的 ode 求解器。

有可能(并且很可能)我把它弄得太复杂了?如果您想出一种不同的方法来做到这一点,我将不胜感激。

【问题讨论】:

日晷套件(可通过例如 Assimulo 访问)在其求解器 CVODE 和 IDA 中具有寻根功能。 【参考方案1】:

我尚未对此进行测试,但以下代码应该可以工作或至少有帮助:

from scipy.integrate import ode

y0, t0 = [1.0j, 2.0], 0

def f(t, y, arg1):
    return [1j*arg1*y[0] + y[1], -arg1*y[1]**2]

r = ode(f).set_integrator('zvode', method='bdf')
r.set_initial_value(y0, t0).set_f_params(2.0)
t1 = 10
dt = 1

older = 0
previous = 0
current = 0
while r.successful() and not (older <  previous and prevous > current):
    older = previous
    previous = current
    current = r.integrate(r.t+dt)

print("Maximum occurs at ".format(r.t - dt))

我还会进一步研究python ode

编辑:

更好的是使用solout 可以找到here

【讨论】:

如果您作为答案发布,您可能需要花时间确保答案经过测试。通常未经测试的代码是危险代码。

以上是关于在找到本地最大值之前,我可以与 scipy 的 odeint 集成吗?的主要内容,如果未能解决你的问题,请参考以下文章

直线上的最大点数 O(N)

在 O(n) 时间内找到数组中的 10 个最大整数

我在哪里可以找到 scipy 中的 mad(平均绝对偏差)?

如何在 numpy / scipy 中获取特定百分位数的索引?

如何找到树上一组节点之间的最大距离?

如何找到 scipy.integrate.ode 的默认 atol 和 rtol?