我正在尝试使用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。
答案 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]) ])