Scipy odeint 给出索引越界错误

Scipy odeint giving index out of bounds errors

我正在尝试使用 Scipy 的 odeint 函数求解 python 中的微分方程。等式的形式为 dy/dt = w(t),其中 w(t) = w1*(1+A*sin(w2*t)) 用于某些参数 w1、w2 和 A。我编写的代码适用于某些参数,但对于其他参数,我得到了索引超出范围的错误。

这是一些有效的示例代码

import numpy as np
import scipy.integrate as integrate

t = np.arange(1000)

w1 = 2*np.pi
w2 = 0.016*np.pi
A = 1.0

w = w1*(1+A*np.sin(w2*t))

def f(y,t0):
    return w[t0]

y = integrate.odeint(f,0,t)

这是一些不起作用的示例代码

import numpy as np
import scipy.integrate as integrate

t = np.arange(1000)

w1 = 0.3*np.pi
w2 = 0.005*np.pi
A = 0.15

w = w1*(1+A*np.sin(w2*t))

def f(y,t0):
    return w[t0]

y = integrate.odeint(f,0,t)

这两者之间唯一不同的是w1,w2,A这三个参数在second中变小了,但是second总是给我下面的错误

line 13, in f 
   return w[t0]

IndexError: index 1001 is out of bounds for axis 0 with size 1000

即使首先重新启动 python 和 运行 第二个代码,此错误仍然存​​在。我试过其他参数,有些似乎有效,但其他参数给了我不同的索引越界错误。有人说1001越界,有人说1000,有人说1008等等

更改 y 的初始条件(odeint 的第二个输入,我在上面的代码中将其设为 0)也会更改索引错误的数字,所以可能是我误解了放在这里的内容.除了 y 被用作信号的相位之外,我没有被告知初始条件应该是什么,所以我假设它最初为 0。

你想做的是

def w(t):
    return w1*(1+A*np.sin(w2*t))

def f(y,t0):
   return w(t0)

数组索引通常是整数,时间参数和微分方程解的值通常是实数。因此在调用 w[t0].

时存在一些概念上的困难

你也可以尝试直接集成函数w,这个例子本身没有难度。


对于耦合系统,您将它们作为耦合系统来解决。

def w(t):
    return w1*(1+A*np.sin(w2*t))

def f(y,t):
   wt = w(t)
   return np.array([ wt, wt*sin(y[1]-y[0]) ])