这是我在这里的第一个问题,所以请放轻松我。我想知道是否有办法只集成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的解,但从任意点开始,我能够解决这个问题的唯一方法是求解(*)for a'很长时间'(可能是4 * T),假设这是一个足够长的时间,确定事后的第一个局部最大值x1。我的大项目要求多次完成,所以我尽量减少计算时间。在没有编写我自己的ode求解器的情况下,似乎必须有更快的方法来实现这一点。
我可能(而且可能)让这个太复杂了?如果您想到一种不同的方式,我会很感激任何建议。
答案 0 :(得分:0)
我没有对此进行测试,但以下代码应该起作用或者至少有所帮助:
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
编辑:
更好的方法是使用可以找到here
的solout