Scipy odeint使索引超出范围错误

时间:2015-09-18 19:26:49

标签: python python-3.x scipy differential-equations

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

这是一些有效的示例代码

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在第二个中较小,但第二个总是给我以下错误

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。

1 个答案:

答案 0 :(得分: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]) ])