python - scipy.integrate.odeint返回错误的结果

时间:2016-02-11 17:20:15

标签: python scipy odeint

我试图使用python 3.5和scipy.integrate.odeint函数集成方波,但结果没有任何意义,并且随着所选时间点数组的不同而变化很大。

方波的周期为10秒,模拟运行100秒。由于时间点阵列的大小为500,因此方波的每个周期将有50个时间点,但这似乎不会发生。 使用可选参数hmax=0.02可以修复它,但不应该自动推断它吗?

以下是代码:

import numpy as np
import matplotlib.pyplot as plt
import scipy.integrate as integrate

# dx/dt = f(t),  where f(t) is a square wave
def f(x, t):
    return float(t % 10.0 < 5.0) * 0.3

T = 100
tt = np.linspace(0, T, 500)
xx = integrate.odeint(f, 0, tt, hmax=0.2)

plt.figure()
plt.subplot(2,1,1)
plt.plot(tt, xx)
plt.axis([0,T,0,16])

plt.subplot(2,1,2)
plt.plot(tt, [f(None,t) for t in tt])
plt.axis([0, T, 0, 1])
plt.show()

我希望有人可以对这里发生的事情有所了解。 尝试将T更改为80到100之间(模拟时间)。

1 个答案:

答案 0 :(得分:1)

我认为你的问题是odeint函数采用方波不连续的常微分方程。

我首先将你的方波功能重新定义为:

def g(t):
    return float(t % 10.0 < 5.0) * 0.3

然后定义一个函数来逐步计算积分:

def get_integral(tt):
    intarray = np.zeros_like(tt)
    step_size = tt[1] -tt[0]
    for i,t in enumerate(tt):
        intarray[i] = intarray[i-1] + g(t)*step_size
    return intarray

然后:

xx = get_integral(tt)

应该为您提供您正在寻找的结果。